552 lines
17 KiB
C
552 lines
17 KiB
C
|
||
//=============================================================================
|
||
// MODULE: cnp.c
|
||
//
|
||
// Description:
|
||
//
|
||
// Bloodhound Parser DLL for the Cluster Network Protocol
|
||
//
|
||
// Modification History
|
||
//
|
||
// Mike Massa 03/21/97 Created
|
||
//=============================================================================
|
||
|
||
#include "precomp.h"
|
||
#pragma hdrstop
|
||
|
||
|
||
//
|
||
// Constants
|
||
//
|
||
#define CNP_VERSION_1 0x1 // original CNP
|
||
#define CNP_VERSION_2 0x2 // original CNP + multicast
|
||
|
||
#define CNP_VERSION_UNICAST CNP_VERSION_1
|
||
#define CNP_VERSION_MULTICAST CNP_VERSION_2
|
||
|
||
#define PROTOCOL_CDP 2
|
||
#define PROTOCOL_CCMP 1
|
||
|
||
#define ClusterAnyNodeId 0 // from clusdef.h
|
||
|
||
//
|
||
// Types
|
||
//
|
||
typedef struct {
|
||
UCHAR Version;
|
||
UCHAR NextHeader;
|
||
USHORT PayloadLength;
|
||
ULONG SourceAddress;
|
||
ULONG DestinationAddress;
|
||
} CNP_HEADER, *PCNP_HEADER;
|
||
|
||
//
|
||
// Multicast signature data.
|
||
//
|
||
#include <packon.h>
|
||
typedef ULONG CL_NETWORK_ID, *PCL_NETWORK_ID;
|
||
|
||
typedef struct {
|
||
UCHAR Version;
|
||
UCHAR Reserved;
|
||
USHORT PayloadOffset;
|
||
CL_NETWORK_ID NetworkId;
|
||
ULONG ClusterNetworkBrand;
|
||
USHORT SigBufferLen;
|
||
UCHAR SigBuffer[1]; // dynamic
|
||
} CNP_SIGNATURE, *PCNP_SIGNATURE;
|
||
#include <packoff.h>
|
||
|
||
//
|
||
// Data
|
||
//
|
||
LPSTR CdpName = "CDP";
|
||
LPSTR CcmpName = "CCMP";
|
||
LPSTR UnknownProtocolName = "Unknown";
|
||
|
||
|
||
//=============================================================================
|
||
// Forward references.
|
||
//=============================================================================
|
||
|
||
VOID WINAPIV CnpFormatSummary(LPPROPERTYINST lpPropertyInst);
|
||
|
||
DWORD WINAPIV CnpFormatSigData(LPPROPERTYINST lpPropertyInst);
|
||
|
||
DWORD WINAPIV CnpFormatSignature(HFRAME hFrame,
|
||
CNP_SIGNATURE UNALIGNED * CnpSig);
|
||
|
||
//=============================================================================
|
||
// CNP database.
|
||
//=============================================================================
|
||
|
||
#define CNP_SUMMARY 0
|
||
#define CNP_VERSION 1
|
||
#define CNP_NEXT_HEADER 2
|
||
#define CNP_PAYLOAD_LENGTH 3
|
||
#define CNP_SOURCE_ADDRESS 4
|
||
#define CNP_DESTINATION_ADDRESS 5
|
||
|
||
// CNP signature properties
|
||
#define CNP_SIG_SIGDATA 6
|
||
#define CNP_SIG_VERSION 7
|
||
#define CNP_SIG_PAYLOADOFFSET 8
|
||
#define CNP_SIG_NETWORK_ID 9
|
||
#define CNP_SIG_NETWORK_BRAND 10
|
||
#define CNP_SIG_SIGBUFFERLEN 11
|
||
#define CNP_SIG_SIGNATURE 12
|
||
|
||
PROPERTYINFO CnpDatabase[] =
|
||
{
|
||
{ // CNP_SUMMARY 0
|
||
0,0,
|
||
"Summary",
|
||
"Summary of the CNP packet",
|
||
PROP_TYPE_SUMMARY,
|
||
PROP_QUAL_NONE,
|
||
NULL,
|
||
132,
|
||
CnpFormatSummary},
|
||
|
||
{ // CNP_VERSION 1
|
||
0,0,
|
||
"Version",
|
||
"Version of CNP that created this packet",
|
||
PROP_TYPE_BYTE,
|
||
PROP_QUAL_NONE,
|
||
NULL,
|
||
80,
|
||
FormatPropertyInstance},
|
||
|
||
{ // CNP_NEXT_HEADER 2
|
||
0,0,
|
||
"Next Header",
|
||
"Protocol ID of the header following the CNP header",
|
||
PROP_TYPE_BYTE,
|
||
PROP_QUAL_NONE,
|
||
NULL,
|
||
80,
|
||
FormatPropertyInstance},
|
||
|
||
{ // CNP_PAYLOAD_LENGTH 3
|
||
0,0,
|
||
"Payload Length",
|
||
"Number of data bytes carried by the packet",
|
||
PROP_TYPE_WORD,
|
||
PROP_QUAL_NONE,
|
||
NULL,
|
||
80,
|
||
FormatPropertyInstance},
|
||
|
||
{ // CNP_SOURCE_ADDRESS 4
|
||
0,0,
|
||
"Source Address",
|
||
"ID of the node which originated the packet",
|
||
PROP_TYPE_DWORD,
|
||
PROP_QUAL_NONE,
|
||
NULL,
|
||
80,
|
||
FormatPropertyInstance},
|
||
|
||
{ // CNP_DESTINATION_ADDRESS 5
|
||
0,0,
|
||
"Destination Address",
|
||
"ID of the node for which the packet is destined",
|
||
PROP_TYPE_DWORD,
|
||
PROP_QUAL_NONE,
|
||
NULL,
|
||
80,
|
||
FormatPropertyInstance},
|
||
|
||
{ // CNP_SIG_SIGDATA 6
|
||
0,0,
|
||
"Signature Data",
|
||
"CNP Multicast Signature Data",
|
||
PROP_TYPE_SUMMARY,
|
||
PROP_QUAL_NONE,
|
||
NULL,
|
||
80,
|
||
CnpFormatSigData},
|
||
|
||
{ // CNP_SIG_VERSION 7
|
||
0,0,
|
||
"Signature Version",
|
||
"Identifies algorithm to sign and verify messages.",
|
||
PROP_TYPE_BYTE,
|
||
PROP_QUAL_NONE,
|
||
NULL,
|
||
80,
|
||
FormatPropertyInstance},
|
||
|
||
{ // CNP_SIG_PAYLOADOFFSET 8
|
||
0,0,
|
||
"Payload Offset",
|
||
"Offset of message payload from start of CNP signature data",
|
||
PROP_TYPE_WORD,
|
||
PROP_QUAL_NONE,
|
||
NULL,
|
||
80,
|
||
FormatPropertyInstance},
|
||
|
||
{ // CNP_SIG_NETWORK_ID 9
|
||
0,0,
|
||
"Network ID",
|
||
"Network ID number assigned by the cluster",
|
||
PROP_TYPE_DWORD,
|
||
PROP_QUAL_NONE,
|
||
NULL,
|
||
80,
|
||
FormatPropertyInstance},
|
||
|
||
{ // CNP_SIG_NETWORK_BRAND 10
|
||
0,0,
|
||
"Network Brand",
|
||
"Pseudo-random 32-bit value differentiating this "
|
||
"network from networks in other clusters",
|
||
PROP_TYPE_DWORD,
|
||
PROP_QUAL_NONE,
|
||
NULL,
|
||
80,
|
||
FormatPropertyInstance},
|
||
|
||
{ // CNP_SIG_SIGBUFFERLEN 11
|
||
0,0,
|
||
"Signature Buffer Length",
|
||
"Length of signature buffer following node data",
|
||
PROP_TYPE_WORD,
|
||
PROP_QUAL_NONE,
|
||
NULL,
|
||
80,
|
||
FormatPropertyInstance},
|
||
|
||
{ // CNP_SIG_SIGNATURE 12
|
||
0,0,
|
||
"Signature",
|
||
"Signature",
|
||
PROP_TYPE_RAW_DATA,
|
||
PROP_QUAL_NONE,
|
||
NULL,
|
||
80,
|
||
FormatPropertyInstance},
|
||
|
||
};
|
||
|
||
DWORD nCnpProperties = ((sizeof CnpDatabase) / PROPERTYINFO_SIZE);
|
||
|
||
//=============================================================================
|
||
// FUNCTION: CnpRegister()
|
||
//
|
||
// Modification History
|
||
//
|
||
// Steve Hiskey 07/07/94 Created
|
||
//=============================================================================
|
||
|
||
VOID WINAPI CnpRegister(HPROTOCOL hCnpProtocol)
|
||
{
|
||
register DWORD i;
|
||
|
||
//=========================================================================
|
||
// Create the property database.
|
||
//=========================================================================
|
||
|
||
CreatePropertyDatabase(hCnpProtocol, nCnpProperties);
|
||
|
||
for(i = 0; i < nCnpProperties; ++i)
|
||
{
|
||
AddProperty(hCnpProtocol, &CnpDatabase[i]);
|
||
}
|
||
|
||
}
|
||
|
||
//=============================================================================
|
||
// FUNCTION: Deregister()
|
||
//
|
||
// Modification History
|
||
//
|
||
// Steve Hiskey 07/07/94 Created
|
||
//=============================================================================
|
||
|
||
VOID WINAPI CnpDeregister(HPROTOCOL hCnpProtocol)
|
||
{
|
||
DestroyPropertyDatabase(hCnpProtocol);
|
||
}
|
||
|
||
//=============================================================================
|
||
// FUNCTION: CnpRecognizeFrame()
|
||
//
|
||
// Modification History
|
||
//
|
||
// Steve Hiskey 07/07/94 Created
|
||
//=============================================================================
|
||
|
||
LPBYTE WINAPI CnpRecognizeFrame(HFRAME hFrame, //... frame handle.
|
||
LPBYTE MacFrame, //... Frame pointer.
|
||
LPBYTE MyFrame, //... Relative pointer.
|
||
DWORD MacType, //... MAC type.
|
||
DWORD BytesLeft, //... 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.
|
||
{
|
||
CNP_HEADER UNALIGNED * cnpHeader = (CNP_HEADER UNALIGNED *) MyFrame;
|
||
CNP_SIGNATURE UNALIGNED * cnpSig = (CNP_SIGNATURE UNALIGNED *)(cnpHeader + 1);
|
||
LPBYTE lpNextByte;
|
||
|
||
if (cnpHeader->Version == CNP_VERSION_MULTICAST) {
|
||
lpNextByte = (LPBYTE)cnpSig + cnpSig->PayloadOffset;
|
||
} else {
|
||
lpNextByte = (LPBYTE)cnpSig;
|
||
}
|
||
|
||
if (cnpHeader->NextHeader == PROTOCOL_CDP) {
|
||
*hNextProtocol = hCdp;
|
||
*ProtocolStatusCode = PROTOCOL_STATUS_NEXT_PROTOCOL;
|
||
}
|
||
else if (cnpHeader->NextHeader == PROTOCOL_CCMP) {
|
||
*hNextProtocol = hCcmp;
|
||
*ProtocolStatusCode = PROTOCOL_STATUS_NEXT_PROTOCOL;
|
||
}
|
||
else {
|
||
*ProtocolStatusCode = PROTOCOL_STATUS_CLAIMED;
|
||
}
|
||
|
||
return lpNextByte;
|
||
}
|
||
|
||
//=============================================================================
|
||
// FUNCTION: CnpAttachProperties()
|
||
//
|
||
// Modification History
|
||
//
|
||
// Steve Hiskey 07/07/94 Created
|
||
//=============================================================================
|
||
|
||
LPBYTE WINAPI CnpAttachProperties(HFRAME hFrame,
|
||
LPBYTE Frame,
|
||
LPBYTE MyFrame,
|
||
DWORD MacType,
|
||
DWORD BytesLeft,
|
||
HPROTOCOL hPreviousProtocol,
|
||
DWORD nPreviousProtocolOffset,
|
||
DWORD InstData)
|
||
{
|
||
CNP_HEADER UNALIGNED * cnpHeader = (CNP_HEADER UNALIGNED *) MyFrame;
|
||
|
||
|
||
AttachPropertyInstance(hFrame,
|
||
CnpDatabase[CNP_SUMMARY].hProperty,
|
||
sizeof(CNP_HEADER),
|
||
cnpHeader,
|
||
0, 0, 0);
|
||
|
||
AttachPropertyInstance(hFrame,
|
||
CnpDatabase[CNP_VERSION].hProperty,
|
||
sizeof(BYTE),
|
||
&(cnpHeader->Version),
|
||
0, 1, 0);
|
||
|
||
AttachPropertyInstance(hFrame,
|
||
CnpDatabase[CNP_NEXT_HEADER].hProperty,
|
||
sizeof(BYTE),
|
||
&(cnpHeader->NextHeader),
|
||
0, 1, 0);
|
||
|
||
AttachPropertyInstance(hFrame,
|
||
CnpDatabase[CNP_PAYLOAD_LENGTH].hProperty,
|
||
sizeof(WORD),
|
||
&(cnpHeader->PayloadLength),
|
||
0, 1, 0);
|
||
|
||
AttachPropertyInstance(hFrame,
|
||
CnpDatabase[CNP_SOURCE_ADDRESS].hProperty,
|
||
sizeof(DWORD),
|
||
&(cnpHeader->SourceAddress),
|
||
0, 1, 0);
|
||
|
||
AttachPropertyInstance(hFrame,
|
||
CnpDatabase[CNP_DESTINATION_ADDRESS].hProperty,
|
||
sizeof(DWORD),
|
||
&(cnpHeader->DestinationAddress),
|
||
0, 1, 0);
|
||
|
||
if (cnpHeader->Version == CNP_VERSION_MULTICAST) {
|
||
CnpFormatSignature(hFrame,
|
||
(CNP_SIGNATURE UNALIGNED *)(cnpHeader + 1)
|
||
);
|
||
}
|
||
|
||
return NULL;
|
||
}
|
||
|
||
|
||
//==============================================================================
|
||
// FUNCTION: CnpFormatSummary()
|
||
//
|
||
// Modification History
|
||
//
|
||
// Steve Hiskey 07/07/94 Created
|
||
//==============================================================================
|
||
|
||
VOID WINAPIV CnpFormatSummary(LPPROPERTYINST lpPropertyInst)
|
||
{
|
||
LPSTR SummaryStr;
|
||
DWORD Length;
|
||
LPSTR NextHeaderStr;
|
||
CNP_HEADER UNALIGNED * cnpHeader =
|
||
(CNP_HEADER UNALIGNED *) lpPropertyInst->lpData;
|
||
|
||
|
||
if (cnpHeader->NextHeader == PROTOCOL_CDP) {
|
||
NextHeaderStr = CdpName;
|
||
}
|
||
else if (cnpHeader->NextHeader == PROTOCOL_CCMP) {
|
||
NextHeaderStr = CcmpName;
|
||
}
|
||
else {
|
||
NextHeaderStr = UnknownProtocolName;
|
||
}
|
||
|
||
Length = wsprintf( lpPropertyInst->szPropertyText,
|
||
"Src = %u; Dst = %u; Proto = %s; Payload Len = %u",
|
||
cnpHeader->SourceAddress,
|
||
cnpHeader->DestinationAddress,
|
||
NextHeaderStr,
|
||
cnpHeader->PayloadLength
|
||
);
|
||
}
|
||
|
||
|
||
//==============================================================================
|
||
// FUNCTION: CnpFormatProperties()
|
||
//
|
||
// Modification History
|
||
//
|
||
// Steve Hiskey 07/07/94 Created
|
||
//==============================================================================
|
||
|
||
DWORD WINAPI CnpFormatProperties(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;
|
||
}
|
||
|
||
//==============================================================================
|
||
// FUNCTION: CnpFormatMcastSigData()
|
||
//
|
||
// Modification History
|
||
//
|
||
// David Dion 04/16/2001 Created
|
||
//==============================================================================
|
||
|
||
DWORD WINAPIV CnpFormatSigData(LPPROPERTYINST lpPropertyInst)
|
||
{
|
||
wsprintf( lpPropertyInst->szPropertyText,
|
||
"CNP Signature Data:"
|
||
);
|
||
|
||
return NMERR_SUCCESS;
|
||
}
|
||
|
||
|
||
//==============================================================================
|
||
// FUNCTION: CnpFormatSignature()
|
||
//
|
||
// Modification History
|
||
//
|
||
// David Dion 04/16/01 Created
|
||
//==============================================================================
|
||
|
||
DWORD WINAPIV CnpFormatSignature(HFRAME hFrame,
|
||
CNP_SIGNATURE UNALIGNED * CnpSig)
|
||
{
|
||
AttachPropertyInstance(hFrame,
|
||
CnpDatabase[CNP_SIG_SIGDATA].hProperty,
|
||
CnpSig->PayloadOffset,
|
||
CnpSig,
|
||
0, 1, 0);
|
||
|
||
AttachPropertyInstance(hFrame,
|
||
CnpDatabase[CNP_SIG_VERSION].hProperty,
|
||
sizeof(UCHAR),
|
||
&(CnpSig->Version),
|
||
0, 2, 0);
|
||
|
||
AttachPropertyInstance(hFrame,
|
||
CnpDatabase[CNP_SIG_PAYLOADOFFSET].hProperty,
|
||
sizeof(WORD),
|
||
&(CnpSig->PayloadOffset),
|
||
0, 2, 0);
|
||
|
||
AttachPropertyInstance(hFrame,
|
||
CnpDatabase[CNP_SIG_NETWORK_ID].hProperty,
|
||
sizeof(DWORD),
|
||
&(CnpSig->NetworkId),
|
||
0, 2, 0);
|
||
|
||
AttachPropertyInstance(hFrame,
|
||
CnpDatabase[CNP_SIG_NETWORK_BRAND].hProperty,
|
||
sizeof(DWORD),
|
||
&(CnpSig->ClusterNetworkBrand),
|
||
0, 2, 0);
|
||
|
||
AttachPropertyInstance(hFrame,
|
||
CnpDatabase[CNP_SIG_SIGBUFFERLEN].hProperty,
|
||
sizeof(WORD),
|
||
&(CnpSig->SigBufferLen),
|
||
0, 2, 0);
|
||
|
||
AttachPropertyInstance(hFrame,
|
||
CnpDatabase[CNP_SIG_SIGNATURE].hProperty,
|
||
CnpSig->SigBufferLen,
|
||
&(CnpSig->SigBuffer[0]),
|
||
0, 2, 0);
|
||
|
||
return NMERR_SUCCESS;
|
||
}
|
||
|
||
//==============================================================================
|
||
// FUNCTION: CnpIsMulticast()
|
||
//
|
||
// Modification History
|
||
//
|
||
// David Dion 04/16/2001 Created
|
||
//==============================================================================
|
||
|
||
BOOLEAN WINAPIV CnpIsMulticast(
|
||
HPROTOCOL hPreviousProtocol, //... Previous protocol or NULL if none.
|
||
LPBYTE MacFrame, //... Frame pointer.
|
||
DWORD nPreviousProtocolOffset //... Offset of previous protocol.
|
||
)
|
||
{
|
||
CNP_HEADER UNALIGNED * cnpHeader;
|
||
|
||
cnpHeader = (CNP_HEADER UNALIGNED *)(MacFrame + nPreviousProtocolOffset);
|
||
|
||
return (BOOLEAN)(hPreviousProtocol == hCnp &&
|
||
cnpHeader->DestinationAddress == ClusterAnyNodeId
|
||
);
|
||
}
|
||
|
||
|
||
|