From 3d06212d1b751227024a571f741f3c57a44df57f Mon Sep 17 00:00:00 2001 From: Timo Kreuzer Date: Sat, 22 Feb 2014 18:02:10 +0000 Subject: [PATCH] [NTOSKRNL] Start implementing the built-in WMI driver svn path=/branches/kernel-fun/; revision=62291 --- reactos/include/reactos/wmiguid.h | 37 ++++++ reactos/ntoskrnl/io/iomgr/iomgr.c | 8 ++ reactos/ntoskrnl/ntos.cmake | 3 +- reactos/ntoskrnl/wmi/wmi.c | 21 ++++ reactos/ntoskrnl/wmi/wmidrv.c | 196 ++++++++++++++++++++++++++++++ reactos/ntoskrnl/wmi/wmip.h | 12 ++ 6 files changed, 276 insertions(+), 1 deletion(-) create mode 100644 reactos/include/reactos/wmiguid.h create mode 100644 reactos/ntoskrnl/wmi/wmidrv.c create mode 100644 reactos/ntoskrnl/wmi/wmip.h diff --git a/reactos/include/reactos/wmiguid.h b/reactos/include/reactos/wmiguid.h new file mode 100644 index 00000000000..28639b6da8f --- /dev/null +++ b/reactos/include/reactos/wmiguid.h @@ -0,0 +1,37 @@ + +#pragma once + +#define IOCTL_WMI_QUERY_ALL_DATA CTL_CODE(FILE_DEVICE_UNKNOWN, 0x00, METHOD_BUFFERED, FILE_READ_ACCESS) // 0x224000 +#define IOCTL_WMI_SINGLE_INSTANCE CTL_CODE(FILE_DEVICE_UNKNOWN, 0x01, METHOD_BUFFERED, FILE_READ_ACCESS) // 0x224004 +#define IOCTL_WMI_SET_SINGLE_INSTANCE CTL_CODE(FILE_DEVICE_UNKNOWN, 0x02, METHOD_BUFFERED, FILE_WRITE_ACCESS) // 0x228008 +#define IOCTL_WMI_SET_SINGLE_ITEM CTL_CODE(FILE_DEVICE_UNKNOWN, 0x03, METHOD_BUFFERED, FILE_WRITE_ACCESS) // 0x22800C +#define IOCTL_WMI_09 CTL_CODE(FILE_DEVICE_UNKNOWN, 0x09, METHOD_BUFFERED, FILE_WRITE_ACCESS) // 0x228024 +#define IOCTL_WMI_20 CTL_CODE(FILE_DEVICE_UNKNOWN, 0x20, METHOD_BUFFERED, FILE_ANY_ACCESS) // 0x220080 +#define IOCTL_WMI_21 CTL_CODE(FILE_DEVICE_UNKNOWN, 0x21, METHOD_BUFFERED, FILE_ANY_ACCESS) // 0x220084 +#define IOCTL_WMI_22 CTL_CODE(FILE_DEVICE_UNKNOWN, 0x22, METHOD_BUFFERED, FILE_ANY_ACCESS) // 0x220088 +#define IOCTL_WMI_TRACE_EVENT CTL_CODE(FILE_DEVICE_UNKNOWN, 0x23, METHOD_NEITHER, FILE_WRITE_ACCESS) // 0x22808F +#define IOCTL_WMI_24 CTL_CODE(FILE_DEVICE_UNKNOWN, 0x24, METHOD_BUFFERED, FILE_ANY_ACCESS) // 0x220090 +#define IOCTL_WMI_25 CTL_CODE(FILE_DEVICE_UNKNOWN, 0x25, METHOD_BUFFERED, FILE_ANY_ACCESS) // 0x220094 +#define IOCTL_WMI_TRACE_USER_MESSAGE CTL_CODE(FILE_DEVICE_UNKNOWN, 0x28, METHOD_NEITHER, FILE_WRITE_ACCESS) // 0x2280A3 +#define IOCTL_WMI_29 CTL_CODE(FILE_DEVICE_UNKNOWN, 0x29, METHOD_BUFFERED, FILE_ANY_ACCESS) // 0x2200A4 +#define IOCTL_WMI_2a CTL_CODE(FILE_DEVICE_UNKNOWN, 0x2a, METHOD_BUFFERED, FILE_ANY_ACCESS) // 0x2200A8 +#define IOCTL_WMI_2b CTL_CODE(FILE_DEVICE_UNKNOWN, 0x2b, METHOD_BUFFERED, FILE_ANY_ACCESS) // 0x2200AC +#define IOCTL_WMI_42 CTL_CODE(FILE_DEVICE_UNKNOWN, 0x42, METHOD_BUFFERED, FILE_READ_ACCESS) // 0x224108 +#define IOCTL_WMI_47 CTL_CODE(FILE_DEVICE_UNKNOWN, 0x47, METHOD_BUFFERED, FILE_WRITE_ACCESS) // 0x22811C +#define IOCTL_WMI_49 CTL_CODE(FILE_DEVICE_UNKNOWN, 0x49, METHOD_BUFFERED, FILE_READ_ACCESS) // 0x224124 +#define IOCTL_WMI_4b CTL_CODE(FILE_DEVICE_UNKNOWN, 0x4b, METHOD_BUFFERED, FILE_WRITE_ACCESS) // 0x22812C +#define IOCTL_WMI_4c CTL_CODE(FILE_DEVICE_UNKNOWN, 0x4c, METHOD_BUFFERED, FILE_WRITE_ACCESS) // 0x228130 +#define IOCTL_WMI_4d CTL_CODE(FILE_DEVICE_UNKNOWN, 0x4d, METHOD_BUFFERED, FILE_READ_ACCESS) // 0x224134 +#define IOCTL_WMI_4e CTL_CODE(FILE_DEVICE_UNKNOWN, 0x4e, METHOD_BUFFERED, FILE_READ_ACCESS) // 0x224138 +#define IOCTL_WMI_4f CTL_CODE(FILE_DEVICE_UNKNOWN, 0x4f, METHOD_BUFFERED, FILE_READ_ACCESS) // 0x22413C +#define IOCTL_WMI_OPEN_GUID_FOR_EVENTS CTL_CODE(FILE_DEVICE_UNKNOWN, 0x50, METHOD_BUFFERED, FILE_READ_ACCESS) // 0x224140 +#define IOCTL_WMI_51 CTL_CODE(FILE_DEVICE_UNKNOWN, 0x51, METHOD_BUFFERED, FILE_WRITE_ACCESS) // 0x228144 +#define IOCTL_WMI_52 CTL_CODE(FILE_DEVICE_UNKNOWN, 0x52, METHOD_BUFFERED, FILE_READ_ACCESS) // 0x224148 +#define IOCTL_WMI_REGISTER_GUIDS CTL_CODE(FILE_DEVICE_UNKNOWN, 0x53, METHOD_BUFFERED, FILE_READ_ACCESS) // 0x22414C, called from ntdll!EtwpRegisterGuids +#define IOCTL_WMI_54 CTL_CODE(FILE_DEVICE_UNKNOWN, 0x54, METHOD_BUFFERED, FILE_READ_ACCESS) // 0x224150 +#define IOCTL_WMI_55 CTL_CODE(FILE_DEVICE_UNKNOWN, 0x55, METHOD_BUFFERED, FILE_READ_ACCESS) // 0x224154 +#define IOCTL_WMI_56 CTL_CODE(FILE_DEVICE_UNKNOWN, 0x56, METHOD_BUFFERED, FILE_READ_ACCESS) // 0x224158 +#define IOCTL_WMI_57 CTL_CODE(FILE_DEVICE_UNKNOWN, 0x57, METHOD_BUFFERED, FILE_READ_ACCESS) // 0x22415C +#define IOCTL_WMI_58 CTL_CODE(FILE_DEVICE_UNKNOWN, 0x58, METHOD_BUFFERED, FILE_READ_ACCESS) // 0x224160 +#define IOCTL_WMI_59 CTL_CODE(FILE_DEVICE_UNKNOWN, 0x59, METHOD_BUFFERED, FILE_READ_ACCESS) // 0x224164 +#define IOCTL_WMI_5a CTL_CODE(FILE_DEVICE_UNKNOWN, 0x5a, METHOD_BUFFERED, FILE_WRITE_ACCESS) // 0x228168 diff --git a/reactos/ntoskrnl/io/iomgr/iomgr.c b/reactos/ntoskrnl/io/iomgr/iomgr.c index b1d4a136731..c0ee900d5a7 100644 --- a/reactos/ntoskrnl/io/iomgr/iomgr.c +++ b/reactos/ntoskrnl/io/iomgr/iomgr.c @@ -25,6 +25,11 @@ IopTimerDispatch( IN PVOID SystemArgument2 ); +BOOLEAN +NTAPI +WmiInitialize( + VOID); + /* DATA ********************************************************************/ POBJECT_TYPE IoDeviceObjectType = NULL; @@ -525,6 +530,9 @@ IoInitSystem(IN PLOADER_PARAMETER_BLOCK LoaderBlock) /* Initialize PnP manager */ IopInitializePlugPlayServices(); + /* Initialize WMI */ + WmiInitialize(); + /* Initialize HAL Root Bus Driver */ HalInitPnpDriver(); diff --git a/reactos/ntoskrnl/ntos.cmake b/reactos/ntoskrnl/ntos.cmake index e42a2d96745..1f83d5975d0 100644 --- a/reactos/ntoskrnl/ntos.cmake +++ b/reactos/ntoskrnl/ntos.cmake @@ -269,7 +269,8 @@ list(APPEND SOURCE ${REACTOS_SOURCE_DIR}/ntoskrnl/se/sid.c ${REACTOS_SOURCE_DIR}/ntoskrnl/se/token.c ${REACTOS_SOURCE_DIR}/ntoskrnl/vf/driver.c - ${REACTOS_SOURCE_DIR}/ntoskrnl/wmi/wmi.c) + ${REACTOS_SOURCE_DIR}/ntoskrnl/wmi/wmi.c + ${REACTOS_SOURCE_DIR}/ntoskrnl/wmi/wmidrv.c) list(APPEND ASM_SOURCE ${REACTOS_SOURCE_DIR}/ntoskrnl/ex/zw.S) diff --git a/reactos/ntoskrnl/wmi/wmi.c b/reactos/ntoskrnl/wmi/wmi.c index 5f81b641bf5..addc243d1a9 100644 --- a/reactos/ntoskrnl/wmi/wmi.c +++ b/reactos/ntoskrnl/wmi/wmi.c @@ -9,11 +9,32 @@ /* INCLUDES *****************************************************************/ #include +#include "wmip.h" + #define NDEBUG #include /* FUNCTIONS *****************************************************************/ +BOOLEAN +NTAPI +WmiInitialize( + VOID) +{ + UNICODE_STRING DriverName = RTL_CONSTANT_STRING(L"\\Driver\\WMIxWDM"); + NTSTATUS Status; + + /* Create the WMI driver */ + Status = IoCreateDriver(&DriverName, WmipDriverEntry); + if (!NT_SUCCESS(Status)) + { + DPRINT1("Failed to create WMI driver: 0x%lx\n", Status); + return FALSE; + } + + return TRUE; +} + /* * @unimplemented */ diff --git a/reactos/ntoskrnl/wmi/wmidrv.c b/reactos/ntoskrnl/wmi/wmidrv.c new file mode 100644 index 00000000000..52670544f8b --- /dev/null +++ b/reactos/ntoskrnl/wmi/wmidrv.c @@ -0,0 +1,196 @@ +/* + * PROJECT: ReactOS Kernel + * LICENSE: GPL - See COPYING in the top level directory + * FILE: ntoskrnl/io/wmidrv.c + * PURPOSE: I/O Windows Management Instrumentation (WMI) Support + * PROGRAMMERS: Timo Kreuzer (timo.kreuzer@reactos.org) + */ + +/* INCLUDES *****************************************************************/ + +#include +#include +#include + +#define NDEBUG +#include + +PDEVICE_OBJECT WmipServiceDeviceObject; +PDEVICE_OBJECT WmipAdminDeviceObject; +FAST_IO_DISPATCH WmipFastIoDispatch; + + +/* FUNCTIONS *****************************************************************/ + +DRIVER_DISPATCH WmipOpenCloseCleanup; +DRIVER_DISPATCH WmipIoControl; +DRIVER_DISPATCH WmipSystemControl; +DRIVER_DISPATCH WmipShutdown; + +NTSTATUS +NTAPI +WmipOpenCloseCleanup( + _In_ PDEVICE_OBJECT DeviceObject, + _Inout_ PIRP Irp) +{ + PAGED_CODE(); + + /* No work to do, just return success */ + Irp->IoStatus.Status = STATUS_SUCCESS; + Irp->IoStatus.Information = 0; + IoCompleteRequest(Irp, IO_NO_INCREMENT); + return STATUS_SUCCESS; +} + +NTSTATUS +NTAPI +WmipIoControl( + _Inout_ PDEVICE_OBJECT DeviceObject, + _Inout_ PIRP Irp) +{ + UNIMPLEMENTED_DBGBREAK(); + return STATUS_NOT_IMPLEMENTED; +} + +NTSTATUS +NTAPI +WmipSystemControl( + _Inout_ PDEVICE_OBJECT DeviceObject, + _Inout_ PIRP Irp) +{ + UNIMPLEMENTED_DBGBREAK(); + return STATUS_NOT_IMPLEMENTED; +} + +NTSTATUS +NTAPI +WmipShutdown( + _Inout_ PDEVICE_OBJECT DeviceObject, + _Inout_ PIRP Irp) +{ + UNIMPLEMENTED_DBGBREAK(); + return STATUS_NOT_IMPLEMENTED; +} + +_Function_class_(FAST_IO_DEVICE_CONTROL) +_IRQL_requires_same_ +BOOLEAN +NTAPI +WmipFastIoDeviceControl( + _In_ PFILE_OBJECT FileObject, + _In_ BOOLEAN Wait, + _In_opt_ PVOID InputBuffer, + _In_ ULONG InputBufferLength, + _Out_opt_ PVOID OutputBuffer, + _In_ ULONG OutputBufferLength, + _In_ ULONG IoControlCode, + _Out_ PIO_STATUS_BLOCK IoStatus, + _In_ PDEVICE_OBJECT DeviceObject) +{ + UNIMPLEMENTED_DBGBREAK(); + return FALSE; +} + +NTSTATUS +NTAPI +WmipDockUndockEventCallback( + _In_ PVOID NotificationStructure, + _Inout_opt_ PVOID Context) +{ + UNIMPLEMENTED_DBGBREAK(); + return STATUS_NOT_IMPLEMENTED; +} + +_Function_class_(DRIVER_INITIALIZE) +_IRQL_requires_same_ +NTSTATUS +NTAPI +WmipDriverEntry( + _In_ PDRIVER_OBJECT DriverObject, + _In_ PUNICODE_STRING RegistryPath) +{ + static UNICODE_STRING ServiceDeviceName = RTL_CONSTANT_STRING(L"\\Device\\WMIDataDevice"); + static UNICODE_STRING ServiceDosDeviceName = RTL_CONSTANT_STRING(L"\\DosDevices\\WMIDataDevice"); + static UNICODE_STRING AdminDeviceName = RTL_CONSTANT_STRING(L"\\Device\\WMIAdminDevice"); + static UNICODE_STRING AdminDosDeviceName = RTL_CONSTANT_STRING(L"\\DosDevices\\WMIAdminDevice"); + NTSTATUS Status; + PAGED_CODE(); + + /* Create the service device object */ + Status = IoCreateDevice(DriverObject, + 0, + &ServiceDeviceName, + FILE_DEVICE_UNKNOWN, + FILE_DEVICE_SECURE_OPEN, + 0, + &WmipServiceDeviceObject); + if (!NT_SUCCESS(Status)) + { + DPRINT1("Failed to create service device: 0x%lx\n", Status); + return Status; + } + + /* Create a symbolic link for the service device */ + Status = IoCreateSymbolicLink(&ServiceDosDeviceName, &ServiceDeviceName); + if (!NT_SUCCESS(Status)) + { + DPRINT1("IoCreateSymbolicLink() failed: 0x%lx\n", Status); + IoDeleteDevice(WmipServiceDeviceObject); + return Status; + } + + /* Create the admin device object */ + Status = IoCreateDevice(DriverObject, + 0, + &AdminDeviceName, + FILE_DEVICE_UNKNOWN, + FILE_DEVICE_SECURE_OPEN, + 0, + &WmipAdminDeviceObject); + if (!NT_SUCCESS(Status)) + { + DPRINT1("Failed to create admin device: 0x%lx\n", Status); + IoDeleteDevice(WmipServiceDeviceObject); + IoDeleteSymbolicLink(&ServiceDosDeviceName); + return Status; + } + + /* Create a symbolic link for the admin device */ + Status = IoCreateSymbolicLink(&AdminDosDeviceName, &AdminDeviceName); + if (!NT_SUCCESS(Status)) + { + DPRINT1("IoCreateSymbolicLink() failed: 0x%lx\n", Status); + IoDeleteSymbolicLink(&ServiceDosDeviceName); + IoDeleteDevice(WmipServiceDeviceObject); + IoDeleteDevice(WmipAdminDeviceObject); + return Status; + } + + /* Initialize dispatch routines */ + DriverObject->MajorFunction[IRP_MJ_CREATE] = WmipOpenCloseCleanup; + DriverObject->MajorFunction[IRP_MJ_CLOSE] = WmipOpenCloseCleanup; + DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = WmipIoControl; + DriverObject->MajorFunction[IRP_MJ_CLEANUP] = WmipOpenCloseCleanup; + DriverObject->MajorFunction[IRP_MJ_SYSTEM_CONTROL] = WmipSystemControl; + DriverObject->MajorFunction[IRP_MJ_SHUTDOWN] = WmipShutdown; + + /* Initialize fast dispatch */ + RtlZeroMemory(&WmipFastIoDispatch, sizeof(WmipFastIoDispatch)); + WmipFastIoDispatch.SizeOfFastIoDispatch = sizeof(WmipFastIoDispatch); + WmipFastIoDispatch.FastIoDeviceControl = WmipFastIoDeviceControl; + DriverObject->FastIoDispatch = &WmipFastIoDispatch; + + /* Register the WMI service device */ + IoWMIRegistrationControl(WmipServiceDeviceObject, WMIREG_ACTION_REGISTER); + + /* Register a shutdown notification */ + IoRegisterShutdownNotification(WmipServiceDeviceObject); + + /* Initialization is done */ + WmipServiceDeviceObject->Flags &= ~DO_DEVICE_INITIALIZING; + WmipAdminDeviceObject->Flags &= ~DO_DEVICE_INITIALIZING; + + return STATUS_SUCCESS; +} + + diff --git a/reactos/ntoskrnl/wmi/wmip.h b/reactos/ntoskrnl/wmi/wmip.h new file mode 100644 index 00000000000..2dffb3e6dc5 --- /dev/null +++ b/reactos/ntoskrnl/wmi/wmip.h @@ -0,0 +1,12 @@ + +#pragma once + + +_Function_class_(DRIVER_INITIALIZE) +_IRQL_requires_same_ +NTSTATUS +NTAPI +WmipDriverEntry( + _In_ PDRIVER_OBJECT DriverObject, + _In_ PUNICODE_STRING RegistryPath); +