1652 lines
36 KiB
C
1652 lines
36 KiB
C
/*++
|
||
|
||
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_
|
||
|