ネットワーク モニターは、パーサーの RecognizeFrame 関数を呼び出して、パーサーがフレームの未要求データを認識することを決定します。 未請求データはフレームの先頭にある場合がありますが、通常は、未要求のデータはフレームの中央に配置されます。 次の図は、フレームの中央にある未請求のデータを示しています。
Network Monitor は、 RecognizeFrame 関数を呼び出すときに次の情報を提供します。
- フレームへのハンドル。
- フレームの先頭へのポインター。
- 未要求データの先頭へのポインター。
- フレーム内の最初のプロトコルの MAC 値。
- 未要求データ内のバイト数。つまり、フレームに残っているバイト数です。
- 前のプロトコルへのハンドル。
- 前のプロトコルのオフセット。
パーサー DLL が、要求されていないデータがパーサー プロトコルで始まると判断すると、パーサー DLL によって次のプロトコルが開始される場所と、その後に続くプロトコルが決定されます。 パーサー DLL は、次の条件付き方法で機能します。
- パーサー DLL が要求されていないデータを認識する場合、パーサー DLL は pProtocolStatus パラメーターを 設定し、フレーム内の次のプロトコルまたは NULL へのポインターを返します。 現在のプロトコルがフレームの最後のプロトコルである場合、NULL が返されます。
- パーサー DLL が未要求データを認識し、(プロトコルで提供される情報から) その後のプロトコルを識別する場合、パーサー DLL は関数の phNextProtocol パラメーター内の次のプロトコルのハンドルへのポインターを返します。
- パーサー DLL が未要求データを認識しない場合、パーサー DLL は未要求データの先頭へのポインターを返し、ネットワーク モニターは未要求データの解析を続行します。
RecognizeFrame を実装するには
テストして、プロトコルを認識していることを確認します。
要求されていないデータを認識し、どのプロトコルが従うかわからない場合は、 pProtocolStatus を PROTOCOL_STATUS_NEXT_PROTOCOL に設定し、 phNextProtocol を次のプロトコルのハンドルを指すポインターに設定し、次のプロトコルへのポインターを返します。
\- または -
要求されていないデータが認識され、どのプロトコルが後に続くのかわからない場合は、 pProtocolStatus を PROTOCOL_STATUS_RECOGNIZED に設定し、次のプロトコルへのポインターを返します。
\- または -
要求されていないデータを認識し、プロトコルがフレーム内の最後のプロトコルである場合は、 pProtocolStatus をPROTOCOL_STATUS_CLAIMEDに設定し、 NULL を返します。
\- または -
要求されていないデータが認識されない場合は、 pProtocolStatus を PROTOCOL_STATUS_NOT_RECOGNIZED に設定し、 pProtocol で渡されたポインターを返します。
RecognizeFrame の基本的な実装を次に 示します。
#include <windows.h>
LPBYTE BHAPI MyProtocol_RecognizeFrame( HFRAME hFrame,
LPBYTE pMacFrame,
LPBYTE pProtocol,
DWORD MacType,
DWORD BytesLeft,
HPROTOCOL hPrevProtocol,
DWORD nPreviuosProtOffset,
LPDWORD pProtocolStatus,
LPHPROTOCOL phNextProtocol,
LPDWORD InstData)
// Test unclaimed data.
// If unclaimed data is recognized, but you do not know what follows.
*pProtocolStatus = PROTOCOL_STATUS_RECOGNIZED;
return pProtocol + MY_PROTOCOL_LENGTH;
// If unclaimed data is recognized and you know what follows.
*pProtocolStatus = PROTOCOL_STATUS_NEXT_PROTOCOL;
phNextProtocol = GetProtocolFromTable(
hTable,
ItemToFind,
lpInstData);
return pProtocol + MY_PROTOCOL_LENGTH;
// If unclaimed data is recognized and the protocol is the last
// protocol in the frame.
*pProtocolStatus = PROTOCOL_STATUS_CLAIMED;
return NULL;
// If the unclaimed data is not recognized.
*pProtocolStatus = PROTOCOL_STATUS_NOT_RECOGNIZED;
return *pProtocol;
}