Implementazione di RecognizeFrame
Monitoraggi di rete chiama la funzione RecognizeFrame di un parser per determinare che il parser riconosce i dati nonclati di un frame. I dati non reclamati possono trovarsi all'inizio di un frame, ma in genere i dati non reclamati si trovano al centro di un frame. La figura seguente mostra i dati nonclati che si trovano al centro di una cornice.
Monitoraggio rete fornisce le informazioni seguenti quando chiama la funzione RecognizeFrame :
- Handle al frame.
- Puntatore all'inizio della cornice.
- Puntatore all'inizio dei dati non reclamati.
- Valore MAC del primo protocollo nel frame.
- Numero di byte nei dati non reclamati; ovvero i byte rimanenti nel frame.
- Handle al protocollo precedente.
- Offset del protocollo precedente.
Quando la DLL del parser determina che i dati non dichiarati iniziano con il protocollo parser, la DLL del parser determina dove viene avviato il protocollo successivo e il protocollo seguente. Le funzioni DLL del parser nei modi condizionali seguenti:
- Se la DLL del parser riconosce i dati non dichiarati, la DLL del parser imposta il parametro pProtocolStatus e restituisce un puntatore al protocollo successivo nel frame o NULL. VIENE restituito NULL se il protocollo corrente è l'ultimo protocollo nel frame.
- Se la DLL del parser riconosce i dati non convalidati e identifica il protocollo che segue (dalle informazioni fornite nel protocollo), la DLL del parser restituisce un puntatore all'handle del protocollo successivo nel parametro phNextProtocol della funzione.
- Se la DLL del parser non riconosce i dati non annullati, la DLL del parser restituisce il puntatore all'inizio dei dati non annullati e Monitoraggio di rete continua a tentare di analizzare i dati non annullati.
Per implementare RecognizeFrame
Testare per determinare che si riconosce il protocollo.
Se si riconoscono i dati non reclamati e si conosce quale protocollo segue, impostare pProtocolStatus su PROTOCOL_STATUS_NEXT_PROTOCOL, impostare phNextProtocol su un puntatore che punta all'handle per il protocollo successivo e quindi restituire un puntatore al protocollo successivo.
–oppure–
Se si riconoscono i dati non annullati e non si conosce quale protocollo segue, impostare pProtocolStatus su PROTOCOL_STATUS_RECOGNIZED e quindi restituire un puntatore al protocollo successivo.
–oppure–
Se si riconoscono i dati non reclamati e il protocollo è l'ultimo protocollo in un frame, impostare pProtocolStatus su PROTOCOL_STATUS_CLAIMED e quindi restituire NULL.
–oppure–
Se non si riconoscono i dati non definiti, impostare pProtocolStatus su PROTOCOL_STATUS_NOT_RECOGNIZED e quindi restituire il puntatore passato all'utente in pProtocol.
Di seguito è riportata un'implementazione di base di 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;
}