Source code of Windows XP (NT5)
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.
 
 
 
 
 
 

1652 lines
36 KiB

/*++
Copyright (c) 1995-1997 Microsoft Corporation
Module Name:
clusrtl.h
Abstract:
Header file for definitions and structures for the NT Cluster
Run Time Library
Author:
John Vert (jvert) 30-Nov-1995
Revision History:
--*/
#ifndef _CLUSRTL_INCLUDED_
#define _CLUSRTL_INCLUDED_
#ifdef __cplusplus
extern "C" {
#endif
//
// Service Message IDs
//
#include "clusvmsg.h"
#include "resapi.h"
#include <aclapi.h>
//
// Routine Description:
//
// Initializes the cluster run time library.
//
// Arguments:
//
// RunningAsService - TRUE if the process is running as an NT service.
// FALSE if running as a console app.
//
// Return Value:
//
// ERROR_SUCCESS if the function succeeds.
// A Win32 error code otherwise.
//
DWORD
ClRtlInitialize(
IN BOOLEAN RunningAsService
);
//
// Routine Description:
//
// Cleans up the cluster run time library.
//
// Arguments:
//
// RunningAsService - TRUE if the process is running as an NT service.
// FALSE if running as a console app.
//
// Return Value:
//
// None.
//
VOID
ClRtlCleanup(
VOID
);
//////////////////////////////////////////////////////////////////////////
//
// Event logging interfaces
//
//
// There are three currently defined logging levels:
// LOG_CRITICAL - fatal error, chaos and destruction will ensue
// LOG_UNUSUAL - unexpected event, but will be handled
// LOG_NOISE - normal occurence
//
//////////////////////////////////////////////////////////////////////////
#define LOG_CRITICAL 1
#define LOG_UNUSUAL 2
#define LOG_NOISE 3
//
// A few interfaces for reporting of errors.
//
VOID
ClRtlLogInit(
VOID
);
VOID
ClusterLogFatalError(
IN ULONG LogModule,
IN ULONG Line,
IN LPSTR File,
IN ULONG ErrCode
);
VOID
ClusterLogNonFatalError(
IN ULONG LogModule,
IN ULONG Line,
IN LPSTR File,
IN ULONG ErrCode
);
VOID
ClusterLogAssertionFailure(
IN ULONG LogModule,
IN ULONG Line,
IN LPSTR File,
IN LPSTR Expression
);
VOID
ClusterLogEvent0(
IN DWORD LogLevel,
IN DWORD LogModule,
IN LPSTR FileName,
IN DWORD LineNumber,
IN DWORD MessageId,
IN DWORD dwByteCount,
IN PVOID lpBytes
);
VOID
ClusterLogEvent1(
IN DWORD LogLevel,
IN DWORD LogModule,
IN LPSTR FileName,
IN DWORD LineNumber,
IN DWORD MessageId,
IN DWORD dwByteCount,
IN PVOID lpBytes,
IN LPCWSTR Arg1
);
VOID
ClusterLogEvent2(
IN DWORD LogLevel,
IN DWORD LogModule,
IN LPSTR FileName,
IN DWORD LineNumber,
IN DWORD MessageId,
IN DWORD dwByteCount,
IN PVOID lpBytes,
IN LPCWSTR Arg1,
IN LPCWSTR Arg2
);
VOID
ClusterLogEvent3(
IN DWORD LogLevel,
IN DWORD LogModule,
IN LPSTR FileName,
IN DWORD LineNumber,
IN DWORD MessageId,
IN DWORD dwByteCount,
IN PVOID lpBytes,
IN LPCWSTR Arg1,
IN LPCWSTR Arg2,
IN LPCWSTR Arg3
);
//
// Routine Description:
//
// Prints a message to the debug terminal if running as a service
// or the console window if running as a console app.
//
// Arguments:
//
// FormatString - Message string.
//
// Any FormatMessage-compatible arguments to be inserted in the
// ErrorMessage before it is logged.
//
// Return Value:
//
// None.
//
VOID
ClRtlDbgPrint(
PCHAR FormatString,
...
);
//
// Same as ClRtlDbgPrint, only uses a message ID instead of a string.
//
VOID
ClRtlMsgPrint(
IN DWORD MessageId,
...
);
//
// Same as ClRtlDbgPrint, only logs to a file instead of screen.
//
VOID
ClRtlLogPrint(
PCHAR FormatString,
...
);
//
// Macros/prototypes for unexpected error handling.
//
#define ARGUMENT_PRESENT( ArgumentPointer ) (\
(CHAR *)(ArgumentPointer) != (CHAR *)(NULL) )
#define CL_UNEXPECTED_ERROR(_errcode_) \
ClusterLogFatalError(LOG_CURRENT_MODULE, \
__LINE__, \
__FILE__, \
(_errcode_))
WINBASEAPI
BOOL
APIENTRY
IsDebuggerPresent(
VOID
);
#define CL_ASSERT( exp ) \
if (!(exp)) { \
ClusterLogAssertionFailure(LOG_CURRENT_MODULE, \
__LINE__, \
__FILE__, \
#exp); \
}
#define CL_LOGFAILURE( _errcode_ ) \
ClusterLogNonFatalError(LOG_CURRENT_MODULE, \
__LINE__, \
__FILE__, \
(_errcode_))
// Use the following to put cluster specific errors in the event log
#define CL_LOGCLUSERROR( _errcode_ ) \
ClusterLogEvent0(LOG_CRITICAL, \
LOG_CURRENT_MODULE, \
__FILE__, \
__LINE__, \
(_errcode_), \
0, \
NULL)
#define CL_LOGCLUSWARNING( _errcode_ ) \
ClusterLogEvent0(LOG_UNUSUAL, \
LOG_CURRENT_MODULE, \
__FILE__, \
__LINE__, \
(_errcode_), \
0, \
NULL)
#define CL_LOGCLUSWARNING1(_msgid_,_arg1_) \
ClusterLogEvent1(LOG_UNUSUAL, \
LOG_CURRENT_MODULE, \
__FILE__, \
__LINE__, \
(_msgid_), \
0, \
NULL, \
(_arg1_))
#define CL_LOGCLUSERROR1(_msgid_,_arg1_) \
ClusterLogEvent1(LOG_CRITICAL, \
LOG_CURRENT_MODULE, \
__FILE__, \
__LINE__, \
(_msgid_), \
0, \
NULL, \
(_arg1_))
//////////////////////////////////////////////////////////////////////////
//
// Doubly-linked list manipulation routines. Implemented as macros
// but logically these are procedures. Stolen from ntrtl.h
//
//////////////////////////////////////////////////////////////////////////
//
// VOID
// InitializeListHead(
// PLIST_ENTRY ListHead
// );
//
#define InitializeListHead(ListHead) (\
(ListHead)->Flink = (ListHead)->Blink = (ListHead))
//
// BOOLEAN
// IsListEmpty(
// PLIST_ENTRY ListHead
// );
//
#define IsListEmpty(ListHead) \
((ListHead)->Flink == (ListHead))
//
// PLIST_ENTRY
// RemoveHeadList(
// PLIST_ENTRY ListHead
// );
//
#define RemoveHeadList(ListHead) \
(ListHead)->Flink;\
{RemoveEntryList((ListHead)->Flink)}
//
// PLIST_ENTRY
// RemoveTailList(
// PLIST_ENTRY ListHead
// );
//
#define RemoveTailList(ListHead) \
(ListHead)->Blink;\
{RemoveEntryList((ListHead)->Blink)}
//
// VOID
// RemoveEntryList(
// PLIST_ENTRY Entry
// );
//
#define RemoveEntryList(Entry) {\
PLIST_ENTRY _EX_Blink;\
PLIST_ENTRY _EX_Flink;\
_EX_Flink = (Entry)->Flink;\
_EX_Blink = (Entry)->Blink;\
_EX_Blink->Flink = _EX_Flink;\
_EX_Flink->Blink = _EX_Blink;\
}
//
// VOID
// InsertTailList(
// PLIST_ENTRY ListHead,
// PLIST_ENTRY Entry
// );
//
#define InsertTailList(ListHead,Entry) {\
PLIST_ENTRY _EX_Blink;\
PLIST_ENTRY _EX_ListHead;\
_EX_ListHead = (ListHead);\
_EX_Blink = _EX_ListHead->Blink;\
(Entry)->Flink = _EX_ListHead;\
(Entry)->Blink = _EX_Blink;\
_EX_Blink->Flink = (Entry);\
_EX_ListHead->Blink = (Entry);\
}
//
// VOID
// InsertHeadList(
// PLIST_ENTRY ListHead,
// PLIST_ENTRY Entry
// );
//
#define InsertHeadList(ListHead,Entry) {\
PLIST_ENTRY _EX_Flink;\
PLIST_ENTRY _EX_ListHead;\
_EX_ListHead = (ListHead);\
_EX_Flink = _EX_ListHead->Flink;\
(Entry)->Flink = _EX_Flink;\
(Entry)->Blink = _EX_ListHead;\
_EX_Flink->Blink = (Entry);\
_EX_ListHead->Flink = (Entry);\
}
//
// Singly-linked list manipulation routines. Implemented as macros
// but logically these are procedures. Stolen from ntrtl.h
//
//
//
// PSINGLE_LIST_ENTRY
// PopEntryList(
// PSINGLE_LIST_ENTRY ListHead
// );
//
#define PopEntryList(ListHead) \
(ListHead)->Next;\
{\
PSINGLE_LIST_ENTRY FirstEntry;\
FirstEntry = (ListHead)->Next;\
if (FirstEntry != NULL) { \
(ListHead)->Next = FirstEntry->Next;\
} \
}
//
// VOID
// PushEntryList(
// PSINGLE_LIST_ENTRY ListHead,
// PSINGLE_LIST_ENTRY Entry
// );
//
#define PushEntryList(ListHead,Entry) \
(Entry)->Next = (ListHead)->Next; \
(ListHead)->Next = (Entry)
//////////////////////////////////////////////////////////////////////////
//
// General-purpose queue package.
//
//////////////////////////////////////////////////////////////////////////
typedef struct _CL_QUEUE {
LIST_ENTRY ListHead;
CRITICAL_SECTION Lock;
HANDLE Event;
DWORD Count;
HANDLE Abort;
} CL_QUEUE, *PCL_QUEUE;
DWORD
ClRtlInitializeQueue(
IN PCL_QUEUE Queue
);
VOID
ClRtlDeleteQueue(
IN PCL_QUEUE Queue
);
PLIST_ENTRY
ClRtlRemoveHeadQueue(
IN PCL_QUEUE Queue
);
PLIST_ENTRY
ClRtlRemoveHeadQueueTimeout(
IN PCL_QUEUE Queue,
IN DWORD dwMilliseconds
);
VOID
ClRtlInsertTailQueue(
IN PCL_QUEUE Queue,
IN PLIST_ENTRY Item
);
VOID
ClRtlRundownQueue(
IN PCL_QUEUE Queue,
OUT PLIST_ENTRY ListHead
);
//////////////////////////////////////////////////////////////////////////
//
// General-purpose buffer pool package.
//
//////////////////////////////////////////////////////////////////////////
//
// Buffer pool definition.
//
typedef struct _CLRTL_BUFFER_POOL *PCLRTL_BUFFER_POOL;
//
// Maximum number of buffers that can be allocated from a pool.
//
#define CLRTL_MAX_POOL_BUFFERS 0xFFFFFFFE
//
// Routines for utilizing buffer pools.
//
typedef
DWORD
(*CLRTL_BUFFER_CONSTRUCTOR)(
PVOID Buffer
);
/*++
Routine Description:
Called to initialize a buffer which has been newly allocated
from system memory.
Arguments:
Buffer - A pointer to the buffer to initialize.
Return Value:
ERROR_SUCCESS if the initialization succeeded.
A Win32 error code if the initialization failed.
--*/
typedef
VOID
(*CLRTL_BUFFER_DESTRUCTOR)(
PVOID Buffer
);
/*++
Routine Description:
Called to cleanup a buffer which is about to be returned to
system memory.
Arguments:
Buffer - A pointer to the buffer to cleanup.
Return Value:
None.
--*/
PCLRTL_BUFFER_POOL
ClRtlCreateBufferPool(
IN DWORD BufferSize,
IN DWORD MaximumCached,
IN DWORD MaximumAllocated,
IN CLRTL_BUFFER_CONSTRUCTOR Constructor, OPTIONAL
IN CLRTL_BUFFER_DESTRUCTOR Destructor OPTIONAL
);
/*++
Routine Description:
Creates a pool from which fixed-size buffers may be allocated.
Arguments:
BufferSize - Size of the buffers managed by the pool.
MaximumCached - The maximum number of buffers to cache in the pool.
Must be less than or equal to MaximumAllocated.
MaximumAllocated - The maximum number of buffers to allocate from
system memory. Must be less than or equal to
CLRTL_MAX_POOL_BUFFERS.
Constructor - An optional routine to be called when a new buffer
is allocated from system memory. May be NULL
Destructor - An optional routine to be called when a buffer
is returned to system memory. May be NULL.
Return Value:
A pointer to the created buffer pool or NULL on error.
Extended error information is available from GetLastError().
--*/
VOID
ClRtlDestroyBufferPool(
IN PCLRTL_BUFFER_POOL Pool
);
/*++
Routine Description:
Destroys a previously created buffer pool.
Arguments:
Pool - A pointer to the pool to destroy.
Return Value:
None.
Notes:
The pool will not actually be destroyed until all outstanding
buffers have been returned. Each outstanding buffer is effectively
a reference on the pool.
--*/
PVOID
ClRtlAllocateBuffer(
IN PCLRTL_BUFFER_POOL Pool
);
/*++
Routine Description:
Allocates a buffer from a previously created buffer pool.
Arguments:
Pool - A pointer to the pool from which to allocate the buffer.
Return Value:
A pointer to the allocated buffer if the routine was successfull.
NULL if the routine failed. Extended error information is available
by calling GetLastError().
--*/
VOID
ClRtlFreeBuffer(
PVOID Buffer
);
/*++
Routine Description:
Frees a buffer back to its owning pool.
Arguments:
Buffer - The buffer to free.
Return Value:
None.
--*/
//////////////////////////////////////////////////////////////////////////
//
// General-purpose worker thread queue package.
//
//////////////////////////////////////////////////////////////////////////
typedef struct _CLRTL_WORK_ITEM *PCLRTL_WORK_ITEM;
typedef
VOID
(*PCLRTL_WORK_ROUTINE)(
IN PCLRTL_WORK_ITEM WorkItem,
IN DWORD Status,
IN DWORD BytesTransferred,
IN DWORD IoContext
);
/*++
Routine Description:
Called to process an item posted to a work queue.
Arguments:
WorkItem - The work item to process.
Status - If the work item represents a completed I/O operation,
this parameter contains the completion status of the
operation.
BytesTransferred - If the work item represents a completed I/O operation,
this parameter contains the number of bytes tranferred
during the operation. For other work items, the
semantics of this parameter are defined by the caller
of ClRtlPostItemWorkQueue.
IoContext - If the work item represents a completed I/O operation,
this parameter contains the context value associated
with the handle on which the I/O was submitted. For
other work items, the semantics of this parameter are
defined by the caller of ClRtlPostItemWorkQueue.
Return Value:
None.
--*/
//
// Work Item Structure.
//
typedef struct _CLRTL_WORK_ITEM {
OVERLAPPED Overlapped;
PCLRTL_WORK_ROUTINE WorkRoutine;
PVOID Context;
} CLRTL_WORK_ITEM;
//
// Work queue definition.
//
typedef struct _CLRTL_WORK_QUEUE *PCLRTL_WORK_QUEUE;
//
// Routines For Utilizing Work Queues
//
#define ClRtlInitializeWorkItem(Item, Routine, Ctx) \
ZeroMemory(&((Item)->Overlapped), sizeof(OVERLAPPED)); \
(Item)->WorkRoutine = (Routine); \
(Item)->Context = (Ctx);
PCLRTL_WORK_QUEUE
ClRtlCreateWorkQueue(
IN DWORD MaximumThreads,
IN int ThreadPriority
);
/*++
Routine Description:
Creates a work queue and a dynamic pool of threads to service it.
Arguments:
MaximumThreads - The maximum number of threads to create to service
the queue.
ThreadPriority - The priority level at which the queue worker threads
should run.
Return Value:
A pointer to the created queue if the routine is successful.
NULL if the routine fails. Call GetLastError for extended
error information.
--*/
VOID
ClRtlDestroyWorkQueue(
IN PCLRTL_WORK_QUEUE WorkQueue
);
/*++
Routine Description:
Destroys a work queue and its thread pool.
Arguments:
WorkQueue - The queue to destroy.
Return Value:
None.
Notes:
The following rules must be observed in order to safely destroy a
work queue:
1) No new work items may be posted to the queue once all previously
posted items have been processed by this routine.
2) WorkRoutines must be able to process items until this
call returns. After the call returns, no more items will
be delivered from the specified queue.
One workable cleanup procedure is as follows: First, direct the
WorkRoutines to silently discard completed items. Next, eliminate
all sources of new work. Finally, destroy the work queue. Note that
when in discard mode, the WorkRoutines may not access any structures
which will be destroyed by eliminating the sources of new work.
--*/
DWORD
ClRtlPostItemWorkQueue(
IN PCLRTL_WORK_QUEUE WorkQueue,
IN PCLRTL_WORK_ITEM WorkItem,
IN DWORD BytesTransferred, OPTIONAL
IN DWORD IoContext OPTIONAL
);
/*++
Routine Description:
Posts a specified work item to a specified work queue.
Arguments:
WorkQueue - A pointer to the work queue to which to post the item.
WorkItem - A pointer to the item to post.
BytesTransferred - If the work item represents a completed I/O operation,
this parameter contains the number of bytes
transferred during the operation. For other work items,
the semantics of this parameter may be defined by
the caller.
IoContext - If the work item represents a completed I/O operation,
this parameter contains the context value associated
with the handle on which the operation was submitted.
Of other work items, the semantics of this parameter
may be defined by the caller.
Return Value:
ERROR_SUCCESS if the item was posted successfully.
A Win32 error code if the post operation fails.
--*/
DWORD
ClRtlAssociateIoHandleWorkQueue(
IN PCLRTL_WORK_QUEUE WorkQueue,
IN HANDLE IoHandle,
IN DWORD IoContext
);
/*++
Routine Description:
Associates a specified I/O handle, opened for overlapped I/O
completion, with a work queue. All pending I/O operations on
the specified handle will be posted to the work queue when
completed. An initialized CLRTL_WORK_ITEM must be used to supply
the OVERLAPPED structure whenever an I/O operation is submitted on
the specified handle.
Arguments:
WorkQueue - The work queue with which to associate the I/O handle.
IoHandle - The I/O handle to associate.
IoContext - A context value to associate with the specified handle.
This value will be supplied as a parameter to the
WorkRoutine which processes completions for this
handle.
Return Value:
ERROR_SUCCESS if the association completes successfully.
A Win32 error code if the association fails.
--*/
//////////////////////////////////////////////////////////////////////////
//
// Utilities for accessing the NT system registry.
//
//////////////////////////////////////////////////////////////////////////
DWORD
ClRtlRegQueryDword(
IN HKEY hKey,
IN LPWSTR lpValueName,
OUT LPDWORD lpValue,
IN LPDWORD lpDefaultValue OPTIONAL
);
DWORD
ClRtlRegQueryString(
IN HKEY Key,
IN LPWSTR ValueName,
IN DWORD ValueType,
IN LPWSTR *StringBuffer,
IN OUT LPDWORD StringBufferSize,
OUT LPDWORD StringSize
);
//////////////////////////////////////////////////////////////////////////
//
// Routines for groveling and managing network configuration.
// Currently, these are specific to TCP/IP.
//
//////////////////////////////////////////////////////////////////////////
//
// Transport interface information structure
//
// The "Ignore" field is intitialized to FALSE. If it is set to
// TRUE by an application, the enum search functions will ignore
// the entry.
//
typedef struct _CLRTL_NET_INTERFACE_INFO {
struct _CLRTL_NET_INTERFACE_INFO * Next;
ULONG Context;
ULONG Flags;
ULONG InterfaceAddress;
LPWSTR InterfaceAddressString;
ULONG NetworkAddress;
LPWSTR NetworkAddressString;
ULONG NetworkMask;
LPWSTR NetworkMaskString;
BOOLEAN Ignore;
} CLRTL_NET_INTERFACE_INFO, *PCLRTL_NET_INTERFACE_INFO;
#define CLRTL_NET_INTERFACE_PRIMARY 0x00000001
#define CLRTL_NET_INTERFACE_DYNAMIC 0x00000002
//
// Adapter information structure
//
// The "Ignore" field is intitialized to FALSE. If it is set to
// TRUE by an application, the enum search functions will ignore
// the entry.
//
typedef struct _CLRTL_NET_ADAPTER_INFO {
struct _CLRTL_NET_ADAPTER_INFO * Next;
LPWSTR Name;
ULONG Index;
ULONG Flags;
ULONG InterfaceCount;
PCLRTL_NET_INTERFACE_INFO InterfaceList;
BOOLEAN Ignore;
} CLRTL_NET_ADAPTER_INFO, *PCLRTL_NET_ADAPTER_INFO;
#define CLRTL_NET_ADAPTER_HIDDEN 0x00000001
typedef struct {
ULONG AdapterCount;
PCLRTL_NET_ADAPTER_INFO AdapterList;
} CLRTL_NET_ADAPTER_ENUM, *PCLRTL_NET_ADAPTER_ENUM;
PCLRTL_NET_ADAPTER_ENUM
ClRtlEnumNetAdapters(
VOID
);
VOID
ClRtlFreeNetAdapterEnum(
IN PCLRTL_NET_ADAPTER_ENUM AdapterEnum
);
PCLRTL_NET_ADAPTER_INFO
ClRtlFindNetAdapterByName(
PCLRTL_NET_ADAPTER_ENUM AdapterEnum,
LPWSTR AdapterName
);
PCLRTL_NET_INTERFACE_INFO
ClRtlFindNetInterfaceByNetworkAddress(
IN PCLRTL_NET_ADAPTER_INFO AdapterInfo,
IN LPWSTR NetworkAddress
);
PCLRTL_NET_ADAPTER_INFO
ClRtlFindNetAdapterByNetworkAddress(
IN PCLRTL_NET_ADAPTER_ENUM AdapterEnum,
IN LPWSTR NetworkAddress,
OUT PCLRTL_NET_INTERFACE_INFO * InterfaceInfo
);
PCLRTL_NET_INTERFACE_INFO
ClRtlGetPrimaryNetInterface(
IN PCLRTL_NET_ADAPTER_INFO AdapterInfo
);
VOID
ClRtlQueryTcpipInformation(
OUT LPDWORD MaxAddressStringLength,
OUT LPDWORD MaxEndpointStringLength
);
DWORD
ClRtlTcpipAddressToString(
ULONG AddressValue,
LPWSTR * AddressString
);
DWORD
ClRtlTcpipStringToAddress(
LPWSTR AddressString,
PULONG AddressValue
);
DWORD
ClRtlTcpipEndpointToString(
USHORT EndpointValue,
LPWSTR * EndpointString
);
DWORD
ClRtlTcpipStringToEndpoint(
LPWSTR EndpointString,
PUSHORT EndpointValue
);
BOOL
ClRtlIsValidTcpipAddress(
IN ULONG Address
);
BOOL
ClRtlIsValidTcpipSubnetMask(
IN ULONG SubnetMask
);
//
// BOOL
// ClRtlAreTcpipAddressesOnSameSubnet(
// ULONG Address1,
// ULONG Address2,
// ULONG SubnetMask
// );
//
#define ClRtlAreTcpipAddressesOnSameSubnet(_Addr1, _Addr2, _Mask) \
( ((_Addr1 & _Mask) == (_Addr2 & _Mask)) ? TRUE : FALSE )
DWORD
ClRtlBuildTcpipTdiAddress(
IN LPWSTR NetworkAddress,
IN LPWSTR TransportEndpoint,
OUT LPVOID * TdiAddress,
OUT LPDWORD TdiAddressLength
);
DWORD
ClRtlBuildLocalTcpipTdiAddress(
IN LPWSTR NetworkAddress,
OUT LPVOID TdiAddress,
OUT LPDWORD TdiAddressLength
);
DWORD
ClRtlParseTcpipTdiAddress(
IN LPVOID TdiAddress,
OUT LPWSTR * NetworkAddress,
OUT LPWSTR * TransportEndpoint
);
//
// Routines for manipulating IP Addresses
//
BOOLEAN
UnicodeInetAddr(
PWCHAR AddressString,
PULONG Address
);
//
// IP_ADDRESS - access an IP address as a single DWORD or 4 BYTEs
//
typedef union {
DWORD d;
BYTE b[4];
} IP_ADDRESS, *PIP_ADDRESS, IP_MASK, *PIP_MASK;
//
// IP_ADDRESS_STRING - store an IP address as a dotted decimal string
//
typedef struct {
char String[4 * 4];
} IP_ADDRESS_STRING, *PIP_ADDRESS_STRING, IP_MASK_STRING, *PIP_MASK_STRING;
//
// IP_ADDR_STRING - store an IP address with its corresponding subnet mask,
// both as dotted decimal strings
//
typedef struct _IP_ADDR_STRING {
struct _IP_ADDR_STRING* Next;
IP_ADDRESS_STRING IpAddress;
IP_MASK_STRING IpMask;
DWORD Context;
} IP_ADDR_STRING, *PIP_ADDR_STRING;
//
// ADAPTER_INFO - per-adapter information. All IP addresses are stored as
// strings
//
#define MAX_ADAPTER_DESCRIPTION_LENGTH 128 // arb.
#define MAX_ADAPTER_NAME_LENGTH 32 // arb.
#define MAX_ALLOWED_ADAPTER_NAME_LENGTH (MAX_ADAPTER_NAME_LENGTH + 256)
#define MAX_ADAPTER_ADDRESS_LENGTH 8 // arb.
#define DEFAULT_MINIMUM_ENTITIES MAX_TDI_ENTITIES // arb.
#define MAX_HOSTNAME_LEN 64 // arb.
#define MAX_DOMAIN_NAME_LEN 64 // arb.
#define MAX_SCOPE_ID_LEN 64 // arb.
typedef struct _ADAPTER_INFO {
struct _ADAPTER_INFO* Next;
char AdapterName[MAX_ADAPTER_NAME_LENGTH + 1];
char Description[MAX_ADAPTER_DESCRIPTION_LENGTH + 1];
UINT AddressLength;
BYTE Address[MAX_ADAPTER_ADDRESS_LENGTH];
UINT Index;
UINT Type;
UINT DhcpEnabled;
UINT NodeType;
IP_ADDR_STRING IpAddressList;
IP_ADDR_STRING GatewayList;
IP_ADDR_STRING DhcpServer;
BOOL HaveWins;
IP_ADDR_STRING PrimaryWinsServer;
IP_ADDR_STRING SecondaryWinsServer;
// time_t LeaseObtained;
// time_t LeaseExpires;
} ADAPTER_INFO, *PADAPTER_INFO;
//
// FIXED_INFO - the set of IP-related information which does not depend on DHCP
//
typedef struct {
char HostName[MAX_HOSTNAME_LEN + 1];
char DomainName[MAX_DOMAIN_NAME_LEN + 1];
IP_ADDR_STRING DnsServerList;
UINT NodeType;
char ScopeId[MAX_SCOPE_ID_LEN + 1];
UINT EnableRouting;
UINT EnableProxy;
UINT EnableDns;
} FIXED_INFO, *PFIXED_INFO;
//
// DHCP_ADAPTER_INFO - the information returned from DHCP VxD per adapter
//
typedef struct {
DWORD LeaseObtained;
DWORD LeaseExpires;
DWORD DhcpServerIpAddress;
UINT NumberOfDnsServers;
LPDWORD DnsServerIpAddressList;
} DHCP_ADAPTER_INFO, *PDHCP_ADAPTER_INFO;
//
// PHYSICAL_ADAPTER_ADDRESS - structure describing physical adapter
//
typedef struct {
UINT AddressLength;
BYTE Address[MAX_ADAPTER_ADDRESS_LENGTH];
} PHYSICAL_ADAPTER_ADDRESS, *PPHYSICAL_ADAPTER_ADDRESS;
//
// DHCP_ADAPTER_LIST - list of physical adapters known to DHCP, and therefore
// DHCP-enabled
//
typedef struct {
UINT NumberOfAdapters;
PHYSICAL_ADAPTER_ADDRESS * AdapterList;
} DHCP_ADAPTER_LIST, *PDHCP_ADAPTER_LIST;
PADAPTER_INFO
GetAdapterInfo(
VOID
);
VOID
DeleteAdapterInfo(
IN PADAPTER_INFO AdapterInfo
);
DWORD
BuildIpTdiAddress(
IN LPWSTR Address,
IN LPWSTR Endpoint,
OUT PVOID * TdiAddress,
OUT PULONG TdiAddressLength
);
#define DeleteIpTdiAddress(_addr) LocalFree(_addr)
//
// Validate network name
//
typedef enum _CLRTL_NAME_STATUS {
NetNameOk,
NetNameEmpty,
NetNameTooLong,
NetNameInvalidChars,
NetNameInUse
} CLRTL_NAME_STATUS;
BOOL
ClRtlIsNetNameValid(
IN LPCWSTR NetName,
OUT OPTIONAL CLRTL_NAME_STATUS *Result,
IN BOOL CheckIfExists
);
//
// Security related routines
//
LONG
MapSAToRpcSA(
IN LPSECURITY_ATTRIBUTES lpSA,
IN OUT struct _RPC_SECURITY_ATTRIBUTES *pRpcSA
);
LONG
MapSDToRpcSD(
IN PSECURITY_DESCRIPTOR lpSD,
IN OUT struct _RPC_SECURITY_DESCRIPTOR *pRpcSD
);
DWORD
ClRtlSetObjSecurityInfo(
IN HANDLE hObject,
IN SE_OBJECT_TYPE SeObjType,
IN DWORD dwAdminMask,
IN DWORD dwOwnerMask,
IN DWORD dwEveryOneMask
);
//
// OS checker
//
DWORD
GetServicePack(
VOID
);
BOOL
ClRtlIsOSValid(
VOID
);
BOOL
ClRtlIsOSTypeValid(
VOID
);
//
// A few MULTI_SZ string manipulation routines
//
DWORD
ClRtlMultiSzAppend(
IN OUT LPWSTR *MultiSz,
IN OUT LPDWORD StringLength,
IN LPCWSTR lpString
);
DWORD
ClRtlMultiSzRemove(
IN LPWSTR lpszMultiSz,
IN OUT LPDWORD StringLength,
IN LPCWSTR lpString
);
LPCWSTR
ClRtlMultiSzEnum(
IN LPCWSTR MszString,
IN DWORD MszStringLength,
IN DWORD StringIndex
);
DWORD
ClRtlMultiSzLength(
IN LPCWSTR lpszMultiSz
);
LPCWSTR
ClRtlMultiSzScan(
IN LPCWSTR lpszMultiSz,
IN LPCWSTR lpszString
);
DWORD
ClRtlCreateDirectory(
IN LPCWSTR lpszPath
);
typedef LONG (*PFNCLRTLCREATEKEY)(
IN PVOID RegistryKey,
IN LPCWSTR lpszSubKey,
IN DWORD dwOptions,
IN REGSAM samDesired,
IN LPSECURITY_ATTRIBUTES lpSecurityAttributes,
OUT PVOID * phkResult,
OUT OPTIONAL LPDWORD lpdwDisposition
);
typedef LONG (*PFNCLRTLOPENKEY)(
IN PVOID RegistryKey,
IN LPCWSTR lpszSubKey,
IN REGSAM samDesired,
OUT PVOID * phkResult
);
typedef LONG (*PFNCLRTLCLOSEKEY)(
IN PVOID RegistryKey
);
typedef LONG (*PFNCLRTLENUMVALUE)(
IN PVOID RegistryKey,
IN DWORD dwIndex,
OUT LPWSTR lpszValueName,
IN OUT LPDWORD lpcbValueName,
OUT LPDWORD lpType,
OUT LPBYTE lpData,
IN OUT LPDWORD lpcbData
);
typedef LONG (*PFNCLRTLSETVALUE)(
IN PVOID RegistryKey,
IN LPCWSTR lpszValueName,
IN DWORD dwType,
IN CONST BYTE* lpData,
IN DWORD cbData
);
typedef LONG (*PFNCLRTLQUERYVALUE)(
IN PVOID RegistryKey,
IN LPCWSTR lpszValueName,
OUT LPDWORD lpValueType,
OUT LPBYTE lpData,
IN OUT LPDWORD lpcbData
);
typedef struct _CLUSTER_REG_APIS {
PFNCLRTLCREATEKEY pfnCreateKey;
PFNCLRTLOPENKEY pfnOpenKey;
PFNCLRTLCLOSEKEY pfnCloseKey;
PFNCLRTLSETVALUE pfnSetValue;
PFNCLRTLQUERYVALUE pfnQueryValue;
PFNCLRTLENUMVALUE pfnEnumValue;
} CLUSTER_REG_APIS, *PCLUSTER_REG_APIS;
DWORD
WINAPI
ClRtlEnumProperties(
IN const PRESUTIL_PROPERTY_ITEM PropertyTable,
OUT PVOID OutBuffer,
IN DWORD OutBufferSize,
OUT LPDWORD BytesReturned,
OUT LPDWORD Required
);
DWORD
WINAPI
ClRtlGetProperties(
IN PVOID RegistryKey,
IN const PCLUSTER_REG_APIS pClusterRegApis,
IN const PRESUTIL_PROPERTY_ITEM PropertyTable,
OUT PVOID OutBuffer,
IN DWORD OutBufferSize,
OUT LPDWORD BytesReturned,
OUT LPDWORD Required
);
DWORD
WINAPI
ClRtlGetPrivateProperties(
IN PVOID RegistryKey,
IN const PCLUSTER_REG_APIS pClusterRegApis,
OUT PVOID OutBuffer,
IN DWORD OutBufferSize,
OUT LPDWORD BytesReturned,
OUT LPDWORD Required
);
DWORD
WINAPI
ClRtlGetPropertySize(
IN PVOID RegistryKey,
IN const PCLUSTER_REG_APIS pClusterRegApis,
IN const PRESUTIL_PROPERTY_ITEM Property,
IN OUT LPDWORD BufferSize,
IN OUT LPDWORD ItemCount
);
DWORD
WINAPI
ClRtlGetProperty(
IN PVOID RegistryKey,
IN const PCLUSTER_REG_APIS pClusterRegApis,
IN const PRESUTIL_PROPERTY_ITEM Property,
OUT PVOID * OutBuffer,
IN OUT LPDWORD OutBufferSize
);
DWORD
WINAPI
ClRtlpSetPropertyTable(
IN PVOID RegistryKey,
IN const PCLUSTER_REG_APIS pClusterRegApis,
IN const PRESUTIL_PROPERTY_ITEM PropertyTable,
IN PVOID Reserved,
IN BOOL AllowUnknownProperties,
IN const PVOID InBuffer,
IN DWORD InBufferSize,
OUT OPTIONAL LPBYTE OutParams
);
DWORD
WINAPI
ClRtlSetPropertyParameterBlock(
IN PVOID RegistryKey,
IN const PCLUSTER_REG_APIS pClusterRegApis,
IN const PRESUTIL_PROPERTY_ITEM PropertyTable,
IN PVOID Reserved,
IN const LPBYTE InParams,
IN const PVOID InBuffer,
IN DWORD InBufferSize,
OUT OPTIONAL LPBYTE OutParams
);
DWORD
WINAPI
ClRtlGetAllProperties(
IN PVOID RegistryKey,
IN const PCLUSTER_REG_APIS pClusterRegApis,
IN const PRESUTIL_PROPERTY_ITEM PropertyTable,
OUT PVOID OutBuffer,
IN DWORD OutBufferSize,
OUT LPDWORD BytesReturned,
OUT LPDWORD Required
);
DWORD
WINAPI
ClRtlGetPropertiesToParameterBlock(
IN HKEY RegistryKey,
IN const PCLUSTER_REG_APIS pClusterRegApis,
IN const PRESUTIL_PROPERTY_ITEM PropertyTable,
IN OUT LPBYTE OutParams,
IN BOOL CheckForRequiredProperties,
OUT OPTIONAL LPWSTR * NameOfPropInError
);
DWORD
WINAPI
ClRtlPropertyListFromParameterBlock(
IN const PRESUTIL_PROPERTY_ITEM PropertyTable,
OUT PVOID * OutBuffer,
IN OUT LPDWORD OutBufferSize,
IN const LPBYTE InParams,
OUT LPDWORD BytesReturned,
OUT LPDWORD Required
);
DWORD
WINAPI
ClRtlGetUnknownProperties(
IN PVOID RegistryKey,
IN const PCLUSTER_REG_APIS pClusterRegApis,
IN const PRESUTIL_PROPERTY_ITEM PropertyTable,
OUT PVOID OutBuffer,
IN DWORD OutBufferSize,
OUT LPDWORD BytesReturned,
OUT LPDWORD Required
);
DWORD
WINAPI
ClRtlAddUnknownProperties(
IN PVOID RegistryKey,
IN const PCLUSTER_REG_APIS pClusterRegApis,
IN const PRESUTIL_PROPERTY_ITEM PropertyTable,
IN OUT PVOID OutBuffer,
IN DWORD OutBufferSize,
IN OUT LPDWORD BytesReturned,
IN OUT LPDWORD Required
);
DWORD
WINAPI
ClRtlFindProperty(
IN const PVOID Buffer,
IN DWORD BufferSize,
IN LPCWSTR PropName,
OUT LPDWORD Type
);
DWORD
WINAPI
ClRtlFindSzProperty(
IN const PVOID Buffer,
IN DWORD BufferSize,
IN LPCWSTR PropName,
OUT LPWSTR *FoundString
);
DWORD
WINAPI
ClRtlFindDwordProperty(
IN const PVOID Buffer,
IN DWORD BufferSize,
IN LPCWSTR PropName,
OUT LPDWORD FoundDword
);
__inline
DWORD
WINAPI
ClRtlVerifyPropertyTable(
IN const PRESUTIL_PROPERTY_ITEM PropertyTable,
IN PVOID Reserved,
IN BOOL AllowUnknownProperties,
IN const PVOID InBuffer,
IN DWORD InBufferSize,
OUT OPTIONAL LPBYTE OutParams
)
{
return ClRtlpSetPropertyTable(NULL, NULL, PropertyTable, Reserved, AllowUnknownProperties, InBuffer, InBufferSize, OutParams);
}
__inline
DWORD
WINAPI
ClRtlSetPropertyTable(
IN PVOID RegistryKey,
IN const PCLUSTER_REG_APIS pClusterRegApis,
IN const PRESUTIL_PROPERTY_ITEM PropertyTable,
IN PVOID Reserved,
IN BOOL AllowUnknownProperties,
IN const PVOID InBuffer,
IN DWORD InBufferSize,
OUT OPTIONAL LPBYTE OutParams
)
{
if ( (RegistryKey == NULL) ||
(pClusterRegApis == NULL) ){
return(ERROR_BAD_ARGUMENTS);
}
return ClRtlpSetPropertyTable(RegistryKey, pClusterRegApis, PropertyTable, Reserved, AllowUnknownProperties, InBuffer, InBufferSize, OutParams);
}
DWORD
WINAPI
ClRtlpSetPrivatePropertyList(
IN PVOID RegistryKey,
IN const PCLUSTER_REG_APIS pClusterRegApis,
IN const PVOID InBuffer,
IN DWORD InBufferSize
);
__inline
DWORD
WINAPI
ClRtlVerifyPrivatePropertyList(
IN const PVOID InBuffer,
IN DWORD InBufferSize
)
{
return ClRtlpSetPrivatePropertyList(NULL, NULL, InBuffer, InBufferSize);
}
__inline
DWORD
WINAPI
ClRtlSetPrivatePropertyList(
IN PVOID RegistryKey,
IN const PCLUSTER_REG_APIS pClusterRegApis,
IN const PVOID InBuffer,
IN DWORD InBufferSize
)
{
if ( (RegistryKey == NULL) ||
(pClusterRegApis == NULL) ){
return(ERROR_BAD_ARGUMENTS);
}
return ClRtlpSetPrivatePropertyList(RegistryKey, pClusterRegApis, InBuffer, InBufferSize);
}
DWORD
WINAPI
ClRtlGetBinaryValue(
IN HKEY ClusterKey,
IN LPCWSTR ValueName,
OUT LPBYTE * OutValue,
OUT LPDWORD OutValueSize,
IN PFNCLRTLQUERYVALUE pfnQueryValue
);
LPWSTR
WINAPI
ClRtlGetSzValue(
IN HKEY ClusterKey,
IN LPCWSTR ValueName,
IN PFNCLRTLQUERYVALUE pfnQueryValue
);
DWORD
WINAPI
ClRtlDupParameterBlock(
OUT LPBYTE OutParams,
IN const LPBYTE InParams,
IN const PRESUTIL_PROPERTY_ITEM PropertyTable
);
void
WINAPI
ClRtlFreeParameterBlock(
OUT LPBYTE OutParams,
IN const LPBYTE InParams,
IN const PRESUTIL_PROPERTY_ITEM PropertyTable
);
//
// Miscellaneous Routines
//
LPWSTR
ClRtlMakeGuid(
VOID
);
#ifdef __cplusplus
}
#endif
#endif // ifndef _CLUSRTL_INCLUDED_