다음을 통해 공유


RecognizeFrame 구현

네트워크 모니터는 파서의 RecognizeFrame 함수를 호출하여 파서가 프레임의 클레임되지 않은 데이터를 인식하는지 확인합니다. 클레임되지 않은 데이터는 프레임의 시작 부분에 있을 수 있지만 일반적으로 클레임되지 않은 데이터는 프레임 중간에 있습니다. 다음 그림에서는 프레임 중간에 있는 클레임되지 않은 데이터를 보여 줍니다.

프레임 중간에 있는 클레임되지 않은 데이터

네트워크 모니터는 RecognizeFrame 함수를 호출할 때 다음 정보를 제공합니다.

  • 프레임에 대한 핸들입니다.
  • 프레임의 시작 부분에 대한 포인터입니다.
  • 클레임되지 않은 데이터의 시작 부분에 대한 포인터입니다.
  • 프레임에서 첫 번째 프로토콜의 MAC 값입니다.
  • 클레임되지 않은 데이터의 바이트 수입니다. 즉, 프레임에 남아 있는 바이트입니다.
  • 이전 프로토콜에 대한 핸들입니다.
  • 이전 프로토콜의 오프셋입니다.

파서 DLL이 클레임되지 않은 데이터가 파서 프로토콜로 시작한다고 판단하면 파서 DLL은 다음 프로토콜이 시작되는 위치와 다음 프로토콜을 결정합니다. 파서 DLL은 다음과 같은 조건부 방법으로 작동합니다.

  • 파서 DLL이 클레임되지 않은 데이터를 인식하는 경우 파서 DLL은 pProtocolStatus 매개 변수를 설정하고 프레임의 다음 프로토콜 또는 NULL에 대한 포인터를 반환합니다. 현재 프로토콜이 프레임의 마지막 프로토콜인 경우 NULL이 반환됩니다.
  • 파서 DLL이 클레임되지 않은 데이터를 인식하고 프로토콜에 제공된 정보에서 뒤에 오는 프로토콜을 식별하는 경우 파서 DLL은 함수의 phNextProtocol 매개 변수에서 다음 프로토콜의 핸들에 대한 포인터를 반환합니다.
  • 파서 DLL이 클레임되지 않은 데이터를 인식하지 못하는 경우 파서 DLL은 클레임되지 않은 데이터의 시작 부분에 대한 포인터를 반환하고 네트워크 모니터는 클레임되지 않은 데이터를 계속 구문 분석하려고 합니다.

RecognizeFrame을 구현하려면

  1. 프로토콜을 인식하는지 확인하려면 테스트합니다.

  2. 클레임되지 않은 데이터를 인식하고 다음 프로토콜을 알고 있는 경우 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;

}