Leaked source code of windows server 2003
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.
 
 
 
 
 
 

526 lines
8.8 KiB

#ifndef __SDPLIB_H__
#define __SDPLIB_H__
#ifdef __cplusplus
extern "C" {
#endif
#include "sdpnode.h"
#ifndef NTSTATUS
typedef LONG NTSTATUS;
#endif
typedef UCHAR SDP_ELEMENT_HEADER;
#define SDP_TYPE_LISTHEAD (0x0021)
#define SDP_ST_CONTAINER_STREAM (0x2001)
#define SDP_ST_CONTAINER_INTERFACE (0x2002)
typedef struct _SDP_STREAM_ENTRY {
LIST_ENTRY link;
ULONG streamSize;
UCHAR stream[1];
} SDP_STREAM_ENTRY, *PSDP_STREAM_ENTRY;
typedef struct _PSM_PROTOCOL_PAIR {
GUID protocol;
USHORT psm;
} PSM_PROTOCOL_PAIR, *PPSM_PROTOCOL_PAIR;
typedef struct _PSM_LIST {
ULONG count;
PSM_PROTOCOL_PAIR list[1];
} PSM_LIST, *PPSM_LIST;
#define TYPE_BIT_SIZE (5)
#define TYPE_SHIFT_VAL (8 - TYPE_BIT_SIZE)
#define TYPE_MASK ((UCHAR) 0x1F)
#define SPECIFIC_TYPE_MASK (0x07)
#define SIZE_INDEX_MASK (SPECIFIC_TYPE_MASK)
#define SPECIFIC_TYPE_SHIFT (8)
#define SIZE_INDEX_ZERO (0)
#define SIZE_INDEX_NEXT_8_BITS (5)
#define SIZE_INDEX_NEXT_16_BITS (6)
#define SIZE_INDEX_NEXT_32_BITS (7)
#define IS_VAR_SIZE_INDEX_INVALID(si) \
((si) < SIZE_INDEX_NEXT_8_BITS || (si) > SIZE_INDEX_NEXT_32_BITS)
#define FMT_TYPE(_type) ((((_type) & TYPE_MASK) << TYPE_SHIFT_VAL))
#define FMT_SIZE_INDEX_FROM_ST(_spectype) \
(((_spectype) & (SPECIFIC_TYPE_MASK << SPECIFIC_TYPE_SHIFT)) >> \
SPECIFIC_TYPE_SHIFT)
void
SdpInitializeNodeHeader(
PSDP_NODE_HEADER Header
);
PSDP_TREE_ROOT_NODE
SdpCreateNodeTree(
void
);
NTSTATUS
SdpFreeTree(
PSDP_TREE_ROOT_NODE Tree
);
NTSTATUS
SdpFreeTreeEx(
PSDP_TREE_ROOT_NODE Tree,
UCHAR FreeRoot
);
NTSTATUS
SdpFreeOrphanedNode(
PSDP_NODE Node
);
void
SdpReleaseContainer(
ISdpNodeContainer *Container
);
PSDP_NODE
SdpCreateNode(
VOID
);
PSDP_NODE
SdpCreateNodeNil(
VOID
);
PSDP_NODE
SdpCreateNodeUInt128(
PSDP_ULARGE_INTEGER_16 puli16Val
);
PSDP_NODE
SdpCreateNodeUInt64(
ULONGLONG ullVal
);
PSDP_NODE
SdpCreateNodeUInt32(
ULONG ulVal
);
PSDP_NODE
SdpCreateNodeUInt16(
USHORT usVal
);
PSDP_NODE
SdpCreateNodeUInt8(
UCHAR ucVal
);
PSDP_NODE
SdpCreateNodeInt128(
PSDP_LARGE_INTEGER_16 uil16Val
);
PSDP_NODE
SdpCreateNodeInt64(
LONGLONG llVal
);
PSDP_NODE
SdpCreateNodeInt32(
LONG lVal
);
PSDP_NODE
SdpCreateNodeInt16(
SHORT sVal
);
PSDP_NODE
SdpCreateNodeInt8(
CHAR cVal
);
#define SdpCreateNodeUUID SdpCreateNodeUUID128
PSDP_NODE
SdpCreateNodeUUID128(
const GUID *uuid
);
PSDP_NODE
SdpCreateNodeUUID32(
ULONG uuidVal4
);
PSDP_NODE
SdpCreateNodeUUID16(
USHORT uuidVal2
);
PSDP_NODE
SdpCreateNodeString(
PCHAR string, ULONG stringLength
);
PSDP_NODE
SdpCreateNodeBoolean(
SDP_BOOLEAN bVal
);
PSDP_NODE
SdpCreateNodeSequence(
void
);
PSDP_NODE
SdpCreateNodeAlternative(
void
);
PSDP_NODE
SdpCreateNodeUrl(
PCHAR url,
ULONG urlLength
);
NTSTATUS
SdpAppendNodeToContainerNode(
PSDP_NODE Parent,
PSDP_NODE Node
);
NTSTATUS
SdpAddAttributeToTree(
PSDP_TREE_ROOT_NODE Tree,
USHORT AttribId,
PSDP_NODE AttribValue
);
NTSTATUS
SdpAddAttributeToHeader(
PSDP_NODE_HEADER Header,
USHORT AttribId,
PSDP_NODE AttribValue,
PULONG Replaced
);
NTSTATUS
SdpFindAttributeInTree(
PSDP_TREE_ROOT_NODE Tree,
USHORT AttribId,
PSDP_NODE *Attribute
);
NTSTATUS
SdpFindAttributeInStream(
PUCHAR Stream,
ULONG Size,
USHORT Attrib,
PUCHAR *PPStream,
PULONG PSize
);
NTSTATUS
SdpFindAttributeSequenceInStream(
PUCHAR Stream,
ULONG Size,
SdpAttributeRange *AttributeRange,
ULONG AttributeRangeCount,
PSDP_STREAM_ENTRY *ppEntry,
PSDP_ERROR SdpError
);
SDP_ERROR
SdpMapNtStatusToSdpError(
NTSTATUS Status
);
NTSTATUS
SdpStreamFromTree(
PSDP_TREE_ROOT_NODE Root,
PUCHAR *Stream,
PULONG Size
);
NTSTATUS
SdpStreamFromTreeEx(
PSDP_TREE_ROOT_NODE Root,
PUCHAR *Stream,
PULONG Size,
ULONG HeaderSize,
ULONG TailSize,
UCHAR PagedAllocation
);
NTSTATUS
SdpTreeFromStream(
PUCHAR Stream,
ULONG Size,
PSDP_TREE_ROOT_NODE* Node,
UCHAR FullParse
);
typedef NTSTATUS (*PSDP_STREAM_WALK_FUNC)(
PVOID Context,
UCHAR DataType,
ULONG DataSize,
PUCHAR Data
);
NTSTATUS
SdpWalkStream(
PUCHAR Stream,
ULONG Size,
PSDP_STREAM_WALK_FUNC WalkFunc,
PVOID WalkContext
);
VOID
SdpFreePool(
PVOID Memory
);
void
SdpByteSwapUuid128(
GUID *uuid128From,
GUID *uuid128To
);
void
SdpByteSwapUint128(
PSDP_ULARGE_INTEGER_16 pInUint128,
PSDP_ULARGE_INTEGER_16 pOutUint128
);
ULONGLONG
SdpByteSwapUint64(
ULONGLONG uint64
);
ULONG
SdpByteSwapUint32(
ULONG uint32
);
USHORT
SdpByteSwapUint16(
USHORT uint16
);
void
SdpRetrieveUuid128(
PUCHAR Stream,
GUID *uuidVal
);
void
SdpRetrieveUint128(
PUCHAR Stream,
PSDP_ULARGE_INTEGER_16 pUint128
);
void
SdpRetrieveUint64(
PUCHAR Stream,
PULONGLONG pUint64
);
void
SdpRetrieveUint32(
PUCHAR Stream,
PULONG pUint32
);
void
SdpRetrieveUint16(
PUCHAR Stream,
PUSHORT pUint16
);
void
SdpRetrieveVariableSize(
PUCHAR Stream,
UCHAR SizeIndex,
PULONG ElementSize,
PULONG StorageSize
);
void
SdpRetrieveUuidFromStream(
PUCHAR Stream,
ULONG DataSize,
GUID *pUuid,
UCHAR bigEndian
);
void
SdpNormalizeUuid(
PSDP_NODE pUuid,
GUID* uuid
);
NTSTATUS
SdpGetProtocolConnectInfo(
IN PUCHAR Stream,
IN ULONG StreamSize,
IN ULONG Index,
IN UCHAR IsPrimary,
OUT GUID* Protocol,
OUT PUSHORT Psm,
OUT PUCHAR IsRfcomm
);
ULONG
SdpGetNumProtocolStacks(
IN PUCHAR Stream,
IN ULONG StreamSize,
IN UCHAR IsPrimary
);
NTSTATUS
SdpValidateProtocolContainer(
PSDP_NODE pContainer,
PPSM_LIST pPsmList
);
NTSTATUS
SdpValidateVariableSize(
PUCHAR Stream,
ULONG StreamSize,
UCHAR SizeIndex,
PULONG ElementSize,
PULONG StorageSize
);
#define SDP_RETRIEVE_HEADER(_stream, _type, _sizeidx) \
{ \
(_type) = ((*(_stream)) & (TYPE_MASK << TYPE_SHIFT_VAL)) >> TYPE_SHIFT_VAL;\
(_sizeidx) = *(_stream) & SIZE_INDEX_MASK; \
}
NTSTATUS
SdpValidateStream(
PUCHAR Stream,
ULONG Size,
PULONG NumEntries,
PULONG ExtraPool,
PULONG_PTR ErrorByte
);
NTSTATUS
SdpIsStreamRecord(
PUCHAR Stream,
ULONG Size
);
#define VERIFY_SINGLE_ATTRIBUTE (0x00000001)
#define VERIFY_CHECK_MANDATORY_LOCAL (0x00000002)
#define VERIFY_CHECK_MANDATORY_REMOTE (0x00000004)
#define VERIFY_STREAM_IS_ATTRIBUTE_VALUE (0x00000008)
#define VERIFY_CHECK_MANDATORY_ALL \
(VERIFY_CHECK_MANDATORY_LOCAL | VERIFY_CHECK_MANDATORY_REMOTE)
NTSTATUS
SdpVerifyServiceRecord(
PUCHAR Stream,
ULONG Size,
ULONG Flags,
PUSHORT AttribId
);
NTSTATUS
SdpVerifySequenceOf(
PUCHAR Stream,
ULONG Size,
UCHAR OfType,
PUCHAR SpecSizes,
PULONG NumFound,
PSDP_STREAM_WALK_FUNC Func,
PVOID Context
);
VOID
SdpGetNextElement(
PUCHAR Stream,
ULONG StreamSize,
PUCHAR CurrentElement,
PUCHAR* NextElement,
PULONG NextElementSize
);
typedef struct _SDP_ATTRIBUTE_INFO {
PUCHAR AttributeStream;
ULONG AttributeStreamSize;
USHORT AttributeId;
} SDP_ATTRIBUTE_INFO, *PSDP_ATTRIBUTE_INFO;
VOID
Sdp_InitializeListHead(
PLIST_ENTRY ListHead
);
UCHAR
Sdp_IsListEmpty(
PLIST_ENTRY ListHead
);
PLIST_ENTRY
Sdp_RemoveHeadList(
PLIST_ENTRY ListHead
);
VOID
Sdp_RemoveEntryList(
PLIST_ENTRY Entry
);
VOID
Sdp_InsertEntryList(
PLIST_ENTRY Previous,
PLIST_ENTRY Entry
);
NTSTATUS
SdpNodeToStream(
PSDP_NODE Node,
PUCHAR Stream
);
NTSTATUS
SdpComputeNodeListSize(
PSDP_NODE Node,
PULONG Size
);
UCHAR
SdpGetContainerHeaderSize(
ULONG ContainerSize
);
PUCHAR
SdpWriteVariableSizeToStream(
UCHAR Type,
ULONG DataSize,
PUCHAR Stream
);
PUCHAR
SdpWriteLeafToStream(
PSDP_NODE Node,
PUCHAR Stream
);
#define IsEqualUuid(u1, u2) (RtlEqualMemory((u1), (u2), sizeof(GUID)))
#ifdef __cplusplus
};
#endif
#endif // __SDPLIB_H__