//============================================================================= // MODULE: cdp.c // // Description: // // Bloodhound Parser DLL for the Cluster Datagram Protocol // // Modification History // // Mike Massa 03/21/97 Created //============================================================================= #include "precomp.h" #pragma hdrstop // // Constants // // // Types // typedef struct { USHORT SourcePort; USHORT DestinationPort; USHORT PayloadLength; USHORT Checksum; } CDP_HEADER, *PCDP_HEADER; // // Data // //============================================================================= // Forward references. //============================================================================= VOID WINAPIV CdpFormatSummary(LPPROPERTYINST lpPropertyInst); //============================================================================= // CDP database. //============================================================================= #define CDP_SUMMARY 0 #define CDP_SOURCE_PORT 1 #define CDP_DESTINATION_PORT 2 #define CDP_PAYLOAD_LENGTH 3 #define CDP_RESERVED 4 #define CDP_DATA 5 PROPERTYINFO CdpDatabase[] = { { // CDP_SUMMARY 0 0,0, "Summary", "Summary of the CDP packet", PROP_TYPE_SUMMARY, PROP_QUAL_NONE, NULL, 132, CdpFormatSummary}, { // CDP_SOURCE_PORT 1 0,0, "Source Port", "Endpoint from which the packet originated", PROP_TYPE_WORD, PROP_QUAL_NONE, NULL, 80, FormatPropertyInstance}, { // CDP_DESTINATION_PORT 2 0,0, "Destination Port", "Endpoint for which the packet is destined", PROP_TYPE_WORD, PROP_QUAL_NONE, NULL, 80, FormatPropertyInstance}, { // CDP_PAYLOAD_LENGTH 3 0,0, "Payload Length", "Number of data bytes carried by the packet", PROP_TYPE_WORD, PROP_QUAL_NONE, NULL, 80, FormatPropertyInstance}, { // CDP_RESERVED 4 0,0, "Reserved", "Reserved field", PROP_TYPE_WORD, PROP_QUAL_NONE, NULL, 80, FormatPropertyInstance}, { // CDP_DATA 5 0,0, "Data", "Amount of data in this datagram", PROP_TYPE_RAW_DATA, PROP_QUAL_NONE, NULL, 80, FormatPropertyInstance}, }; DWORD nCdpProperties = ((sizeof CdpDatabase) / PROPERTYINFO_SIZE); //============================================================================= // FUNCTION: CdpRegister() // // Modification History // // Steve Hiskey 07/07/94 Created //============================================================================= VOID WINAPI CdpRegister(HPROTOCOL hCdpProtocol) { register DWORD i; //========================================================================= // Create the property database. //========================================================================= CreatePropertyDatabase(hCdpProtocol, nCdpProperties); for(i = 0; i < nCdpProperties; ++i) { AddProperty(hCdpProtocol, &CdpDatabase[i]); } } //============================================================================= // FUNCTION: Deregister() // // Modification History // // Steve Hiskey 07/07/94 Created //============================================================================= VOID WINAPI CdpDeregister(HPROTOCOL hCdpProtocol) { DestroyPropertyDatabase(hCdpProtocol); } //============================================================================= // FUNCTION: CdpRecognizeFrame() // // Modification History // // Steve Hiskey 07/07/94 Created //============================================================================= LPBYTE WINAPI CdpRecognizeFrame(HFRAME hFrame, //... frame handle. LPBYTE MacFrame, //... Frame pointer. LPBYTE MyFrame, //... Relative pointer. DWORD MacType, //... MAC type. DWORD MyBytesLeft, //... Bytes left. HPROTOCOL hPreviousProtocol, //... Previous protocol or NULL if none. DWORD nPreviousProtocolOffset, //... Offset of previous protocol. LPDWORD ProtocolStatusCode, //... Pointer to return status code in. LPHPROTOCOL hNextProtocol, //... Next protocol to call (optional). LPDWORD InstData) //... Next protocol instance data. { CDP_HEADER UNALIGNED * cdpHeader = (CDP_HEADER UNALIGNED *) MyFrame; LPBYTE lpNextByte = (LPBYTE) (cdpHeader + 1); if (MyBytesLeft > sizeof(CDP_HEADER)) { MyBytesLeft -= sizeof(CDP_HEADER); if ( (cdpHeader->SourcePort == 1) || (cdpHeader->DestinationPort == 1) ) { // // This is a regroup packet. // *hNextProtocol = hRGP; *ProtocolStatusCode = PROTOCOL_STATUS_NEXT_PROTOCOL; } else { // // This is probably an RPC packet. Let the follow set // have it. // *hNextProtocol = NULL; *ProtocolStatusCode = PROTOCOL_STATUS_RECOGNIZED; } } else { *ProtocolStatusCode = PROTOCOL_STATUS_CLAIMED; } return lpNextByte; } //============================================================================= // FUNCTION: CdpAttachProperties() // // Modification History // // Steve Hiskey 07/07/94 Created //============================================================================= LPBYTE WINAPI CdpAttachProperties(HFRAME hFrame, LPBYTE Frame, LPBYTE MyFrame, DWORD MacType, DWORD BytesLeft, HPROTOCOL hPreviousProtocol, DWORD nPreviousProtocolOffset, DWORD InstData) { CDP_HEADER UNALIGNED * cdpHeader = (CDP_HEADER UNALIGNED *) MyFrame; AttachPropertyInstance(hFrame, CdpDatabase[CDP_SUMMARY].hProperty, sizeof(CDP_HEADER), cdpHeader, 0, 0, 0); AttachPropertyInstance(hFrame, CdpDatabase[CDP_SOURCE_PORT].hProperty, sizeof(WORD), &(cdpHeader->SourcePort), 0, 1, 0); AttachPropertyInstance(hFrame, CdpDatabase[CDP_DESTINATION_PORT].hProperty, sizeof(WORD), &(cdpHeader->DestinationPort), 0, 1, 0); AttachPropertyInstance(hFrame, CdpDatabase[CDP_PAYLOAD_LENGTH].hProperty, sizeof(WORD), &(cdpHeader->PayloadLength), 0, 1, 0); AttachPropertyInstance(hFrame, CdpDatabase[CDP_RESERVED].hProperty, sizeof(WORD), &(cdpHeader->Checksum), 0, 1, 0); AttachPropertyInstance(hFrame, CdpDatabase[CDP_DATA].hProperty, BytesLeft - sizeof(CDP_HEADER), (LPBYTE)cdpHeader + sizeof(CDP_HEADER), 0, 1, 0); return NULL; } //============================================================================== // FUNCTION: CdpFormatSummary() // // Modification History // // Steve Hiskey 07/07/94 Created //============================================================================== VOID WINAPIV CdpFormatSummary(LPPROPERTYINST lpPropertyInst) { LPSTR SummaryStr; DWORD Length; CDP_HEADER UNALIGNED * cdpHeader = (CDP_HEADER UNALIGNED *) lpPropertyInst->lpData; Length = wsprintf( lpPropertyInst->szPropertyText, "Src Port = %u; Dst Port = %u; Payload Length = %u", cdpHeader->SourcePort, cdpHeader->DestinationPort, cdpHeader->PayloadLength ); } //============================================================================== // FUNCTION: CdpFormatProperties() // // Modification History // // Steve Hiskey 07/07/94 Created //============================================================================== DWORD WINAPI CdpFormatProperties(HFRAME hFrame, LPBYTE MacFrame, LPBYTE FrameData, DWORD nPropertyInsts, LPPROPERTYINST p) { //========================================================================= // Format each property in the property instance table. // // The property-specific instance data was used to store the address of a // property-specific formatting function so all we do here is call each // function via the instance data pointer. //========================================================================= while (nPropertyInsts--) { ((FORMAT) p->lpPropertyInfo->InstanceData)(p); p++; } return NMERR_SUCCESS; }