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
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__
|