* PROGRAMMERS: Hervé Poussineau (hpoussin@reactos.org)
*/
-#define INITGUID
#include "kbdclass.h"
+#include <stdio.h>
+#include <pseh/pseh2.h>
+#include <kbdmou.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_KEYBOARD,
IoCompleteRequest(Irp, IO_NO_INCREMENT);
return Status;
- case IRP_MN_REMOVE_DEVICE:
case IRP_MN_STOP_DEVICE:
if (DeviceExtension->FileHandle)
{
}
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;