[FLTMGR] Stub FltGetFileNameInformationUnsafe()
[reactos.git] / drivers / input / mouclass / mouclass.c
index 99818bb..8628c58 100644 (file)
@@ -7,9 +7,13 @@
  * 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;
@@ -166,15 +170,18 @@ IrpStub(
        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",
@@ -578,7 +585,7 @@ DestroyPortDriver(
 
        /* 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] */
@@ -676,7 +683,7 @@ ClassAddDevice(
        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,
@@ -725,8 +732,7 @@ ClassCancelRoutine(
        }
        else
        {
-               /* Hm, this shouldn't happen */
-               ASSERT(FALSE);
+        DPRINT1("Cancelled IRP is not pending. Race condition?\n");
        }
 }
 
@@ -800,6 +806,82 @@ HandleReadIrp(
        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,
@@ -919,6 +1001,8 @@ SearchForLegacyDrivers(
                        /* FIXME: Log the error */
                        WARN_(CLASS_NAME, "ClassAddDevice() failed with status 0x%08lx\n", Status);
                }
+
+               ObDereferenceObject(FileObject);
        }
 
 cleanup:
@@ -993,6 +1077,7 @@ DriverEntry(
        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;