ReactOS 0.4.17-dev-1321-g5c122a9
mouclass.c
Go to the documentation of this file.
1/*
2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: ReactOS Mouse class driver
4 * FILE: drivers/mouclass/mouclass.c
5 * PURPOSE: Mouse class driver
6 *
7 * PROGRAMMERS: Hervé Poussineau (hpoussin@reactos.org)
8 */
9
10#include "mouclass.h"
11
12#include <stdio.h>
13#include <kbdmou.h>
14#include <hidclass.h>
15#include <poclass.h>
16#include <pseh/pseh2.h>
17#include <debug.h>
18
19static DRIVER_UNLOAD DriverUnload;
26static DRIVER_ADD_DEVICE ClassAddDevice;
27static DRIVER_STARTIO ClassStartIo;
28static DRIVER_CANCEL ClassCancelRoutine;
29static NTSTATUS
34
35static VOID NTAPI
37{
38 // nothing to do here yet
39}
40
41static NTSTATUS NTAPI
44 IN PIRP Irp)
45{
46 TRACE_(CLASS_NAME, "IRP_MJ_CREATE\n");
47
48 if (!((PCOMMON_DEVICE_EXTENSION)DeviceObject->DeviceExtension)->IsClassDO)
50
51 /* FIXME: open all associated Port devices */
52 Irp->IoStatus.Status = STATUS_SUCCESS;
53 Irp->IoStatus.Information = 0;
55 return STATUS_SUCCESS;
56}
57
58static NTSTATUS NTAPI
61 IN PIRP Irp)
62{
63 TRACE_(CLASS_NAME, "IRP_MJ_CLOSE\n");
64
65 if (!((PCOMMON_DEVICE_EXTENSION)DeviceObject->DeviceExtension)->IsClassDO)
67
68 /* FIXME: close all associated Port devices */
69 Irp->IoStatus.Status = STATUS_SUCCESS;
70 Irp->IoStatus.Information = 0;
72 return STATUS_SUCCESS;
73}
74
75static NTSTATUS NTAPI
78 IN PIRP Irp)
79{
80 TRACE_(CLASS_NAME, "IRP_MJ_CLEANUP\n");
81
82 if (!((PCOMMON_DEVICE_EXTENSION)DeviceObject->DeviceExtension)->IsClassDO)
84
85 /* FIXME: cleanup all associated Port devices */
86 Irp->IoStatus.Status = STATUS_SUCCESS;
87 Irp->IoStatus.Information = 0;
89 return STATUS_SUCCESS;
90}
91
92static NTSTATUS NTAPI
95 IN PIRP Irp)
96{
97 PCOMMON_DEVICE_EXTENSION DeviceExtension = DeviceObject->DeviceExtension;
99
100 TRACE_(CLASS_NAME, "IRP_MJ_READ\n");
101
103 {
104 Irp->IoStatus.Status = STATUS_BUFFER_TOO_SMALL;
105 Irp->IoStatus.Information = 0;
107
109 }
110
111 if (DeviceExtension->IsClassDO)
112 {
113 ReadData = ((PCLASS_DEVICE_EXTENSION)DeviceExtension)->ReadData;
114 }
115 else
116 {
118 PCLASS_DEVICE_EXTENSION Class = (PCLASS_DEVICE_EXTENSION)Port->ClassDO->DeviceExtension;
119 ReadData = Class->ReadData;
120 }
121
123}
124
125static NTSTATUS NTAPI
128 IN PIRP Irp)
129{
131
132 TRACE_(CLASS_NAME, "IRP_MJ_DEVICE_CONTROL\n");
133
135 {
137 {
138 if (((PCOMMON_DEVICE_EXTENSION)DeviceObject->DeviceExtension)->IsClassDO)
139 {
140 /* FIXME: We hope that all devices will return the same result.
141 * Ask only the first one */
142 PLIST_ENTRY Head = &((PCLASS_DEVICE_EXTENSION)DeviceObject->DeviceExtension)->ListHead;
143 if (Head->Flink != Head)
144 {
145 /* We have at least one device */
147 DeviceObject = DevExt->DeviceObject;
148 }
149 else
151 }
152 if (DeviceObject)
153 {
157 }
158 break;
159 }
160
161 /* Every IOCTL HID, except IOCTL_HID_GET_INPUT_REPORT/IOCTL_HID_SET_OUTPUT_REPORT */
180 /* IOCTL used by Power Manager */
183 {
184 PPORT_DEVICE_EXTENSION DeviceExtension = DeviceObject->DeviceExtension;
185 if (!DeviceExtension->Common.IsClassDO)
186 {
188 return IoCallDriver(DeviceExtension->LowerDevice, Irp);
189 }
190 break;
191 }
192 default:
193 WARN_(CLASS_NAME, "IRP_MJ_DEVICE_CONTROL / unknown I/O control code 0x%lx\n",
195 ASSERT(FALSE);
196 break;
197 }
198
199 Irp->IoStatus.Status = Status;
200 Irp->IoStatus.Information = 0;
202
203 return Status;
204}
205
206static NTSTATUS NTAPI
209 IN PIRP Irp)
210{
212 PPORT_DEVICE_EXTENSION DeviceExtension;
213
214 DeviceExtension = DeviceObject->DeviceExtension;
215 if (!DeviceExtension->Common.IsClassDO)
216 {
217 /* Forward port DO IRPs to lower device */
220 return PoCallDriver(DeviceExtension->LowerDevice, Irp);
221 }
222
224 {
225 case IRP_MN_SET_POWER:
227 Irp->IoStatus.Status = STATUS_SUCCESS;
228 break;
229 }
230 Status = Irp->IoStatus.Status;
233 return Status;
234}
235
236static NTSTATUS
240{
241 UNICODE_STRING ParametersRegistryKey;
244
245 ULONG DefaultConnectMultiplePorts = 1;
246 ULONG DefaultDataQueueSize = 0x64;
247 PCWSTR DefaultDeviceBaseName = L"PointerClass";
248
249 ParametersRegistryKey.Length = 0;
250 ParametersRegistryKey.MaximumLength = RegistryPath->Length + sizeof(L"\\Parameters") + sizeof(UNICODE_NULL);
251 ParametersRegistryKey.Buffer = ExAllocatePoolWithTag(PagedPool, ParametersRegistryKey.MaximumLength, CLASS_TAG);
252 if (!ParametersRegistryKey.Buffer)
253 {
254 WARN_(CLASS_NAME, "ExAllocatePoolWithTag() failed\n");
255 return STATUS_NO_MEMORY;
256 }
257 RtlCopyUnicodeString(&ParametersRegistryKey, RegistryPath);
258 RtlAppendUnicodeToString(&ParametersRegistryKey, L"\\Parameters");
259 ParametersRegistryKey.Buffer[ParametersRegistryKey.Length / sizeof(WCHAR)] = UNICODE_NULL;
260
262
264 Parameters[0].Name = L"ConnectMultiplePorts";
265 Parameters[0].EntryContext = &DriverExtension->ConnectMultiplePorts;
266 Parameters[0].DefaultType = REG_DWORD;
267 Parameters[0].DefaultData = &DefaultConnectMultiplePorts;
268 Parameters[0].DefaultLength = sizeof(ULONG);
269
271 Parameters[1].Name = L"MouseDataQueueSize";
272 Parameters[1].EntryContext = &DriverExtension->DataQueueSize;
273 Parameters[1].DefaultType = REG_DWORD;
274 Parameters[1].DefaultData = &DefaultDataQueueSize;
275 Parameters[1].DefaultLength = sizeof(ULONG);
276
278 Parameters[2].Name = L"PointerDeviceBaseName";
279 Parameters[2].EntryContext = &DriverExtension->DeviceBaseName;
280 Parameters[2].DefaultType = REG_SZ;
281 Parameters[2].DefaultData = (PVOID)DefaultDeviceBaseName;
282 Parameters[2].DefaultLength = 0;
283
286 ParametersRegistryKey.Buffer,
288 NULL,
289 NULL);
290
291 if (NT_SUCCESS(Status))
292 {
293 /* Check values */
294 if (DriverExtension->ConnectMultiplePorts != 0
295 && DriverExtension->ConnectMultiplePorts != 1)
296 {
297 DriverExtension->ConnectMultiplePorts = DefaultConnectMultiplePorts;
298 }
299 if (DriverExtension->DataQueueSize == 0)
300 {
301 DriverExtension->DataQueueSize = DefaultDataQueueSize;
302 }
303 }
305 {
306 /* Registry path doesn't exist. Set defaults */
307 DriverExtension->ConnectMultiplePorts = DefaultConnectMultiplePorts;
308 DriverExtension->DataQueueSize = DefaultDataQueueSize;
309 if (RtlCreateUnicodeString(&DriverExtension->DeviceBaseName, DefaultDeviceBaseName))
311 else
313 }
314
315 ExFreePoolWithTag(ParametersRegistryKey.Buffer, CLASS_TAG);
316 return Status;
317}
318
319static NTSTATUS
322 OUT PDEVICE_OBJECT *ClassDO OPTIONAL)
323{
325 ULONG DeviceId = 0;
326 ULONG PrefixLength;
327 UNICODE_STRING DeviceNameU;
328 PWSTR DeviceIdW = NULL; /* Pointer into DeviceNameU.Buffer */
330 PCLASS_DEVICE_EXTENSION DeviceExtension;
332
333 TRACE_(CLASS_NAME, "CreateClassDeviceObject(0x%p)\n", DriverObject);
334
335 /* Create new device object */
337 DeviceNameU.Length = 0;
338 DeviceNameU.MaximumLength =
339 (USHORT)wcslen(L"\\Device\\") * sizeof(WCHAR) /* "\Device\" */
340 + DriverExtension->DeviceBaseName.Length /* "PointerClass" */
341 + 4 * sizeof(WCHAR) /* Id between 0 and 9999 */
342 + sizeof(UNICODE_NULL); /* Final NULL char */
343 DeviceNameU.Buffer = ExAllocatePoolWithTag(PagedPool, DeviceNameU.MaximumLength, CLASS_TAG);
344 if (!DeviceNameU.Buffer)
345 {
346 WARN_(CLASS_NAME, "ExAllocatePoolWithTag() failed\n");
347 return STATUS_NO_MEMORY;
348 }
349 Status = RtlAppendUnicodeToString(&DeviceNameU, L"\\Device\\");
350 if (!NT_SUCCESS(Status))
351 {
352 WARN_(CLASS_NAME, "RtlAppendUnicodeToString() failed with status 0x%08lx\n", Status);
353 goto cleanup;
354 }
355 Status = RtlAppendUnicodeStringToString(&DeviceNameU, &DriverExtension->DeviceBaseName);
356 if (!NT_SUCCESS(Status))
357 {
358 WARN_(CLASS_NAME, "RtlAppendUnicodeStringToString() failed with status 0x%08lx\n", Status);
359 goto cleanup;
360 }
361 PrefixLength = DeviceNameU.MaximumLength - 4 * sizeof(WCHAR) - sizeof(UNICODE_NULL);
362 DeviceIdW = &DeviceNameU.Buffer[PrefixLength / sizeof(WCHAR)];
363 while (DeviceId < 9999)
364 {
365 DeviceNameU.Length = (USHORT)(PrefixLength + _swprintf(DeviceIdW, L"%lu", DeviceId) * sizeof(WCHAR));
369 &DeviceNameU,
372 FALSE,
373 &Fdo);
374 if (NT_SUCCESS(Status))
375 goto cleanup;
377 {
378 WARN_(CLASS_NAME, "IoCreateDevice() failed with status 0x%08lx\n", Status);
379 goto cleanup;
380 }
381 DeviceId++;
382 }
383 WARN_(CLASS_NAME, "Too many devices starting with '\\Device\\%wZ'\n", &DriverExtension->DeviceBaseName);
385cleanup:
386 if (!NT_SUCCESS(Status))
387 {
388 ExFreePoolWithTag(DeviceNameU.Buffer, CLASS_TAG);
389 return Status;
390 }
391
392 DeviceExtension = (PCLASS_DEVICE_EXTENSION)Fdo->DeviceExtension;
393 RtlZeroMemory(DeviceExtension, sizeof(CLASS_DEVICE_EXTENSION));
394 DeviceExtension->Common.IsClassDO = TRUE;
395 DeviceExtension->DriverExtension = DriverExtension;
396 InitializeListHead(&DeviceExtension->ListHead);
397 KeInitializeSpinLock(&DeviceExtension->ListSpinLock);
398 DeviceExtension->ReadData = ExAllocatePoolZero(NonPagedPool, sizeof(READ_DATA), CLASS_TAG);
399 if (!DeviceExtension->ReadData)
400 {
401 ExFreePoolWithTag(DeviceNameU.Buffer, CLASS_TAG);
402 return STATUS_NO_MEMORY;
403 }
404 KeInitializeSpinLock(&DeviceExtension->ReadData->SpinLock);
405 DeviceExtension->ReadData->PortData = ExAllocatePoolWithTag(NonPagedPool, DeviceExtension->DriverExtension->DataQueueSize * sizeof(MOUSE_INPUT_DATA), CLASS_TAG);
406 if (!DeviceExtension->ReadData->PortData)
407 {
408 ExFreePoolWithTag(DeviceNameU.Buffer, CLASS_TAG);
409 ExFreePoolWithTag(DeviceExtension->ReadData, CLASS_TAG);
410 return STATUS_NO_MEMORY;
411 }
412 DeviceExtension->DeviceName = DeviceNameU.Buffer;
413 Fdo->Flags |= DO_POWER_PAGABLE;
414 Fdo->Flags &= ~DO_DEVICE_INITIALIZING;
415 Fdo->Flags |= DO_BUFFERED_IO;
416
417 /* Add entry entry to HKEY_LOCAL_MACHINE\HARDWARE\DEVICEMAP\[DeviceBaseName] */
420 DriverExtension->DeviceBaseName.Buffer,
421 DeviceExtension->DeviceName,
422 REG_SZ,
423 DriverExtension->RegistryPath.Buffer,
424 DriverExtension->RegistryPath.MaximumLength);
425
426 if (ClassDO)
427 *ClassDO = Fdo;
428
429 return STATUS_SUCCESS;
430}
431
432static NTSTATUS
434 IN PDEVICE_OBJECT ClassDeviceObject,
437 IN SIZE_T NumberOfEntries)
438{
440
441 if (!Destination)
442 return STATUS_UNSUCCESSFUL;
443
444 if (ClassDeviceObject->Flags & (DO_BUFFERED_IO | DO_DIRECT_IO))
445 {
448 Source,
449 NumberOfEntries * sizeof(MOUSE_INPUT_DATA));
450 }
451 else
452 {
454 {
457 Source,
458 NumberOfEntries * sizeof(MOUSE_INPUT_DATA));
459 }
461 {
463 }
464 _SEH2_END;
465 }
466
467 return Status;
468}
469
470static BOOLEAN NTAPI
472 IN PDEVICE_OBJECT ClassDeviceObject,
473 IN OUT PMOUSE_INPUT_DATA DataStart,
474 IN PMOUSE_INPUT_DATA DataEnd,
475 IN OUT PULONG ConsumedCount)
476{
477 PCLASS_DEVICE_EXTENSION ClassDeviceExtension = ClassDeviceObject->DeviceExtension;
479 SIZE_T InputCount = DataEnd - DataStart;
480 SIZE_T ReadSize;
481
482 TRACE_(CLASS_NAME, "ClassCallback()\n");
483
484 ASSERT(ClassDeviceExtension->Common.IsClassDO);
485
486 if (InputCount > 0)
487 {
488 KeAcquireSpinLock(&ClassDeviceExtension->ReadData->SpinLock, &OldIrql);
489 if (ClassDeviceExtension->ReadData->InputCount + InputCount > ClassDeviceExtension->DriverExtension->DataQueueSize)
490 {
491 /*
492 * We're exceeding the buffer, and data will be thrown away...
493 * FIXME: What could we do, as we are at DISPATCH_LEVEL?
494 */
495 ReadSize = ClassDeviceExtension->DriverExtension->DataQueueSize - ClassDeviceExtension->ReadData->InputCount;
496 }
497 else
498 ReadSize = InputCount;
499
500 /*
501 * Move the input data from the port data queue to our class data
502 * queue.
503 */
505 &ClassDeviceExtension->ReadData->PortData[ClassDeviceExtension->ReadData->InputCount],
506 (PCHAR)DataStart,
507 sizeof(MOUSE_INPUT_DATA) * ReadSize);
508
509 /* Move the counter up */
510 ClassDeviceExtension->ReadData->InputCount += ReadSize;
511
512 (*ConsumedCount) += (ULONG)ReadSize;
513
514 KeReleaseSpinLock(&ClassDeviceExtension->ReadData->SpinLock, OldIrql);
515
516 /* Complete pending IRP (if any) */
517 HandleReadIrp(ClassDeviceObject, ClassDeviceExtension->ReadData, NULL);
518 }
519
520 TRACE_(CLASS_NAME, "Leaving ClassCallback()\n");
521 return TRUE;
522}
523
524/* Send IOCTL_INTERNAL_*_CONNECT to port */
525static NTSTATUS
527 IN PDEVICE_OBJECT PortDO,
528 IN PDEVICE_OBJECT ClassDO)
529{
531 PIRP Irp;
533 CONNECT_DATA ConnectData;
535
536 TRACE_(CLASS_NAME, "Connecting PortDO %p to ClassDO %p\n", PortDO, ClassDO);
537
539
540 ConnectData.ClassDeviceObject = ClassDO;
541 ConnectData.ClassService = ClassCallback;
542
545 PortDO,
546 &ConnectData, sizeof(CONNECT_DATA),
547 NULL, 0,
548 TRUE, &Event, &IoStatus);
549 if (!Irp)
551
552 Status = IoCallDriver(PortDO, Irp);
553
554 if (Status == STATUS_PENDING)
556 else
557 IoStatus.Status = Status;
558
559 if (NT_SUCCESS(IoStatus.Status))
560 {
561 ObReferenceObject(PortDO);
563 &((PCLASS_DEVICE_EXTENSION)ClassDO->DeviceExtension)->ListHead,
564 &((PPORT_DEVICE_EXTENSION)PortDO->DeviceExtension)->ListEntry,
565 &((PCLASS_DEVICE_EXTENSION)ClassDO->DeviceExtension)->ListSpinLock);
566 if (ClassDO->StackSize <= PortDO->StackSize)
567 {
568 /* Increase the stack size, in case we have to
569 * forward some IRPs to the port device object
570 */
571 ClassDO->StackSize = PortDO->StackSize + 1;
572 }
573 }
574
575 return IoStatus.Status;
576}
577
578/* Send IOCTL_INTERNAL_*_DISCONNECT to port + destroy the Port DO */
579static VOID
581 IN PDEVICE_OBJECT PortDO)
582{
583 PPORT_DEVICE_EXTENSION DeviceExtension;
584 PCLASS_DEVICE_EXTENSION ClassDeviceExtension;
587 PIRP Irp;
591
592 TRACE_(CLASS_NAME, "Destroying PortDO %p\n", PortDO);
593
594 DeviceExtension = (PPORT_DEVICE_EXTENSION)PortDO->DeviceExtension;
595 ClassDeviceExtension = DeviceExtension->ClassDO->DeviceExtension;
596 DriverExtension = IoGetDriverObjectExtension(PortDO->DriverObject, PortDO->DriverObject);
597
598 /* Send IOCTL_INTERNAL_*_DISCONNECT */
602 PortDO,
603 NULL, 0,
604 NULL, 0,
605 TRUE, &Event, &IoStatus);
606 if (Irp)
607 {
608 Status = IoCallDriver(PortDO, Irp);
609 if (Status == STATUS_PENDING)
611 }
612
613 /* Remove from ClassDeviceExtension->ListHead list */
614 KeAcquireSpinLock(&ClassDeviceExtension->ListSpinLock, &OldIrql);
615 RemoveEntryList(&DeviceExtension->ListEntry);
616 KeReleaseSpinLock(&ClassDeviceExtension->ListSpinLock, OldIrql);
617
618 /* Remove entry from HKEY_LOCAL_MACHINE\HARDWARE\DEVICEMAP\[DeviceBaseName] */
621 DriverExtension->DeviceBaseName.Buffer,
622 ClassDeviceExtension->DeviceName);
623
624 if (DeviceExtension->LowerDevice)
625 IoDetachDevice(DeviceExtension->LowerDevice);
626 ObDereferenceObject(PortDO);
627
628 if (!DriverExtension->ConnectMultiplePorts && DeviceExtension->ClassDO)
629 {
630 ExFreePoolWithTag(ClassDeviceExtension->ReadData->PortData, CLASS_TAG);
631 ExFreePoolWithTag(ClassDeviceExtension->ReadData, CLASS_TAG);
632 ExFreePoolWithTag((PVOID)ClassDeviceExtension->DeviceName, CLASS_TAG);
633 IoDeleteDevice(DeviceExtension->ClassDO);
634 }
635
636 IoDeleteDevice(PortDO);
637}
638
639static NTSTATUS NTAPI
643{
646 PPORT_DEVICE_EXTENSION DeviceExtension = NULL;
648
649 TRACE_(CLASS_NAME, "ClassAddDevice called. Pdo = 0x%p\n", Pdo);
650
652
653 if (Pdo == NULL)
654 /* We may get a NULL Pdo at the first call as we're a legacy driver. Ignore it */
655 return STATUS_SUCCESS;
656
657 /* Create new device object */
660 sizeof(PORT_DEVICE_EXTENSION),
661 NULL,
662 Pdo->DeviceType,
663 Pdo->Characteristics & FILE_DEVICE_SECURE_OPEN ? FILE_DEVICE_SECURE_OPEN : 0,
664 FALSE,
665 &Fdo);
666 if (!NT_SUCCESS(Status))
667 {
668 WARN_(CLASS_NAME, "IoCreateDevice() failed with status 0x%08lx\n", Status);
669 goto cleanup;
670 }
672
673 DeviceExtension = (PPORT_DEVICE_EXTENSION)Fdo->DeviceExtension;
674 RtlZeroMemory(DeviceExtension, sizeof(PORT_DEVICE_EXTENSION));
675 DeviceExtension->Common.IsClassDO = FALSE;
676 DeviceExtension->DeviceObject = Fdo;
677 DeviceExtension->PnpState = dsStopped;
679 if (!NT_SUCCESS(Status))
680 {
681 WARN_(CLASS_NAME, "IoAttachDeviceToDeviceStackSafe() failed with status 0x%08lx\n", Status);
682 goto cleanup;
683 }
684 if (DeviceExtension->LowerDevice->Flags & DO_POWER_PAGABLE)
685 Fdo->Flags |= DO_POWER_PAGABLE;
686 if (DeviceExtension->LowerDevice->Flags & DO_BUFFERED_IO)
687 Fdo->Flags |= DO_BUFFERED_IO;
688 if (DeviceExtension->LowerDevice->Flags & DO_DIRECT_IO)
689 Fdo->Flags |= DO_DIRECT_IO;
690
691 if (DriverExtension->ConnectMultiplePorts)
692 DeviceExtension->ClassDO = DriverExtension->MainClassDeviceObject;
693 else
694 {
695 /* We need a new class device object for this Fdo */
698 &DeviceExtension->ClassDO);
699 if (!NT_SUCCESS(Status))
700 {
701 WARN_(CLASS_NAME, "CreateClassDeviceObject() failed with status 0x%08lx\n", Status);
702 goto cleanup;
703 }
704 }
705 Status = ConnectPortDriver(Fdo, DeviceExtension->ClassDO);
706 if (!NT_SUCCESS(Status))
707 {
708 WARN_(CLASS_NAME, "ConnectPortDriver() failed with status 0x%08lx\n", Status);
709 goto cleanup;
710 }
711 Fdo->Flags &= ~DO_DEVICE_INITIALIZING;
712
713 /* Register interface ; ignore the error (if any) as having
714 * a registered interface is not so important... */
716 Pdo,
717 &GUID_DEVINTERFACE_MOUSE,
718 NULL,
719 &DeviceExtension->InterfaceName);
720 if (!NT_SUCCESS(Status))
721 DeviceExtension->InterfaceName.Length = 0;
722
723 return STATUS_SUCCESS;
724
725cleanup:
726 if (Fdo)
728 return Status;
729}
730
731static VOID NTAPI
734 IN PIRP Irp)
735{
736 PCOMMON_DEVICE_EXTENSION DeviceExtension = DeviceObject->DeviceExtension;
739 BOOLEAN wasQueued = FALSE;
740
741 TRACE_(CLASS_NAME, "ClassCancelRoutine(DeviceObject %p, Irp %p)\n", DeviceObject, Irp);
742
743 if (DeviceExtension->IsClassDO)
744 {
745 ReadData = ((PCLASS_DEVICE_EXTENSION)DeviceExtension)->ReadData;
746 }
747 else
748 {
750 PCLASS_DEVICE_EXTENSION Class = (PCLASS_DEVICE_EXTENSION)Port->ClassDO->DeviceExtension;
751 ReadData = Class->ReadData;
752 }
753
754 IoReleaseCancelSpinLock(Irp->CancelIrql);
755
756 KeAcquireSpinLock(&ReadData->SpinLock, &OldIrql);
757
758 if (ReadData->PendingIrp == Irp)
759 {
760 ReadData->PendingIrp = NULL;
761 wasQueued = TRUE;
762 }
764
765 if (wasQueued)
766 {
767 Irp->IoStatus.Status = STATUS_CANCELLED;
768 Irp->IoStatus.Information = 0;
770 }
771 else
772 {
773 DPRINT1("Cancelled IRP is not pending. Race condition?\n");
774 }
775}
776
777static NTSTATUS
782{
785
786 TRACE_(CLASS_NAME, "HandleReadIrp(DeviceObject %p, ReadData %p, Irp %p)\n", DeviceObject, ReadData, Irp);
787
788 if (!Irp)
789 Irp = ReadData->PendingIrp;
790 if (!Irp)
791 return STATUS_SUCCESS;
792
793 if (ReadData->InputCount > 0)
794 {
795 SIZE_T NumberOfEntries;
797
798 if (DeviceObject->Flags & DO_BUFFERED_IO)
799 Destination = Irp->AssociatedIrp.SystemBuffer;
800 else if (DeviceObject->Flags & DO_DIRECT_IO)
802 else
803 Destination = Irp->UserBuffer;
804
805 KeAcquireSpinLock(&ReadData->SpinLock, &OldIrql);
806 NumberOfEntries = MIN(
807 ReadData->InputCount,
809
812 ReadData->PortData,
814 NumberOfEntries);
815
816 if (NT_SUCCESS(Status))
817 {
818 if (ReadData->InputCount > NumberOfEntries)
819 {
821 &ReadData->PortData[0],
822 &ReadData->PortData[NumberOfEntries],
823 (ReadData->InputCount - NumberOfEntries) * sizeof(MOUSE_INPUT_DATA));
824 }
825
826 ReadData->InputCount -= NumberOfEntries;
827
828 Irp->IoStatus.Information = NumberOfEntries * sizeof(MOUSE_INPUT_DATA);
829 }
830
831 /* Go to next packet and complete this request */
832 Irp->IoStatus.Status = Status;
833
836 ReadData->PendingIrp = NULL;
838
839 return Status;
840 }
841
843 if (Irp->Cancel)
844 {
845 ReadData->PendingIrp = NULL;
847 }
848 else
849 {
851 ReadData->PendingIrp = Irp;
854 }
856 return Status;
857}
858
859static NTSTATUS NTAPI
862 IN PIRP Irp)
863{
864 PPORT_DEVICE_EXTENSION DeviceExtension = DeviceObject->DeviceExtension;
869
870 switch (IrpSp->MinorFunction)
871 {
873 if (IoForwardIrpSynchronously(DeviceExtension->LowerDevice, Irp))
874 {
875 Status = Irp->IoStatus.Status;
876 }
877 else
878 {
880 }
881
882 if (NT_SUCCESS(Status))
883 {
885 &DeviceExtension->InterfaceName,
887 NULL,
888 NULL);
889
890 Status = ZwOpenFile(&DeviceExtension->FileHandle,
893 &Iosb,
894 0,
895 0);
896 if (!NT_SUCCESS(Status))
897 DeviceExtension->FileHandle = NULL;
898 }
899 else
900 DeviceExtension->FileHandle = NULL;
901 if (DeviceExtension->InterfaceName.Length != 0)
902 IoSetDeviceInterfaceState(&DeviceExtension->InterfaceName, TRUE);
903 Irp->IoStatus.Status = Status;
905 return Status;
906
908 if (DeviceExtension->FileHandle)
909 {
910 ZwClose(DeviceExtension->FileHandle);
911 DeviceExtension->FileHandle = NULL;
912 }
914 break;
915
917 if (DeviceExtension->InterfaceName.Length != 0)
919 if (DeviceExtension->FileHandle)
920 {
921 ZwClose(DeviceExtension->FileHandle);
922 DeviceExtension->FileHandle = NULL;
923 }
925 Status = IoCallDriver(DeviceExtension->LowerDevice, Irp);
927 return Status;
928
929 default:
930 Status = Irp->IoStatus.Status;
931 break;
932 }
933
934 Irp->IoStatus.Status = Status;
936 {
938 return IoCallDriver(DeviceExtension->LowerDevice, Irp);
939 }
940 else
941 {
943 return Status;
944 }
945}
946
947static VOID NTAPI
950 IN PIRP Irp)
951{
952 PCLASS_DEVICE_EXTENSION DeviceExtension = DeviceObject->DeviceExtension;
953
954 TRACE_(CLASS_NAME, "ClassStartIo(DeviceObject %p, Irp %p)\n", DeviceObject, Irp);
955
956 ASSERT(DeviceExtension->Common.IsClassDO);
957
958 HandleReadIrp(DeviceObject, DeviceExtension->ReadData, Irp);
959}
960
961static VOID NTAPI
964 IN PVOID Context, /* PCLASS_DRIVER_EXTENSION */
965 IN ULONG Count)
966{
967 UNICODE_STRING DeviceMapKeyU = RTL_CONSTANT_STRING(L"\\REGISTRY\\MACHINE\\HARDWARE\\DEVICEMAP");
969 UNICODE_STRING PortBaseName = { 0, 0, NULL };
970 PKEY_VALUE_BASIC_INFORMATION KeyValueInformation = NULL;
972 HANDLE hDeviceMapKey = (HANDLE)-1;
973 HANDLE hPortKey = (HANDLE)-1;
974 ULONG Index = 0;
977
978 TRACE_(CLASS_NAME, "SearchForLegacyDrivers(%p %p %lu)\n",
980
981 if (Count != 1)
982 return;
984
985 /* Create port base name, by replacing Class by Port at the end of the class base name */
988 &DriverExtension->DeviceBaseName,
989 &PortBaseName);
990 if (!NT_SUCCESS(Status))
991 {
992 WARN_(CLASS_NAME, "DuplicateUnicodeString() failed with status 0x%08lx\n", Status);
993 goto cleanup;
994 }
995 PortBaseName.Length -= (sizeof(L"Class") - sizeof(UNICODE_NULL));
996 RtlAppendUnicodeToString(&PortBaseName, L"Port");
997
998 /* Allocate memory */
1000 KeyValueInformation = ExAllocatePoolWithTag(PagedPool, Size, CLASS_TAG);
1001 if (!KeyValueInformation)
1002 {
1003 WARN_(CLASS_NAME, "ExAllocatePoolWithTag() failed\n");
1005 goto cleanup;
1006 }
1007
1008 /* Open HKEY_LOCAL_MACHINE\HARDWARE\DEVICEMAP */
1010 Status = ZwOpenKey(&hDeviceMapKey, 0, &ObjectAttributes);
1012 {
1013 INFO_(CLASS_NAME, "HKLM\\HARDWARE\\DEVICEMAP is non-existent\n");
1015 goto cleanup;
1016 }
1017 else if (!NT_SUCCESS(Status))
1018 {
1019 WARN_(CLASS_NAME, "ZwOpenKey() failed with status 0x%08lx\n", Status);
1020 goto cleanup;
1021 }
1022
1023 /* Open sub key */
1027 {
1028 INFO_(CLASS_NAME, "HKLM\\HARDWARE\\DEVICEMAP\\%wZ is non-existent\n", &PortBaseName);
1030 goto cleanup;
1031 }
1032 else if (!NT_SUCCESS(Status))
1033 {
1034 WARN_(CLASS_NAME, "ZwOpenKey() failed with status 0x%08lx\n", Status);
1035 goto cleanup;
1036 }
1037
1038 /* Read each value name */
1039 while (ZwEnumerateValueKey(hPortKey, Index++, KeyValueBasicInformation, KeyValueInformation, Size, &ResultLength) == STATUS_SUCCESS)
1040 {
1042 PDEVICE_OBJECT PortDeviceObject = NULL;
1044
1045 PortName.Length = PortName.MaximumLength = (USHORT)KeyValueInformation->NameLength;
1046 PortName.Buffer = KeyValueInformation->Name;
1047
1048 /* Open the device object pointer */
1050 if (!NT_SUCCESS(Status))
1051 {
1052 WARN_(CLASS_NAME, "IoGetDeviceObjectPointer(%wZ) failed with status 0x%08lx\n", &PortName, Status);
1053 continue;
1054 }
1055 INFO_(CLASS_NAME, "Legacy driver found\n");
1056
1057 Status = ClassAddDevice(DriverObject, PortDeviceObject);
1058 if (!NT_SUCCESS(Status))
1059 {
1060 /* FIXME: Log the error */
1061 WARN_(CLASS_NAME, "ClassAddDevice() failed with status 0x%08lx\n", Status);
1062 }
1063
1065 }
1066
1067cleanup:
1068 if (KeyValueInformation != NULL)
1069 ExFreePoolWithTag(KeyValueInformation, CLASS_TAG);
1070 if (hDeviceMapKey != (HANDLE)-1)
1071 ZwClose(hDeviceMapKey);
1072 if (hPortKey != (HANDLE)-1)
1073 ZwClose(hPortKey);
1074}
1075
1076/*
1077 * Standard DriverEntry method.
1078 */
1083{
1086
1090 sizeof(CLASS_DRIVER_EXTENSION),
1092 if (!NT_SUCCESS(Status))
1093 {
1094 WARN_(CLASS_NAME, "IoAllocateDriverObjectExtension() failed with status 0x%08lx\n", Status);
1095 return Status;
1096 }
1098
1102 &DriverExtension->RegistryPath);
1103 if (!NT_SUCCESS(Status))
1104 {
1105 WARN_(CLASS_NAME, "DuplicateUnicodeString() failed with status 0x%08lx\n", Status);
1106 return Status;
1107 }
1108
1110 if (!NT_SUCCESS(Status))
1111 {
1112 WARN_(CLASS_NAME, "ReadRegistryEntries() failed with status 0x%08lx\n", Status);
1113 return Status;
1114 }
1115
1116 if (DriverExtension->ConnectMultiplePorts == 1)
1117 {
1120 &DriverExtension->MainClassDeviceObject);
1121 if (!NT_SUCCESS(Status))
1122 {
1123 WARN_(CLASS_NAME, "CreateClassDeviceObject() failed with status 0x%08lx\n", Status);
1124 return Status;
1125 }
1126 }
1127
1128 DriverObject->DriverExtension->AddDevice = ClassAddDevice;
1129 DriverObject->DriverUnload = DriverUnload;
1130
1131 DriverObject->MajorFunction[IRP_MJ_CREATE] = ClassCreate;
1132 DriverObject->MajorFunction[IRP_MJ_CLOSE] = ClassClose;
1133 DriverObject->MajorFunction[IRP_MJ_CLEANUP] = ClassCleanup;
1134 DriverObject->MajorFunction[IRP_MJ_READ] = ClassRead;
1135 DriverObject->MajorFunction[IRP_MJ_POWER] = ClassPower;
1136 DriverObject->MajorFunction[IRP_MJ_PNP] = ClassPnp;
1139 DriverObject->DriverStartIo = ClassStartIo;
1140
1141 /* We will detect the legacy devices later */
1146
1147 return STATUS_SUCCESS;
1148}
static PIO_STACK_LOCATION IoGetCurrentIrpStackLocation(PIRP Irp)
static UNICODE_STRING PortName
#define VOID
Definition: acefi.h:82
unsigned char BOOLEAN
Definition: actypes.h:127
#define REG_SZ
Definition: layer.c:22
LONG NTSTATUS
Definition: precomp.h:26
#define MIN(x, y)
Definition: rdesktop.h:171
#define DPRINT1
Definition: precomp.h:8
#define FILE_DEVICE_SECURE_OPEN
Definition: cdrw_usr.h:46
#define IRP_MJ_PNP
Definition: cdrw_usr.h:52
NTSYSAPI BOOLEAN NTAPI RtlCreateUnicodeString(PUNICODE_STRING DestinationString, PCWSTR SourceString)
IN PUNICODE_STRING IN POBJECT_ATTRIBUTES ObjectAttributes
Definition: conport.c:36
#define STATUS_NO_MEMORY
Definition: d3dkmdt.h:51
#define STATUS_NOT_SUPPORTED
Definition: d3dkmdt.h:48
_In_ HANDLE _In_ CONST PDXGKMDT_OPM_GET_INFO_PARAMETERS Parameters
Definition: dispmprt.h:321
_Check_return_ _In_ DXGK_EVENT_TYPE _In_ ULONG Event
Definition: dispmprt.h:1287
#define NULL
Definition: types.h:112
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
#define NT_SUCCESS(StatCode)
Definition: apphelp.c:33
#define RTL_CONSTANT_STRING(s)
Definition: combase.c:35
#define TRACE_(x)
Definition: compat.h:76
#define MAX_PATH
Definition: compat.h:34
static void cleanup(void)
Definition: main.c:1335
_ACRTIMP size_t __cdecl wcslen(const wchar_t *)
Definition: wcs.c:2988
DRIVER_INITIALIZE DriverEntry
Definition: condrv.c:21
#define L(x)
Definition: resources.c:13
_In_ PIO_STACK_LOCATION IrpSp
Definition: create.c:4138
return Iosb
Definition: create.c:4403
@ ReadData
Definition: amstream.idl:63
const TCHAR * CLASS_NAME
Definition: enumwnd.c:16
#define RemoveEntryList(Entry)
Definition: env_spec_w32.h:986
#define ExAllocatePoolWithTag(hernya, size, tag)
Definition: env_spec_w32.h:350
UCHAR KIRQL
Definition: env_spec_w32.h:591
#define DO_BUFFERED_IO
Definition: env_spec_w32.h:394
#define KeWaitForSingleObject(pEvt, foo, a, b, c)
Definition: env_spec_w32.h:478
#define KeInitializeEvent(pEvt, foo, foo2)
Definition: env_spec_w32.h:477
#define KeReleaseSpinLock(sl, irql)
Definition: env_spec_w32.h:627
NTSTATUS RtlAppendUnicodeToString(IN PUNICODE_STRING Str1, IN PWSTR Str2)
Definition: string_lib.cpp:62
#define KeAcquireSpinLock(sl, irql)
Definition: env_spec_w32.h:609
#define DO_DIRECT_IO
Definition: env_spec_w32.h:396
#define NonPagedPool
Definition: env_spec_w32.h:307
#define InitializeListHead(ListHead)
Definition: env_spec_w32.h:944
#define KeInitializeSpinLock(sl)
Definition: env_spec_w32.h:604
#define PagedPool
Definition: env_spec_w32.h:308
Status
Definition: gdiplustypes.h:24
#define RTL_DUPLICATE_UNICODE_STRING_NULL_TERMINATE
Definition: green.h:15
CPPORT Port[4]
Definition: headless.c:38
#define IOCTL_HID_GET_DRIVER_CONFIG
Definition: hidclass.h:74
#define IOCTL_HID_GET_MANUFACTURER_STRING
Definition: hidclass.h:64
#define IOCTL_HID_GET_COLLECTION_DESCRIPTOR
Definition: hidclass.h:58
#define IOCTL_HID_GET_PRODUCT_STRING
Definition: hidclass.h:67
#define IOCTL_HID_SET_POLL_FREQUENCY_MSEC
Definition: hidclass.h:72
#define IOCTL_GET_NUM_DEVICE_INPUT_BUFFERS
Definition: hidclass.h:65
#define IOCTL_HID_GET_INDEXED_STRING
Definition: hidclass.h:76
#define IOCTL_SET_NUM_DEVICE_INPUT_BUFFERS
Definition: hidclass.h:70
#define IOCTL_HID_GET_SERIALNUMBER_STRING
Definition: hidclass.h:68
#define IOCTL_HID_GET_POLL_FREQUENCY_MSEC
Definition: hidclass.h:66
#define IOCTL_HID_GET_MS_GENRE_DESCRIPTOR
Definition: hidclass.h:77
#define IOCTL_HID_SET_FEATURE
Definition: hidclass.h:69
#define IOCTL_HID_FLUSH_QUEUE
Definition: hidclass.h:57
#define IOCTL_HID_GET_HARDWARE_ID
Definition: hidclass.h:61
#define IOCTL_GET_PHYSICAL_DESCRIPTOR
Definition: hidclass.h:56
#define IOCTL_HID_SET_DRIVER_CONFIG
Definition: hidclass.h:75
#define IOCTL_HID_GET_FEATURE
Definition: hidclass.h:60
#define IOCTL_HID_GET_COLLECTION_INFORMATION
Definition: hidclass.h:59
return ZwOpenKey(Handle, KEY_READ, &Attributes)
ZwClose(Handle)
_In_ UCXUSBDEVICE _In_ PDEVICE_OBJECT Pdo
Definition: hubucx.h:280
struct _PORT_DEVICE_EXTENSION * PPORT_DEVICE_EXTENSION
NTSTATUS DuplicateUnicodeString(IN ULONG Flags, IN PCUNICODE_STRING SourceString, OUT PUNICODE_STRING DestinationString)
Definition: misc.c:31
DRIVER_DISPATCH ForwardIrpAndForget
Definition: i8042prt.h:341
#define EXCEPTION_EXECUTE_HANDLER
Definition: excpt.h:90
PLIST_ENTRY NTAPI ExInterlockedInsertTailList(IN OUT PLIST_ENTRY ListHead, IN OUT PLIST_ENTRY ListEntry, IN OUT PKSPIN_LOCK Lock)
Definition: interlocked.c:140
IoMarkIrpPending(Irp)
IoSetCancelRoutine(Irp, CancelRoutine)
@ dsStopped
Definition: isapnp.h:30
struct _CLASS_DRIVER_EXTENSION * PCLASS_DRIVER_EXTENSION
#define CLASS_TAG
Definition: kbdclass.h:11
#define IOCTL_INTERNAL_MOUSE_DISCONNECT
Definition: kbdmou.h:71
#define IOCTL_INTERNAL_MOUSE_CONNECT
Definition: kbdmou.h:68
_In_ PIRP Irp
Definition: kse.h:79
_In_ PIRP _In_ PIO_COMPLETION_ROUTINE _In_ PVOID Context
Definition: kse.h:81
#define ASSERT(a)
Definition: mode.c:44
#define ExFreePoolWithTag(_P, _T)
Definition: module.h:1109
@ NormalPagePriority
Definition: imports.h:54
#define _swprintf(buf, format,...)
Definition: sprintf.c:56
static PVOID ExAllocatePoolZero(ULONG PoolType, SIZE_T NumberOfBytes, ULONG Tag)
Definition: precomp.h:45
#define InitializeObjectAttributes(p, n, a, r, s)
Definition: reg.c:115
static DRIVER_DISPATCH ClassDeviceControl
Definition: mouclass.c:24
static DRIVER_DISPATCH ClassRead
Definition: mouclass.c:23
static VOID DestroyPortDriver(IN PDEVICE_OBJECT PortDO)
Definition: mouclass.c:580
static DRIVER_ADD_DEVICE ClassAddDevice
Definition: mouclass.c:26
static DRIVER_CANCEL ClassCancelRoutine
Definition: mouclass.c:28
static VOID NTAPI SearchForLegacyDrivers(IN PDRIVER_OBJECT DriverObject, IN PVOID Context, IN ULONG Count)
Definition: mouclass.c:962
static NTSTATUS ReadRegistryEntries(IN PUNICODE_STRING RegistryPath, IN PCLASS_DRIVER_EXTENSION DriverExtension)
Definition: mouclass.c:237
static BOOLEAN NTAPI ClassCallback(IN PDEVICE_OBJECT ClassDeviceObject, IN OUT PMOUSE_INPUT_DATA DataStart, IN PMOUSE_INPUT_DATA DataEnd, IN OUT PULONG ConsumedCount)
Definition: mouclass.c:471
static DRIVER_DISPATCH ClassClose
Definition: mouclass.c:21
static NTSTATUS ConnectPortDriver(IN PDEVICE_OBJECT PortDO, IN PDEVICE_OBJECT ClassDO)
Definition: mouclass.c:526
static NTSTATUS NTAPI ClassPnp(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
Definition: mouclass.c:860
static DRIVER_DISPATCH ClassCleanup
Definition: mouclass.c:22
static NTSTATUS HandleReadIrp(IN PDEVICE_OBJECT DeviceObject, IN PREAD_DATA ReadData, IN PIRP Irp OPTIONAL)
Definition: mouclass.c:778
static NTSTATUS CreateClassDeviceObject(IN PDRIVER_OBJECT DriverObject, OUT PDEVICE_OBJECT *ClassDO OPTIONAL)
Definition: mouclass.c:320
static DRIVER_DISPATCH ClassPower
Definition: mouclass.c:25
static DRIVER_DISPATCH ClassCreate
Definition: mouclass.c:20
static DRIVER_STARTIO ClassStartIo
Definition: mouclass.c:27
static NTSTATUS FillEntries(IN PDEVICE_OBJECT ClassDeviceObject, IN PMOUSE_INPUT_DATA Source, OUT PMOUSE_INPUT_DATA Destination, IN SIZE_T NumberOfEntries)
Definition: mouclass.c:433
static DRIVER_UNLOAD DriverUnload
Definition: mouclass.c:19
__in UCHAR __in POWER_STATE __in_opt PVOID __in PIO_STATUS_BLOCK IoStatus
Definition: mxum.h:159
_In_ UINT _In_ UINT _In_ PNDIS_PACKET Source
Definition: ndis.h:3171
#define KernelMode
Definition: asm.h:38
NTSYSAPI NTSTATUS NTAPI ZwOpenFile(_Out_ PHANDLE FileHandle, _In_ ACCESS_MASK DesiredAccess, _In_ POBJECT_ATTRIBUTES ObjectAttributes, _Out_ PIO_STATUS_BLOCK IoStatusBlock, _In_ ULONG ShareAccess, _In_ ULONG OpenOptions)
_In_ PUNICODE_STRING _Inout_ PUNICODE_STRING Destination
Definition: rtlfuncs.h:3051
DRIVER_DISPATCH(nfs41_FsdDispatch)
NTSYSAPI VOID NTAPI RtlCopyUnicodeString(PUNICODE_STRING DestinationString, PUNICODE_STRING SourceString)
struct _KEY_VALUE_BASIC_INFORMATION KEY_VALUE_BASIC_INFORMATION
#define FILE_READ_DATA
Definition: nt_native.h:628
@ KeyValueBasicInformation
Definition: nt_native.h:1183
NTSYSAPI NTSTATUS NTAPI RtlAppendUnicodeStringToString(PUNICODE_STRING Destination, PUNICODE_STRING Source)
#define FILE_READ_ATTRIBUTES
Definition: nt_native.h:647
#define RTL_REGISTRY_ABSOLUTE
Definition: nt_native.h:161
#define KEY_QUERY_VALUE
Definition: nt_native.h:1019
#define RTL_REGISTRY_DEVICEMAP
Definition: nt_native.h:165
#define RTL_QUERY_REGISTRY_DIRECT
Definition: nt_native.h:144
#define RTL_REGISTRY_OPTIONAL
Definition: nt_native.h:169
#define UNICODE_NULL
struct _MOUSE_INPUT_DATA MOUSE_INPUT_DATA
#define IOCTL_MOUSE_QUERY_ATTRIBUTES
Definition: ntddmou.h:32
@ NotificationEvent
#define IoSkipCurrentIrpStackLocation(Irp)
Definition: ntifs_ex.h:421
#define IoCopyCurrentIrpStackLocationToNext(Irp)
Definition: ntifs_ex.h:413
NTSTATUS NTAPI IoCreateDevice(IN PDRIVER_OBJECT DriverObject, IN ULONG DeviceExtensionSize, IN PUNICODE_STRING DeviceName, IN DEVICE_TYPE DeviceType, IN ULONG DeviceCharacteristics, IN BOOLEAN Exclusive, OUT PDEVICE_OBJECT *DeviceObject)
Definition: device.c:1038
NTSTATUS NTAPI IoAttachDeviceToDeviceStackSafe(IN PDEVICE_OBJECT SourceDevice, IN PDEVICE_OBJECT TargetDevice, IN OUT PDEVICE_OBJECT *AttachedToDeviceObject)
Definition: device.c:987
VOID NTAPI IoDetachDevice(IN PDEVICE_OBJECT TargetDevice)
Definition: device.c:1306
VOID NTAPI IoSetStartIoAttributes(IN PDEVICE_OBJECT DeviceObject, IN BOOLEAN DeferredStartIo, IN BOOLEAN NonCancelable)
Definition: device.c:1817
VOID NTAPI IoDeleteDevice(IN PDEVICE_OBJECT DeviceObject)
Definition: device.c:1261
NTSTATUS NTAPI IoGetDeviceObjectPointer(IN PUNICODE_STRING ObjectName, IN ACCESS_MASK DesiredAccess, OUT PFILE_OBJECT *FileObject, OUT PDEVICE_OBJECT *DeviceObject)
Definition: device.c:1455
NTSTATUS NTAPI IoRegisterDeviceInterface(IN PDEVICE_OBJECT PhysicalDeviceObject, IN CONST GUID *InterfaceClassGuid, IN PUNICODE_STRING ReferenceString OPTIONAL, OUT PUNICODE_STRING SymbolicLinkName)
Definition: deviface.c:1451
NTSTATUS NTAPI IoSetDeviceInterfaceState(IN PUNICODE_STRING SymbolicLinkName, IN BOOLEAN Enable)
Definition: deviface.c:1807
PVOID NTAPI IoGetDriverObjectExtension(IN PDRIVER_OBJECT DriverObject, IN PVOID ClientIdentificationAddress)
Definition: driver.c:1925
VOID NTAPI IoRegisterDriverReinitialization(IN PDRIVER_OBJECT DriverObject, IN PDRIVER_REINITIALIZE ReinitRoutine, IN PVOID Context)
Definition: driver.c:1818
NTSTATUS NTAPI IoAllocateDriverObjectExtension(IN PDRIVER_OBJECT DriverObject, IN PVOID ClientIdentificationAddress, IN ULONG DriverObjectExtensionSize, OUT PVOID *DriverObjectExtension)
Definition: driver.c:1847
#define IoCompleteRequest
Definition: irp.c:1272
PIRP NTAPI IoBuildDeviceIoControlRequest(IN ULONG IoControlCode, IN PDEVICE_OBJECT DeviceObject, IN PVOID InputBuffer, IN ULONG InputBufferLength, IN PVOID OutputBuffer, IN ULONG OutputBufferLength, IN BOOLEAN InternalDeviceIoControl, IN PKEVENT Event, IN PIO_STATUS_BLOCK IoStatusBlock)
Definition: irp.c:913
BOOLEAN NTAPI IoForwardIrpSynchronously(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
Definition: irp.c:1657
#define IoCallDriver
Definition: irp.c:1257
VOID NTAPI IoReleaseCancelSpinLock(IN KIRQL Irql)
Definition: util.c:150
VOID NTAPI IoAcquireCancelSpinLock(OUT PKIRQL Irql)
Definition: util.c:56
VOID NTAPI PoStartNextPowerIrp(IN PIRP Irp)
Definition: power.c:758
#define STATUS_TOO_MANY_NAMES
Definition: ntstatus.h:535
PPCI_DRIVER_EXTENSION DriverExtension
Definition: pci.c:31
short WCHAR
Definition: pedump.c:58
unsigned short USHORT
Definition: pedump.c:61
#define IOCTL_GET_SYS_BUTTON_CAPS
Definition: poclass.h:59
#define IOCTL_GET_SYS_BUTTON_EVENT
Definition: poclass.h:62
#define FILE_DEVICE_MOUSE
Definition: winioctl.h:60
#define OBJ_KERNEL_HANDLE
Definition: winternl.h:231
#define OBJ_CASE_INSENSITIVE
Definition: winternl.h:228
#define _SEH2_GetExceptionCode()
Definition: pseh2_64.h:204
#define _SEH2_EXCEPT(...)
Definition: pseh2_64.h:104
#define _SEH2_END
Definition: pseh2_64.h:194
#define _SEH2_TRY
Definition: pseh2_64.h:93
#define IRP_MJ_CLOSE
Definition: rdpdr.c:45
#define IRP_MJ_READ
Definition: rdpdr.c:46
#define IRP_MJ_DEVICE_CONTROL
Definition: rdpdr.c:52
#define IRP_MJ_CREATE
Definition: rdpdr.c:44
#define REG_DWORD
Definition: sdbapi.c:615
#define INFO_(ch,...)
Definition: debug.h:159
#define WARN_(ch,...)
Definition: debug.h:157
#define STATUS_SUCCESS
Definition: shellext.h:65
#define STATUS_BUFFER_TOO_SMALL
Definition: shellext.h:69
PULONG MinorVersion OPTIONAL
Definition: CrossNt.h:68
PVOID ClassService
Definition: kbdmou.h:82
PDEVICE_OBJECT ClassDeviceObject
Definition: kbdmou.h:81
PVOID DeviceExtension
Definition: env_spec_w32.h:418
struct _IO_STACK_LOCATION::@5136::@5140 Read
struct _IO_STACK_LOCATION::@1823::@1824 DeviceIoControl
Definition: typedefs.h:120
struct _LIST_ENTRY * Flink
Definition: typedefs.h:121
PDEVICE_OBJECT DeviceObject
Definition: kbdclass.h:53
UNICODE_STRING InterfaceName
Definition: kbdclass.h:58
PORT_DEVICE_STATE PnpState
Definition: kbdclass.h:54
LIST_ENTRY ListEntry
Definition: kbdclass.h:52
PDEVICE_OBJECT ClassDO
Definition: kbdclass.h:56
COMMON_DEVICE_EXTENSION Common
Definition: kbdclass.h:50
PDEVICE_OBJECT LowerDevice
Definition: kbdclass.h:55
USHORT MaximumLength
Definition: env_spec_w32.h:370
#define STATUS_PENDING
Definition: telnetd.h:14
uint16_t * PWSTR
Definition: typedefs.h:56
uint32_t * PULONG
Definition: typedefs.h:59
const uint16_t * PCWSTR
Definition: typedefs.h:57
#define NTAPI
Definition: typedefs.h:36
void * PVOID
Definition: typedefs.h:50
PVOID HANDLE
Definition: typedefs.h:73
ULONG_PTR SIZE_T
Definition: typedefs.h:80
#define RtlCopyMemory(Destination, Source, Length)
Definition: typedefs.h:263
#define RtlZeroMemory(Destination, Length)
Definition: typedefs.h:262
#define IN
Definition: typedefs.h:39
#define RtlMoveMemory(Destination, Source, Length)
Definition: typedefs.h:264
#define CONTAINING_RECORD(address, type, field)
Definition: typedefs.h:260
uint32_t ULONG
Definition: typedefs.h:59
#define OUT
Definition: typedefs.h:40
char * PCHAR
Definition: typedefs.h:51
_In_ PGUID _In_ ULONG _Out_ PULONG ResultLength
Definition: ucxcontroller.h:83
#define STATUS_UNSUCCESSFUL
Definition: udferr_usr.h:132
#define STATUS_OBJECT_NAME_COLLISION
Definition: udferr_usr.h:150
#define STATUS_INSUFFICIENT_RESOURCES
Definition: udferr_usr.h:158
#define STATUS_OBJECT_NAME_NOT_FOUND
Definition: udferr_usr.h:149
#define STATUS_CANCELLED
Definition: udferr_usr.h:170
USHORT Count
Definition: userreq.cpp:200
_In_ WDFCOLLECTION _In_ ULONG Index
_In_ PDEVICE_OBJECT DeviceObject
Definition: wdfdevice.h:2061
_In_ WDFREQUEST _In_ WDFFILEOBJECT FileObject
Definition: wdfdevice.h:550
_Must_inspect_result_ _In_ WDFDEVICE _In_ PWDF_DEVICE_PROPERTY_DATA _In_ DEVPROPTYPE _In_ ULONG Size
Definition: wdfdevice.h:4539
_In_ UCHAR _In_ UCHAR MinorFunction
Definition: wdfdevice.h:1705
_Must_inspect_result_ _In_ PDRIVER_OBJECT _In_ PCUNICODE_STRING RegistryPath
Definition: wdfdriver.h:215
_Must_inspect_result_ _In_ PDRIVER_OBJECT DriverObject
Definition: wdfdriver.h:213
_Must_inspect_result_ _In_ WDFDEVICE Fdo
Definition: wdffdo.h:461
NTSYSAPI NTSTATUS WINAPI RtlDeleteRegistryValue(ULONG, PCWSTR, PCWSTR)
NTSYSAPI NTSTATUS WINAPI RtlWriteRegistryValue(ULONG, PCWSTR, PCWSTR, ULONG, PVOID, ULONG)
NTSYSAPI NTSTATUS WINAPI RtlQueryRegistryValues(ULONG, PCWSTR, PRTL_QUERY_REGISTRY_TABLE, PVOID, PVOID)
__drv_aliasesMem FORCEINLINE PIO_STACK_LOCATION IoGetNextIrpStackLocation(_In_ PIRP Irp)
Definition: iofuncs.h:2721
#define IO_NO_INCREMENT
Definition: iotypes.h:598
#define IRP_MN_START_DEVICE
#define IRP_MN_REMOVE_DEVICE
#define DO_POWER_PAGABLE
* PFILE_OBJECT
Definition: iotypes.h:1998
#define IRP_MN_SET_POWER
#define IO_MOUSE_INCREMENT
Definition: iotypes.h:603
#define IRP_MJ_INTERNAL_DEVICE_CONTROL
#define IRP_MN_STOP_DEVICE
#define IRP_MJ_POWER
#define IRP_MN_QUERY_POWER
#define IRP_MJ_CLEANUP
_Requires_lock_held_ Interrupt _Releases_lock_ Interrupt _In_ _IRQL_restores_ KIRQL OldIrql
Definition: kefuncs.h:778
@ Suspended
Definition: ketypes.h:472
#define MmGetSystemAddressForMdlSafe(_Mdl, _Priority)
#define ObDereferenceObject
Definition: obfuncs.h:203
#define ObReferenceObject
Definition: obfuncs.h:204