實作 AttachProperties
網路監視器會呼叫 AttachProperties 函式,以對應存在於已辨識資料片段中的屬性。 AttachProperties 函式會將屬性對應至特定位置。
網路監視器會使用下列程式來剖析框架中的資料。
- 首先,網路監視器會呼叫 RecognizeFrame 來辨識存在於框架中的所有通訊協定。
- 然後,網路監視器會針對可辨識一段資料的每個剖析器呼叫 AttachProperties 。
當網路監視器呼叫已辨識資料的 AttachProperties 函式時,呼叫的剖析器必須剖析資料,然後將每個現有屬性對應至已辨識資料中的位置。 剖析器會決定有哪些屬性存在,以及每個屬性位於資料的位置。 下圖顯示剖析器辨識的資料。
在 AttachProperties的實作期間,您必須針對存在於資料框架中的每個屬性呼叫下列其中一個函式。
- 如果您想要修改框架中的屬性資料,請呼叫 AttachPropertyInstanceEx 函式。
- 當您不想修改框架中的屬性資料時,請呼叫 AttachPropertyInstance 函式。
注意
建議您使用資料,因為它存在於擷取中。
下列程式會識別實作 AttachProperties所需的步驟。
實作 AttachProperties
- 判斷哪些屬性存在,以及資料中的屬性位置。
- 針對您想要修改的值,為每個屬性呼叫 AttachPropertyInstanceEx 。
- 針對每個屬性呼叫 AttachPropertyInstance ,其中包含您不想修改的值。 一般而言,這是您唯一需要呼叫的函式。
以下是 AttachProperties的基本實作。 請注意,此範例不包含程式碼來判斷哪些屬性存在,或是要找出屬性的程式碼。
#include <windows.h>
LPBYTE BHAPI MyProtocolAttachProperties( HFRAME hFrame,
LPBYTE pMacFrame,
LPBYTE pBLRPLATEFrame,
DWORD MacType,
DWORD BytesLeft,
HPROTOCOL hPreviousProtocol,
DWORD nPrevProtocolOffset,
DWORD InstData)
{
PBLRPLATEHDR pBLRPLATEHdr = (PBLRPLATEHDR)pBLRPLATEFrame;
// Attach summary property.
AttachPropertyInstance( hFrame,
BLRPLATEPropertyTable[BLRPLATE_SUMMARY].hProperty,
(WORD)BytesLeft,
(LPBYTE)pBLRPLATEFrame,
0, // No Help file.
0, // Indent level.
0); // Data flag.
// Attach signature property.
AttachPropertyInstance( hFrame,
BLRPLATEPropertyTable[BLRPLATE_SIGNATURE].hProperty,
sizeof(DWORD),
&(pBLRPLATEHdr->Signature),
0, // No Help file.
1, // Indent level.
0); // Data flag.
// Attach opcode.
AttachPropertyInstance( hFrame,
BLRPLATEPropertyTable[BLRPLATE_OPCODE].hProperty,
sizeof(WORD),
&(pBLRPLATEHdr->Opcode),
0, // No Help file.
1, // Indent level.
0); // Data flag.
// Attach flags summary.
AttachPropertyInstance( hFrame,
BLRPLATEPropertyTable[BLRPLATE_FLAGS_SUMMARY].hProperty,
sizeof(BYTE),
&(pBLRPLATEHdr->Flags),
0, // No Help file.
1, // Indent level.
0); // Data flag.
// Attach flags decode.
AttachPropertyInstance( hFrame,
BLRPLATEPropertyTable[BLRPLATE_FLAGS_FLAGS].hProperty,
sizeof(BYTE),
&(pBLRPLATEHdr->Flags),
0, // No Help file.
2, // Indent level.
0); // Data flag.
RETURN null;
}