mirror of
https://github.com/reactos/reactos.git
synced 2024-06-16 09:31:51 +00:00
[NTOSKRNL]
Start implementing the built-in WMI driver svn path=/branches/kernel-fun/; revision=62291
This commit is contained in:
parent
9347a16a57
commit
3d06212d1b
37
reactos/include/reactos/wmiguid.h
Normal file
37
reactos/include/reactos/wmiguid.h
Normal file
|
@ -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
|
|
@ -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();
|
||||
|
||||
|
|
|
@ -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)
|
||||
|
||||
|
|
|
@ -9,11 +9,32 @@
|
|||
/* INCLUDES *****************************************************************/
|
||||
|
||||
#include <ntoskrnl.h>
|
||||
#include "wmip.h"
|
||||
|
||||
#define NDEBUG
|
||||
#include <debug.h>
|
||||
|
||||
/* 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
|
||||
*/
|
||||
|
|
196
reactos/ntoskrnl/wmi/wmidrv.c
Normal file
196
reactos/ntoskrnl/wmi/wmidrv.c
Normal file
|
@ -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 <ntoskrnl.h>
|
||||
#include <wmistr.h>
|
||||
#include <wmiguid.h>
|
||||
|
||||
#define NDEBUG
|
||||
#include <debug.h>
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
|
12
reactos/ntoskrnl/wmi/wmip.h
Normal file
12
reactos/ntoskrnl/wmi/wmip.h
Normal file
|
@ -0,0 +1,12 @@
|
|||
|
||||
#pragma once
|
||||
|
||||
|
||||
_Function_class_(DRIVER_INITIALIZE)
|
||||
_IRQL_requires_same_
|
||||
NTSTATUS
|
||||
NTAPI
|
||||
WmipDriverEntry(
|
||||
_In_ PDRIVER_OBJECT DriverObject,
|
||||
_In_ PUNICODE_STRING RegistryPath);
|
||||
|
Loading…
Reference in a new issue