mirror of https://github.com/tongzx/nt5src
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
330 lines
9.8 KiB
330 lines
9.8 KiB
|
|
//=============================================================================
|
|
// 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;
|
|
}
|
|
|