#define INITGUID
#include "kbdclass.h"
+static NTSTATUS
+SearchForLegacyDrivers(
+ IN PDRIVER_OBJECT DriverObject,
+ IN PCLASS_DRIVER_EXTENSION DriverExtension);
+
static VOID NTAPI
DriverUnload(IN PDRIVER_OBJECT DriverObject)
{
Parameters[2].EntryContext = &DriverExtension->DeviceBaseName;
Parameters[2].DefaultType = REG_SZ;
Parameters[2].DefaultData = &DefaultDeviceBaseName;
- Parameters[2].DefaultLength = sizeof(ULONG);
+ Parameters[2].DefaultLength = 0;
Status = RtlQueryRegistryValues(
RTL_REGISTRY_ABSOLUTE,
Fdo->Flags |= DO_POWER_PAGABLE | DO_BUFFERED_IO;
Fdo->Flags &= ~DO_DEVICE_INITIALIZING;
- /* FIXME: create registry entry in HKEY_LOCAL_MACHINE\HARDWARE\DEVICEMAP */
+ /* Add entry entry to HKEY_LOCAL_MACHINE\HARDWARE\DEVICEMAP\[DeviceBaseName] */
+ RtlWriteRegistryValue(
+ RTL_REGISTRY_DEVICEMAP,
+ DriverExtension->DeviceBaseName.Buffer,
+ DeviceNameU.Buffer,
+ REG_SZ,
+ DriverExtension->RegistryPath.Buffer,
+ DriverExtension->RegistryPath.MaximumLength);
/* HACK: 1st stage setup needs a keyboard to open it in user-mode
* Create a link to user space... */
ASSERT(ClassDeviceExtension->Common.IsClassDO);
+ KeAcquireSpinLock(&ClassDeviceExtension->SpinLock, &OldIrql);
+
DPRINT("ClassCallback()\n");
/* A filter driver might have consumed all the data already; I'm
* not sure if they are supposed to move the packets when they
/* A read request is waiting for input, so go straight to it */
/* FIXME: use SEH */
+ DPRINT("Immediate Completion: %x\n", DataStart->MakeCode);
+
RtlCopyMemory(
Irp->MdlAddress ? MmGetSystemAddressForMdlSafe(Irp->MdlAddress, NormalPagePriority) : Irp->AssociatedIrp.SystemBuffer,
DataStart,
/* If we have data from the port driver and a higher service to send the data to */
if (InputCount != 0)
{
- KeAcquireSpinLock(&ClassDeviceExtension->SpinLock, &OldIrql);
-
if (ClassDeviceExtension->InputCount + InputCount > ClassDeviceExtension->DriverExtension->DataQueueSize)
ReadSize = ClassDeviceExtension->DriverExtension->DataQueueSize - ClassDeviceExtension->InputCount;
else
ClassDeviceExtension->PortData += ReadSize;
ClassDeviceExtension->InputCount += ReadSize;
- KeReleaseSpinLock(&ClassDeviceExtension->SpinLock, OldIrql);
(*ConsumedCount) += ReadSize;
}
else
DPRINT("ClassCallBack() entered, InputCount = %lu - DOING NOTHING\n", InputCount);
}
+ KeReleaseSpinLock(&ClassDeviceExtension->SpinLock, OldIrql);
+
if (Irp != NULL)
{
IoStartNextPacket(ClassDeviceObject, FALSE);
else
IoStatus.Status = Status;
- if (NT_SUCCESS(Status))
+ if (NT_SUCCESS(IoStatus.Status))
ObReferenceObject(PortDO);
return IoStatus.Status;
DriverExtension = IoGetDriverObjectExtension(DriverObject, DriverObject);
+ if (Pdo == NULL)
+ /* We're getting a NULL Pdo at the first call as we're a legacy driver.
+ * Use it to search for legacy port drivers. */
+ return SearchForLegacyDrivers(DriverObject, DriverExtension);
+
/* Create new device object */
Status = IoCreateDevice(
DriverObject,
KeAcquireSpinLock(&DeviceExtension->SpinLock, &oldIrql);
+ DPRINT("Mdl: %x, UserBuffer: %x, InputCount: %d, Data: %x\n",
+ Irp->MdlAddress,
+ Irp->UserBuffer,
+ DeviceExtension->InputCount,
+ (DeviceExtension->PortData-DeviceExtension->InputCount)->MakeCode);
+
/* FIXME: use SEH */
RtlCopyMemory(
- Irp->MdlAddress ? MmGetSystemAddressForMdlSafe(Irp->MdlAddress, NormalPagePriority) : Irp->UserBuffer,
- DeviceExtension->PortData - DeviceExtension->InputCount,
- sizeof(KEYBOARD_INPUT_DATA));
+ Irp->AssociatedIrp.SystemBuffer,
+ DeviceExtension->PortData - DeviceExtension->InputCount,
+ sizeof(KEYBOARD_INPUT_DATA));
if (DeviceExtension->InputCount > 1)
{
{
/* FIXME: Log the error */
DPRINT("ConnectPortDriver() failed with status 0x%08lx\n", Status);
- ObDereferenceObject(PortDeviceObject);
}
}
else
{
/* FIXME: Log the error */
DPRINT("CreatePointerClassDeviceObject() failed with status 0x%08lx\n", Status);
- ObDereferenceObject(PortDeviceObject);
continue;
}
Status = ConnectPortDriver(PortDeviceObject, ClassDO);
{
/* FIXME: Log the error */
DPRINT("ConnectPortDriver() failed with status 0x%08lx\n", Status);
- ObDereferenceObject(PortDeviceObject);
IoDeleteDevice(ClassDO);
}
}
}
RtlZeroMemory(DriverExtension, sizeof(CLASS_DRIVER_EXTENSION));
+ Status = RtlDuplicateUnicodeString(
+ RTL_DUPLICATE_UNICODE_STRING_NULL_TERMINATE,
+ RegistryPath,
+ &DriverExtension->RegistryPath);
+ if (!NT_SUCCESS(Status))
+ {
+ DPRINT("RtlDuplicateUnicodeString() failed with status 0x%08lx\n", Status);
+ return Status;
+ }
+
Status = ReadRegistryEntries(RegistryPath, DriverExtension);
if (!NT_SUCCESS(Status))
{
DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = ClassDeviceControl;
DriverObject->DriverStartIo = ClassStartIo;
- Status = SearchForLegacyDrivers(DriverObject, DriverExtension);
-
- return Status;
+ return STATUS_SUCCESS;
}