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.
178 lines
5.1 KiB
178 lines
5.1 KiB
/*++
|
|
|
|
Copyright (c) 1989-1993 Microsoft Corporation
|
|
|
|
Module Name:
|
|
|
|
spxutils.h
|
|
|
|
Abstract:
|
|
|
|
|
|
Author:
|
|
|
|
Nikhil Kamkolkar (nikhilk) 11-November-1993
|
|
|
|
Environment:
|
|
|
|
Kernel mode
|
|
|
|
Revision History:
|
|
|
|
|
|
--*/
|
|
|
|
// For PROTO_SPX, i'd return a device name from the dll of the form
|
|
// \Device\NwlnkSpx\SpxStream (for SOCK_STREAM) or
|
|
// \Device\NwlnkSpx\Spx (for SOCK_SEQPKT)
|
|
//
|
|
// and for PROTO_SPXII (the more common case we hope, even if
|
|
// internally we degrade to SPX1 cause of the remote client's
|
|
// limitations)
|
|
// \Device\NwlnkSpx\Stream (for SOCK_STREAM) or
|
|
// \Device\NwlnkSpx (for SOCK_SEQPKT)
|
|
|
|
#define SOCKET1STREAM_SUFFIX L"\\SpxStream"
|
|
#define SOCKET1_SUFFIX L"\\Spx"
|
|
#define SOCKET2STREAM_SUFFIX L"\\Stream"
|
|
#define SOCKET1_TYPE_SEQPKT 0
|
|
#define SOCKET2_TYPE_SEQPKT 1
|
|
#define SOCKET1_TYPE_STREAM 2
|
|
#define SOCKET2_TYPE_STREAM 3
|
|
|
|
#define IN_RANGE(_S, _RangeStart, _RangeEnd) \
|
|
((_S >= _RangeStart) && (_S <= _RangeEnd))
|
|
|
|
|
|
//
|
|
// The following macros deal with on-the-wire integer and long values
|
|
//
|
|
// On the wire format is big-endian i.e. a long value of 0x01020304 is
|
|
// represented as 01 02 03 04. Similarly an int value of 0x0102 is
|
|
// represented as 01 02.
|
|
//
|
|
// The host format is not assumed since it will vary from processor to
|
|
// processor.
|
|
//
|
|
|
|
// Get a byte from on-the-wire format to a short in the host format
|
|
#define GETBYTE2SHORT(DstPtr, SrcPtr) \
|
|
*(PUSHORT)(DstPtr) = (USHORT) (*(PBYTE)(SrcPtr))
|
|
|
|
// Get a byte from on-the-wire format to a short in the host format
|
|
#define GETBYTE2ULONG(DstPtr, SrcPtr) \
|
|
*(PULONG)(DstPtr) = (ULONG) (*(PBYTE)(SrcPtr))
|
|
|
|
// Get a short from on-the-wire format to a dword in the host format
|
|
#define GETSHORT2ULONG(DstPtr, SrcPtr) \
|
|
*(PULONG)(DstPtr) = ((*((PBYTE)(SrcPtr)+0) << 8) + \
|
|
(*((PBYTE)(SrcPtr)+1) ))
|
|
|
|
// Get a short from on-the-wire format to a dword in the host format
|
|
#define GETSHORT2SHORT(DstPtr, SrcPtr) \
|
|
*(PUSHORT)(DstPtr) = ((*((PBYTE)(SrcPtr)+0) << 8) + \
|
|
(*((PBYTE)(SrcPtr)+1) ))
|
|
|
|
// Get a dword from on-the-wire format to a dword in the host format
|
|
#define GETULONG2ULONG(DstPtr, SrcPtr) \
|
|
*(PULONG)(DstPtr) = ((*((PBYTE)(SrcPtr)+0) << 24) + \
|
|
(*((PBYTE)(SrcPtr)+1) << 16) + \
|
|
(*((PBYTE)(SrcPtr)+2) << 8) + \
|
|
(*((PBYTE)(SrcPtr)+3) ))
|
|
|
|
// Get a dword from on-the-wire format to a dword in the same format but
|
|
// also watch out for alignment
|
|
#define GETULONG2ULONG_NOCONV(DstPtr, SrcPtr) \
|
|
*((PBYTE)(DstPtr)+0) = *((PBYTE)(SrcPtr)+0); \
|
|
*((PBYTE)(DstPtr)+1) = *((PBYTE)(SrcPtr)+1); \
|
|
*((PBYTE)(DstPtr)+2) = *((PBYTE)(SrcPtr)+2); \
|
|
*((PBYTE)(DstPtr)+3) = *((PBYTE)(SrcPtr)+3);
|
|
|
|
// Put a dword from the host format to a short to on-the-wire format
|
|
#define PUTBYTE2BYTE(DstPtr, Src) \
|
|
*((PBYTE)(DstPtr)) = (BYTE)(Src)
|
|
|
|
// Put a dword from the host format to a short to on-the-wire format
|
|
#define PUTSHORT2BYTE(DstPtr, Src) \
|
|
*((PBYTE)(DstPtr)) = ((USHORT)(Src) % 256)
|
|
|
|
// Put a dword from the host format to a short to on-the-wire format
|
|
#define PUTSHORT2SHORT(DstPtr, Src) \
|
|
*((PBYTE)(DstPtr)+0) = (BYTE) ((USHORT)(Src) >> 8), \
|
|
*((PBYTE)(DstPtr)+1) = (BYTE)(Src)
|
|
|
|
// Put a dword from the host format to a byte to on-the-wire format
|
|
#define PUTULONG2BYTE(DstPtr, Src) \
|
|
*(PBYTE)(DstPtr) = (BYTE)(Src)
|
|
|
|
// Put a dword from the host format to a short to on-the-wire format
|
|
#define PUTULONG2SHORT(DstPtr, Src) \
|
|
*((PBYTE)(DstPtr)+0) = (BYTE) ((ULONG)(Src) >> 8), \
|
|
*((PBYTE)(DstPtr)+1) = (BYTE) (Src)
|
|
|
|
// Put a dword from the host format to a dword to on-the-wire format
|
|
#define PUTULONG2ULONG(DstPtr, Src) \
|
|
*((PBYTE)(DstPtr)+0) = (BYTE) ((ULONG)(Src) >> 24), \
|
|
*((PBYTE)(DstPtr)+1) = (BYTE) ((ULONG)(Src) >> 16), \
|
|
*((PBYTE)(DstPtr)+2) = (BYTE) ((ULONG)(Src) >> 8), \
|
|
*((PBYTE)(DstPtr)+3) = (BYTE) (Src)
|
|
|
|
// Put a BYTE[4] array into another BYTE4 array.
|
|
#define PUTBYTE42BYTE4(DstPtr, SrcPtr) \
|
|
*((PBYTE)(DstPtr)+0) = *((PBYTE)(SrcPtr)+0), \
|
|
*((PBYTE)(DstPtr)+1) = *((PBYTE)(SrcPtr)+1), \
|
|
*((PBYTE)(DstPtr)+2) = *((PBYTE)(SrcPtr)+2), \
|
|
*((PBYTE)(DstPtr)+3) = *((PBYTE)(SrcPtr)+3)
|
|
|
|
// MIN/MAX macros
|
|
#define MIN(a, b) (((a) < (b)) ? (a) : (b))
|
|
#define MAX(a, b) (((a) > (b)) ? (a) : (b))
|
|
|
|
|
|
|
|
|
|
// Exported prototypes
|
|
|
|
UINT
|
|
SpxUtilWstrLength(
|
|
IN PWSTR Wstr);
|
|
|
|
LONG
|
|
SpxRandomNumber(
|
|
VOID);
|
|
|
|
NTSTATUS
|
|
SpxUtilGetSocketType(
|
|
PUNICODE_STRING RemainingFileName,
|
|
PBYTE SocketType);
|
|
|
|
VOID
|
|
SpxSleep(
|
|
IN ULONG TimeInMs);
|
|
|
|
ULONG
|
|
SpxBuildTdiAddress(
|
|
IN PVOID AddressBuffer,
|
|
IN ULONG AddressBufferLength,
|
|
IN UCHAR Network[4],
|
|
IN UCHAR Node[6],
|
|
IN USHORT Socket);
|
|
|
|
VOID
|
|
SpxBuildTdiAddressFromIpxAddr(
|
|
IN PVOID AddressBuffer,
|
|
IN PBYTE pIpxAddr);
|
|
|
|
TDI_ADDRESS_IPX UNALIGNED *
|
|
SpxParseTdiAddress(
|
|
IN TRANSPORT_ADDRESS UNALIGNED * TransportAddress);
|
|
|
|
BOOLEAN
|
|
SpxValidateTdiAddress(
|
|
IN TRANSPORT_ADDRESS UNALIGNED * TransportAddress,
|
|
IN ULONG TransportAddressLength);
|
|
|
|
VOID
|
|
SpxCalculateNewT1(
|
|
IN struct _SPX_CONN_FILE * pSpxConnFile,
|
|
IN int NewT1);
|