60 lines
2.2 KiB
C
60 lines
2.2 KiB
C
#include "../../../lib/mice/ioctl.h"
|
|
#include "framework.h"
|
|
|
|
#define NTDEVICE_NAME_STRING L"\\Device\\mxhwreset"
|
|
#define SYMBOLIC_NAME_STRING L"\\DosDevices\\mxhwreset"
|
|
|
|
static NTSTATUS IrpComplete(PIRP Irp, NTSTATUS Status, PVOID Information) {
|
|
(Irp->IoStatus).Status = Status;
|
|
(Irp->IoStatus).Information = (ULONG_PTR)Information;
|
|
MT_IofCompleteRequest(Irp, IO_NO_INCREMENT);
|
|
return Status;
|
|
}
|
|
|
|
static NTSTATUS __stdcall EventNotSupported(PDEVICE_OBJECT DeviceObject, PIRP Irp) {
|
|
return IrpComplete(Irp, STATUS_NOT_SUPPORTED, NULL);
|
|
}
|
|
static NTSTATUS __stdcall EventCreateClose(PDEVICE_OBJECT DeviceObject, PIRP Irp) {
|
|
return IrpComplete(Irp, STATUS_SUCCESS, NULL);
|
|
}
|
|
static NTSTATUS __stdcall EventDispatchIoControl(PDEVICE_OBJECT DeviceObject, PIRP Irp) {
|
|
IrpComplete(Irp, STATUS_NOT_SUPPORTED, NULL);
|
|
|
|
PIO_STACK_LOCATION irpStack = MT_IoGetCurrentIrpStackLocation(Irp);
|
|
if (irpStack->Parameters.DeviceIoControl.IoControlCode != IOCTL_MXHWRESET_RESET) {
|
|
return IrpComplete(Irp, STATUS_INVALID_DEVICE_REQUEST, NULL);
|
|
}
|
|
|
|
return IrpComplete(Irp, STATUS_SUCCESS, NULL);
|
|
}
|
|
|
|
static void __stdcall EventUnload(PDRIVER_OBJECT DriverObject) {
|
|
UNICODE_STRING dosDevice;
|
|
MT_RtlInitUnicodeString(&dosDevice, SYMBOLIC_NAME_STRING);
|
|
MT_IoDeleteSymbolicLink(&dosDevice);
|
|
MT_IoDeleteDevice(DriverObject->DeviceObject);
|
|
}
|
|
|
|
NTSTATUS entry_mxHwReset(PDRIVER_OBJECT driver) {
|
|
UNICODE_STRING deviceName;
|
|
UNICODE_STRING dosDeviceName;
|
|
|
|
PDEVICE_OBJECT device = NULL;
|
|
|
|
MT_RtlInitUnicodeString(&deviceName, NTDEVICE_NAME_STRING);
|
|
MT_RtlInitUnicodeString(&dosDeviceName, SYMBOLIC_NAME_STRING);
|
|
NTSTATUS ret = MT_IoCreateDevice(driver, 0, &deviceName, 34, 0, '\0', &device);
|
|
if (ret != STATUS_SUCCESS) return ret;
|
|
|
|
for (int i = 0; i <= IRP_MJ_MAXIMUM_FUNCTION; i++) {
|
|
driver->MajorFunction[i] = &EventNotSupported;
|
|
}
|
|
driver->MajorFunction[IRP_MJ_CREATE] = EventCreateClose;
|
|
driver->MajorFunction[IRP_MJ_CLOSE] = EventCreateClose;
|
|
driver->MajorFunction[IRP_MJ_DEVICE_CONTROL] = EventDispatchIoControl;
|
|
driver->DriverUnload = EventUnload;
|
|
|
|
MT_IoCreateSymbolicLink(&dosDeviceName, &deviceName);
|
|
return STATUS_SUCCESS;
|
|
}
|