* PROGRAMMERS: Hervé Poussineau (hpoussin@reactos.org)
*/
-#define INITGUID
#include "mouclass.h"
+#include <stdio.h>
+#include <kbdmou.h>
+#include <pseh/pseh2.h>
+#include <debug.h>
+
static DRIVER_UNLOAD DriverUnload;
static DRIVER_DISPATCH ClassCreate;
static DRIVER_DISPATCH ClassClose;
IN PIRP Irp)
{
NTSTATUS Status = STATUS_NOT_SUPPORTED;
+ PPORT_DEVICE_EXTENSION DeviceExtension;
- if (!((PCOMMON_DEVICE_EXTENSION)DeviceObject->DeviceExtension)->IsClassDO)
+ DeviceExtension = DeviceObject->DeviceExtension;
+ if (!DeviceExtension->Common.IsClassDO)
{
/* Forward some IRPs to lower device */
switch (IoGetCurrentIrpStackLocation(Irp)->MajorFunction)
{
- case IRP_MJ_PNP:
- case IRP_MJ_INTERNAL_DEVICE_CONTROL:
- return ForwardIrpAndForget(DeviceObject, Irp);
+ case IRP_MJ_POWER:
+ PoStartNextPowerIrp(Irp);
+ IoSkipCurrentIrpStackLocation(Irp);
+ return PoCallDriver(DeviceExtension->LowerDevice, Irp);
default:
{
ERR_(CLASS_NAME, "Port DO stub for major function 0x%lx\n",
/* Remove from ClassDeviceExtension->ListHead list */
KeAcquireSpinLock(&ClassDeviceExtension->ListSpinLock, &OldIrql);
- RemoveHeadList(DeviceExtension->ListEntry.Blink);
+ RemoveEntryList(&DeviceExtension->ListEntry);
KeReleaseSpinLock(&ClassDeviceExtension->ListSpinLock, OldIrql);
/* Remove entry from HKEY_LOCAL_MACHINE\HARDWARE\DEVICEMAP\[DeviceBaseName] */
Fdo->Flags &= ~DO_DEVICE_INITIALIZING;
/* Register interface ; ignore the error (if any) as having
- * a registred interface is not so important... */
+ * a registered interface is not so important... */
Status = IoRegisterDeviceInterface(
Pdo,
&GUID_DEVINTERFACE_MOUSE,
}
else
{
- /* Hm, this shouldn't happen */
- ASSERT(FALSE);
+ DPRINT1("Cancelled IRP is not pending. Race condition?\n");
}
}
return Status;
}
+static NTSTATUS NTAPI
+ClassPnp(
+ IN PDEVICE_OBJECT DeviceObject,
+ IN PIRP Irp)
+{
+ PPORT_DEVICE_EXTENSION DeviceExtension = DeviceObject->DeviceExtension;
+ PIO_STACK_LOCATION IrpSp = IoGetCurrentIrpStackLocation(Irp);
+ OBJECT_ATTRIBUTES ObjectAttributes;
+ IO_STATUS_BLOCK Iosb;
+ NTSTATUS Status;
+
+ switch (IrpSp->MinorFunction)
+ {
+ case IRP_MN_START_DEVICE:
+ Status = ForwardIrpAndWait(DeviceObject, Irp);
+ if (NT_SUCCESS(Status))
+ {
+ InitializeObjectAttributes(&ObjectAttributes,
+ &DeviceExtension->InterfaceName,
+ OBJ_CASE_INSENSITIVE | OBJ_KERNEL_HANDLE,
+ NULL,
+ NULL);
+
+ Status = ZwOpenFile(&DeviceExtension->FileHandle,
+ FILE_READ_DATA,
+ &ObjectAttributes,
+ &Iosb,
+ 0,
+ 0);
+ if (!NT_SUCCESS(Status))
+ DeviceExtension->FileHandle = NULL;
+ }
+ else
+ DeviceExtension->FileHandle = NULL;
+ Irp->IoStatus.Status = Status;
+ IoCompleteRequest(Irp, IO_NO_INCREMENT);
+ return Status;
+
+ case IRP_MN_STOP_DEVICE:
+ if (DeviceExtension->FileHandle)
+ {
+ ZwClose(DeviceExtension->FileHandle);
+ DeviceExtension->FileHandle = NULL;
+ }
+ Status = STATUS_SUCCESS;
+ break;
+
+ case IRP_MN_REMOVE_DEVICE:
+ if (DeviceExtension->FileHandle)
+ {
+ ZwClose(DeviceExtension->FileHandle);
+ DeviceExtension->FileHandle = NULL;
+ }
+ IoSkipCurrentIrpStackLocation(Irp);
+ Status = IoCallDriver(DeviceExtension->LowerDevice, Irp);
+ DestroyPortDriver(DeviceObject);
+ return Status;
+
+ default:
+ Status = Irp->IoStatus.Status;
+ break;
+ }
+
+ Irp->IoStatus.Status = Status;
+ if (NT_SUCCESS(Status) || Status == STATUS_NOT_SUPPORTED)
+ {
+ IoSkipCurrentIrpStackLocation(Irp);
+ return IoCallDriver(DeviceExtension->LowerDevice, Irp);
+ }
+ else
+ {
+ IoCompleteRequest(Irp, IO_NO_INCREMENT);
+ return Status;
+ }
+}
+
static VOID NTAPI
ClassStartIo(
IN PDEVICE_OBJECT DeviceObject,
/* FIXME: Log the error */
WARN_(CLASS_NAME, "ClassAddDevice() failed with status 0x%08lx\n", Status);
}
+
+ ObDereferenceObject(FileObject);
}
cleanup:
DriverObject->MajorFunction[IRP_MJ_CLOSE] = ClassClose;
DriverObject->MajorFunction[IRP_MJ_CLEANUP] = ClassCleanup;
DriverObject->MajorFunction[IRP_MJ_READ] = ClassRead;
+ DriverObject->MajorFunction[IRP_MJ_PNP] = ClassPnp;
DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = ClassDeviceControl;
DriverObject->MajorFunction[IRP_MJ_INTERNAL_DEVICE_CONTROL] = ForwardIrpAndForget;
DriverObject->DriverStartIo = ClassStartIo;