858 lines
26 KiB
C
858 lines
26 KiB
C
|
/*++
|
||
|
|
||
|
Copyright (c) Microsoft Corporation. All rights reserved.
|
||
|
|
||
|
Module Name:
|
||
|
|
||
|
wmiumkm.h
|
||
|
|
||
|
Abstract:
|
||
|
|
||
|
Private definitions for WMI communications between user and kernel modes
|
||
|
|
||
|
Author:
|
||
|
|
||
|
AlanWar
|
||
|
|
||
|
Environment:
|
||
|
|
||
|
Kernel and User modes
|
||
|
|
||
|
Revision History:
|
||
|
|
||
|
|
||
|
--*/
|
||
|
|
||
|
#ifndef _WMIUMKM_
|
||
|
#define _WMIUMKM_
|
||
|
#if (_MSC_VER > 1020)
|
||
|
#pragma once
|
||
|
#endif
|
||
|
#if _MSC_VER >= 1200
|
||
|
#pragma warning(push)
|
||
|
#endif
|
||
|
#pragma warning(disable: 4200) // nonstandard extension used : zero-sized array in struct/union
|
||
|
|
||
|
//
|
||
|
// This defines the guid under which the default WMI security descriptor
|
||
|
// is maintained.
|
||
|
DEFINE_GUID(DefaultSecurityGuid, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
|
||
|
#define DefaultSecurityGuidName L"00000000-0000-0000-0000-000000000000"
|
||
|
|
||
|
#ifndef _WMIKM_
|
||
|
|
||
|
//
|
||
|
// This defines the codes used to define what a request must do. These
|
||
|
// definitions must match the same in wmium.h
|
||
|
//
|
||
|
|
||
|
typedef enum tagWMIACTIONCODE
|
||
|
{
|
||
|
WmiGetAllData = 0,
|
||
|
WmiGetSingleInstance = 1,
|
||
|
WmiChangeSingleInstance = 2,
|
||
|
WmiChangeSingleItem = 3,
|
||
|
WmiEnableEvents = 4,
|
||
|
WmiDisableEvents = 5,
|
||
|
WmiEnableCollection = 6,
|
||
|
WmiDisableCollection = 7,
|
||
|
WmiRegisterInfo = 8,
|
||
|
WmiExecuteMethodCall = 9,
|
||
|
WmiSetTraceNotify = 10
|
||
|
} WMIACTIONCODE;
|
||
|
|
||
|
#endif
|
||
|
|
||
|
#if defined(_WINNT_) || defined(WINNT)
|
||
|
|
||
|
typedef enum
|
||
|
{
|
||
|
WmiStartLoggerCode = 32,
|
||
|
WmiStopLoggerCode = 33,
|
||
|
WmiQueryLoggerCode = 34,
|
||
|
WmiTraceEventCode = 35,
|
||
|
WmiUpdateLoggerCode = 36,
|
||
|
WmiFlushLoggerCode = 37,
|
||
|
WmiMBRequest = 38,
|
||
|
WmiRequestDied = 39,
|
||
|
WmiTraceMessageCode = 40,
|
||
|
WmiSetMarkCode = 41,
|
||
|
WmiNtdllLoggerCode = 42,
|
||
|
WmiClockTypeCode = 43
|
||
|
|
||
|
#ifdef NTPERF
|
||
|
,
|
||
|
WmiSwitchBufferCode = 63
|
||
|
#endif
|
||
|
} WMITRACECODE;
|
||
|
#endif
|
||
|
|
||
|
typedef enum
|
||
|
{
|
||
|
WmiReadNotifications = 64,
|
||
|
WmiGetNextRegistrant = 65,
|
||
|
#ifndef MEMPHIS
|
||
|
WmiOpenGuid = 66,
|
||
|
#endif
|
||
|
WmiNotifyUser = 67,
|
||
|
WmiGetAllRegistrant = 68,
|
||
|
WmiGenerateEvent = 69,
|
||
|
|
||
|
WmiTranslateFileHandle = 71,
|
||
|
WmiGetVersion = 73,
|
||
|
WmiCheckAccess = 74,
|
||
|
|
||
|
WmiQueryAllMultiple = 75,
|
||
|
WmiQuerySingleMultiple = 76,
|
||
|
WmiEnumerateGuidList = 77,
|
||
|
WmiQueryDataBlockInformation = 78,
|
||
|
WmiOpenGuidForQuerySet = 79,
|
||
|
WmiOpenGuidForEvents = 80,
|
||
|
WmiReceiveNotif = 81,
|
||
|
WmiEnableDisableTracelogProvider = 82,
|
||
|
WmiRegisterGuids = 83,
|
||
|
WmiCreateUMLogger = 84,
|
||
|
WmiMBReply = 85,
|
||
|
WmiEnumerateMofResouces = 86,
|
||
|
WmiUnregisterDP = 87,
|
||
|
WmiEnumerateGuidListAndProperties = 88,
|
||
|
WmiNotifyLanguageChange = 89,
|
||
|
WmiMarkHandleAsClosed = 90
|
||
|
} WMISERVICECODES;
|
||
|
|
||
|
#define WMIUMKM_LL(x) L##x
|
||
|
#define WMIUMKM_L(x) WMIUMKM_LL(x)
|
||
|
//
|
||
|
// This defines the name of the WMI device that manages service IOCTLS
|
||
|
//
|
||
|
#define WMIServiceDeviceObjectName L"\\Device\\WMIDataDevice"
|
||
|
|
||
|
#define WMIServiceDeviceName_A "\\\\.\\WMIDataDevice"
|
||
|
#define WMIServiceDeviceName_W WMIUMKM_L(WMIServiceDeviceName_A)
|
||
|
#define WMIServiceDeviceName TEXT(WMIServiceDeviceName_A)
|
||
|
|
||
|
#define WMIServiceSymbolicLinkName_A "\\DosDevices\\WMIDataDevice"
|
||
|
#define WMIServiceSymbolicLinkName_W WMIUMKM_L(WMIServiceSymbolicLinkName_A)
|
||
|
#define WMIServiceSymbolicLinkName TEXT(WMIServiceSymbolicLinkName_A)
|
||
|
|
||
|
#define WMIAdminDeviceObjectName L"\\Device\\WMIAdminDevice"
|
||
|
#define WMIAdminDeviceName_A "\\\\.\\WMIAdminDevice"
|
||
|
#define WMIAdminDeviceName_W WMIUMKM_L(WMIAdminDeviceName_A)
|
||
|
#define WMIAdminDeviceName TEXT(WMIAdminDeviceName_A)
|
||
|
#define WMIAdminSymbolicLinkName TEXT("\\DosDevices\\WMIAdminDevice")
|
||
|
|
||
|
#ifdef MEMPHIS
|
||
|
//
|
||
|
// This id the name of the device that handles query/set IOCTLS. On memphis
|
||
|
// it is the same as the service device name.
|
||
|
#define WMIDataDeviceObjectName L"\\Device\\WMIDevice"
|
||
|
|
||
|
#define WMIDataDeviceName_A "\\\\.\\WMIServiceDevice")
|
||
|
#define WMIDataDeviceName_W WMIUMKM_L(WMIDataDeviceName_A)
|
||
|
#define WMIDataDeviceName TEXT(WMIDataDeviceName_A)
|
||
|
|
||
|
#define WMIDataSymbolicLinkName_A "\\DosDevices\\WMIServiceDevice"
|
||
|
#define WMIDataSymbolicLinkName_W WMIUMKM_L(WMIDataSymbolicLinkName_A)
|
||
|
#define WMIDataSymbolicLinkName TEXT(WMIDataSymbolicLinkName_A)
|
||
|
|
||
|
#else
|
||
|
|
||
|
#define WMIDataDeviceObjectName WMIServiceDeviceObjectName
|
||
|
#define WMIDataDeviceName_A WMIServiceDeviceName_A
|
||
|
#define WMIDataDeviceName_W WMIServiceDeviceName_W
|
||
|
#define WMIDataDeviceName WMIServiceDeviceName
|
||
|
#define WMIDataSymbolicLinkName_A WMIServiceSymbolicLinkName_A
|
||
|
#define WMIDataSymbolicLinkName_W WMIServiceSymbolicLinkName_W
|
||
|
#define WMIDataSymbolicLinkName WMIServiceSymbolicLinkName
|
||
|
|
||
|
#endif
|
||
|
|
||
|
//
|
||
|
// This defines the data structure that is used to pass a handle from
|
||
|
// um to km. In 32bit code a handle has 32bits and in 64bit code a handle
|
||
|
// has 64 bits and both call into the kernel which is 64bits. In order to
|
||
|
// insure that the data structures compile to the same size on 32 and 64
|
||
|
// bit systems we define the union with a dummy 64bit value so the field is
|
||
|
// forced to be 64 bits in all code. Note that the object manager always
|
||
|
// ignores the top 32bits of the handle in order to support 32 bit code
|
||
|
// that only maintains 32 bit handles
|
||
|
//
|
||
|
typedef union
|
||
|
{
|
||
|
HANDLE Handle;
|
||
|
ULONG64 Handle64;
|
||
|
ULONG32 Handle32;
|
||
|
} HANDLE3264, *PHANDLE3264;
|
||
|
|
||
|
typedef HANDLE3264 PVOID3264;
|
||
|
|
||
|
#ifdef _WIN64
|
||
|
#define WmipSetHandle3264(Handle3264, XHandle) \
|
||
|
(Handle3264).Handle = XHandle
|
||
|
#else
|
||
|
#define WmipSetHandle3264(Handle3264, XHandle) \
|
||
|
{ (Handle3264).Handle64 = 0; (Handle3264).Handle32 = (ULONG32)XHandle; }
|
||
|
#endif
|
||
|
#define WmipSetPVoid3264 WmipSetHandle3264
|
||
|
|
||
|
//
|
||
|
// This IOCTL will return when a KM notification has been generated that
|
||
|
// requires user mode attention.
|
||
|
// BufferIn - Not used
|
||
|
// BufferOut - Buffer to return notification information
|
||
|
#define IOCTL_WMI_READ_NOTIFICATIONS \
|
||
|
CTL_CODE(FILE_DEVICE_UNKNOWN, WmiReadNotifications, METHOD_BUFFERED, FILE_READ_ACCESS)
|
||
|
|
||
|
//
|
||
|
// This IOCTL will return with the next set of unprocessed registration info
|
||
|
// BufferIn - Not used
|
||
|
// BufferOut - Buffer to return registration information
|
||
|
#define IOCTL_WMI_GET_NEXT_REGISTRANT \
|
||
|
CTL_CODE(FILE_DEVICE_UNKNOWN, WmiGetNextRegistrant, METHOD_BUFFERED, FILE_READ_ACCESS)
|
||
|
|
||
|
#ifndef MEMPHIS
|
||
|
//
|
||
|
// This IOCTL will return a handle to a guid
|
||
|
// BufferIn - WMIOPENGUIDBLOCK
|
||
|
// BufferOut - WMIOPENGUIDBLOCK
|
||
|
#define IOCTL_WMI_OPEN_GUID \
|
||
|
CTL_CODE(FILE_DEVICE_UNKNOWN, WmiOpenGuid, METHOD_BUFFERED, FILE_READ_ACCESS)
|
||
|
#define IOCTL_WMI_OPEN_GUID_FOR_QUERYSET \
|
||
|
CTL_CODE(FILE_DEVICE_UNKNOWN, WmiOpenGuidForQuerySet, METHOD_BUFFERED, FILE_READ_ACCESS)
|
||
|
|
||
|
#define IOCTL_WMI_OPEN_GUID_FOR_EVENTS \
|
||
|
CTL_CODE(FILE_DEVICE_UNKNOWN, WmiOpenGuidForEvents, METHOD_BUFFERED, FILE_READ_ACCESS)
|
||
|
#endif
|
||
|
|
||
|
// This IOCTL will perform a query for all data items of a data block
|
||
|
// BufferIn - Incoming WNODE describing query. This gets filled in by driver
|
||
|
#define IOCTL_WMI_QUERY_ALL_DATA \
|
||
|
CTL_CODE(FILE_DEVICE_UNKNOWN, WmiGetAllData, METHOD_BUFFERED, FILE_READ_ACCESS)
|
||
|
|
||
|
// This IOCTL will query for a single instance
|
||
|
// BufferIn - Incoming WNODE describing query. This gets filled in by driver
|
||
|
#define IOCTL_WMI_QUERY_SINGLE_INSTANCE \
|
||
|
CTL_CODE(FILE_DEVICE_UNKNOWN, WmiGetSingleInstance, METHOD_BUFFERED, FILE_READ_ACCESS)
|
||
|
|
||
|
// This IOCTL will set a single instance
|
||
|
// BufferIn - Incoming WNODE describing set.
|
||
|
#define IOCTL_WMI_SET_SINGLE_INSTANCE \
|
||
|
CTL_CODE(FILE_DEVICE_UNKNOWN, WmiChangeSingleInstance, METHOD_BUFFERED, FILE_WRITE_ACCESS)
|
||
|
|
||
|
// This IOCTL will set a single item
|
||
|
// BufferIn - Incoming WNODE describing set.
|
||
|
#define IOCTL_WMI_SET_SINGLE_ITEM \
|
||
|
CTL_CODE(FILE_DEVICE_UNKNOWN, WmiChangeSingleItem, METHOD_BUFFERED, FILE_WRITE_ACCESS)
|
||
|
|
||
|
// This IOCTL will enable an event
|
||
|
// BufferIn - Incoming WNODE event item to enable
|
||
|
#define IOCTL_WMI_ENABLE_EVENT \
|
||
|
CTL_CODE(FILE_DEVICE_UNKNOWN, WmiEnableEvents, METHOD_BUFFERED, FILE_WRITE_ACCESS)
|
||
|
|
||
|
// This IOCTL will disable an event
|
||
|
// BufferIn - Incoming WNODE event item to disable
|
||
|
#define IOCTL_WMI_DISABLE_EVENT \
|
||
|
CTL_CODE(FILE_DEVICE_UNKNOWN, WmiDisableEvents, METHOD_BUFFERED, FILE_WRITE_ACCESS)
|
||
|
|
||
|
// This IOCTL will enable collection
|
||
|
// BufferIn - Incoming WNODE describing what to enable for collection
|
||
|
#define IOCTL_WMI_ENABLE_COLLECTION \
|
||
|
CTL_CODE(FILE_DEVICE_UNKNOWN, WmiEnableCollection, METHOD_BUFFERED, FILE_WRITE_ACCESS)
|
||
|
|
||
|
// This IOCTL will disable collection
|
||
|
// BufferIn - Incoming WNODE describing what to disable for collection
|
||
|
#define IOCTL_WMI_DISABLE_COLLECTION \
|
||
|
CTL_CODE(FILE_DEVICE_UNKNOWN, WmiDisableCollection, METHOD_BUFFERED, FILE_WRITE_ACCESS)
|
||
|
|
||
|
// This IOCTL will return the registration information for a specific provider
|
||
|
// BufferIn - Provider handle
|
||
|
// BufferOut - Buffer to return WMI information
|
||
|
#define IOCTL_WMI_GET_REGINFO \
|
||
|
CTL_CODE(FILE_DEVICE_UNKNOWN, WmiRegisterInfo, METHOD_BUFFERED, FILE_WRITE_ACCESS)
|
||
|
|
||
|
// This IOCTL will execute a method on a device
|
||
|
// BufferIn - WNODE_METHOD_ITEM
|
||
|
// BufferOut - WNODE_METHOD_ITEM
|
||
|
#define IOCTL_WMI_EXECUTE_METHOD \
|
||
|
CTL_CODE(FILE_DEVICE_UNKNOWN, WmiExecuteMethodCall, METHOD_BUFFERED, FILE_WRITE_ACCESS)
|
||
|
|
||
|
|
||
|
// This IOCTL will do a query all data multiple
|
||
|
// BufferIn - WMIQADMULTIPLE
|
||
|
// BufferOut - Linked WNODE_ALL_DATA with results
|
||
|
#define IOCTL_WMI_QAD_MULTIPLE \
|
||
|
CTL_CODE(FILE_DEVICE_UNKNOWN, WmiQueryAllMultiple, METHOD_BUFFERED, FILE_WRITE_ACCESS)
|
||
|
|
||
|
//
|
||
|
// This specifies the maxiumum number of handles that can be passed to
|
||
|
// query all data multiple and query single instance multiple
|
||
|
//
|
||
|
#define QUERYMULIPLEHANDLELIMIT 0x1000
|
||
|
|
||
|
typedef struct
|
||
|
{
|
||
|
ULONG HandleCount;
|
||
|
HANDLE3264 Handles[1];
|
||
|
} WMIQADMULTIPLE, *PWMIQADMULTIPLE;
|
||
|
|
||
|
// This IOCTL will do a query single instance multiple
|
||
|
// BufferIn - WMIQSIMULTIPLE
|
||
|
// BufferOut - Linked WNODE_SINGLE_INSTANCE with results
|
||
|
#define IOCTL_WMI_QSI_MULTIPLE \
|
||
|
CTL_CODE(FILE_DEVICE_UNKNOWN, WmiQuerySingleMultiple, METHOD_BUFFERED, FILE_WRITE_ACCESS)
|
||
|
|
||
|
#ifndef MEMPHIS
|
||
|
typedef struct
|
||
|
{
|
||
|
USHORT Length;
|
||
|
USHORT MaximumLength;
|
||
|
union
|
||
|
{
|
||
|
PWSTR Buffer;
|
||
|
ULONG64 Dummy;
|
||
|
};
|
||
|
} UNICODE_STRING3264, *PUNICODE_STRING3264;
|
||
|
|
||
|
typedef struct
|
||
|
{
|
||
|
HANDLE3264 Handle;
|
||
|
UNICODE_STRING3264 InstanceName;
|
||
|
} WMIQSIINFO, *PWMIQSIINFO;
|
||
|
typedef struct
|
||
|
{
|
||
|
ULONG QueryCount;
|
||
|
WMIQSIINFO QsiInfo[1];
|
||
|
} WMIQSIMULTIPLE, *PWMIQSIMULTIPLE;
|
||
|
#endif
|
||
|
|
||
|
// This IOCTL will mark the object as not longer able to receive events
|
||
|
// BufferIn - WMIMARKASCLOSED
|
||
|
// BufferOut -
|
||
|
#define IOCTL_WMI_MARK_HANDLE_AS_CLOSED \
|
||
|
CTL_CODE(FILE_DEVICE_UNKNOWN, WmiMarkHandleAsClosed, METHOD_BUFFERED, FILE_WRITE_ACCESS)
|
||
|
|
||
|
typedef struct
|
||
|
{
|
||
|
HANDLE3264 Handle;
|
||
|
} WMIMARKASCLOSED, *PWMIMARKASCLOSED;
|
||
|
|
||
|
|
||
|
// This IOCTL will register for receiving an event
|
||
|
// BufferIn - WMIRECEIVENOTIFICATIONS
|
||
|
// BufferOut - WMIRECEIVENOTIFICATIONS
|
||
|
#define IOCTL_WMI_RECEIVE_NOTIFICATIONS \
|
||
|
CTL_CODE(FILE_DEVICE_UNKNOWN, WmiReceiveNotif, METHOD_BUFFERED, FILE_WRITE_ACCESS)
|
||
|
|
||
|
//
|
||
|
// WmiReceiveNotification
|
||
|
//
|
||
|
|
||
|
#define RECEIVE_ACTION_NONE 1 // No special action required
|
||
|
#define RECEIVE_ACTION_CREATE_THREAD 2 // Mark guid objects as requiring
|
||
|
// a new thread to be
|
||
|
// created
|
||
|
typedef struct
|
||
|
{
|
||
|
//
|
||
|
// List of guid notification handles
|
||
|
//
|
||
|
ULONG HandleCount;
|
||
|
ULONG Action;
|
||
|
PVOID3264 /* PUSER_THREAD_START_ROUTINE */ UserModeCallback;
|
||
|
HANDLE3264 UserModeProcess;
|
||
|
HANDLE3264 Handles[1];
|
||
|
} WMIRECEIVENOTIFICATION, *PWMIRECEIVENOTIFICATION;
|
||
|
|
||
|
|
||
|
// This IOCTL will cause a registration notification to be generated
|
||
|
// BufferIn - Not used
|
||
|
// BufferOut - Not used
|
||
|
#define IOCTL_WMI_NOTIFY_USER \
|
||
|
CTL_CODE(FILE_DEVICE_UNKNOWN, WmiNotifyUser, METHOD_BUFFERED, FILE_WRITE_ACCESS)
|
||
|
|
||
|
//
|
||
|
// This IOCTL will return with the all registration info
|
||
|
// BufferIn - Not used
|
||
|
// BufferOut - Buffer to return all registration information
|
||
|
#define IOCTL_WMI_GET_ALL_REGISTRANT \
|
||
|
CTL_CODE(FILE_DEVICE_UNKNOWN, WmiGetAllRegistrant, METHOD_BUFFERED, FILE_READ_ACCESS)
|
||
|
|
||
|
//
|
||
|
// This IOCTL will cause certain data providers to generate events
|
||
|
// BufferIn - WnodeEventItem to use in firing event
|
||
|
// BufferOut - Not Used
|
||
|
#define IOCTL_WMI_GENERATE_EVENT \
|
||
|
CTL_CODE(FILE_DEVICE_UNKNOWN, WmiGenerateEvent, METHOD_BUFFERED, FILE_WRITE_ACCESS)
|
||
|
|
||
|
|
||
|
// This IOCTL will translate a File Object into a device object
|
||
|
// BufferIn - pointer to incoming WMIFILETODEVICE structure
|
||
|
// BufferOut - outgoing WMIFILETODEVICE structure
|
||
|
#define IOCTL_WMI_TRANSLATE_FILE_HANDLE \
|
||
|
CTL_CODE(FILE_DEVICE_UNKNOWN, WmiTranslateFileHandle, METHOD_BUFFERED, FILE_WRITE_ACCESS)
|
||
|
|
||
|
//
|
||
|
// This IOCTL will check if the caller has desired access to the guid
|
||
|
// BufferIn - WMIOPENGUIDBLOCK
|
||
|
// BufferOut - WMIOPENGUIDBLOCK
|
||
|
#define IOCTL_WMI_CHECK_ACCESS \
|
||
|
CTL_CODE(FILE_DEVICE_UNKNOWN, WmiCheckAccess, METHOD_BUFFERED, FILE_READ_ACCESS)
|
||
|
|
||
|
//
|
||
|
// This IOCTL will determine the version of WMI
|
||
|
// BufferIn - Not used
|
||
|
// BufferOut - WMIVERSIONINFO
|
||
|
#define IOCTL_WMI_GET_VERSION \
|
||
|
CTL_CODE(FILE_DEVICE_UNKNOWN, WmiGetVersion, METHOD_BUFFERED, FILE_READ_ACCESS)
|
||
|
|
||
|
//
|
||
|
// This IOCTL will return a list of guids registered with WMI
|
||
|
// BufferIn - Not used
|
||
|
// BufferOut - WMIGUIDLISTINFO
|
||
|
//
|
||
|
#define IOCTL_WMI_ENUMERATE_GUIDS \
|
||
|
CTL_CODE(FILE_DEVICE_UNKNOWN, WmiEnumerateGuidList, METHOD_BUFFERED, FILE_READ_ACCESS)
|
||
|
|
||
|
//
|
||
|
// This IOCTL will return a list of guids registered with WMI
|
||
|
// BufferIn - Not used
|
||
|
// BufferOut - WMIGUIDLISTINFO
|
||
|
//
|
||
|
#define IOCTL_WMI_ENUMERATE_GUIDS_AND_PROPERTIES \
|
||
|
CTL_CODE(FILE_DEVICE_UNKNOWN, WmiEnumerateGuidListAndProperties, METHOD_BUFFERED, FILE_READ_ACCESS)
|
||
|
|
||
|
//
|
||
|
// WmiEnumerateGuidList - Enumerate guids
|
||
|
|
||
|
//
|
||
|
// WMIGUIDPROPERTIES structure is used to return the properties of
|
||
|
// all the registered guids in the EnumerateGuids call. The properties
|
||
|
// GuidType - ( 0-TraceControlGuid, 1-TraceGuid, 2-DataGuid, 3-EventGuid )
|
||
|
// LoggerId - If Trace guid and enabled, indicates the LoggerId to which this
|
||
|
// Guid is currently logging data
|
||
|
// EnableLevel - If Trace guid and enabled, indicates the level of logging
|
||
|
// EnableFlags - If Trace guid and enabled, indicates the flags used in logging.
|
||
|
// IsEnabled - Indicates whether this Guid is enabled currently. For data
|
||
|
// guids this means if collection is enabled,
|
||
|
// For event guids this means if events are enabled,
|
||
|
// For trace guids this means trace logging is enabled.
|
||
|
//
|
||
|
|
||
|
typedef struct
|
||
|
{
|
||
|
GUID Guid;
|
||
|
ULONG GuidType; // 0-TraceControlGuid, 1-TraceGuid, 2-DataGuid, 3-EventGuid
|
||
|
ULONG LoggerId;
|
||
|
ULONG EnableLevel;
|
||
|
ULONG EnableFlags;
|
||
|
BOOLEAN IsEnabled;
|
||
|
} WMIGUIDPROPERTIES, *PWMIGUIDPROPERTIES;
|
||
|
|
||
|
|
||
|
typedef struct
|
||
|
{
|
||
|
ULONG TotalGuidCount;
|
||
|
ULONG ReturnedGuidCount;
|
||
|
WMIGUIDPROPERTIES GuidList[1];
|
||
|
} WMIGUIDLISTINFO, *PWMIGUIDLISTINFO;
|
||
|
|
||
|
//
|
||
|
// This IOCTL will return a list of guids registered with WMI
|
||
|
// BufferIn - WMIGUIDINFO
|
||
|
// BufferOut - WMIGUIDINFO
|
||
|
//
|
||
|
#define IOCTL_WMI_QUERY_GUID_INFO \
|
||
|
CTL_CODE(FILE_DEVICE_UNKNOWN, WmiQueryDataBlockInformation, METHOD_BUFFERED, FILE_READ_ACCESS)
|
||
|
|
||
|
//
|
||
|
// This IOCTL will return the list of mof resources registered
|
||
|
//
|
||
|
// BufferIn - not used
|
||
|
// BufferOut - WMIMOFLIST
|
||
|
#define IOCTL_WMI_ENUMERATE_MOF_RESOURCES \
|
||
|
CTL_CODE(FILE_DEVICE_UNKNOWN, WmiEnumerateMofResouces, METHOD_BUFFERED, FILE_READ_ACCESS)
|
||
|
|
||
|
typedef struct
|
||
|
{
|
||
|
ULONG RegPathOffset;
|
||
|
ULONG ResourceOffset;
|
||
|
ULONG Flags;
|
||
|
} WMIMOFENTRY, *PWMIMOFENTRY;
|
||
|
#define WMIMOFENTRY_FLAG_USERMODE 0x00000001
|
||
|
|
||
|
|
||
|
typedef struct
|
||
|
{
|
||
|
ULONG MofListCount;
|
||
|
WMIMOFENTRY MofEntry[1];
|
||
|
} WMIMOFLIST, *PWMIMOFLIST;
|
||
|
|
||
|
|
||
|
//
|
||
|
// This IOCTL notifies the kernel that a language has been added or
|
||
|
// removed on a MUI system
|
||
|
//
|
||
|
// BufferIn - WMILANGUAGECHANGE
|
||
|
// BufferOut - not used
|
||
|
#define IOCTL_WMI_NOTIFY_LANGUAGE_CHANGE \
|
||
|
CTL_CODE(FILE_DEVICE_UNKNOWN, WmiNotifyLanguageChange, METHOD_BUFFERED, FILE_READ_ACCESS)
|
||
|
|
||
|
#define MAX_LANGUAGE_SIZE 0x100
|
||
|
typedef struct
|
||
|
{
|
||
|
WCHAR Language[MAX_LANGUAGE_SIZE];
|
||
|
ULONG Flags;
|
||
|
} WMILANGUAGECHANGE, *PWMILANGUAGECHANGE;
|
||
|
#define WMILANGUAGECHANGE_FLAG_ADDED 0x00000001
|
||
|
#define WMILANGUAGECHANGE_FLAG_REMOVED 0x00000002
|
||
|
|
||
|
|
||
|
#define MOFEVENT_ACTION_IMAGE_PATH 0
|
||
|
#define MOFEVENT_ACTION_REGISTRY_PATH 1
|
||
|
#define MOFEVENT_ACTION_LANGUAGE_CHANGE 2
|
||
|
#define MOFEVENT_ACTION_BINARY_MOF 3
|
||
|
|
||
|
#if defined(_WINNT_) || defined(WINNT)
|
||
|
|
||
|
#ifndef MEMPHIS
|
||
|
|
||
|
#define WMIMAXREGGUIDCOUNT 65536
|
||
|
|
||
|
//
|
||
|
// This IOCTL will Register a set of guids with WMI
|
||
|
//
|
||
|
// BufferIn - WMIREGREQUEST followed by WMIREGINFOW
|
||
|
// BufferOut - TRACEGUIDMAP[GuidCount] followed by WMIUMREGRESULTS.
|
||
|
//
|
||
|
#define IOCTL_WMI_REGISTER_GUIDS CTL_CODE(FILE_DEVICE_UNKNOWN, WmiRegisterGuids, METHOD_BUFFERED, FILE_READ_ACCESS)
|
||
|
|
||
|
|
||
|
typedef struct
|
||
|
{
|
||
|
union {
|
||
|
POBJECT_ATTRIBUTES ObjectAttributes;
|
||
|
ULONG64 Dummy;
|
||
|
};
|
||
|
ULONG Cookie;
|
||
|
ULONG WmiRegInfo32Size;
|
||
|
ULONG WmiRegGuid32Size;
|
||
|
} WMIREGREQUEST, *PWMIREGREQUEST;
|
||
|
|
||
|
typedef struct
|
||
|
{
|
||
|
HANDLE3264 RequestHandle;
|
||
|
ULONG64 LoggerContext;
|
||
|
BOOLEAN MofIgnored;
|
||
|
} WMIREGRESULTS, *PWMIREGRESULTS;
|
||
|
//
|
||
|
// This IOCTL will unregister a data provider
|
||
|
//
|
||
|
// BufferIn - WMIUNREGGUIDS
|
||
|
// BufferOut - WMIUNREGGUIDS
|
||
|
//
|
||
|
#define IOCTL_WMI_UNREGISTER_GUIDS CTL_CODE(FILE_DEVICE_UNKNOWN, WmiUnregisterDP, METHOD_BUFFERED, FILE_READ_ACCESS)
|
||
|
|
||
|
typedef struct
|
||
|
{
|
||
|
IN GUID Guid;
|
||
|
IN HANDLE3264 RequestHandle;
|
||
|
OUT ULONG64 LoggerContext;
|
||
|
} WMIUNREGGUIDS, *PWMIUNREGGUIDS;
|
||
|
|
||
|
//
|
||
|
// This IOCTL will Create a user mode logger
|
||
|
//
|
||
|
// BufferIn - PWMICREATEUMLOGGER
|
||
|
// BufferOut - PWMICREATEUMLOGGER
|
||
|
|
||
|
typedef struct
|
||
|
{
|
||
|
IN POBJECT_ATTRIBUTES ObjectAttributes;
|
||
|
IN GUID ControlGuid;
|
||
|
OUT HANDLE3264 ReplyHandle;
|
||
|
OUT ULONG ReplyCount;
|
||
|
} WMICREATEUMLOGGER, *PWMICREATEUMLOGGER;
|
||
|
|
||
|
typedef struct
|
||
|
{
|
||
|
IN ULONG ObjectAttributes;
|
||
|
IN GUID ControlGuid;
|
||
|
OUT HANDLE3264 ReplyHandle;
|
||
|
OUT ULONG ReplyCount;
|
||
|
} WMICREATEUMLOGGER32, *PWMICREATEUMLOGGER32;
|
||
|
|
||
|
#define IOCTL_WMI_CREATE_UM_LOGGER CTL_CODE(FILE_DEVICE_UNKNOWN, WmiCreateUMLogger, METHOD_BUFFERED, FILE_READ_ACCESS)
|
||
|
|
||
|
|
||
|
//
|
||
|
// This IOCTL will reply to a MB request
|
||
|
//
|
||
|
// BufferIn - WMIMBREPLY
|
||
|
// BufferOut - not used
|
||
|
|
||
|
typedef struct
|
||
|
{
|
||
|
HANDLE3264 Handle;
|
||
|
ULONG ReplyIndex;
|
||
|
UCHAR Message[1];
|
||
|
} WMIMBREPLY, *PWMIMBREPLY;
|
||
|
|
||
|
#define IOCTL_WMI_MB_REPLY CTL_CODE(FILE_DEVICE_UNKNOWN, WmiMBReply, METHOD_BUFFERED, FILE_READ_ACCESS)
|
||
|
|
||
|
|
||
|
//
|
||
|
// This IOCTL will start an instance of a logger
|
||
|
// BufferIn - Logger configuration information
|
||
|
// BufferOut - Updated logger information when logger is started
|
||
|
#define IOCTL_WMI_START_LOGGER \
|
||
|
CTL_CODE(FILE_DEVICE_UNKNOWN, WmiStartLoggerCode, METHOD_BUFFERED, FILE_ANY_ACCESS)
|
||
|
|
||
|
//
|
||
|
// This IOCTL will stop an instance of a logger
|
||
|
// BufferIn - Logger information structure with Handle set
|
||
|
// BufferOut - Updated logger information when logger is stopped
|
||
|
#define IOCTL_WMI_STOP_LOGGER \
|
||
|
CTL_CODE(FILE_DEVICE_UNKNOWN, WmiStopLoggerCode, METHOD_BUFFERED, FILE_ANY_ACCESS)
|
||
|
|
||
|
//
|
||
|
// This IOCTL will update an existing logger attributes
|
||
|
// BufferIn - Logger information structure with Handle set
|
||
|
// BufferOut - Updated logger information
|
||
|
#define IOCTL_WMI_UPDATE_LOGGER \
|
||
|
CTL_CODE(FILE_DEVICE_UNKNOWN, WmiUpdateLoggerCode, METHOD_BUFFERED, FILE_ANY_ACCESS)
|
||
|
|
||
|
//
|
||
|
// This IOCTL will flush all buffers of a logger
|
||
|
// BufferIn - Logger configuration information
|
||
|
// BufferOut - Updated logger information when logger is flushed
|
||
|
#define IOCTL_WMI_FLUSH_LOGGER \
|
||
|
CTL_CODE(FILE_DEVICE_UNKNOWN, WmiFlushLoggerCode, METHOD_BUFFERED, FILE_ANY_ACCESS)
|
||
|
|
||
|
//
|
||
|
// This IOCTL will query a logger for its information
|
||
|
// BufferIn - Logger information structure with Handle set
|
||
|
// BufferOut - Updated logger information
|
||
|
#define IOCTL_WMI_QUERY_LOGGER \
|
||
|
CTL_CODE(FILE_DEVICE_UNKNOWN, WmiQueryLoggerCode, METHOD_BUFFERED, FILE_ANY_ACCESS)
|
||
|
|
||
|
//
|
||
|
// This IOCTL will synchronize a trace record to the logger
|
||
|
// BufferIn - Trace record, with handle set
|
||
|
// BufferOut - Not used
|
||
|
#define IOCTL_WMI_TRACE_EVENT \
|
||
|
CTL_CODE(FILE_DEVICE_UNKNOWN, WmiTraceEventCode, METHOD_NEITHER, FILE_WRITE_ACCESS)
|
||
|
|
||
|
//
|
||
|
// This IOCTL will synchronize a trace Message to the logger
|
||
|
// BufferIn - Trace record, with handle
|
||
|
// BufferOut - Not used
|
||
|
#define IOCTL_WMI_TRACE_MESSAGE \
|
||
|
CTL_CODE(FILE_DEVICE_UNKNOWN, WmiTraceMessageCode, METHOD_NEITHER, FILE_WRITE_ACCESS)
|
||
|
|
||
|
//
|
||
|
// This IOCTL will set a mark in kernel logger
|
||
|
// BufferIn - Logger information structure with Handle set
|
||
|
// BufferOut - Not used
|
||
|
#define IOCTL_WMI_SET_MARK \
|
||
|
CTL_CODE(FILE_DEVICE_UNKNOWN, WmiSetMarkCode, METHOD_BUFFERED, FILE_ANY_ACCESS)
|
||
|
|
||
|
//
|
||
|
// This IOCTL will set/get the logger information in the GuidEntry
|
||
|
// in case we are starting NTDLL heap or crit sec tracing
|
||
|
// BufferIn - WMINTDLLLOGGERINFO structure
|
||
|
// BufferOut - updated WMINTDLLLOGGERINFO in case of Get.
|
||
|
|
||
|
#define IOCTL_WMI_NTDLL_LOGGERINFO \
|
||
|
CTL_CODE(FILE_DEVICE_UNKNOWN, WmiNtdllLoggerCode, METHOD_BUFFERED, FILE_ANY_ACCESS)
|
||
|
|
||
|
#define IOCTL_WMI_CLOCK_TYPE \
|
||
|
CTL_CODE(FILE_DEVICE_UNKNOWN, WmiClockTypeCode, METHOD_BUFFERED, FILE_ANY_ACCESS)
|
||
|
|
||
|
#ifdef NTPERF
|
||
|
//
|
||
|
// This IOCTL will switch a buffer for UserMode Logging
|
||
|
// BufferIn - WMI_SWITCH_PERFMEM_BUFFER_INFORMATION structure
|
||
|
// BufferOut - Not used
|
||
|
#define IOCTL_WMI_SWITCH_BUFFER \
|
||
|
CTL_CODE(FILE_DEVICE_UNKNOWN, WmiSwitchBufferCode, METHOD_BUFFERED, FILE_ANY_ACCESS)
|
||
|
|
||
|
#endif //NTPERF
|
||
|
#endif
|
||
|
#endif // WINNT
|
||
|
|
||
|
//
|
||
|
// Notifications from kernel mode WMI to user mode WMI
|
||
|
//
|
||
|
#define NOTIFICATIONTYPES ULONG
|
||
|
|
||
|
// A new data provider is being registered
|
||
|
#define RegistrationAdd 0x00000001
|
||
|
// A data provider is being removed
|
||
|
#define RegistrationDelete 0x00000002
|
||
|
// A data provider is being updated
|
||
|
#define RegistrationUpdate 0x00000004
|
||
|
// An event is fired by a data provider
|
||
|
#define EventNotification 0x00000008
|
||
|
|
||
|
#define NOTIFICATIONSLOT_MASK_NOTIFICATIONTYPES (RegistrationAdd | \
|
||
|
RegistrationDelete | \
|
||
|
RegistrationUpdate)
|
||
|
|
||
|
#define INTERNALNOTIFICATIONSIZE (sizeof(WNODE_HEADER) + sizeof(KMREGINFO))
|
||
|
|
||
|
|
||
|
//
|
||
|
// This is used in IOCTL_WMI_GET_ALL_REGISTRANT to report the list of
|
||
|
// registered KM data providers to the WMI service
|
||
|
typedef struct
|
||
|
{
|
||
|
OUT ULONG ProviderId; // Provider Id (or device object pointer)
|
||
|
OUT ULONG Flags; // REGENTRY_FLAG_*
|
||
|
} KMREGINFO, *PKMREGINFO;
|
||
|
|
||
|
#define REGENTRY_FLAG_NEWREGINFO 0x00000004 // Entry has new registration info
|
||
|
#define REGENTRY_FLAG_UPDREGINFO 0x00000008 // Entry has updated registration info
|
||
|
|
||
|
//
|
||
|
// This structure is used in IOCTL_WMI_TRANSLATE_FILE_HANDLE
|
||
|
typedef struct
|
||
|
{
|
||
|
union
|
||
|
{
|
||
|
IN HANDLE3264 FileHandle; // File handle whose instance name is needed
|
||
|
OUT ULONG SizeNeeded; // If incoming buffer too small then this
|
||
|
// returns with number bytes needed.
|
||
|
};
|
||
|
IN HANDLE3264 KernelHandle; // Kernel handle for data block
|
||
|
OUT ULONG BaseIndex; //
|
||
|
OUT USHORT InstanceNameLength; // Length of instance name in bytes
|
||
|
OUT WCHAR InstanceNames[1]; // Instance name in unicode
|
||
|
} WMIFHTOINSTANCENAME, *PWMIFHTOINSTANCENAME;
|
||
|
|
||
|
#ifndef MEMPHIS
|
||
|
|
||
|
//
|
||
|
// This is used in IOCTL_WMI_OPEN_GUID
|
||
|
|
||
|
// Guid must be in the form \WmiGuid\00000000-0000-0000-0000-000000000000
|
||
|
|
||
|
#define WmiGuidObjectDirectory L"\\WmiGuid\\"
|
||
|
#define WmiGuidObjectDirectoryLength (sizeof(WmiGuidObjectDirectory) / sizeof(WCHAR))
|
||
|
|
||
|
#define WmiGuidGuidPosition 9
|
||
|
|
||
|
#define WmiSampleGuidObjectName L"\\WmiGuid\\00000000-0000-0000-0000-000000000000"
|
||
|
#define WmiGuidObjectNameLength ((sizeof(WmiSampleGuidObjectName) / sizeof(WCHAR))-1) // 45
|
||
|
|
||
|
typedef struct
|
||
|
{
|
||
|
IN POBJECT_ATTRIBUTES ObjectAttributes;
|
||
|
IN ACCESS_MASK DesiredAccess;
|
||
|
|
||
|
OUT HANDLE3264 Handle;
|
||
|
} WMIOPENGUIDBLOCK, *PWMIOPENGUIDBLOCK;
|
||
|
|
||
|
typedef struct
|
||
|
{
|
||
|
IN UINT32 /* POBJECT_ATTRIBUTES32 */ ObjectAttributes;
|
||
|
IN ACCESS_MASK DesiredAccess;
|
||
|
|
||
|
OUT HANDLE3264 Handle;
|
||
|
} WMIOPENGUIDBLOCK32, *PWMIOPENGUIDBLOCK32;
|
||
|
|
||
|
typedef struct
|
||
|
{
|
||
|
GUID Guid;
|
||
|
ACCESS_MASK DesiredAccess;
|
||
|
} WMICHECKGUIDACCESS, *PWMICHECKGUIDACCESS;
|
||
|
#endif
|
||
|
|
||
|
//
|
||
|
// This is the header in front of a WNODE request
|
||
|
typedef struct
|
||
|
{
|
||
|
ULONG ProviderId; // Provider Id of target device
|
||
|
} WMITARGET, *PWMITARGET;
|
||
|
|
||
|
|
||
|
typedef struct
|
||
|
{
|
||
|
ULONG Length; // Length of this header
|
||
|
ULONG Count; // Count of device object to target
|
||
|
UCHAR Template[sizeof(WNODE_ALL_DATA)]; // Template WNODE_ALL_DATA
|
||
|
WMITARGET Target[1]; // Provider ids for device object targets
|
||
|
} WMITARGETHEADER, *PWMITARGETHEADER;
|
||
|
|
||
|
//
|
||
|
// This is used to retrieve the internal version of WMI in IOCTL_WMI_GET_VERSION
|
||
|
|
||
|
#define WMI_CURRENT_VERSION 1
|
||
|
|
||
|
typedef struct
|
||
|
{
|
||
|
ULONG32 Version;
|
||
|
} WMIVERSIONINFO, *PWMIVERSIONINFO;
|
||
|
|
||
|
|
||
|
//
|
||
|
// WmiQueryGuidInfo
|
||
|
typedef struct
|
||
|
{
|
||
|
HANDLE3264 KernelHandle;
|
||
|
BOOLEAN IsExpensive;
|
||
|
} WMIQUERYGUIDINFO, *PWMIQUERYGUIDINFO;
|
||
|
|
||
|
|
||
|
#if defined(_WINNT_) || defined(WINNT)
|
||
|
|
||
|
//
|
||
|
// Used to enable and disable a tracelog provider
|
||
|
//
|
||
|
// BufferIn - WmiTraceEnableDisableInfo
|
||
|
// BufferOut -
|
||
|
#define IOCTL_WMI_ENABLE_DISABLE_TRACELOG \
|
||
|
CTL_CODE(FILE_DEVICE_UNKNOWN, WmiEnableDisableTracelogProvider, METHOD_BUFFERED, FILE_READ_ACCESS)
|
||
|
|
||
|
typedef struct
|
||
|
{
|
||
|
GUID Guid;
|
||
|
ULONG64 LoggerContext;
|
||
|
BOOLEAN Enable;
|
||
|
} WMITRACEENABLEDISABLEINFO, *PWMITRACEENABLEDISABLEINFO;
|
||
|
|
||
|
#define EVENT_TRACE_INTERNAL_FLAG_PRIVATE 0x01
|
||
|
|
||
|
#endif // WINNT
|
||
|
|
||
|
typedef struct
|
||
|
{
|
||
|
ULONGLONG GuidMapHandle;
|
||
|
GUID Guid;
|
||
|
ULONGLONG SystemTime;
|
||
|
} TRACEGUIDMAP, *PTRACEGUIDMAP;
|
||
|
|
||
|
typedef struct
|
||
|
{
|
||
|
WNODE_HEADER Wnode;
|
||
|
ULONG64 LoggerContext;
|
||
|
ULONG64 SecurityToken;
|
||
|
} WMITRACE_NOTIFY_HEADER, *PWMITRACE_NOTIFY_HEADER;
|
||
|
|
||
|
#ifndef MEMPHIS
|
||
|
|
||
|
#define ENABLECRITSECTRACE 0x1
|
||
|
#define DISABLECRITSECTRACE 0xFFFFFFFE
|
||
|
#define ENABLEHEAPTRACE 0x2
|
||
|
#define DISABLEHEAPTRACE 0xFFFFFFFD
|
||
|
#define DISABLENTDLLTRACE 0xFFFFFFFC
|
||
|
|
||
|
#endif
|
||
|
|
||
|
#if _MSC_VER >= 1200
|
||
|
#pragma warning(pop)
|
||
|
#else
|
||
|
#pragma warning( default: 4200 )
|
||
|
#endif
|
||
|
|
||
|
#endif // _WMIUMKM_
|