다음을 통해 공유


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;

}