parser.h
上传用户:dzyhzl
上传日期:2019-04-29
资源大小:56270k
文件大小:13k
源码类别:

模拟服务器

开发平台:

C/C++

  1. //=============================================================================
  2. //  Microsoft (R) Network Monitor (tm). 
  3. //  Copyright (C) 1991-1999. All rights reserved.
  4. //
  5. //  MODULE: nmparser.h
  6. //
  7. //  This header file defines helper functions for use by Network Monitor 
  8. //  parser DLL's.
  9. //=============================================================================
  10. #include "bhtypes.h"
  11. #include "frame.h"
  12. // OK, we should make everyone convert to NMerr... 
  13. // but not right this particular moment
  14. #include "bherr.h"
  15. #if !defined(_NMPARSER_)
  16. #define _NMPARSER_
  17. #pragma pack(1)
  18. //=============================================================================
  19. //  Format Procedure Type.
  20. //
  21. //  NOTE: All format functions *must* be decalred as WINAPIV not WINAPI!
  22. //=============================================================================
  23. typedef VOID (WINAPIV *FORMAT)(LPPROPERTYINST, ...);
  24. //=============================================================================
  25. //  PROTOCOL_STATUS_RECOGNIZED:
  26. //
  27. //  The protocol recognized the frame and moved the pointer to end of its
  28. //  protocol header. Network Monitor uses the protocols follow set to continue
  29. //  parsing.
  30. //=============================================================================
  31. #define PROTOCOL_STATUS_RECOGNIZED                        0
  32. //=============================================================================
  33. //  PROTOCOL_STATUS_NOT_RECOGNIZED:
  34. //
  35. //  The protocol did not recognized the frame and did not move the pointer
  36. //  (i.e. the start data pointer which was passed in). Network Monitor uses the
  37. //  protocols follow set to continue parsing.
  38. //=============================================================================
  39. #define PROTOCOL_STATUS_NOT_RECOGNIZED                    1
  40. //=============================================================================
  41. //  PROTOCOL_STATUS_CLAIMED:
  42. //
  43. //  The protocol recognized the frame and claimed it all for itself,
  44. //  and parsing terminates.
  45. //=============================================================================
  46. #define PROTOCOL_STATUS_CLAIMED                           2
  47. //=============================================================================
  48. //  PROTOCOL_STATUS_NEXT_PROTOCOL:
  49. //
  50. //  The protocol recognized the frame and moved the pointer to end of its
  51. //  protocol header. The current protocol requests that Network Monitor 
  52. //  continue parsing at a known next protocol by returning the next protocols
  53. //  handle back to Network Monitor. In this case, the follow of the current 
  54. //  protocol, if any, is not used.
  55. //=============================================================================
  56. #define PROTOCOL_STATUS_NEXT_PROTOCOL                     3
  57. //=============================================================================
  58. //  Macros.
  59. //=============================================================================
  60. extern  BYTE HexTable[];
  61. #define XCHG(x)         MAKEWORD( HIBYTE(x), LOBYTE(x) )
  62. #define DXCHG(x)        MAKELONG( XCHG(HIWORD(x)), XCHG(LOWORD(x)) )
  63. #define LONIBBLE(b) ((BYTE) ((b) & 0x0F))
  64. #define HINIBBLE(b)     ((BYTE) ((b) >> 4))
  65. #define HEX(b)          (HexTable[LONIBBLE(b)])
  66. #define SWAPBYTES(w)    ((w) = XCHG(w))
  67. #define SWAPWORDS(d)    ((d) = DXCHG(d))
  68. //=============================================================================
  69. //  All the MAC frame types combined.
  70. //=============================================================================
  71. typedef union _MACFRAME
  72. {
  73.     LPBYTE      MacHeader;              //... generic pointer.
  74.     LPETHERNET  Ethernet;               //... ethernet pointer.
  75.     LPTOKENRING Tokenring;              //... tokenring pointer.
  76.     LPFDDI      Fddi;                   //... FDDI pointer.
  77. } MACFRAME;
  78. typedef MACFRAME *LPMACFRAME;
  79. #define HOT_SIGNATURE       MAKE_IDENTIFIER('H', 'O', 'T', '$')
  80. #define HOE_SIGNATURE       MAKE_IDENTIFIER('H', 'O', 'E', '$')
  81. typedef struct _HANDOFFENTRY
  82. {
  83. #ifdef DEBUGNEVER  // remove retail/debug mixing nightmare.
  84.     DWORD       hoe_sig;                    //... 'HOE$'
  85. #endif
  86.    DWORD        hoe_ProtIdentNumber;        //Port/Socket number used to determine who to handoff to
  87.    HPROTOCOL    hoe_ProtocolHandle;         //Handle of Protocol to hand off to
  88.    DWORD        hoe_ProtocolData;           //Additional Data to pass to protocol when handed off
  89. } HANDOFFENTRY;
  90. typedef HANDOFFENTRY * LPHANDOFFENTRY;    
  91. typedef struct _HANDOFFTABLE
  92. {
  93. #ifdef DEBUGNEVER  // remove retail/debug mixing nightmare.
  94.     DWORD           hot_sig;                //... 'HOT$'
  95. #endif
  96.     DWORD           hot_NumEntries;
  97.     LPHANDOFFENTRY  hot_Entries;
  98. } HANDOFFTABLE, *LPHANDOFFTABLE;
  99. //=============================================================================
  100. //  Parser helper macros.
  101. //=============================================================================
  102. INLINE LPVOID GetPropertyInstanceData(LPPROPERTYINST PropertyInst)
  103. {
  104.     if ( PropertyInst->DataLength != (WORD) -1 )
  105.     {
  106.         return PropertyInst->lpData;
  107.     }
  108.     return (LPVOID) PropertyInst->lpPropertyInstEx->Byte;
  109. }
  110. #define GetPropertyInstanceDataValue(p, type)  ((type *) GetPropertyInstanceData(p))[0]
  111. INLINE DWORD GetPropertyInstanceFrameDataLength(LPPROPERTYINST PropertyInst)
  112. {
  113.     if ( PropertyInst->DataLength != (WORD) -1 )
  114.     {
  115.         return PropertyInst->DataLength;
  116.     }
  117.     return PropertyInst->lpPropertyInstEx->Length;
  118. }
  119. INLINE DWORD GetPropertyInstanceExDataLength(LPPROPERTYINST PropertyInst)
  120. {
  121.     if ( PropertyInst->DataLength == (WORD) -1 )
  122.     {
  123.         PropertyInst->lpPropertyInstEx->Length;
  124.     }
  125.     return (WORD) -1;
  126. }
  127. //=============================================================================
  128. //  Parser helper functions.
  129. //=============================================================================
  130. extern LPLABELED_WORD  WINAPI GetProtocolDescriptionTable(LPDWORD TableSize);
  131. extern LPLABELED_WORD  WINAPI GetProtocolDescription(DWORD ProtocolID);
  132. extern DWORD        WINAPI GetMacHeaderLength(LPVOID MacHeader, DWORD MacType);
  133. extern DWORD        WINAPI GetLLCHeaderLength(LPLLC Frame);
  134. extern DWORD        WINAPI GetEtype(LPVOID MacHeader, DWORD MacType);
  135. extern DWORD        WINAPI GetSaps(LPVOID MacHeader, DWORD MacType);
  136. extern BOOL         WINAPI IsLLCPresent(LPVOID MacHeader, DWORD MacType);
  137. extern VOID         WINAPI CanonicalizeHexString(LPSTR hex, LPSTR dest, DWORD len);
  138. extern void         WINAPI CanonHex(UCHAR * pDest, UCHAR * pSource, int iLen, BOOL fOx );
  139. extern DWORD        WINAPI ByteToBinary(LPSTR string, DWORD ByteValue);
  140. extern DWORD        WINAPI WordToBinary(LPSTR string, DWORD WordValue);
  141. extern DWORD        WINAPI DwordToBinary(LPSTR string, DWORD DwordValue);
  142. extern LPSTR        WINAPI AddressToString(LPSTR string, BYTE *lpAddress);
  143. extern LPBYTE       WINAPI StringToAddress(BYTE *lpAddress, LPSTR string);
  144. extern LPDWORD      WINAPI VarLenSmallIntToDword( LPBYTE  pValue, 
  145.                                                   WORD    ValueLen, 
  146.                                                   BOOL    fIsByteswapped,
  147.                                                   LPDWORD lpDword );
  148. extern LPBYTE       WINAPI LookupByteSetString (LPSET lpSet, BYTE Value);
  149. extern LPBYTE       WINAPI LookupWordSetString (LPSET lpSet, WORD Value);
  150. extern LPBYTE       WINAPI LookupDwordSetString (LPSET lpSet, DWORD Value);
  151. extern DWORD        WINAPIV FormatByteFlags(LPSTR string, DWORD ByteValue, DWORD BitMask);
  152. extern DWORD        WINAPIV FormatWordFlags(LPSTR string, DWORD WordValue, DWORD BitMask);
  153. extern DWORD        WINAPIV FormatDwordFlags(LPSTR string, DWORD DwordValue, DWORD BitMask);
  154. extern LPSTR        WINAPIV FormatTimeAsString(SYSTEMTIME *time, LPSTR string);
  155. extern VOID         WINAPIV FormatLabeledByteSetAsFlags(LPPROPERTYINST lpPropertyInst);
  156. extern VOID         WINAPIV FormatLabeledWordSetAsFlags(LPPROPERTYINST lpPropertyInst);
  157. extern VOID         WINAPIV FormatLabeledDwordSetAsFlags(LPPROPERTYINST lpPropertyInst);
  158. extern VOID         WINAPIV FormatPropertyDataAsByte(LPPROPERTYINST lpPropertyInst, DWORD Base);
  159. extern VOID         WINAPIV FormatPropertyDataAsWord(LPPROPERTYINST lpPropertyInst, DWORD Base);
  160. extern VOID         WINAPIV FormatPropertyDataAsDword(LPPROPERTYINST lpPropertyInst, DWORD Base);
  161. extern VOID         WINAPIV FormatLabeledByteSet(LPPROPERTYINST lpPropertyInst);
  162. extern VOID         WINAPIV FormatLabeledWordSet(LPPROPERTYINST lpPropertyInst);
  163. extern VOID         WINAPIV FormatLabeledDwordSet(LPPROPERTYINST lpPropertyInst);
  164. extern VOID         WINAPIV FormatPropertyDataAsInt64(LPPROPERTYINST lpPropertyInst, DWORD Base);
  165. extern VOID         WINAPIV FormatPropertyDataAsTime(LPPROPERTYINST lpPropertyInst);
  166. extern VOID         WINAPIV FormatPropertyDataAsString(LPPROPERTYINST lpPropertyInst);
  167. extern VOID         WINAPIV FormatPropertyDataAsHexString(LPPROPERTYINST lpPropertyInst);
  168. // Parsers should NOT call LockFrame().  If a parser takes a lock and then gets
  169. // faulted or returns without unlocking, it leaves the system in a state where
  170. // it cannot change protocols or cut/copy frames.  Parsers should use ParserTemporaryLockFrame
  171. // which grants a lock ONLY during the context of the api entry into the parser.  The 
  172. // lock is released on exit from the parser for that frame.
  173. extern LPBYTE       WINAPI ParserTemporaryLockFrame(HFRAME hFrame);
  174. extern LPVOID       WINAPI GetCCInstPtr(VOID);
  175. extern VOID         WINAPI SetCCInstPtr(LPVOID lpCurCaptureInst);
  176. extern LPVOID       WINAPI CCHeapAlloc(DWORD dwBytes, BOOL bZeroInit);
  177. extern LPVOID       WINAPI CCHeapReAlloc(LPVOID lpMem, DWORD dwBytes, BOOL bZeroInit);
  178. extern BOOL         WINAPI CCHeapFree(LPVOID lpMem);
  179. extern SIZE_T       WINAPI CCHeapSize(LPVOID lpMem);
  180. extern BOOL _cdecl BERGetInteger( LPBYTE  pCurrentPointer,
  181.                                   LPBYTE *ppValuePointer,
  182.                                   LPDWORD pHeaderLength,
  183.                                   LPDWORD pDataLength,
  184.                                   LPBYTE *ppNext);
  185. extern BOOL _cdecl BERGetString( LPBYTE  pCurrentPointer,
  186.                                  LPBYTE *ppValuePointer,
  187.                                  LPDWORD pHeaderLength,
  188.                                  LPDWORD pDataLength,
  189.                                  LPBYTE *ppNext);
  190. extern BOOL _cdecl BERGetHeader( LPBYTE  pCurrentPointer,
  191.                                  LPBYTE  pTag,
  192.                                  LPDWORD pHeaderLength,
  193.                                  LPDWORD pDataLength,
  194.                                  LPBYTE *ppNext);
  195. //=============================================================================
  196. //  Parser Finder Structures.
  197. //=============================================================================
  198. #pragma warning(disable:4200)
  199. #define MAX_PROTOCOL_NAME_LEN       16
  200. #define MAX_PROTOCOL_COMMENT_LEN    256
  201. // Handoff Value Format Base
  202. typedef enum
  203. {
  204.     HANDOFF_VALUE_FORMAT_BASE_UNKNOWN = 0,
  205.     HANDOFF_VALUE_FORMAT_BASE_DECIMAL = 10,
  206.     HANDOFF_VALUE_FORMAT_BASE_HEX     = 16
  207. } PF_HANDOFFVALUEFORMATBASE;
  208. // PF_HANDOFFENTRY
  209. typedef struct _PF_HANDOFFENTRY
  210. {
  211.     char  szIniFile[MAX_PATH];
  212.     char  szIniSection[MAX_PATH];
  213.     char  szProtocol[MAX_PROTOCOL_NAME_LEN];
  214.     DWORD dwHandOffValue;
  215.     PF_HANDOFFVALUEFORMATBASE ValueFormatBase;
  216. } PF_HANDOFFENTRY;
  217. typedef PF_HANDOFFENTRY* PPF_HANDOFFENTRY;
  218. // PF_HANDOFFSET
  219. typedef struct _PF_HANDOFFSET
  220. {
  221.     DWORD           nEntries;
  222.     PF_HANDOFFENTRY Entry[0];
  223. } PF_HANDOFFSET;
  224. typedef PF_HANDOFFSET* PPF_HANDOFFSET;
  225. // FOLLOWENTRY
  226. typedef struct _PF_FOLLOWENTRY
  227. {
  228.     char szProtocol[MAX_PROTOCOL_NAME_LEN];
  229. } PF_FOLLOWENTRY;
  230. typedef PF_FOLLOWENTRY* PPF_FOLLOWENTRY;
  231. // PF_FOLLOWSET
  232. typedef struct _PF_FOLLOWSET
  233. {
  234.     DWORD           nEntries;
  235.     PF_FOLLOWENTRY  Entry[0];
  236. } PF_FOLLOWSET;
  237. typedef PF_FOLLOWSET* PPF_FOLLOWSET;
  238. // PARSERINFO - contains information about a single parser
  239. typedef struct _PF_PARSERINFO
  240. {
  241.     char szProtocolName[MAX_PROTOCOL_NAME_LEN];
  242.     char szComment[MAX_PROTOCOL_COMMENT_LEN];
  243.     char szHelpFile[MAX_PATH];
  244.     PPF_FOLLOWSET pWhoCanPrecedeMe;
  245.     PPF_FOLLOWSET pWhoCanFollowMe;
  246.     PPF_HANDOFFSET pWhoHandsOffToMe;
  247.     PPF_HANDOFFSET pWhoDoIHandOffTo;
  248. } PF_PARSERINFO;
  249. typedef PF_PARSERINFO* PPF_PARSERINFO;
  250. // PF_PARSERDLLINFO - contains information about a single parser DLL
  251. typedef struct _PF_PARSERDLLINFO
  252. {             
  253. //    char          szDLLName[MAX_PATH];
  254.     DWORD         nParsers;
  255.     PF_PARSERINFO ParserInfo[0];
  256. } PF_PARSERDLLINFO;
  257. typedef PF_PARSERDLLINFO* PPF_PARSERDLLINFO;
  258. #pragma warning(default:4200)
  259. #pragma pack()
  260. #endif