windows-nt/Source/XPSP1/NT/base/wmi/ntdll/wmiump.h
2020-09-26 16:20:57 +08:00

2536 lines
65 KiB
C

/*++
Copyright (c) 1997-1999 Microsoft Corporation
Module Name:
wmiump.h
Abstract:
Private headers for WMI user mode
Author:
16-Jan-1997 AlanWar
Revision History:
--*/
#define _WMI_SOURCE_
//
// Define this to track reference counts
//#define TRACK_REFERNECES
//
// Define this to get extra checks on heap validation
//#define HEAPVALIDATION
//
// Define this to get a trace of critical section
//#define CRITSECTTRACE
//
// Define this to compile WMI to run as a service under NT
#define RUN_AS_SERVICE
//
// Define this to include WMI user mode functionality. Note that if you enable
// this then you also need to fix the files: wmi\dll\sources and wmi\makefil0.
//#define WMI_USER_MODE
//
// Define this to track memory leaks
//#define TRACK_MEMORY_LEAKS
#ifndef MEMPHIS
#define UNICODE
#define _UNICODE
#include <nt.h>
#include <ntrtl.h>
#include <nturtl.h>
#endif
#include <windows.h>
#include <ole2.h>
#include <tchar.h>
#include <stdio.h>
#ifndef MEMPHIS
#include "svcs.h"
#endif
#include <netevent.h>
#ifdef MEMPHIS
//
// CONSIDER: Is there a better place to get this stuff on MEMPHIS
//
// Doubly-linked list manipulation routines. Implemented as macros
// but logically these are procedures.
//
//
// 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);\
}
//
//
// 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)
//
// Define the various device type values. Note that values used by Microsoft
// Corporation are in the range 0-32767, and 32768-65535 are reserved for use
// by customers.
//
#define DEVICE_TYPE ULONG
#define FILE_DEVICE_BEEP 0x00000001
#define FILE_DEVICE_CD_ROM 0x00000002
#define FILE_DEVICE_CD_ROM_FILE_SYSTEM 0x00000003
#define FILE_DEVICE_CONTROLLER 0x00000004
#define FILE_DEVICE_DATALINK 0x00000005
#define FILE_DEVICE_DFS 0x00000006
#define FILE_DEVICE_DISK 0x00000007
#define FILE_DEVICE_DISK_FILE_SYSTEM 0x00000008
#define FILE_DEVICE_FILE_SYSTEM 0x00000009
#define FILE_DEVICE_INPORT_PORT 0x0000000a
#define FILE_DEVICE_KEYBOARD 0x0000000b
#define FILE_DEVICE_MAILSLOT 0x0000000c
#define FILE_DEVICE_MIDI_IN 0x0000000d
#define FILE_DEVICE_MIDI_OUT 0x0000000e
#define FILE_DEVICE_MOUSE 0x0000000f
#define FILE_DEVICE_MULTI_UNC_PROVIDER 0x00000010
#define FILE_DEVICE_NAMED_PIPE 0x00000011
#define FILE_DEVICE_NETWORK 0x00000012
#define FILE_DEVICE_NETWORK_BROWSER 0x00000013
#define FILE_DEVICE_NETWORK_FILE_SYSTEM 0x00000014
#define FILE_DEVICE_NULL 0x00000015
#define FILE_DEVICE_PARALLEL_PORT 0x00000016
#define FILE_DEVICE_PHYSICAL_NETCARD 0x00000017
#define FILE_DEVICE_PRINTER 0x00000018
#define FILE_DEVICE_SCANNER 0x00000019
#define FILE_DEVICE_SERIAL_MOUSE_PORT 0x0000001a
#define FILE_DEVICE_SERIAL_PORT 0x0000001b
#define FILE_DEVICE_SCREEN 0x0000001c
#define FILE_DEVICE_SOUND 0x0000001d
#define FILE_DEVICE_STREAMS 0x0000001e
#define FILE_DEVICE_TAPE 0x0000001f
#define FILE_DEVICE_TAPE_FILE_SYSTEM 0x00000020
#define FILE_DEVICE_TRANSPORT 0x00000021
#define FILE_DEVICE_UNKNOWN 0x00000022
#define FILE_DEVICE_VIDEO 0x00000023
#define FILE_DEVICE_VIRTUAL_DISK 0x00000024
#define FILE_DEVICE_WAVE_IN 0x00000025
#define FILE_DEVICE_WAVE_OUT 0x00000026
#define FILE_DEVICE_8042_PORT 0x00000027
#define FILE_DEVICE_NETWORK_REDIRECTOR 0x00000028
#define FILE_DEVICE_BATTERY 0x00000029
#define FILE_DEVICE_BUS_EXTENDER 0x0000002a
#define FILE_DEVICE_MODEM 0x0000002b
#define FILE_DEVICE_VDM 0x0000002c
#define FILE_DEVICE_MASS_STORAGE 0x0000002d
#define FILE_DEVICE_SMB 0x0000002e
#define FILE_DEVICE_KS 0x0000002f
#define FILE_DEVICE_CHANGER 0x00000030
#define FILE_DEVICE_SMARTCARD 0x00000031
#define FILE_DEVICE_ACPI 0x00000032
#define FILE_DEVICE_DVD 0x00000033
//
// Macro definition for defining IOCTL and FSCTL function control codes. Note
// that function codes 0-2047 are reserved for Microsoft Corporation, and
// 2048-4095 are reserved for customers.
//
#define CTL_CODE( DeviceType, Function, Method, Access ) ( \
((DeviceType) << 16) | ((Access) << 14) | ((Function) << 2) | (Method) \
)
//
// Define the method codes for how buffers are passed for I/O and FS controls
//
#define METHOD_BUFFERED 0
#define METHOD_IN_DIRECT 1
#define METHOD_OUT_DIRECT 2
#define METHOD_NEITHER 3
//
// Define the access check value for any access
//
//
// The FILE_READ_ACCESS and FILE_WRITE_ACCESS constants are also defined in
// ntioapi.h as FILE_READ_DATA and FILE_WRITE_DATA. The values for these
// constants *MUST* always be in sync.
//
#define FILE_ANY_ACCESS 0
#define FILE_READ_ACCESS ( 0x0001 ) // file & pipe
#define FILE_WRITE_ACCESS ( 0x0002 ) // file & pipe
typedef LONG NTSTATUS;
typedef NTSTATUS (*PUSER_THREAD_START_ROUTINE)(
PVOID ThreadParameter
);
#include <stdio.h>
#endif
#include "wmium.h"
#include "wmiumkm.h"
#include "ntwmi.h"
#include "wmiguid.h"
#if DBG
#define WmipAssert(x) if (! (x) ) { \
BOOLEAN OldLoggingEnabled = WmipLoggingEnabled; \
WmipLoggingEnabled = TRUE; \
WmipDbgPrint(("WMI Assertion: "#x" at %s %d\n", __FILE__, __LINE__)); \
WmipLoggingEnabled = OldLoggingEnabled; \
DbgBreakPoint(); }
#else
#define WmipAssert(x)
#endif
#if DBG
extern BOOLEAN WmipLoggingEnabled;
#ifdef MEMPHIS
void __cdecl DebugOut(char *Format, ...);
#define WmipDebugPrint(_x_) { if (WmipLoggingEnabled) DebugOut _x_; }
#define WmipDbgPrint(_x_) { if (WmipLoggingEnabled) DebugOut _x_; }
#else
#define WmipDebugPrint(_x_) { if (WmipLoggingEnabled) DbgPrint _x_; }
#define WmipDbgPrint(_x_) { if (WmipLoggingEnabled) DbgPrint _x_; }
#endif
#else
#define WmipDebugPrint(_x_)
#define WmipDbgPrint(_x_)
#endif
#define NULL_GUID {0x00000000, 0x0000, 0x0000, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}
//
// Registry based config options. Only available on checked builds
//
#define WmiRegKeyText TEXT("SYSTEM\\CurrentControlSet\\Control\\WMI")
#define PumpTimeoutRegValueText TEXT("NotificationPumpTimeout")
#define LoggingEnableValueText TEXT("LoggingEnabled")
//
// WMI RPC related definitions
typedef struct
{
WNODE_HEADER WnodeHeader;
BYTE Data[1];
} WNODE_INTERNAL, *PWNODE_INTERNAL;
#define INTERNAL_PROVIDER_ID 1
//
// Size of initial buffer used to read notifications from kernel mode
#define STARTNOTIFICATIONBUFFERSIZE 4096
#ifdef MEMPHIS
#define WmiRpcProtocolSequence TEXT("ncalrpc")
#define WmiServiceRpcProtocolSequence TEXT("ncalrpc")
#define WmiServiceRpcEndpoint TEXT("WmiRpcEndpoint")
#else
//#define WmiRpcProtocolSequence TEXT("ncalrpc")
//#define WmiRpcEndpointPrefix TEXT("NT")
#define WmiRpcProtocolSequence TEXT("ncacn_np")
#define WmiRpcEndpointPrefix TEXT("\\pipe\\")
#define WmiServiceRpcProtocolSequence TEXT("ncacn_np")
#define WmiServiceRpcEndpoint SVCS_RPC_PIPE
#endif
#define MinRpcCalls 1
#define MaxRpcCalls RPC_C_PROTSEQ_MAX_REQS_DEFAULT
//
// Time to wait between retrying an RPC call that was too busy to complete
#define RPC_BUSY_WAIT_TIMER 500
//
// Number of times to retry an RPC call that was too busy to complete
#define RPC_BUSY_WAIT_RETRIES 5
//
// WMI RPC interface principle name
#define WMI_RPC_PRINC_NAME TEXT("WMI_RPC_PRINC_NAME")
//
// This macro will break CountedString into a pointer to the actual string
// and the actual length of the string excluding any trailing nul characters
#define WmipBreakCountedString(CountedString, CountedStringLen) { \
CountedStringLen = *CountedString++; \
if (CountedString[(CountedStringLen-sizeof(WCHAR))/sizeof(WCHAR)] == UNICODE_NULL) \
{ \
CountedStringLen -= sizeof(WCHAR); \
} \
}
typedef struct
{
HANDLE GuidHandle;
PVOID DeliveryInfo;
ULONG_PTR DeliveryContext;
ULONG Flags;
} NOTIFYEE, *PNOTIFYEE;
#define STATIC_NOTIFYEE_COUNT 2
typedef struct
{
LIST_ENTRY GNList;
GUID Guid;
ULONG RefCount;
ULONG NotifyeeCount;
PNOTIFYEE Notifyee;
NOTIFYEE StaticNotifyee[STATIC_NOTIFYEE_COUNT];
} GUIDNOTIFICATION, *PGUIDNOTIFICATION;
#define WmipAllocGNEntry() (PGUIDNOTIFICATION)WmipAlloc(sizeof(GUIDNOTIFICATION))
#define WmipFreeGNEntry(GNEntry) WmipFree(GNEntry)
#define WmipReferenceGNEntry(GNEntry) InterlockedIncrement(&GNEntry->RefCount);
//
// Notification Cookie data structures
#if DBG
#define NOTIFYCOOKIESPERCHUNK 2
#else
#define NOTIFYCOOKIESPERCHUNK 128
#endif
typedef struct
{
PVOID DeliveryContext;
PVOID DeliveryInfo;
GUID Guid;
BOOLEAN InUse;
} NOTIFYCOOKIE, *PNOTIFYCOOKIE;
typedef struct
{
LIST_ENTRY Next; // Next cookie chunk
ULONG BaseSlot; // Index of first slot number
USHORT FreeSlot; // Index to a free cookie
BOOLEAN Full; // TRUE if this chunk is full
NOTIFYCOOKIE Cookies[NOTIFYCOOKIESPERCHUNK];
} NOTIFYCOOKIECHUNK, *PNOTIFYCOOKIECHUNK;
//
// Useful macro to establish a WNODE_HEADER quickly
#ifdef _WIN64
#define WmipBuildWnodeHeader(Wnode, WnodeSize, FlagsUlong, Handle) { \
(Wnode)->Flags = FlagsUlong; \
(Wnode)->KernelHandle = Handle; \
(Wnode)->BufferSize = WnodeSize; \
(Wnode)->Linkage = 0; \
}
#else
#define WmipBuildWnodeHeader(Wnode, WnodeSize, FlagsUlong, Handle) { \
(Wnode)->Flags = FlagsUlong; \
*((PULONG64)(&((Wnode)->TimeStamp))) = (ULONG64)(IntToPtr(PtrToInt(Handle))); \
(Wnode)->BufferSize = WnodeSize; \
(Wnode)->Linkage = 0; \
}
#endif
#ifdef MEMPHIS
extern HANDLE PMMutex;
#define WmipEnterPMCritSection() WaitForSingleObject(PMMutex, INFINITE)
#define WmipLeavePMCritSection() ReleaseMutex(PMMutex)
#else
extern RTL_CRITICAL_SECTION PMCritSect;
#if DBG
#define WmipEnterPMCritSection() \
WmipAssert(NT_SUCCESS(RtlEnterCriticalSection(&PMCritSect)));
#define WmipLeavePMCritSection() { \
WmipAssert(PMCritSect.LockCount >= 0); \
WmipAssert(NT_SUCCESS(RtlLeaveCriticalSection(&PMCritSect))); }
#else
#define WmipEnterPMCritSection() RtlEnterCriticalSection(&PMCritSect)
#define WmipLeavePMCritSection() RtlLeaveCriticalSection(&PMCritSect)
#endif // DBG
#endif // MEMPHIS
typedef struct
{
NOTIFICATIONCALLBACK Callback;
ULONG_PTR Context;
PWNODE_HEADER Wnode;
BYTE WnodeBuffer[1];
} NOTIFDELIVERYCTX, *PNOTIFDELIVERYCTX;
// from handle.c
#define WmipVerifyToken() \
{ \
ULONG VerifyStatus; \
VerifyStatus = WmipCheckImpersonationTokenType(); \
if (VerifyStatus != ERROR_SUCCESS) \
{ \
WmipSetLastError(VerifyStatus); \
return(VerifyStatus); \
} \
}
ULONG WmipCheckImpersonationTokenType(
void
);
ULONG WmipCopyStringToCountedUnicode(
LPCWSTR String,
PWCHAR CountedString,
ULONG *BytesUsed,
BOOLEAN ConvertFromAnsi
);
ULONG WmipCountedAnsiToCountedUnicode(
PCHAR Ansi,
PWCHAR Unicode
);
ULONG WmipCountedUnicodeToCountedAnsi(
PWCHAR Unicode,
PCHAR Ansi
);
#ifndef MEMPHIS
ULONG WmipCheckGuidAccess(
LPGUID Guid,
ACCESS_MASK DesiredAccess
);
ULONG WmipOpenKernelGuid(
LPGUID Guid,
ACCESS_MASK DesiredAccess,
PHANDLE Handle,
ULONG Ioctl
);
#endif
ULONG WmipAllocateCookie(
PVOID DeliveryInfo,
PVOID DeliveryContext,
LPGUID Guid
);
BOOLEAN WmipLookupCookie(
ULONG CookieSlot,
LPGUID Guid,
PVOID *DeliveryInfo,
PVOID *DeliveryContext
);
void WmipGetGuidInCookie(
ULONG CookieSlot,
LPGUID Guid
);
void WmipFreeCookie(
ULONG CookieSlot
);
PGUIDNOTIFICATION
WmipFindGuidNotification(
LPGUID Guid
);
ULONG
WmipAddToGNList(
LPGUID Guid,
PVOID DeliveryInfo,
ULONG_PTR DeliveryContext,
ULONG Flags,
HANDLE GuidHandle
);
ULONG
WmipRemoveFromGNList(
LPGUID Guid,
PVOID DeliveryInfo,
BOOLEAN ActuallyRemove
);
void
WmipDereferenceGNEntry(
PGUIDNOTIFICATION GNEntry
);
PTCHAR GuidToString(
PTCHAR s,
LPGUID piid
);
PCHAR GuidToStringA(
PCHAR s,
LPGUID piid
);
// from request.c
ULONG WmipSendWmiRequest(
ULONG ActionCode,
PWNODE_HEADER Wnode,
ULONG WnodeSize,
PVOID OutBuffer,
ULONG MaxBufferSize,
ULONG *RetSize
);
ULONG WmipSendWmiKMRequest(
HANDLE Handle,
ULONG Ioctl,
PVOID InBuffer,
ULONG InBufferSize,
PVOID OutBuffer,
ULONG MaxBufferSize,
ULONG *ReturnSize,
LPOVERLAPPED Overlapped
);
ULONG WmipConvertWADToAnsi(
PWNODE_ALL_DATA Wnode
);
ULONG WmipConvertWADToUnicode(
PWNODE_ALL_DATA WnodeAllData,
ULONG *BufferSize
);
/*ULONG WmipQueryPidEntry(
IN GUID Guid,
IN ULONG Pid,
OUT BOOLEAN *PidEntry
);*/
ULONG WmipRegisterGuids(
IN LPGUID MasterGuid,
IN ULONG RegistrationCookie,
IN PWMIREGINFOW RegInfo,
IN ULONG GuidCount,
OUT PTRACEGUIDMAP *GuidMapHandle,
OUT ULONG64 *LoggerContext,
OUT HANDLE *RegistrationHandle
);
//
// from intrnldp.c
ULONG WmipInternalProvider(
ULONG ActionCode,
PWNODE_HEADER Wnode,
ULONG MaxWnodeSize,
PVOID OutBuffer,
ULONG *RetSize
);
ULONG
WmipEnumRegGuids(
PWMIGUIDLISTINFO *pGuidInfo
);
//
// from dcapi.c
ULONG
WmipNotificationRegistration(
IN LPGUID InGuid,
IN BOOLEAN Enable,
IN PVOID DeliveryInfo,
IN ULONG_PTR DeliveryContext,
IN ULONG64 LoggerContext,
IN ULONG Flags,
IN BOOLEAN IsAnsi
);
//
// from mofapi.c
//
void WmipProcessLanguageAddRemoveEvent(
IN PWNODE_SINGLE_INSTANCE WnodeSI,
IN NOTIFICATIONCALLBACK Callback,
IN ULONG_PTR DeliveryContext,
IN BOOLEAN IsAnsi
);
void WmipProcessMofAddRemoveEvent(
IN PWNODE_SINGLE_INSTANCE WnodeSI,
IN NOTIFICATIONCALLBACK Callback,
IN ULONG_PTR DeliveryContext,
IN BOOLEAN IsAnsi
);
//
// from notify.c
extern ULONG WmipNotificationSinkIndex;
#ifndef MEMPHIS
ULONG WmipProcessUMRequest(
PWMI_LOGGER_INFORMATION LoggerInfo,
PVOID DeliveryContext,
ULONG ReplyIndex
);
#endif
ULONG WmipAddHandleToEventPump(
LPGUID Guid,
PVOID DeliveryInfo,
ULONG_PTR DeliveryContext,
ULONG NotificationFlags,
HANDLE GuidHandle
);
void WmipMakeEventCallbacks(
IN PWNODE_HEADER Wnode,
IN NOTIFICATIONCALLBACK Callback,
IN ULONG_PTR DeliveryContext,
IN BOOLEAN IsAnsi
);
ULONG
WmipReceiveNotifications(
IN ULONG HandleCount,
IN HANDLE *HandleList,
IN NOTIFICATIONCALLBACK Callback,
IN ULONG_PTR DeliveryContext,
IN BOOLEAN IsAnsi,
IN ULONG Action,
IN PUSER_THREAD_START_ROUTINE UserModeCallback,
IN HANDLE ProcessHandle
);
ULONG WmipEventPump(
PVOID Param
);
//
// from main.c
VOID
WmipCreateHeap(
VOID
);
#ifndef IsEqualGUID
#define IsEqualGUID(guid1, guid2) \
(!memcmp((guid1), (guid2), sizeof(GUID)))
#endif
//
// These define the dll and mof resource name for all of the builtin mof
// resources
#define WMICOREDLLNAME L"wmicore.dll"
#define WMICOREMOFRESOURCENAME L"MofResource"
//
// This defines the registry key under which security descriptors associated
// with the guids are stored.
#ifndef MEMPHIS
#define WMISECURITYREGISTRYKEY TEXT("System\\CurrentControlSet\\Control\\Wmi\\Security")
#endif
//
// This defines the initial value of the buffer passed to each data provider
// to retrieve the registration information
#if DBG
#define INITIALREGINFOSIZE sizeof(WNODE_TOO_SMALL)
#else
#define INITIALREGINFOSIZE 8192
#endif
//
// Chunk Management definitions
// All structures that rely upon the chunk allocator must be defined so that
// their members match that of ENTRYHEADER. These include DATASOURCE,
// GUIDENTRY, INSTANCESET, DCENTRY, NOTIFICATIONENTRY, MOFCLASS, MOFRESOURCE
// Also ENTRYHEADER reserves 0x80000000 for its own flag.
struct _CHUNKINFO;
struct _ENTRYHEADER;
typedef void (*ENTRYCLEANUP)(
struct _CHUNKINFO *,
struct _ENTRYHEADER *
);
typedef struct _CHUNKINFO
{
LIST_ENTRY ChunkHead; // Head of list of chunks
ULONG EntrySize; // Size of a single entry
ULONG EntriesPerChunk; // Number of entries per chunk allocation
ENTRYCLEANUP EntryCleanup; // Entry cleanup routine
ULONG InitialFlags; // Initial flags for all entries
ULONG Signature;
#if DBG
ULONG AllocCount;
ULONG FreeCount;
#endif
} CHUNKINFO, *PCHUNKINFO;
typedef struct
{
LIST_ENTRY ChunkList; // Node in list of chunks
LIST_ENTRY FreeEntryHead; // Head of list of free entries in chunk
ULONG EntriesInUse; // Count of entries being used
} CHUNKHEADER, *PCHUNKHEADER;
typedef struct _ENTRYHEADER
{
union
{
LIST_ENTRY FreeEntryList; // Node in list of free entries
LIST_ENTRY InUseEntryList; // Node in list ofin use entries
};
PCHUNKHEADER Chunk; // Chunk in which entry is located
ULONG Flags; // Flags
ULONG RefCount; // Reference Count
ULONG Signature;
} ENTRYHEADER, *PENTRYHEADER;
// Set if the entry is free
#define FLAG_ENTRY_ON_FREE_LIST 0x80000000
#define FLAG_ENTRY_ON_INUSE_LIST 0x40000000
#define FLAG_ENTRY_INVALID 0x20000000
#define FLAG_ENTRY_REMOVE_LIST 0x10000000
#define WmipReferenceEntry(Entry) \
InterlockedIncrement(&((PENTRYHEADER)(Entry))->RefCount)
// chunk.c
#ifndef MEMPHIS
ULONG WmipBuildGuidObjectAttributes(
IN LPGUID Guid,
OUT POBJECT_ATTRIBUTES ObjectAttributes,
OUT PUNICODE_STRING GuidString,
OUT PWCHAR GuidObjectName
);
#endif
ULONG WmipUnreferenceEntry(
PCHUNKINFO ChunkInfo,
PENTRYHEADER Entry);
PENTRYHEADER WmipAllocEntry(
PCHUNKINFO ChunkInfo
);
void WmipFreeEntry(
PCHUNKINFO ChunkInfo,
PENTRYHEADER Entry
);
//
// This is the guid that denotes non event notifications. WMICore
// automatically registers anyone opening a guid to
extern GUID RegChangeNotificationGuid;
extern CHUNKINFO DSChunkInfo;
extern CHUNKINFO GEChunkInfo;
extern CHUNKINFO ISChunkInfo;
extern CHUNKINFO DCChunkInfo;
extern CHUNKINFO NEChunkInfo;
extern CHUNKINFO MRChunkInfo;
struct tagGUIDENTRY;
typedef struct tagGUIDENTRY GUIDENTRY, *PGUIDENTRY, *PBGUIDENTRY;
struct tagDATASOURCE;
//
// An INSTANCESET contains the information a set of instances that is provided
// by a single data source. An instance set is part of two lists. One list is
// the set of instance sets for a particular guid. The other list is the list
// of instance sets supported by a data source.
//
//
// Instance names for an instance set registered with a base name and count
// are stored in a ISBASENAME structure. This structure is tracked by
// PDFISBASENAME in wmicore.idl.
typedef struct
{
ULONG BaseIndex; // First index to append to base name
WCHAR BaseName[1]; // Actual base name
} ISBASENAME, *PISBASENAME, *PBISBASENAME;
//
// This defines the maximum number of characters that can be part of a suffix
// to a basename. The current value of 6 will allow up to 999999 instances
// of a guid with a static base name
#define MAXBASENAMESUFFIXSIZE 6
//
// Instance names for an instance set registerd with a set of static names
// are kept in a ISSTATICNAMES structure. This structure is tracked by
// PDFISSTATICNAMES defined in wmicore.idl
typedef struct
{
PWCHAR StaticNamePtr[1]; // pointers to static names
// WCHAR StaticNames[1];
} ISSTATICENAMES, *PISSTATICNAMES, *PBISSTATICNAMES;
typedef struct tagInstanceSet
{
union
{
// Entry in list of instances within a guid
LIST_ENTRY GuidISList;
// Entry in main list of free instances
LIST_ENTRY FreeISList;
};
PCHUNKHEADER Chunk; // Chunk in which entry is located
ULONG Flags;
// Reference count of number of guids using this instance set
ULONG RefCount;
// Signature to identify entry
ULONG Signature;
// Entry in list of instances within a data source
LIST_ENTRY DSISList;
// Back link to guid that this instance set is a member
PBGUIDENTRY GuidEntry;
// Back link to data source that this instance set is a member
struct tagDATASOURCE *DataSource;
// Count of instances in instance set
ULONG Count;
//
// If IS_INSTANCE_BASENAME is set then IsBaseName pointe at instance base
// name structure. Else if IS_INSTANCE_STATICNAME is set then
// IsStaticNames points to static instance name list. If
union
{
PBISBASENAME IsBaseName;
PBISSTATICNAMES IsStaticNames;
};
} INSTANCESET, *PINSTANCESET, *PBINSTANCESET;
#define IS_SIGNATURE 'nalA'
//
// Guid Map Entry List maintains the list of Guid and their maps.
// Only those Guids that are Unregistered while a logger session is in
// progress is kept in this list.
// It is also used as a placeholder for InstanceIds. Trace Guid Registration
// calls return a handle to a GUIDMAPENTRY which maintains the map and the
// Instance Ids.
//
typedef struct tagTRACE_REG_INFO
{
ULONG RegistrationCookie;
HANDLE InProgressEvent; // Registration is in Progress Event
BOOLEAN EnabledState; // Indicates if this GUID is Enabled or not.
PVOID NotifyRoutine;
PVOID TraceCtxHandle;
} TRACE_REG_INFO, *PTRACE_REG_INFO;
typedef struct
{
LIST_ENTRY Entry;
TRACEGUIDMAP GuidMap;
ULONG InstanceId;
ULONG64 LoggerContext;
PTRACE_REG_INFO pControlGuidData;
} GUIDMAPENTRY, *PGUIDMAPENTRY;
#define IS_INSTANCE_BASENAME 0x00000001
#define IS_INSTANCE_STATICNAMES 0x00000002
#define IS_EXPENSIVE 0x00000004 // set if collection must be enabled
#define IS_COLLECTING 0x00000008 // set when collecting
#define IS_KM_PROVIDER 0x00000080 // KM data provider
#define IS_SM_PROVIDER 0x00000100 // Shared memory provider
#define IS_UM_PROVIDER 0x00000200 // User mode provider
#define IS_NEWLY_REGISTERED 0x00000800 // set if IS is registering
//
// Any traced guids are used for trace logging and not querying
#define IS_TRACED 0x00001000
// Set when events are enabled for instance set
#define IS_ENABLE_EVENT 0x00002000
// Set when events are enabled for instance set
#define IS_ENABLE_COLLECTION 0x00004000
// Set if guid is used only for firing events and not querying
#define IS_EVENT_ONLY 0x00008000
// Set if data provider for instance set is expecting ansi instsance names
#define IS_ANSI_INSTANCENAMES 0x00010000
// Set if instance names are originated from a PDO
#define IS_PDO_INSTANCENAME 0x00020000
// If set the data provider for the InstanceSet is internal to wmi.dll
#define IS_INTERNAL_PROVIDER 0x00040000
// Set if a Traced Guid is also a Trace Control Guid
#define IS_CONTROL_GUID 0x00080000
#define IS_ON_FREE_LIST 0x80000000
typedef struct tagGUIDENTRY
{
union
{
// Entry in list of all guids registered with WMI
LIST_ENTRY MainGEList;
// Entry in list of free guid entry blocks
LIST_ENTRY FreeGEList;
};
PCHUNKHEADER Chunk; // Chunk in which entry is located
ULONG Flags;
// Count of number of data sources using this guid
ULONG RefCount;
// Signature to identify entry
ULONG Signature;
// Count of InstanceSets headed by this guid
ULONG ISCount;
// Head of list of all instances for guid
LIST_ENTRY ISHead;
// Guid that represents data block
GUID Guid;
} GUIDENTRY, *PGUIDENTRY, *PBGUIDENTRY;
#define GE_SIGNATURE 'diuG'
#define GE_ON_FREE_LIST 0x80000000
//
// When set this guid is an internally defined guid that has no data source
// attached to it.
#define GE_FLAG_INTERNAL 0x00000001
typedef struct
{
union
{
// Entry in list of all DS
LIST_ENTRY MainMRList;
// Entry in list of free DS
LIST_ENTRY FreeMRList;
};
PCHUNKHEADER Chunk; // Chunk in which entry is located
ULONG Flags;
ULONG RefCount;
// Signature to identify entry
ULONG Signature;
PWCHAR MofImagePath; // Path to image file with resource
PWCHAR MofResourceName; // Name of resource containing mof data
#ifdef WMI_USER_MODE
LIST_ENTRY MRMCHead;
#endif
} MOFRESOURCE, *PMOFRESOURCE;
#define MR_SIGNATURE 'yhsA'
#if DBG
#define AVGMOFRESOURCECOUNT 1
#else
#define AVGMOFRESOURCECOUNT 4
#endif
typedef struct tagDATASOURCE
{
union
{
// Entry in list of all DS
LIST_ENTRY MainDSList;
// Entry in list of free DS
LIST_ENTRY FreeDSList;
};
PCHUNKHEADER Chunk; // Chunk in which entry is located
ULONG Flags;
ULONG RefCount;
ULONG Signature;
// Head of list of instances for this DS
LIST_ENTRY ISHead;
// Binding string and callback address for DS rpc server
PTCHAR BindingString;
RPC_BINDING_HANDLE RpcBindingHandle;
ULONG RequestAddress;
ULONG RequestContext;
// Provider id of kernel mode driver
ULONG_PTR ProviderId;
// Path to registry holding ACLs
PTCHAR RegistryPath;
// Head of list of MofResources attached to data source
ULONG MofResourceCount;
PMOFRESOURCE *MofResources;
PMOFRESOURCE StaticMofResources[AVGMOFRESOURCECOUNT];
};
#define DS_SIGNATURE ' naD'
#define VERIFY_DPCTXHANDLE(DsCtxHandle) \
( ((DsCtxHandle) == NULL) || \
(((PBDATASOURCE)(DsCtxHandle))->Signature == DS_SIGNATURE) )
typedef struct tagDATASOURCE DATASOURCE, *PDATASOURCE, *PBDATASOURCE;
#define DS_ALLOW_ALL_ACCESS 0x00000001
#define DS_KERNEL_MODE 0x00000002
//
// Set in the Internal WMI data source
#define DS_INTERNAL 0x00000004
#define DS_ON_FREE_LIST 0x80000000
//
// A list of enabled notifications is maintained by the wmi service to mange
// delivering events and to know when to send enable and disable event
// wmi requests to the data providers. Each NOTIFICATIONENTRY has an array of
// DCREF which is a reference to the data consumer who is interested in the
// event.
#define RPCOUTSTANDINGCALLLIMIT 128
typedef struct
{
LIST_ENTRY MainDCList; // Node on global data consumer list
PCHUNKHEADER Chunk; // Chunk in which entry is located
ULONG Flags;
ULONG RefCount;
ULONG Signature;
// Actual RPC binding handle
RPC_BINDING_HANDLE RpcBindingHandle;
PUCHAR EventData; // Buffer to hold events to be sent
ULONG LastEventOffset; // Offset in EventData to previous event
ULONG NextEventOffset; // Offset in EventData to write next event
ULONG EventDataSizeLeft; // Number of bytes left to use in EventData
ULONG RpcCallsOutstanding; // Number of rpc calls outstanding
#if DBG
PTCHAR BindingString; // Binding string for consumer
#endif
} DCENTRY, *PDCENTRY;
#define DC_SIGNATURE 'cirE'
// If the data consumer has had its context rundown routine then this flag
// is set. This indicates that the data consumer has gone away and no more
// events should be sent to him.
#define DC_FLAG_RUNDOWN 0x00000001
#define VERIFY_DCCTXHANDLE(DcCtxHandle) \
( ((DcCtxHandle) == NULL) || \
(((PDCENTRY)(DcCtxHandle))->Signature == DC_SIGNATURE) )
typedef struct
{
PDCENTRY DcEntry; // points at data consumer interested in notification
// Number of times collect has been enabled by
// this DC.
ULONG CollectRefCount;
// Number of times collect has been enabled by
// this DC.
ULONG EventRefCount;
ULONG Flags; // Flags
ULONG LostEventCount;
} DCREF, *PDCREF;
//
// _ENABLED flag set if DP already called to enable notification or collection
#define DCREF_FLAG_NOTIFICATION_ENABLED 0x00000001
#define DCREF_FLAG_COLLECTION_ENABLED 0x00000002
// if DCREF_FLAG_NO_EXTRA_THREAD set then WMI will not create a special thread
// to do the direct notification callback.
#define DCREF_FLAG_NO_EXTRA_THREAD 0x00000008
// If this flag is set then the notification callback is expecting an ANSI
// instance names.
#define DCREF_FLAG_ANSI 0x00000010
// NOTE: Other notification flags in wmium.h are:
// NOTIFICATION_TRACE_FLAG 0x00010000
//
// NOTIFICATION_FLAG_CALLBACK_DIRECT is set when NotifyAddress specifies
// a direct callback address for delivering the event.
//
// NOTIFICATION_FLAG_CALLBACK_DIRECT is set when NotifyAddress specifies
// a direct callback address for delivering the event.
//
#define NOTIFICATION_FLAG_CALLBACK_DIRECT 0x00020000
#define NOTIFICATION_FLAG_CALLBACK_QUEUED 0x00040000
#define NOTIFICATION_FLAG_WINDOW 0x00080000
#define NOTIFICATION_FLAG_BATCHED 0x00100000
#define NOTIFICATION_FLAG_GROUPED_EVENT 0x00200000
//
// These are the flags contained in DcRef->Flags that pertain to Notifications
#define NOTIFICATION_MASK_EVENT_FLAGS \
(NOTIFICATION_FLAG_CALLBACK_DIRECT | \
NOTIFICATION_FLAG_CALLBACK_QUEUED | \
NOTIFICATION_FLAG_WINDOW | \
DCREF_FLAG_NO_EXTRA_THREAD | \
DCREF_FLAG_ANSI)
//
// This defines the number of DC references a NOTIFICATIONENTRY can have
// in a single entry
// CONSIDER: Merging NOTIFICATIONENTRY with GUIDENTRY
#define DCREFPERNOTIFICATION 16
typedef struct _notificationentry
{
LIST_ENTRY MainNotificationList; // Node in main notifications list
PCHUNKHEADER Chunk; // Chunk in which entry is located
ULONG Flags; // flags
ULONG RefCount;
// Signature to identify entry
ULONG Signature;
GUID Guid; // guid representing notification
// If > DCREFPERNOTIFICATION DC have
// enabled this event then this points
// to another NOTIFICATIONENTRY which
// has another DCREF array
struct _notificationentry *Continuation;
ULONG EventRefCount; // Global count of event enables
ULONG CollectRefCount; // Global count of collection enables
ULONG64 LoggerContext; // Logger context handle
HANDLE CollectInProgress; // Event set when all collect complete
DCREF DcRef[DCREFPERNOTIFICATION]; // DC that have enabled this event
} NOTIFICATIONENTRY, *PNOTIFICATIONENTRY;
#define NE_SIGNATURE 'eluJ'
// Set when a notification request is being processed by the data providers
#define NE_FLAG_NOTIFICATION_IN_PROGRESS 0x00000001
// Set when a collection request is being processed by the data providers
#define NE_FLAG_COLLECTION_IN_PROGRESS 0x00000002
// Set when a trace disable is being processed by a worker thread
#define NE_FLAG_TRACEDISABLE_IN_PROGRESS 0x00000004
#ifdef WMI_USER_MODE
//
// Valid MOF data types for qualifiers and properties (data items)
typedef enum
{
MOFInt32 = 0, // 32bit integer
MOFUInt32 = 1, // 32bit unsigned integer
MOFInt64 = 2, // 64bit integer
MOFUInt64 = 3, // 32bit unsigned integer
MOFInt16 = 4, // 16bit integer
MOFUInt16 = 5, // 16bit unsigned integer
MOFChar = 6, // 8bit integer
MOFByte = 7, // 8bit unsigned integer
MOFWChar = 8, // Wide (16bit) character
MOFDate = 9, // Date field
MOFBoolean = 10, // 8bit Boolean value
MOFEmbedded = 11, // Embedded class
MOFString = 12, // Counted String type
MOFZTString = 13, // NULL terminated unicode string
MOFAnsiString = 14, // NULL terminated ansi string
MOFUnknown = 0xffffffff // Data type is not known
} MOFDATATYPE, *PMOFDATATYPE;
// Data items that are of type MOFString are stored in the data block as a
// counted unicode string. The text of the string is always preceeded by
// a USHORT which contains the count of bytes following that composes the
// string. The string may be NULL terminated and in that case the count must
// include the null termination bytes.
// Data items that are of type MOFDate are fixed length Unicode strings and
// not preceeded by a count value. It is in the following fixed format:
//
// yyyymmddhhmmss.mmmmmmsutc
//
// Where yyyy is a 4 digit year, mm is the month, dd is the day, hh is
// the hour (24-hour clock), mm is the minute, ss is the second, the
// mmmmmm is the number of microseconds (typically all zeros) and s is a
// "+" or "-" indicating the sign of the UTC (correction field, and utc
// is the offset from UTC in minutes (using the sign indicated by s).
// For example, Wednesday, May 25, 1994, at 1:30:15 PM EDT would be
// represented as:
//
// 19940525133015.0000000-300
//
// Values MUST be zero-padded so that the entire string is always the
// same 25-character length. Fields which are not significant MUST be
// replaced with asterisk characters. Similarly, intervals use the
// same format, except that the interpretation of the fields is based
// on elapsed time. For example, an elapsed time of 1 day, 13 hours,
// 23 minutes, and 12 seconds would be:
//
// 00000001132312.000000+000
//
// A UTC offset of zero is always used for interval properties.
struct _MOFCLASSINFOW;
struct _MOFCLASSINFOA;
//
// Each class has one or more data items that are described by a MOFDATAITEM
// structure.
typedef struct
{
#ifdef MIDL_PASS
[string] PDFWCHAR
#else
LPWSTR
#endif
Name; // Text name of data item
#ifdef MIDL_PASS
[string] PDFWCHAR
#else
LPWSTR
#endif
Description; // Text description of data item
MOFDATATYPE DataType; // MOF data type
ULONG Version; // Version that this MOF is part of
ULONG SizeInBytes; // Size of data item in Blob
ULONG Flags; // Flags, See MOFDI_FLAG_*
GUID EmbeddedClassGuid; // Guid of data item's embedded class
ULONG FixedArrayElements; // Number of elements in fixed sized array
// Used when MOF_FLAG_FIXED_ARRAY is set
ULONG VariableArraySizeId; // MOF_FLAG_VARIABLE_ARRAY, Data id of
// variable containing number of elements
// in array
PVOID VarArrayTempPtr;
PVOID EcTempPtr;
ULONG_PTR PropertyQualifierHandle;
ULONG MethodId;
LPWSTR HeaderName;// Name of structure in generated header
struct _MOFCLASSINFOW *MethodClassInfo;
} MOFDATAITEMW, *PMOFDATAITEMW;
typedef struct
{
LPSTR
Name; // Text name of data item
LPSTR
Description; // Text description of data item
MOFDATATYPE DataType; // MOF data type
ULONG Version; // Version that this MOF is part of
ULONG SizeInBytes; // Size of data item in Blob
ULONG Flags; // Flags, See MOFDI_FLAG_*
GUID EmbeddedClassGuid; // Guid of data item's embedded class
ULONG FixedArrayElements; // Number of elements in fixed sized array
// Used when MOF_FLAG_FIXED_ARRAY is set
ULONG VariableArraySizeId; // MOF_FLAG_VARIABLE_ARRAY, Data id of
// variable containing number of elements
// in array
PVOID VarArrayTempPtr;
PVOID EcTempPtr;
ULONG_PTR PropertyQualifierHandle;
ULONG MethodId;
LPSTR HeaderName; // Name of structure in generated header
struct _MOFCLASSINFOA *MethodClassInfo;
} MOFDATAITEMA, *PMOFDATAITEMA;
#ifdef UNICODE
typedef MOFDATAITEMW MOFDATAITEM;
typedef PMOFDATAITEMW PMOFDATAITEM;
#else
typedef MOFDATAITEMA MOFDATAITEM;
typedef PMOFDATAITEMA PMOFDATAITEM;
#endif
// Data item is actually a fixed sized array
#define MOFDI_FLAG_FIXED_ARRAY 0x00000001
// Data item is actually a variable length array
#define MOFDI_FLAG_VARIABLE_ARRAY 0x00000002
// Data item is actually an embedded class
#define MOFDI_FLAG_EMBEDDED_CLASS 0x00000004
// Data item is readable
#define MOFDI_FLAG_READABLE 0x00000008
// Data item is writable
#define MOFDI_FLAG_WRITEABLE 0x00000010
// Data item is an event
#define MOFDI_FLAG_EVENT 0x00000020
// Embedded class Guid is not set
#define MOFDI_FLAG_EC_GUID_NOT_SET 0x00000040
// Data item is really a method
#define MOFDI_FLAG_METHOD 0x00000080
// Data item is an input method parameter
#define MOFDI_FLAG_INPUT_METHOD 0x00000100
// Data item is an output method parameter
#define MOFDI_FLAG_OUTPUT_METHOD 0x00000200
//
// The MOFCLASSINFO structure describes the format of a data block
typedef struct _MOFCLASSINFOW
{
GUID Guid; // Guid that represents class
#ifdef MIDL_PASS
[string] PDFWCHAR
#else
LPWSTR
#endif
Name; // Text name of class
#ifdef MIDL_PASS
[string] PDFWCHAR
#else
LPWSTR
#endif
Description;// Text description of class
#ifdef MIDL_PASS
[string] PDFWCHAR
#else
LPWSTR
#endif
HeaderName;// Name of structure in generated header
#ifdef MIDL_PASS
[string] PDFWCHAR
#else
LPWSTR
#endif
GuidName1;// Name of Guid in generated header
#ifdef MIDL_PASS
[string] PDFWCHAR
#else
LPWSTR
#endif
GuidName2;// Name of Guid in generated header
USHORT Language; // Language of MOF
USHORT Reserved;
ULONG Flags; // Flags, see MOFGI_FLAG_*
ULONG Version; // Version of Guid
ULONG DataItemCount; // Number of wmi data items (properties)
ULONG MethodCount; // Number of wmi data items (properties)
// Array of Property info
#ifdef MIDL_PASS
[size_is(DataItemCount)]
#endif
MOFDATAITEMW *DataItems;
#ifndef MIDL_PASS
UCHAR Tail[1];
#endif
} MOFCLASSINFOW, *PMOFCLASSINFOW;
typedef struct _MOFCLASSINFOA
{
GUID Guid; // Guid that represents class
LPSTR
Name; // Text name of class
LPSTR
Description;// Text description of class
LPSTR
HeaderName;// Name of structure in generated header
LPSTR
GuidName1;// Name of Guid in generated header
LPSTR
GuidName2;// Name of Guid in generated header
USHORT Language; // Language of MOF
USHORT Reserved;
ULONG Flags; // Flags, see MOFGI_FLAG_*
ULONG Version; // Version of Guid
ULONG DataItemCount; // Number of wmi data items (properties)
ULONG MethodCount; // Number of wmi data items (properties)
// Array of Property info
MOFDATAITEMA *DataItems;
UCHAR Tail[1];
} MOFCLASSINFOA, *PMOFCLASSINFOA;
#ifdef UNICODE
typedef MOFCLASSINFOW MOFCLASSINFO;
typedef PMOFCLASSINFOW PMOFCLASSINFO;
#else
typedef MOFCLASSINFOA MOFCLASSINFO;
typedef PMOFCLASSINFOA PMOFCLASSINFO;
#endif
// 0x00000001 to 0x00000004 are not available
#define MOFCI_FLAG_EVENT 0x10000000
#define MOFCI_FLAG_EMBEDDED_CLASS 0x20000000
#define MOFCI_FLAG_READONLY 0x40000000
#define MOFCI_FLAG_METHOD_PARAMS 0x80000000
typedef struct
{
union
{
// Entry in list of all DS
LIST_ENTRY MainMCList;
// Entry in list of free DS
LIST_ENTRY FreeMCList;
};
PCHUNKHEADER Chunk; // Chunk in which entry is located
ULONG Flags;
ULONG RefCount;
PMOFCLASSINFOW MofClassInfo; // Actual class info data
LIST_ENTRY MCMRList; // Entry in list of MCs in a MR
LIST_ENTRY MCVersionList; // Head or entry in list of MCs with
// same guid, but possibly different versions
ULONG_PTR ClassObjectHandle; // CBMOFObj, BMOF class object ptr
PMOFRESOURCE MofResource; // Resource holding class info
} MOFCLASS, *PMOFCLASS;
// If this is set then the MOF class can never be replaced with a later version
#define MC_FLAG_NEVER_REPLACE 0x00000001
#endif
//
// AVGGUIDSPERDS defines a guess as to the number of guids that get registered
// by any data provider. It is used to allocate the buffer used to deliver
// registration change notifications.
#if DBG
#define AVGGUIDSPERDS 2
#else
#define AVGGUIDSPERDS 256
#endif
#define OffsetToPtr(Base, Offset) ((PBYTE)((PBYTE)(Base) + (Offset)))
//
// Guid and InstanceSet cache
#if DBG
#define PTRCACHEGROWSIZE 2
#else
#define PTRCACHEGROWSIZE 64
#endif
typedef struct
{
LPGUID Guid;
PBINSTANCESET InstanceSet;
} PTRCACHE;
//
// Registration data structures
//
#ifdef MEMPHIS
extern HANDLE SMMutex;
#define WmipEnterSMCritSection() WaitForSingleObject(SMMutex, INFINITE)
#define WmipLeaveSMCritSection() ReleaseMutex(SMMutex)
#else
extern RTL_CRITICAL_SECTION SMCritSect;
#if DBG
#ifdef CRITSECTTRACE
#define WmipEnterSMCritSection() { \
WmipDebugPrint(("WMI: %d Enter SM Crit %s %d\n", GetCurrentThreadId(), __FILE__, __LINE__)); \
RtlEnterCriticalSection(&SMCritSect); }
#define WmipLeaveSMCritSection() { \
WmipDebugPrint(("WMI: %d Leave SM Crit %s %d\n", GetCurrentThreadId(), __FILE__, __LINE__)); \
RtlLeaveCriticalSection(&SMCritSect); }
#else
#define WmipEnterSMCritSection() \
WmipAssert(NT_SUCCESS(RtlEnterCriticalSection(&SMCritSect)));
#define WmipLeaveSMCritSection() { \
WmipAssert(SMCritSect.LockCount >= 0); \
WmipAssert(NT_SUCCESS(RtlLeaveCriticalSection(&SMCritSect))); }
#endif // CRITSECTTRACE
#else
#define WmipEnterSMCritSection() RtlEnterCriticalSection(&SMCritSect)
#define WmipLeaveSMCritSection() RtlLeaveCriticalSection(&SMCritSect)
#endif // DBG
#endif // MEMPHIS
#ifndef IsEqualGUID
#define IsEqualGUID(guid1, guid2) \
(!memcmp((guid1), (guid2), sizeof(GUID)))
#endif
//
// WMI MOF result codes. Since they are never given to the caller they are
// defined in here
#define ERROR_WMIMOF_INCORRECT_DATA_TYPE -1 /* 0xffffffff */
#define ERROR_WMIMOF_NO_DATA -2 /* 0xfffffffe */
#define ERROR_WMIMOF_NOT_FOUND -3 /* 0xfffffffd */
#define ERROR_WMIMOF_UNUSED -4 /* 0xfffffffc */
// Property %ws in class %ws has no embedded class name
#define ERROR_WMIMOF_NO_EMBEDDED_CLASS_NAME -5 /* 0xfffffffb */
// Property %ws in class %ws has an unknown data type
#define ERROR_WMIMOF_UNKNOWN_DATA_TYPE -6 /* 0xfffffffa */
// Property %ws in class %ws has no syntax qualifier
#define ERROR_WMIMOF_NO_SYNTAX_QUALIFIER -7 /* 0xfffffff9 */
#define ERROR_WMIMOF_NO_CLASS_NAME -8 /* 0xfffffff8 */
#define ERROR_WMIMOF_BAD_DATA_FORMAT -9 /* 0xfffffff7 */
// Property %ws in class %ws has the same WmiDataId %d as property %ws
#define ERROR_WMIMOF_DUPLICATE_ID -10 /* 0xfffffff6 */
// Property %ws in class %ws has a WmiDataId of %d which is out of range
#define ERROR_WMIMOF_BAD_DATAITEM_ID -11 /* 0xfffffff5 */
#define ERROR_WMIMOF_MISSING_DATAITEM -12 /* 0xfffffff4 */
// Property for WmiDataId %d is not defined in class %ws
#define ERROR_WMIMOF_DATAITEM_NOT_FOUND -13 /* 0xfffffff3 */
// Embedded class %ws not defined for Property %ws in Class %ws
#define ERROR_WMIMOF_EMBEDDED_CLASS_NOT_FOUND -14 /* 0xfffffff2 */
// Property %ws in class %ws has an incorrect [WmiVersion] qualifier
#define ERROR_WMIMOF_INCONSISTENT_VERSIONING -15 /* 0xfffffff1 */
#define ERROR_WMIMOF_NO_PROPERTY_QUALIFERS -16 /* 0xfffffff0 */
// Class %ws has a badly formed or missing [guid] qualifier
#define ERROR_WMIMOF_BAD_OR_MISSING_GUID -17 /* 0xffffffef */
// Could not find property %ws which is the array size for property %ws in class %ws
#define ERROR_WMIMOF_VL_ARRAY_SIZE_NOT_FOUND -18 /* 0xffffffee */
// A class could not be parsed properly
#define ERROR_WMIMOF_CLASS_NOT_PARSED -19 /* 0xffffffed */
// Wmi class %ws requires the qualifiers [Dynamic, Provider("WmiProv")]
#define ERROR_WMIMOF_MISSING_HMOM_QUALIFIERS -20 /* 0xffffffec */
// Error accessing binary mof file %s
#define ERROR_WMIMOF_CANT_ACCESS_FILE -21 /* 0xffffffeb */
// Property InstanceName in class %ws must be type string and not %ws
#define ERROR_WMIMOF_INSTANCENAME_BAD_TYPE -22 /* 0xffffffea */
// Property Active in class %ws must be type bool and not %ws
#define ERROR_WMIMOF_ACTIVE_BAD_TYPE -23 /* 0xffffffe9 */
// Property %ws in class %ws does not have [WmiDataId()] qualifier
#define ERROR_WMIMOF_NO_WMIDATAID -24 /* 0xffffffe8 */
// Property InstanceName in class %ws must have [key] qualifier
#define ERROR_WMIMOF_INSTANCENAME_NOT_KEY -25 /* 0xffffffe7 */
// Class %ws does not have an InstanceName qualifier
#define ERROR_WMIMOF_NO_INSTANCENAME -26 /* 0xffffffe6 */
// Class %ws does not have an Active qualifier
#define ERROR_WMIMOF_NO_ACTIVE -27 /* 0xffffffe5 */
// Property %ws in class %ws is an array, but doesn't specify a dimension
#define ERROR_WMIMOF_MUST_DIM_ARRAY -28 /* 0xffffffe4 */
// The element count property %ws for the variable length array %ws in class %ws is not an integral type
#define ERROR_WMIMOF_BAD_VL_ARRAY_SIZE_TYPE -29 /* 0xdddddde4 */
// Property %ws in class %ws is both a fixed and variable length array
#define ERROR_WMIMOF_BOTH_FIXED_AND_VARIABLE_ARRAY -30 /* 0xffffffe3 */
// Embedded class %ws should not have InstaneName or Active properties
#define ERROR_WMIMOF_EMBEDDED_CLASS -31 /* 0xffffffe2 */
#define ERROR_WMIMOF_IMPLEMENTED_REQUIRED -32 /* 0xffffffe1 */
// TEXT("WmiMethodId for method %ws in class %ws must be unique")
#define ERROR_WMIMOF_DUPLICATE_METHODID -33 /* 0xffffffe0 */
// TEXT("WmiMethodId for method %ws in class %ws must be specified")
#define ERROR_WMIMOF_MISSING_METHODID -34 /* 0xffffffdf */
// TEXT("WmiMethodId for method %ws in class %ws must not be 0")
#define ERROR_WMIMOF_METHODID_ZERO -35 /* 0xffffffde */
// TEXT("Class %ws is derived from WmiEvent and may not be [abstract]")
#define ERROR_WMIMOF_WMIEVENT_ABSTRACT -36 /* 0xffffffdd */
#define ERROR_WMIMOF_COUNT 36
// This file is not a valid binary mof file
// ERROR_WMI_INVALID_MOF
// There was not enough memory to complete an operation
// ERROR_NOT_ENOUGH_MEMORY
//
// Function prototypes for private functions
//
// sharemem.c
ULONG WmipEstablishSharedMemory(
PBDATASOURCE DataSource,
LPCTSTR SectionName,
ULONG SectionSize
);
//
// validate.c
BOOLEAN WmipValidateCountedString(
WCHAR *String
);
BOOLEAN WmipValidateGuid(
LPGUID Guid
);
BOOLEAN WmipProbeForRead(
PUCHAR Buffer,
ULONG BufferSize
);
//
// alloc.c
extern LIST_ENTRY GEHead;
extern PLIST_ENTRY GEHeadPtr;
extern CHUNKINFO GEChunkInfo;
extern LIST_ENTRY NEHead;
extern PLIST_ENTRY NEHeadPtr;
extern CHUNKINFO NEChunkInfo;
extern LIST_ENTRY DSHead;
extern PLIST_ENTRY DSHeadPtr;
extern CHUNKINFO DSChunkInfo;
extern LIST_ENTRY DCHead;
extern PLIST_ENTRY DCHeadPtr;
extern CHUNKINFO DCChunkInfo;
extern LIST_ENTRY MRHead;
extern PLIST_ENTRY MRHeadPtr;
extern CHUNKINFO MRChunkInfo;
extern CHUNKINFO ISChunkInfo;
extern LIST_ENTRY GMHead;
extern PLIST_ENTRY GMHeadPtr;
#ifdef WMI_USER_MODE
extern LIST_ENTRY MCHead;
extern PLIST_ENTRY MCHeadPtr;
extern CHUNKINFO MCChunkInfo;
#endif
#ifdef TRACK_REFERNECES
#define WmipUnreferenceDS(DataSource) \
{ \
WmipDebugPrint(("WMI: Unref DS %x at %s %d\n", DataSource, __FILE__, __LINE__)); \
WmipUnreferenceEntry(&DSChunkInfo, (PENTRYHEADER)DataSource); \
}
#define WmipReferenceDS(DataSource) \
{ \
WmipDebugPrint(("WMI: Ref DS %x at %s %d\n", DataSource, __FILE__, __LINE__)); \
WmipReferenceEntry((PENTRYHEADER)DataSource); \
}
#define WmipUnreferenceGE(GuidEntry) \
{ \
WmipDebugPrint(("WMI: Unref GE %x at %s %d\n", GuidEntry, __FILE__, __LINE__)); \
WmipUnreferenceEntry(&GEChunkInfo, (PENTRYHEADER)GuidEntry); \
}
#define WmipReferenceGE(GuidEntry) \
{ \
WmipDebugPrint(("WMI: Ref GE %x at %s %d\n", GuidEntry, __FILE__, __LINE__)); \
WmipReferenceEntry((PENTRYHEADER)GuidEntry); \
}
#define WmipUnreferenceIS(InstanceSet) \
{ \
WmipDebugPrint(("WMI: Unref IS %x at %s %d\n", InstanceSet, __FILE__, __LINE__)); \
WmipUnreferenceEntry(&ISChunkInfo, (PENTRYHEADER)InstanceSet); \
}
#define WmipReferenceIS(InstanceSet) \
{ \
WmipDebugPrint(("WMI: Ref IS %x at %s %d\n", InstanceSet, __FILE__, __LINE__)); \
WmipReferenceEntry((PENTRYHEADER)InstanceSet); \
}
#define WmipUnreferenceDC(DataConsumer) \
{ \
WmipDebugPrint(("WMI: Unref DC %x at %s %d\n", DataConsumer, __FILE__, __LINE__)); \
WmipUnreferenceEntry(&DCChunkInfo, (PENTRYHEADER)DataConsumer); \
}
#define WmipReferenceDC(DataConsumer) \
{ \
WmipDebugPrint(("WMI: Ref DC %x at %s %d\n", DataConsumer, __FILE__, __LINE__)); \
WmipReferenceEntry((PENTRYHEADER)DataConsumer); \
}
#define WmipUnreferenceNE(NotificationEntry) \
{ \
WmipDebugPrint(("WMI: Unref NE %x at %s %d\n", NotificationEntry, __FILE__, __LINE__)); \
WmipUnreferenceEntry(&NEChunkInfo, (PENTRYHEADER)NotificationEntry); \
}
#define WmipReferenceNE(NotificationEntry) \
{ \
WmipDebugPrint(("WMI: Ref NE %x at %s %d\n", NotificationEntry, __FILE__, __LINE__)); \
WmipReferenceEntry((PENTRYHEADER)NotificationEntry); \
}
#define WmipUnreferenceMR(MofResource) \
{ \
WmipDebugPrint(("WMI: Unref MR %x at %s %d\n", MofResource, __FILE__, __LINE__)); \
WmipUnreferenceEntry(&MRChunkInfo, (PENTRYHEADER)MofResource); \
}
#define WmipReferenceMR(MofResource) \
{ \
WmipDebugPrint(("WMI: Ref MR %x at %s %d\n", MofResource, __FILE__, __LINE__)); \
WmipReferenceEntry((PENTRYHEADER)MofResource); \
}
#ifdef WMI_USER_MODE
#define WmipUnreferenceMC(MofClass) \
{ \
WmipDebugPrint(("WMI: Unref MC %x at %s %d\n", MofClass, __FILE__, __LINE__)); \
WmipUnreferenceEntry(&MCChunkInfo, (PENTRYHEADER)MofClass); \
}
#define WmipReferenceMC(MofClass) \
{ \
WmipDebugPrint(("WMI: Ref MC %x at %s %d\n", MofClass, __FILE__, __LINE__)); \
WmipReferenceEntry((PENTRYHEADER)MofClass); \
}
#endif
#else
#define WmipUnreferenceDS(DataSource) \
WmipUnreferenceEntry(&DSChunkInfo, (PENTRYHEADER)DataSource)
#define WmipReferenceDS(DataSource) \
WmipReferenceEntry((PENTRYHEADER)DataSource)
#define WmipUnreferenceGE(GuidEntry) \
WmipUnreferenceEntry(&GEChunkInfo, (PENTRYHEADER)GuidEntry)
#define WmipReferenceGE(GuidEntry) \
WmipReferenceEntry((PENTRYHEADER)GuidEntry)
#define WmipUnreferenceIS(InstanceSet) \
WmipUnreferenceEntry(&ISChunkInfo, (PENTRYHEADER)InstanceSet)
#define WmipReferenceIS(InstanceSet) \
WmipReferenceEntry((PENTRYHEADER)InstanceSet)
#define WmipUnreferenceDC(DataConsumer) \
WmipUnreferenceEntry(&DCChunkInfo, (PENTRYHEADER)DataConsumer)
#define WmipReferenceDC(DataConsumer) \
WmipReferenceEntry((PENTRYHEADER)DataConsumer)
#define WmipUnreferenceNE(NotificationEntry) \
WmipUnreferenceEntry(&NEChunkInfo, (PENTRYHEADER)NotificationEntry)
#define WmipReferenceNE(NotificationEntry) \
WmipReferenceEntry((PENTRYHEADER)NotificationEntry)
#define WmipUnreferenceMR(MofResource) \
WmipUnreferenceEntry(&MRChunkInfo, (PENTRYHEADER)MofResource)
#define WmipReferenceMR(MofResource) \
WmipReferenceEntry((PENTRYHEADER)MofResource)
#ifdef WMI_USER_MODE
#define WmipUnreferenceMC(MofClass) \
WmipUnreferenceEntry(&MCChunkInfo, (PENTRYHEADER)MofClass)
#define WmipReferenceMC(MofClass) \
WmipReferenceEntry((PENTRYHEADER)MofClass)
#endif
#endif
PBDATASOURCE WmipAllocDataSource(
void
);
PBGUIDENTRY WmipAllocGuidEntry(
void
);
#define WmipAllocInstanceSet() ((PBINSTANCESET)WmipAllocEntry(&ISChunkInfo))
#define WmipAllocDataConsumer() ((PDCENTRY)WmipAllocEntry(&DCChunkInfo))
#define WmipAllocNotificationEntry() ((PNOTIFICATIONENTRY)WmipAllocEntry(&NEChunkInfo))
#define WmipAllocMofResource() ((PMOFRESOURCE)WmipAllocEntry(&MRChunkInfo))
#ifdef WMI_USER_MODE
#define WmipAllocMofClass() ((PMOFCLASS)WmipAllocEntry(&MCChunkInfo))
#endif
#define WmipAllocString(Size) \
WmipAlloc((Size)*sizeof(WCHAR))
#define WmipFreeString(Ptr) \
WmipFree(Ptr)
#ifdef MEMPHIS
#define WmipAlloc(Size) \
malloc(Size)
#define WmipFree(Ptr) \
free(Ptr)
#define WmipInitProcessHeap()
#else
//
// Reserve 1MB for WMI.DLL, but only commit 16K initially
#define DLLRESERVEDHEAPSIZE 1024 * 1024
#define DLLCOMMITHEAPSIZE 0 * 1024
//
// Reserve 1MB for WMI service, but only commit 16K initially
#define CORERESERVEDHEAPSIZE 1024 * 1024
#define CORECOMMITHEAPSIZE 16 * 1024
extern PVOID WmipProcessHeap;
#define WmipInitProcessHeap() \
{ \
if (WmipProcessHeap == NULL) \
{ \
WmipCreateHeap(); \
} \
}
#ifdef HEAPVALIDATION
PVOID WmipAlloc(
ULONG Size
);
void WmipFree(
PVOID p
);
#else
#if DBG
_inline PVOID WmipAlloc(ULONG Size)
{
WmipAssert(WmipProcessHeap != NULL);
return(RtlAllocateHeap(WmipProcessHeap, 0, Size));
}
_inline void WmipFree(PVOID Ptr)
{
RtlFreeHeap(WmipProcessHeap, 0, Ptr);
}
#else
#define WmipAlloc(Size) \
RtlAllocateHeap(WmipProcessHeap, 0, Size)
#define WmipFree(Ptr) \
RtlFreeHeap(WmipProcessHeap, 0, Ptr)
#endif
#endif
#endif
BOOLEAN WmipRealloc(
PVOID *Buffer,
ULONG CurrentSize,
ULONG NewSize,
BOOLEAN FreeOriginalBuffer
);
//
// datastr.c
extern GUID WmipBinaryMofGuid;
void WmipGenerateBinaryMofNotification(
PBINSTANCESET BianryMofInstanceSet,
LPCGUID Guid
);
BOOLEAN WmipEstablishInstanceSetRef(
PBDATASOURCE DataSourceRef,
LPGUID Guid,
PBINSTANCESET InstanceSet
);
ULONG WmipAddDataSource(
PTCHAR QueryBinding,
ULONG RequestAddress,
ULONG RequestContext,
LPCTSTR ImagePath,
PWMIREGINFOW RegistrationInfo,
ULONG RegistrationInfoSize,
ULONG_PTR *ProviderId,
BOOLEAN IsAnsi
);
ULONG WmipUpdateAddGuid(
PBDATASOURCE DataSource,
PWMIREGGUID RegGuid,
PWMIREGINFO RegistrationInfo,
PBINSTANCESET *AddModInstanceSet
);
ULONG WmipUpdateModifyGuid(
PBDATASOURCE DataSource,
PWMIREGGUID RegGuid,
PWMIREGINFO RegistrationInfo,
PBINSTANCESET *AddModInstanceSet
);
BOOLEAN WmipUpdateRemoveGuid(
PBDATASOURCE DataSource,
PWMIREGGUID RegGuid,
PBINSTANCESET *AddModInstanceSet
);
void WmipUpdateDataSource(
ULONG_PTR ProviderId,
PWMIREGINFOW RegistrationInfo,
ULONG RetSize
);
void WmipRemoveDataSource(
ULONG_PTR ProviderId
);
void WmipRemoveDataSourceByDS(
PBDATASOURCE DataSource
);
ULONG WmipRegisterInternalDataSource(
void
);
PBGUIDENTRY WmipFindGEByGuid(
LPGUID Guid,
BOOLEAN MakeTopOfList
);
PBINSTANCESET WmipFindISInDSByGuid(
PBDATASOURCE DataSource,
LPGUID Guid
);
PNOTIFICATIONENTRY WmipFindNEByGuid(
GUID UNALIGNED *Guid,
BOOLEAN MakeTopOfList
);
PDCREF WmipFindExistingAndFreeDCRefInNE(
PNOTIFICATIONENTRY NotificationEntry,
PDCENTRY DataConsumer,
PDCREF *FreeDcRef
);
PDCREF WmipFindDCRefInNE(
PNOTIFICATIONENTRY NotificationEntry,
PDCENTRY DataConsumer
);
PBDATASOURCE WmipFindDSByProviderId(
ULONG_PTR ProviderId
);
PBINSTANCESET WmipFindISByGuid(
PBDATASOURCE DataSource,
GUID UNALIGNED *Guid
);
PMOFRESOURCE WmipFindMRByNames(
LPCWSTR ImagePath,
LPCWSTR MofResourceName
);
#ifdef WMI_USER_MODE
PMOFCLASS WmipFindMCByGuid(
LPGUID Guid
);
PMOFCLASS WmipFindMCByGuidAndBestLanguage(
LPGUID Guid,
WORD Language
);
PMOFCLASS WmipFindMCByGuidAndLanguage(
LPGUID Guid,
WORD Language
);
#endif
PBINSTANCESET WmipFindISinGEbyName(
PBGUIDENTRY GuidEntry,
PWCHAR InstanceName,
PULONG InstanceIndex
);
PWNODE_HEADER WmipGenerateRegistrationNotification(
PBDATASOURCE DataSource,
PWNODE_HEADER Wnode,
ULONG GuidMax,
ULONG NotificationCode
);
BOOLEAN
WmipIsControlGuid(
PBGUIDENTRY GuidEntry
);
void WmipGenerateMofResourceNotification(
LPWSTR ImagePath,
LPWSTR ResourceName,
LPCGUID Guid
);
//
// wbem.c
ULONG WmipBuildMofClassInfo(
PBDATASOURCE DataSource,
LPWSTR ImagePath,
LPWSTR MofResourceName,
PBOOLEAN NewMofResource
);
ULONG WmipReadBuiltinMof(
void
);
//
// from krnlmode.c
ULONG WmipInitializeKM(
HANDLE *WmiKMHandle
);
void WmipKMNonEventNotification(
HANDLE WmiKMHandle,
PWNODE_HEADER Wnode
);
//
// main.c
extern HANDLE WmipRestrictedToken;
void WmipGetRegistryValue(
TCHAR *ValueName,
PULONG Value
);
ULONG WmiRunService(
ULONG Context
#ifdef MEMPHIS
, HINSTANCE InstanceHandle
#endif
);
ULONG WmipInitializeAccess(
PTCHAR *RpcStringBinding
);
void WmiTerminateService(
void
);
ULONG WmiInitializeService(
void
);
void WmiDeinitializeService(
void
);
void WmipEventNotification(
PWNODE_HEADER Wnode,
BOOLEAN SingleEvent,
ULONG EventSizeGuess
);
#define WmipBuildRegistrationNotification(Wnode, WnodeSize, NotificationCode, GuidCount) { \
memset(Wnode, 0, sizeof(WNODE_HEADER)); \
memcpy(&Wnode->Guid, &RegChangeNotificationGuid, sizeof(GUID)); \
Wnode->BufferSize = WnodeSize; \
Wnode->Linkage = NotificationCode; \
Wnode->Version = GuidCount; \
Wnode->Flags = WNODE_FLAG_INTERNAL; \
}
void WmipSendQueuedEvents(
void
);
ULONG WmipCleanupDataConsumer(
PDCENTRY DataConsumer
#if DBG
,BOOLEAN *NotificationsEnabled,
BOOLEAN *CollectionsEnabled
#endif
);
//
// This defines the maximum number of replacement strings over all of the
// event messages.
#define MAX_MESSAGE_STRINGS 2
void __cdecl WmipReportEventLog(
ULONG MessageCode,
WORD MessageType,
WORD MessageCategory,
DWORD RawDataSize,
PVOID RawData,
WORD StringCount,
...
);
#ifdef MEMPHIS
long WINAPI
DeviceNotificationWndProc(HWND hWnd, UINT Message, WPARAM wParam, LPARAM lParam);
void WmipDestroyDeviceNotificationWindow(
HINSTANCE InstanceHandle,
HWND WindowHandle
);
ULONG WmipCreateDeviceNotificationWindow(
HINSTANCE InstanceHandle,
HWND *DeviceNotificationWindow
);
#endif
//
// server.c
void WmipRpcServerDeinitialize(
void
);
ULONG WmipRpcServerInitialize(
void
);
ULONG WmipDeliverWnodeToDS(
ULONG ActionCode,
PBDATASOURCE DataSource,
PWNODE_HEADER Wnode
);
ULONG WmipDoDisableRequest(
PNOTIFICATIONENTRY NotificationEntry,
PBGUIDENTRY GuidEntry,
BOOLEAN IsEvent,
BOOLEAN IsTraceLog,
ULONG64 LoggerContext,
ULONG InProgressFlag
);
ULONG CollectOrEventWorker(
PDCENTRY DataConsumer,
LPGUID Guid,
BOOLEAN Enable,
BOOLEAN IsEvent,
ULONG *NotificationCookie,
ULONG64 LoggerContext,
ULONG NotificationFlags
);
ULONG WmipCreateRestrictedToken(
HANDLE *RestrictedToken
);
void WmipShowPrivs(
HANDLE TokenHandle
);
#ifdef MEMPHIS
#define WmipRestrictToken(Token) (ERROR_SUCCESS)
#define WmipUnrestrictToken() (ERROR_SUCCESS)
#else
ULONG WmipRestrictToken(
HANDLE RestrictedToken
);
ULONG WmipUnrestrictToken(
void
);
ULONG WmipServiceDisableTraceProviders(
PWNODE_HEADER Wnode
);
#endif
void WmipReleaseCollectionEnabled(
PNOTIFICATIONENTRY NotificationEntry
);
//
// chunk.c
ULONG UnicodeToAnsi(
LPCWSTR pszW,
LPSTR * ppszA,
ULONG *AnsiSizeInBytes OPTIONAL
);
ULONG AnsiToUnicode(
LPCSTR pszA,
LPWSTR * ppszW
);
ULONG AnsiSizeForUnicodeString(
PWCHAR UnicodeString,
ULONG *AnsiSizeInBytes
);
ULONG UnicodeSizeForAnsiString(
LPCSTR AnsiString,
ULONG *UnicodeSizeInBytes
);
//
// debug.c
#if DBG
void WmipDumpIS(
PBINSTANCESET IS,
BOOLEAN RecurseGE,
BOOLEAN RecurseDS
);
void WmipDumpGE(
PBGUIDENTRY GE,
BOOLEAN RecurseIS
);
void WmipDumpDS(
PBDATASOURCE DS,
BOOLEAN RecurseIS
);
void WmipDumpAllDS(
void
);
#endif
#ifndef MEMPHIS
typedef enum
{
TRACELOG_START = 0,
TRACELOG_STOP = 1,
TRACELOG_QUERY = 2,
TRACELOG_QUERYALL = 3,
TRACELOG_QUERYENABLED = 4,
TRACELOG_UPDATE = 5,
TRACELOG_FLUSH = 6
} TRACEREQUESTCODE;
typedef struct _WMI_REF_CLOCK {
LARGE_INTEGER StartTime;
LARGE_INTEGER StartPerfClock;
} WMI_REF_CLOCK, *PWMI_REF_CLOCK;
//
// logsup.c
ULONG
WmiUnregisterGuids(
IN WMIHANDLE WMIHandle,
IN LPGUID Guid,
OUT ULONG64 *LoggerContext
);
void
WmipGenericTraceEnable(
IN ULONG RequestCode,
IN PVOID Buffer,
IN OUT PVOID *RequestAddress
);
ULONG
WmipAddLogHeaderToLogFile(
IN OUT PWMI_LOGGER_INFORMATION LoggerInfo,
IN PWMI_REF_CLOCK RefClock,
IN ULONG Update
);
ULONG
WmipStartLogger(
IN OUT PWMI_LOGGER_INFORMATION LoggerInfo
);
ULONG
WmipStopLogger(
IN OUT PWMI_LOGGER_INFORMATION LoggerInfo
);
ULONG
WmipQueryLogger(
IN OUT PWMI_LOGGER_INFORMATION LoggerInfo,
IN ULONG Update
);
ULONG
WmipFlushLogger(
IN OUT PWMI_LOGGER_INFORMATION LoggerInfo
);
VOID
WmipInitString(
IN PVOID Destination,
IN PVOID Buffer,
IN ULONG Size
);
ULONG
WmipGetTraceRegKeys(
);
ULONG
WmipFinalizeLogFileHeader(
IN PWMI_LOGGER_INFORMATION LoggerInfo
);
//
// umlog.c
BOOLEAN
FASTCALL
WmipIsPrivateLoggerOn();
ULONG
WmipFlushUmLoggerBuffer();
ULONG
WmipSendUmLogRequest(
IN WMITRACECODE RequestCode,
IN OUT PWMI_LOGGER_INFORMATION LoggerInfo
);
ULONG
FASTCALL
WmiTraceUmEvent(
IN PWNODE_HEADER Wnode
);
ULONG
WmipStartUmLogger(
IN ULONG WnodeSize,
IN OUT ULONG *SizeUsed,
OUT ULONG *SizeNeeded,
IN OUT PWMI_LOGGER_INFORMATION LoggerInfo
);
ULONG
WmipStopUmLogger(
IN ULONG WnodeSize,
IN OUT ULONG *SizeUsed,
OUT ULONG *SizeNeeded,
IN OUT PWMI_LOGGER_INFORMATION LoggerInfo
);
PWMI_BUFFER_HEADER
FASTCALL
WmipGetFullFreeBuffer();
LONG
FASTCALL
WmipReleaseTraceBuffer(
IN PWMI_BUFFER_HEADER BufferResource
);
PWMI_BUFFER_HEADER
FASTCALL
WmipSwitchFullBuffer(
IN PWMI_BUFFER_HEADER OldBuffer
);
ULONG
WmipReleaseFullBuffer(
IN PWMI_BUFFER_HEADER Buffer
);
#endif