RecognizeFrame implementálása

A Network Monitors meghívja az elemző RecognizeFrame függvényét annak megállapításához, hogy az elemző felismeri-e a keret nem igényelt adatait. Előfordulhat, hogy a nem igényelt adatok egy keret elején találhatók, de a nem igényelt adatok általában a keret közepén találhatók. Az alábbi ábrán a keret közepén található nem igényelt adatok láthatók.

keret közepén található nem igényelt adatok

A Network Monitor a következő információkat adja meg, amikor meghívja a RecognizeFrame függvényt:

  • Egy fogópont a kerethez.
  • A keret kezdőpontjára mutató mutató.
  • Mutató a nem igényelt adatok elejére.
  • A keret első protokolljának MAC-értéke.
  • A nem törölt adatok bájtjainak száma; vagyis a keretben fennmaradó bájtok.
  • Az előző protokoll hivatkozása.
  • Az előző protokoll eltolása.

Amikor az elemző DLL megállapítja, hogy a nem igényelt adatok az elemzési protokolllal kezdődnek, az elemző DLL határozza meg, hogy hol kezdődik a következő protokoll, és melyik protokoll következik. Az elemző DLL a következő feltételes módokon működik:

  • Ha az elemző DLL felismeri a nem igényelt adatokat, az elemző DLL beállítja a pProtocolStatus paramétert, és egy mutatót ad vissza a keret következő protokolljához, vagy NULL. NULL lesz visszaadva, ha az aktuális protokoll az utolsó protokoll a keretben.
  • Ha az elemző DLL felismeri a nem igényelt adatokat, és azonosítja az azt követő protokollt (a protokollban megadott információk alapján), akkor az elemző DLL a függvény phNextProtocol paraméterében lévő következő protokoll leírójára mutató mutatót ad vissza.
  • Ha az elemző DLL nem ismeri fel a nem elismert adatokat, az elemző DLL visszaadja a mutatót a nem elismert adatok elejére, és a Network Monitor továbbra is megpróbálja elemezni a nem igényelt adatokat.

RecognizeFrame implementálása

  1. Tesztelje annak megállapítását, hogy felismeri-e a protokollt.

  2. Ha felismeri a nem igényelt adatokat, és tudja, hogy melyik protokollt követi, állítsa pProtocolStatus PROTOCOL_STATUS_NEXT_PROTOCOL értékre, állítsa phNextProtocol egy mutatóra, amely a következő protokoll fogópontjára mutat, majd visszaad egy mutatót a következő protokollhoz.

    –vagy–

    Ha felismeri a nem igényelt adatokat, és nem tudja, hogy melyik protokollt követi, állítsa pProtocolStatus PROTOCOL_STATUS_RECOGNIZED értékre, majd adjon vissza egy mutatót a következő protokollhoz.

    –vagy–

    Ha felismeri a nem igényelt adatokat, és a protokoll egy keretben az utolsó protokollként szerepel, állítsa be a pProtocolStatus értéket PROTOCOL_STATUS_CLAIMED-re, majd adjon vissza NULL.

    –vagy–

    Ha nem ismeri fel a nem igényelt adatokat, állítsa a pProtocolStatus értékét PROTOCOL_STATUS_NOT_RECOGNIZED-ra, majd adja vissza a mutatót, amely átadásra került önnek a pProtocol-ban.

Az alábbiakban a RecognizeFramealapszintű implementációját ismertetjük.

#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;

}