ReactOS 0.4.17-dev-1190-g4c812f4
hidusb.c File Reference
#include "hidusb.h"
Include dependency graph for hidusb.c:

Go to the source code of this file.

Functions

PUSBD_PIPE_INFORMATION HidUsb_GetInputInterruptInterfaceHandle (PUSBD_INTERFACE_INFORMATION InterfaceInformation)
 
NTSTATUS HidUsb_GetPortStatus (IN PDEVICE_OBJECT DeviceObject, IN PULONG PortStatus)
 
NTSTATUS HidUsb_ResetInterruptPipe (IN PDEVICE_OBJECT DeviceObject)
 
NTSTATUS HidUsb_AbortPipe (IN PDEVICE_OBJECT DeviceObject)
 
NTSTATUS HidUsb_ResetPort (IN PDEVICE_OBJECT DeviceObject)
 
NTSTATUS NTAPI HidCreate (IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
 
VOID NTAPI HidUsb_ResetWorkerRoutine (IN PDEVICE_OBJECT DeviceObject, IN PVOID Ctx)
 
NTSTATUS NTAPI HidUsb_ReadReportCompletion (IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp, IN PVOID Context)
 
NTSTATUS NTAPI HidUsb_ReadReport (IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
 
NTSTATUS NTAPI HidUsb_GetReportDescriptor (IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
 
NTSTATUS NTAPI HidInternalDeviceControl (IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
 
NTSTATUS NTAPI HidPower (IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
 
NTSTATUS NTAPI HidSystemControl (IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
 
NTSTATUS NTAPI Hid_PnpCompletion (IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp, IN PVOID Context)
 
NTSTATUS Hid_DispatchUrb (IN PDEVICE_OBJECT DeviceObject, IN PURB Urb)
 
NTSTATUS Hid_GetDescriptor (IN PDEVICE_OBJECT DeviceObject, IN USHORT UrbFunction, IN USHORT UrbLength, IN OUT PVOID *UrbBuffer, IN OUT PULONG UrbBufferLength, IN UCHAR DescriptorType, IN UCHAR Index, IN USHORT LanguageIndex)
 
NTSTATUS Hid_SelectConfiguration (IN PDEVICE_OBJECT DeviceObject)
 
NTSTATUS Hid_DisableConfiguration (IN PDEVICE_OBJECT DeviceObject)
 
NTSTATUS Hid_SetIdle (IN PDEVICE_OBJECT DeviceObject)
 
VOID Hid_GetProtocol (IN PDEVICE_OBJECT DeviceObject)
 
NTSTATUS Hid_PnpStart (IN PDEVICE_OBJECT DeviceObject)
 
NTSTATUS NTAPI HidPnp (IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
 
NTSTATUS NTAPI HidAddDevice (IN PDRIVER_OBJECT DriverObject, IN PDEVICE_OBJECT DeviceObject)
 
VOID NTAPI Hid_Unload (IN PDRIVER_OBJECT DriverObject)
 
NTSTATUS NTAPI DriverEntry (IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING RegPath)
 

Function Documentation

◆ DriverEntry()

NTSTATUS NTAPI DriverEntry ( IN PDRIVER_OBJECT  DriverObject,
IN PUNICODE_STRING  RegPath 
)

Definition at line 1922 of file hidusb.c.

1925{
1928
1929 //
1930 // initialize driver object
1931 //
1932 DriverObject->MajorFunction[IRP_MJ_CREATE] = HidCreate;
1933 DriverObject->MajorFunction[IRP_MJ_CLOSE] = HidCreate;
1935 DriverObject->MajorFunction[IRP_MJ_POWER] = HidPower;
1937 DriverObject->MajorFunction[IRP_MJ_PNP] = HidPnp;
1938 DriverObject->DriverExtension->AddDevice = HidAddDevice;
1939 DriverObject->DriverUnload = Hid_Unload;
1940
1941 //
1942 // prepare registration info
1943 //
1945
1946 //
1947 // fill in registration info
1948 //
1949 Registration.Revision = HID_REVISION;
1950 Registration.DriverObject = DriverObject;
1951 Registration.RegistryPath = RegPath;
1952 Registration.DeviceExtensionSize = sizeof(HID_USB_DEVICE_EXTENSION);
1953 Registration.DevicesArePolled = FALSE;
1954
1955 //
1956 // register driver
1957 //
1959
1960 //
1961 // informal debug
1962 //
1963 DPRINT("********* HIDUSB *********\n");
1964 DPRINT("HIDUSB Registration Status %x\n", Status);
1965
1966 return Status;
1967}
LONG NTSTATUS
Definition: precomp.h:26
#define IRP_MJ_PNP
Definition: cdrw_usr.h:52
#define FALSE
Definition: types.h:117
_Must_inspect_result_ _In_ CONST FLT_REGISTRATION * Registration
Definition: fltkernel.h:991
Status
Definition: gdiplustypes.h:24
NTSTATUS NTAPI HidRegisterMinidriver(IN PHID_MINIDRIVER_REGISTRATION MinidriverRegistration)
Definition: hidclass.c:1244
#define HID_REVISION
Definition: hidclass.h:32
NTSTATUS NTAPI HidPnp(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
Definition: hidusb.c:1687
NTSTATUS NTAPI HidAddDevice(IN PDRIVER_OBJECT DriverObject, IN PDEVICE_OBJECT DeviceObject)
Definition: hidusb.c:1887
NTSTATUS NTAPI HidSystemControl(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
Definition: hidusb.c:921
NTSTATUS NTAPI HidPower(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
Definition: hidusb.c:907
VOID NTAPI Hid_Unload(IN PDRIVER_OBJECT DriverObject)
Definition: hidusb.c:1913
NTSTATUS NTAPI HidInternalDeviceControl(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
Definition: hidusb.c:725
NTSTATUS NTAPI HidCreate(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
Definition: hidusb.c:298
#define IRP_MJ_CLOSE
Definition: rdpdr.c:45
#define IRP_MJ_CREATE
Definition: rdpdr.c:44
#define DPRINT
Definition: sndvol32.h:73
#define RtlZeroMemory(Destination, Length)
Definition: typedefs.h:262
_Must_inspect_result_ _In_ PDRIVER_OBJECT DriverObject
Definition: wdfdriver.h:213
#define IRP_MJ_SYSTEM_CONTROL
#define IRP_MJ_INTERNAL_DEVICE_CONTROL
#define IRP_MJ_POWER

◆ Hid_DisableConfiguration()

NTSTATUS Hid_DisableConfiguration ( IN PDEVICE_OBJECT  DeviceObject)

Definition at line 1282 of file hidusb.c.

1284{
1285 PHID_DEVICE_EXTENSION DeviceExtension;
1286 PHID_USB_DEVICE_EXTENSION HidDeviceExtension;
1288 PURB Urb;
1289
1290 //
1291 // get device extension
1292 //
1293 DeviceExtension = DeviceObject->DeviceExtension;
1294 HidDeviceExtension = DeviceExtension->MiniDeviceExtension;
1295
1296 //
1297 // build urb
1298 //
1300 sizeof(struct _URB_SELECT_CONFIGURATION),
1302 if (!Urb)
1303 {
1304 //
1305 // no memory
1306 //
1308 }
1309
1310 //
1311 // format urb
1312 //
1314 sizeof(struct _URB_SELECT_CONFIGURATION),
1315 NULL);
1316
1317 //
1318 // dispatch request
1319 //
1321 if (!NT_SUCCESS(Status))
1322 {
1323 DPRINT1("[HIDUSB] Dispatching unconfigure URB failed with %lx\n", Status);
1324 }
1325 else if (!USBD_SUCCESS(Urb->UrbHeader.Status))
1326 {
1327 DPRINT("[HIDUSB] Unconfigure URB failed with %lx\n", Status);
1328 }
1329
1330 //
1331 // free urb
1332 //
1334
1335 //
1336 // free resources
1337 //
1338 HidDeviceExtension->ConfigurationHandle = NULL;
1339
1340 if (HidDeviceExtension->InterfaceInfo)
1341 {
1342 ExFreePoolWithTag(HidDeviceExtension->InterfaceInfo, HIDUSB_TAG);
1343 HidDeviceExtension->InterfaceInfo = NULL;
1344 }
1345
1346 if (HidDeviceExtension->ConfigurationDescriptor)
1347 {
1349 HidDeviceExtension->ConfigurationDescriptor = NULL;
1350 HidDeviceExtension->HidDescriptor = NULL;
1351 }
1352
1353 if (HidDeviceExtension->DeviceDescriptor)
1354 {
1355 ExFreePoolWithTag(HidDeviceExtension->DeviceDescriptor, HIDUSB_TAG);
1356 HidDeviceExtension->DeviceDescriptor = NULL;
1357 }
1358
1359 //
1360 // done
1361 //
1362 return Status;
1363}
#define DPRINT1
Definition: precomp.h:8
#define NULL
Definition: types.h:112
#define NT_SUCCESS(StatCode)
Definition: apphelp.c:33
#define ExAllocatePoolWithTag(hernya, size, tag)
Definition: env_spec_w32.h:350
#define NonPagedPool
Definition: env_spec_w32.h:307
NTSTATUS Hid_DispatchUrb(IN PDEVICE_OBJECT DeviceObject, IN PURB Urb)
Definition: hidusb.c:962
#define HIDUSB_URB_TAG
Definition: hidusb.h:91
#define HIDUSB_TAG
Definition: hidusb.h:90
#define ExFreePoolWithTag(_P, _T)
Definition: module.h:1109
USBD_CONFIGURATION_HANDLE ConfigurationHandle
Definition: hidusb.h:42
PHID_DESCRIPTOR HidDescriptor
Definition: hidusb.h:47
PUSB_CONFIGURATION_DESCRIPTOR ConfigurationDescriptor
Definition: hidusb.h:32
PUSBD_INTERFACE_INFORMATION InterfaceInfo
Definition: hidusb.h:37
PUSB_DEVICE_DESCRIPTOR DeviceDescriptor
Definition: hidusb.h:27
PVOID MiniDeviceExtension
Definition: hidport.h:19
Definition: usb.h:557
#define STATUS_INSUFFICIENT_RESOURCES
Definition: udferr_usr.h:158
#define USBD_SUCCESS(Status)
Definition: usb.h:173
#define UsbBuildSelectConfigurationRequest(urb, length, configurationDescriptor)
Definition: usbdlib.h:53
_In_ PIO_STACK_LOCATION _In_ PURB Urb
Definition: usbdlib.h:294
_In_ PDEVICE_OBJECT DeviceObject
Definition: wdfdevice.h:2061

Referenced by HidPnp().

◆ Hid_DispatchUrb()

NTSTATUS Hid_DispatchUrb ( IN PDEVICE_OBJECT  DeviceObject,
IN PURB  Urb 
)

Definition at line 962 of file hidusb.c.

965{
966 PIRP Irp;
968 PHID_DEVICE_EXTENSION DeviceExtension;
970 PIO_STACK_LOCATION IoStack;
972
973 //
974 // init event
975 //
977
978 //
979 // get device extension
980 //
981 DeviceExtension = DeviceObject->DeviceExtension;
982
983 //
984 // build irp
985 //
987 DeviceExtension->NextDeviceObject,
988 NULL,
989 0,
990 NULL,
991 0,
992 TRUE,
993 &Event,
994 &IoStatus);
995 if (!Irp)
996 {
997 //
998 // no memory
999 //
1001 }
1002
1003 //
1004 // get next stack location
1005 //
1006 IoStack = IoGetNextIrpStackLocation(Irp);
1007
1008 //
1009 // store urb
1010 //
1011 IoStack->Parameters.Others.Argument1 = Urb;
1012
1013 //
1014 // set completion routine
1015 //
1017
1018 //
1019 // call driver
1020 //
1021 Status = IoCallDriver(DeviceExtension->NextDeviceObject, Irp);
1022
1023 //
1024 // wait for the request to finish
1025 //
1026 if (Status == STATUS_PENDING)
1027 {
1029 }
1030
1031 //
1032 // complete request
1033 //
1035
1036 if (Status == STATUS_PENDING)
1037 {
1038 //
1039 // get final status
1040 //
1041 Status = IoStatus.Status;
1042 }
1043
1044 DPRINT("[HIDUSB] DispatchUrb %x\n", Status);
1045
1046
1047 //
1048 // done
1049 //
1050 return Status;
1051}
_Check_return_ _In_ DXGK_EVENT_TYPE _In_ ULONG Event
Definition: dispmprt.h:1287
#define TRUE
Definition: types.h:120
#define KeWaitForSingleObject(pEvt, foo, a, b, c)
Definition: env_spec_w32.h:478
#define KeInitializeEvent(pEvt, foo, foo2)
Definition: env_spec_w32.h:477
NTSTATUS NTAPI Hid_PnpCompletion(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp, IN PVOID Context)
Definition: hidusb.c:945
#define IoSetCompletionRoutine(_Irp, _CompletionRoutine, _Context, _InvokeOnSuccess, _InvokeOnError, _InvokeOnCancel)
Definition: irp.cpp:490
_In_ PIRP Irp
Definition: kse.h:79
__in UCHAR __in POWER_STATE __in_opt PVOID __in PIO_STATUS_BLOCK IoStatus
Definition: mxum.h:159
#define KernelMode
Definition: asm.h:38
@ NotificationEvent
#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
#define IoCallDriver
Definition: irp.c:1257
PDEVICE_OBJECT NextDeviceObject
Definition: hidport.h:18
struct _IO_STACK_LOCATION::@5020::@5059 Others
union _IO_STACK_LOCATION::@1814 Parameters
#define STATUS_PENDING
Definition: telnetd.h:14
#define IOCTL_INTERNAL_USB_SUBMIT_URB
Definition: usbioctl.h:32
__drv_aliasesMem FORCEINLINE PIO_STACK_LOCATION IoGetNextIrpStackLocation(_In_ PIRP Irp)
Definition: iofuncs.h:2702
#define IO_NO_INCREMENT
Definition: iotypes.h:598
@ Executive
Definition: ketypes.h:467

Referenced by Hid_DisableConfiguration(), Hid_GetDescriptor(), Hid_GetProtocol(), Hid_SelectConfiguration(), Hid_SetIdle(), HidUsb_AbortPipe(), and HidUsb_ResetInterruptPipe().

◆ Hid_GetDescriptor()

NTSTATUS Hid_GetDescriptor ( IN PDEVICE_OBJECT  DeviceObject,
IN USHORT  UrbFunction,
IN USHORT  UrbLength,
IN OUT PVOID *  UrbBuffer,
IN OUT PULONG  UrbBufferLength,
IN UCHAR  DescriptorType,
IN UCHAR  Index,
IN USHORT  LanguageIndex 
)

Definition at line 1054 of file hidusb.c.

1063{
1064 PURB Urb;
1067
1068 //
1069 // allocate urb
1070 //
1072 if (!Urb)
1073 {
1074 //
1075 // no memory
1076 //
1078 }
1079
1080 //
1081 // is there an urb buffer
1082 //
1083 if (!*UrbBuffer)
1084 {
1085 //
1086 // allocate buffer
1087 //
1088 *UrbBuffer = ExAllocatePoolWithTag(NonPagedPool, *UrbBufferLength, HIDUSB_TAG);
1089 if (!*UrbBuffer)
1090 {
1091 //
1092 // no memory
1093 //
1096 }
1097
1098 //
1099 // zero buffer
1100 //
1101 RtlZeroMemory(*UrbBuffer, *UrbBufferLength);
1102 Allocated = TRUE;
1103 }
1104
1105 //
1106 // zero urb
1107 //
1108 RtlZeroMemory(Urb, UrbLength);
1109
1110 //
1111 // build descriptor request
1112 //
1113 UsbBuildGetDescriptorRequest(Urb, UrbLength, DescriptorType, Index, LanguageIndex, *UrbBuffer, NULL, *UrbBufferLength, NULL);
1114
1115 //
1116 // set urb function
1117 //
1118 Urb->UrbHeader.Function = UrbFunction;
1119
1120 //
1121 // dispatch urb
1122 //
1124
1125 //
1126 // did the request fail
1127 //
1128 if (!NT_SUCCESS(Status))
1129 {
1130 if (Allocated)
1131 {
1132 //
1133 // free allocated buffer
1134 //
1135 ExFreePoolWithTag(*UrbBuffer, HIDUSB_TAG);
1136 *UrbBuffer = NULL;
1137 }
1138
1139 //
1140 // free urb
1141 //
1143 *UrbBufferLength = 0;
1144 return Status;
1145 }
1146
1147 //
1148 // did urb request fail
1149 //
1150 if (!NT_SUCCESS(Urb->UrbHeader.Status))
1151 {
1152 if (Allocated)
1153 {
1154 //
1155 // free allocated buffer
1156 //
1157 ExFreePoolWithTag(*UrbBuffer, HIDUSB_TAG);
1158 *UrbBuffer = NULL;
1159 }
1160
1161 //
1162 // free urb
1163 //
1165 *UrbBufferLength = 0;
1166 return STATUS_UNSUCCESSFUL;
1167 }
1168
1169 //
1170 // store result length
1171 //
1172 *UrbBufferLength = Urb->UrbControlDescriptorRequest.TransferBufferLength;
1173
1174 //
1175 // free urb
1176 //
1178
1179 //
1180 // completed successfully
1181 //
1182 return STATUS_SUCCESS;
1183}
IN PFCB IN VBO OUT PLBO OUT PULONG OUT PBOOLEAN Allocated
Definition: fatprocs.h:311
#define STATUS_SUCCESS
Definition: shellext.h:65
unsigned char UCHAR
Definition: typedefs.h:53
#define STATUS_UNSUCCESSFUL
Definition: udferr_usr.h:132
#define UsbBuildGetDescriptorRequest(urb, length, descriptorType, descriptorIndex, languageId, transferBuffer, transferBufferMDL, transferBufferLength, link)
Definition: usbdlib.h:23
_In_ ULONG _In_ PVOID _In_ LONG DescriptorType
Definition: usbdlib.h:187
_In_ WDFCOLLECTION _In_ ULONG Index

Referenced by Hid_PnpStart(), and HidUsb_GetReportDescriptor().

◆ Hid_GetProtocol()

VOID Hid_GetProtocol ( IN PDEVICE_OBJECT  DeviceObject)

Definition at line 1424 of file hidusb.c.

1426{
1427 PHID_USB_DEVICE_EXTENSION HidDeviceExtension;
1428 PHID_DEVICE_EXTENSION DeviceExtension;
1429 PURB Urb;
1430 UCHAR Protocol[1];
1431
1432 //
1433 // get device extension
1434 //
1435 DeviceExtension = DeviceObject->DeviceExtension;
1436 HidDeviceExtension = DeviceExtension->MiniDeviceExtension;
1437 ASSERT(HidDeviceExtension->InterfaceInfo);
1438
1439 if (HidDeviceExtension->InterfaceInfo->SubClass != 0x1)
1440 {
1441 //
1442 // device does not support the boot protocol
1443 //
1444 return;
1445 }
1446
1447 //
1448 // allocate urb
1449 //
1451 if (!Urb)
1452 {
1453 //
1454 // no memory
1455 //
1456 return;
1457 }
1458
1459 //
1460 // zero urb
1461 //
1463
1464 //
1465 // format urb
1466 //
1471 0,
1473 0,
1474 0,
1475 Protocol,
1476 NULL,
1477 1,
1478 NULL);
1479 Protocol[0] = 0xFF;
1480
1481 //
1482 // dispatch urb
1483 //
1485
1486 //
1487 // free urb
1488 //
1490
1491 //
1492 // boot protocol active 0x00 disabled 0x1
1493 //
1494 if (Protocol[0] != 0x1)
1495 {
1496 if (Protocol[0] == 0x00)
1497 {
1498 DPRINT1("[HIDUSB] Need to disable boot protocol!\n");
1499 }
1500 else
1501 {
1502 DPRINT1("[HIDUSB] Unexpected protocol value %x\n", Protocol[0] & 0xFF);
1503 }
1504 }
1505}
#define USB_GET_PROTOCOL_REQUEST
Definition: hidusb.h:88
#define ASSERT(a)
Definition: mode.c:44
#define URB_FUNCTION_CLASS_INTERFACE
Definition: usb.h:113
#define USBD_TRANSFER_DIRECTION_IN
Definition: usb.h:166
#define UsbBuildVendorRequest(urb, cmd, length, transferFlags, reservedbits, request, value, index, transferBuffer, transferBufferMDL, transferBufferLength, link)
Definition: usbdlib.h:68

Referenced by Hid_PnpStart().

◆ Hid_PnpCompletion()

NTSTATUS NTAPI Hid_PnpCompletion ( IN PDEVICE_OBJECT  DeviceObject,
IN PIRP  Irp,
IN PVOID  Context 
)

Definition at line 945 of file hidusb.c.

949{
950 //
951 // signal event
952 //
954
955 //
956 // done
957 //
959}
#define KeSetEvent(pEvt, foo, foo2)
Definition: env_spec_w32.h:476
_In_ PIRP _In_ PIO_COMPLETION_ROUTINE _In_ PVOID Context
Definition: kse.h:81
#define STATUS_MORE_PROCESSING_REQUIRED
Definition: shellext.h:68

Referenced by Hid_DispatchUrb(), and HidPnp().

◆ Hid_PnpStart()

NTSTATUS Hid_PnpStart ( IN PDEVICE_OBJECT  DeviceObject)

Definition at line 1508 of file hidusb.c.

1510{
1511 PHID_USB_DEVICE_EXTENSION HidDeviceExtension;
1512 PHID_DEVICE_EXTENSION DeviceExtension;
1514 ULONG DescriptorLength;
1516 PHID_DESCRIPTOR HidDescriptor;
1517
1518 //
1519 // get device extension
1520 //
1521 DeviceExtension = DeviceObject->DeviceExtension;
1522 HidDeviceExtension = DeviceExtension->MiniDeviceExtension;
1523
1524 //
1525 // get device descriptor
1526 //
1527 DescriptorLength = sizeof(USB_DEVICE_DESCRIPTOR);
1530 sizeof(struct _URB_CONTROL_DESCRIPTOR_REQUEST),
1531 (PVOID *)&HidDeviceExtension->DeviceDescriptor,
1532 &DescriptorLength,
1534 0,
1535 0);
1536 if (!NT_SUCCESS(Status))
1537 {
1538 //
1539 // failed to obtain device descriptor
1540 //
1541 DPRINT1("[HIDUSB] failed to get device descriptor %x\n", Status);
1542 return Status;
1543 }
1544
1545 //
1546 // now get the configuration descriptor
1547 //
1548 DescriptorLength = sizeof(USB_CONFIGURATION_DESCRIPTOR);
1551 sizeof(struct _URB_CONTROL_DESCRIPTOR_REQUEST),
1552 (PVOID *)&HidDeviceExtension->ConfigurationDescriptor,
1553 &DescriptorLength,
1555 0,
1556 0);
1557 if (!NT_SUCCESS(Status))
1558 {
1559 //
1560 // failed to obtain device descriptor
1561 //
1562 DPRINT1("[HIDUSB] failed to get device descriptor %x\n", Status);
1563 return Status;
1564 }
1565
1566 //
1567 // sanity check
1568 //
1569 ASSERT(DescriptorLength);
1570 ASSERT(HidDeviceExtension->ConfigurationDescriptor);
1571 ASSERT(HidDeviceExtension->ConfigurationDescriptor->bLength);
1572
1573 //
1574 // store full length
1575 //
1576 DescriptorLength = HidDeviceExtension->ConfigurationDescriptor->wTotalLength;
1577
1578 //
1579 // delete partial configuration descriptor
1580 //
1582 HidDeviceExtension->ConfigurationDescriptor = NULL;
1583
1584 //
1585 // get full configuration descriptor
1586 //
1589 sizeof(struct _URB_CONTROL_DESCRIPTOR_REQUEST),
1590 (PVOID *)&HidDeviceExtension->ConfigurationDescriptor,
1591 &DescriptorLength,
1593 0,
1594 0);
1595 if (!NT_SUCCESS(Status))
1596 {
1597 //
1598 // failed to obtain device descriptor
1599 //
1600 DPRINT1("[HIDUSB] failed to get device descriptor %x\n", Status);
1601 return Status;
1602 }
1603
1604 //
1605 // now parse the descriptors
1606 //
1608 HidDeviceExtension->ConfigurationDescriptor,
1609 -1,
1610 -1,
1612 -1,
1613 -1);
1615 {
1616 //
1617 // no interface class
1618 //
1619 DPRINT1("[HIDUSB] HID Interface descriptor not found\n");
1620 return STATUS_UNSUCCESSFUL;
1621 }
1622
1623 //
1624 // sanity check
1625 //
1629
1630 //
1631 // move to next descriptor
1632 //
1634 ASSERT(HidDescriptor->bLength >= 2);
1635
1636 //
1637 // check if this is the hid descriptor
1638 //
1639 if (HidDescriptor->bLength == sizeof(HID_DESCRIPTOR) && HidDescriptor->bDescriptorType == HID_HID_DESCRIPTOR_TYPE)
1640 {
1641 //
1642 // found
1643 //
1644 HidDeviceExtension->HidDescriptor = HidDescriptor;
1645
1646 //
1647 // select configuration
1648 //
1650
1651 //
1652 // done
1653 //
1654 DPRINT("[HIDUSB] SelectConfiguration %x\n", Status);
1655
1656 if (NT_SUCCESS(Status))
1657 {
1658 //
1659 // now set the device idle
1660 //
1662
1663 //
1664 // get protocol
1665 //
1667 return Status;
1668 }
1669 }
1670 else
1671 {
1672 //
1673 // FIXME parse hid descriptor
1674 // select configuration
1675 // set idle
1676 // and get protocol
1677 //
1679 ASSERT(FALSE);
1680 }
1681 return Status;
1682}
#define UNIMPLEMENTED
Definition: ntoskrnl.c:15
#define HID_HID_DESCRIPTOR_TYPE
Definition: hidport.h:94
struct _HID_DESCRIPTOR * PHID_DESCRIPTOR
NTSTATUS Hid_SelectConfiguration(IN PDEVICE_OBJECT DeviceObject)
Definition: hidusb.c:1186
VOID Hid_GetProtocol(IN PDEVICE_OBJECT DeviceObject)
Definition: hidusb.c:1424
NTSTATUS Hid_SetIdle(IN PDEVICE_OBJECT DeviceObject)
Definition: hidusb.c:1366
NTSTATUS Hid_GetDescriptor(IN PDEVICE_OBJECT DeviceObject, IN USHORT UrbFunction, IN USHORT UrbLength, IN OUT PVOID *UrbBuffer, IN OUT PULONG UrbBufferLength, IN UCHAR DescriptorType, IN UCHAR Index, IN USHORT LanguageIndex)
Definition: hidusb.c:1054
UCHAR bDescriptorType
Definition: hidport.h:36
UCHAR bLength
Definition: hidport.h:35
uint32_t ULONG_PTR
Definition: typedefs.h:65
uint32_t ULONG
Definition: typedefs.h:59
struct _USB_CONFIGURATION_DESCRIPTOR USB_CONFIGURATION_DESCRIPTOR
#define USB_DEVICE_CLASS_HUMAN_INTERFACE
Definition: usb100.h:93
#define USB_CONFIGURATION_DESCRIPTOR_TYPE
Definition: usb100.h:50
#define USB_DEVICE_DESCRIPTOR_TYPE
Definition: usb100.h:49
struct _USB_DEVICE_DESCRIPTOR USB_DEVICE_DESCRIPTOR
#define USB_INTERFACE_DESCRIPTOR_TYPE
Definition: usb100.h:52
#define URB_FUNCTION_GET_DESCRIPTOR_FROM_DEVICE
Definition: usb.h:97
PUSB_INTERFACE_DESCRIPTOR NTAPI USBD_ParseConfigurationDescriptorEx(PUSB_CONFIGURATION_DESCRIPTOR ConfigurationDescriptor, PVOID StartPosition, LONG InterfaceNumber, LONG AlternateSetting, LONG InterfaceClass, LONG InterfaceSubClass, LONG InterfaceProtocol)
Definition: usbd.c:496
_In_ WDFUSBINTERFACE _In_ UCHAR _Out_ PUSB_INTERFACE_DESCRIPTOR InterfaceDescriptor
Definition: wdfusb.h:2334

Referenced by HidPnp().

◆ Hid_SelectConfiguration()

NTSTATUS Hid_SelectConfiguration ( IN PDEVICE_OBJECT  DeviceObject)

Definition at line 1186 of file hidusb.c.

1188{
1192 PURB Urb;
1193 PHID_USB_DEVICE_EXTENSION HidDeviceExtension;
1194 PHID_DEVICE_EXTENSION DeviceExtension;
1195
1196 //
1197 // get device extension
1198 //
1199 DeviceExtension = DeviceObject->DeviceExtension;
1200 HidDeviceExtension = DeviceExtension->MiniDeviceExtension;
1201
1202 //
1203 // now parse the descriptors
1204 //
1206 HidDeviceExtension->ConfigurationDescriptor,
1207 -1,
1208 -1,
1210 -1,
1211 -1);
1213 {
1214 //
1215 // bogus configuration descriptor
1216 //
1218 }
1219
1220 //
1221 // sanity check
1222 //
1227
1228 //
1229 // setup interface list
1230 //
1233
1234 //
1235 // build urb
1236 //
1238 if (!Urb)
1239 {
1240 //
1241 // no memory
1242 //
1244 }
1245
1246 //
1247 // dispatch request
1248 //
1250 if (NT_SUCCESS(Status))
1251 {
1252 //
1253 // store configuration handle
1254 //
1255 HidDeviceExtension->ConfigurationHandle = Urb->UrbSelectConfiguration.ConfigurationHandle;
1256
1257 //
1258 // copy interface info
1259 //
1260 HidDeviceExtension->InterfaceInfo = ExAllocatePoolWithTag(NonPagedPool, Urb->UrbSelectConfiguration.Interface.Length, HIDUSB_TAG);
1261 if (HidDeviceExtension->InterfaceInfo)
1262 {
1263 //
1264 // copy interface info
1265 //
1266 RtlCopyMemory(HidDeviceExtension->InterfaceInfo, &Urb->UrbSelectConfiguration.Interface, Urb->UrbSelectConfiguration.Interface.Length);
1267 }
1268 }
1269
1270 //
1271 // free urb request
1272 //
1274
1275 //
1276 // done
1277 //
1278 return Status;
1279}
PINTERFACE Interface
Definition: iotypes.h:3263
Definition: usbdlib.h:7
PUSB_INTERFACE_DESCRIPTOR InterfaceDescriptor
Definition: usbdlib.h:8
#define RtlCopyMemory(Destination, Source, Length)
Definition: typedefs.h:263
#define STATUS_INVALID_PARAMETER
Definition: udferr_usr.h:135
PURB NTAPI USBD_CreateConfigurationRequestEx(PUSB_CONFIGURATION_DESCRIPTOR ConfigurationDescriptor, PUSBD_INTERFACE_LIST_ENTRY InterfaceList)
Definition: usbd.c:329
_In_ PUSBD_INTERFACE_LIST_ENTRY InterfaceList
Definition: usbdlib.h:208

Referenced by Hid_PnpStart().

◆ Hid_SetIdle()

NTSTATUS Hid_SetIdle ( IN PDEVICE_OBJECT  DeviceObject)

Definition at line 1366 of file hidusb.c.

1368{
1369 PURB Urb;
1371
1372 //
1373 // allocate urb
1374 //
1376 if (!Urb)
1377 {
1378 //
1379 // no memory
1380 //
1382 }
1383
1384 //
1385 // zero urb
1386 //
1388
1389 //
1390 // format urb
1391 //
1395 0,
1396 0,
1397 USB_SET_IDLE_REQUEST, // HID_SET_IDLE
1398 0,
1399 0,
1400 NULL,
1401 NULL,
1402 0,
1403 NULL);
1404
1405 //
1406 // dispatch urb
1407 //
1409
1410 //
1411 // free urb
1412 //
1414
1415 //
1416 // print status
1417 //
1418 DPRINT1("Status %x\n", Status);
1419 return Status;
1420}
#define USB_SET_IDLE_REQUEST
Definition: hidusb.h:87

Referenced by Hid_PnpStart().

◆ Hid_Unload()

VOID NTAPI Hid_Unload ( IN PDRIVER_OBJECT  DriverObject)

Definition at line 1913 of file hidusb.c.

1915{
1917}

Referenced by DriverEntry().

◆ HidAddDevice()

NTSTATUS NTAPI HidAddDevice ( IN PDRIVER_OBJECT  DriverObject,
IN PDEVICE_OBJECT  DeviceObject 
)

Definition at line 1887 of file hidusb.c.

1890{
1891 PHID_USB_DEVICE_EXTENSION HidDeviceExtension;
1892 PHID_DEVICE_EXTENSION DeviceExtension;
1893
1894 //
1895 // get device extension
1896 //
1897 DeviceExtension = DeviceObject->DeviceExtension;
1898 HidDeviceExtension = DeviceExtension->MiniDeviceExtension;
1899
1900 //
1901 // init event
1902 //
1903 KeInitializeEvent(&HidDeviceExtension->Event, NotificationEvent, FALSE);
1904
1905 //
1906 // done
1907 //
1908 return STATUS_SUCCESS;
1909}

Referenced by DriverEntry().

◆ HidCreate()

NTSTATUS NTAPI HidCreate ( IN PDEVICE_OBJECT  DeviceObject,
IN PIRP  Irp 
)

Definition at line 298 of file hidusb.c.

301{
302 PIO_STACK_LOCATION IoStack;
303
304 //
305 // get current irp stack location
306 //
308
309 //
310 // sanity check for hidclass driver
311 //
312 ASSERT(IoStack->MajorFunction == IRP_MJ_CREATE || IoStack->MajorFunction == IRP_MJ_CLOSE);
313
314 //
315 // informational debug print
316 //
317 DPRINT("HIDUSB Request: %x\n", IoStack->MajorFunction);
318
319 //
320 // complete request
321 //
322 Irp->IoStatus.Information = 0;
323 Irp->IoStatus.Status = STATUS_SUCCESS;
325
326 //
327 // done
328 //
329 return STATUS_SUCCESS;
330}
static PIO_STACK_LOCATION IoGetCurrentIrpStackLocation(PIRP Irp)

Referenced by DriverEntry().

◆ HidInternalDeviceControl()

NTSTATUS NTAPI HidInternalDeviceControl ( IN PDEVICE_OBJECT  DeviceObject,
IN PIRP  Irp 
)

Definition at line 725 of file hidusb.c.

728{
729 PIO_STACK_LOCATION IoStack;
730 PHID_USB_DEVICE_EXTENSION HidDeviceExtension;
731 PHID_DEVICE_EXTENSION DeviceExtension;
735
736 //
737 // get device extension
738 //
739 DeviceExtension = DeviceObject->DeviceExtension;
740 HidDeviceExtension = DeviceExtension->MiniDeviceExtension;
741
742 //
743 // get current stack location
744 //
746
747 switch (IoStack->Parameters.DeviceIoControl.IoControlCode)
748 {
750 {
751 if (IoStack->Parameters.DeviceIoControl.OutputBufferLength < sizeof(HID_DEVICE_ATTRIBUTES))
752 {
753 //
754 // invalid request
755 //
756 Irp->IoStatus.Status = STATUS_INVALID_BUFFER_SIZE;
757 DPRINT1("[HIDUSB] IOCTL_HID_GET_DEVICE_ATTRIBUTES invalid buffer\n");
760 }
761 //
762 // store result
763 //
764 DPRINT("[HIDUSB] IOCTL_HID_GET_DEVICE_ATTRIBUTES\n");
765 ASSERT(HidDeviceExtension->DeviceDescriptor);
766 Irp->IoStatus.Information = sizeof(HID_DESCRIPTOR);
767 Attributes = Irp->UserBuffer;
768 Attributes->Size = sizeof(HID_DEVICE_ATTRIBUTES);
769 Attributes->VendorID = HidDeviceExtension->DeviceDescriptor->idVendor;
770 Attributes->ProductID = HidDeviceExtension->DeviceDescriptor->idProduct;
771 Attributes->VersionNumber = HidDeviceExtension->DeviceDescriptor->bcdDevice;
772
773 //
774 // complete request
775 //
776 Irp->IoStatus.Status = STATUS_SUCCESS;
778 return STATUS_SUCCESS;
779 }
781 {
782 //
783 // sanity check
784 //
785 ASSERT(HidDeviceExtension->HidDescriptor);
786 DPRINT("[HIDUSB] IOCTL_HID_GET_DEVICE_DESCRIPTOR DescriptorLength %lu OutputBufferLength %lu\n", HidDeviceExtension->HidDescriptor->bLength, IoStack->Parameters.DeviceIoControl.OutputBufferLength);
787
788 //
789 // store length
790 //
791 Length = min(HidDeviceExtension->HidDescriptor->bLength, IoStack->Parameters.DeviceIoControl.OutputBufferLength);
792
793 //
794 // copy descriptor
795 //
796 RtlCopyMemory(Irp->UserBuffer, HidDeviceExtension->HidDescriptor, Length);
797
798 //
799 // store result length
800 //
801 Irp->IoStatus.Information = HidDeviceExtension->HidDescriptor->bLength;
802 Irp->IoStatus.Status = STATUS_SUCCESS;
803
804 /* complete request */
806 return STATUS_SUCCESS;
807 }
809 {
811 DPRINT("[HIDUSB] IOCTL_HID_GET_REPORT_DESCRIPTOR Status %x\n", Status);
812 Irp->IoStatus.Status = Status;
814 return Status;
815 }
817 {
818 DPRINT("[HIDUSB] IOCTL_HID_READ_REPORT\n");
820 return Status;
821 }
823 {
824 DPRINT1("[HIDUSB] IOCTL_HID_WRITE_REPORT not implemented \n");
825 ASSERT(FALSE);
826 Irp->IoStatus.Status = STATUS_NOT_IMPLEMENTED;
829 }
831 {
832 DPRINT1("[HIDUSB] IOCTL_GET_PHYSICAL_DESCRIPTOR not implemented \n");
833 ASSERT(FALSE);
834 Irp->IoStatus.Status = STATUS_NOT_IMPLEMENTED;
837 }
839 {
840 DPRINT1("[HIDUSB] IOCTL_HID_SEND_IDLE_NOTIFICATION_REQUEST not implemented \n");
841 ASSERT(FALSE);
842 Irp->IoStatus.Status = STATUS_NOT_IMPLEMENTED;
845 }
847 {
848 DPRINT1("[HIDUSB] IOCTL_HID_GET_FEATURE not implemented \n");
849 ASSERT(FALSE);
850 Irp->IoStatus.Status = STATUS_NOT_IMPLEMENTED;
853 }
855 {
856 DPRINT1("[HIDUSB] IOCTL_HID_SET_FEATURE not implemented \n");
857 ASSERT(FALSE);
858 Irp->IoStatus.Status = STATUS_NOT_IMPLEMENTED;
861 }
863 {
864 DPRINT1("[HIDUSB] IOCTL_HID_SET_OUTPUT_REPORT not implemented \n");
865 ASSERT(FALSE);
866 Irp->IoStatus.Status = STATUS_NOT_IMPLEMENTED;
869 }
871 {
872 DPRINT1("[HIDUSB] IOCTL_HID_GET_INPUT_REPORT not implemented \n");
873 ASSERT(FALSE);
874 Irp->IoStatus.Status = STATUS_NOT_IMPLEMENTED;
877 }
879 {
880 DPRINT1("[HIDUSB] IOCTL_HID_GET_INDEXED_STRING not implemented \n");
881 ASSERT(FALSE);
882 Irp->IoStatus.Status = STATUS_NOT_IMPLEMENTED;
885 }
887 {
888 DPRINT1("[HIDUSB] IOCTL_HID_GET_MS_GENRE_DESCRIPTOR not implemented \n");
889 ASSERT(FALSE);
890 Irp->IoStatus.Status = STATUS_NOT_IMPLEMENTED;
893 }
894 default:
895 {
897 ASSERT(FALSE);
898 Status = Irp->IoStatus.Status;
900 return Status;
901 }
902 }
903}
#define STATUS_NOT_IMPLEMENTED
Definition: d3dkmdt.h:42
_In_ ULONG Attributes
Definition: dispmprt.h:1077
#define IOCTL_HID_SET_OUTPUT_REPORT
Definition: hidclass.h:71
#define IOCTL_HID_GET_INDEXED_STRING
Definition: hidclass.h:76
#define IOCTL_HID_GET_INPUT_REPORT
Definition: hidclass.h:63
#define IOCTL_HID_GET_MS_GENRE_DESCRIPTOR
Definition: hidclass.h:77
#define IOCTL_HID_SET_FEATURE
Definition: hidclass.h:69
#define IOCTL_GET_PHYSICAL_DESCRIPTOR
Definition: hidclass.h:56
#define IOCTL_HID_GET_FEATURE
Definition: hidclass.h:60
#define IOCTL_HID_GET_DEVICE_DESCRIPTOR
Definition: hidport.h:84
#define IOCTL_HID_READ_REPORT
Definition: hidport.h:86
#define IOCTL_HID_SEND_IDLE_NOTIFICATION_REQUEST
Definition: hidport.h:92
#define IOCTL_HID_WRITE_REPORT
Definition: hidport.h:87
#define IOCTL_HID_GET_DEVICE_ATTRIBUTES
Definition: hidport.h:91
struct _HID_DEVICE_ATTRIBUTES HID_DEVICE_ATTRIBUTES
#define IOCTL_HID_GET_REPORT_DESCRIPTOR
Definition: hidport.h:85
NTSTATUS NTAPI HidUsb_GetReportDescriptor(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
Definition: hidusb.c:629
NTSTATUS NTAPI HidUsb_ReadReport(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
Definition: hidusb.c:524
#define min(a, b)
Definition: monoChain.cc:55
_In_ ULONG _In_ ULONG _In_ ULONG Length
Definition: ntddpcm.h:102
#define STATUS_INVALID_BUFFER_SIZE
Definition: ntstatus.h:772
struct _IO_STACK_LOCATION::@1814::@1815 DeviceIoControl
#define HID_DESCRIPTOR

Referenced by DriverEntry().

◆ HidPnp()

NTSTATUS NTAPI HidPnp ( IN PDEVICE_OBJECT  DeviceObject,
IN PIRP  Irp 
)

Definition at line 1687 of file hidusb.c.

1690{
1692 PIO_STACK_LOCATION IoStack;
1693 PHID_DEVICE_EXTENSION DeviceExtension;
1694 KEVENT Event;
1695
1696 //
1697 // get device extension
1698 //
1699 DeviceExtension = DeviceObject->DeviceExtension;
1700
1701 //
1702 // get current stack location
1703 //
1705 DPRINT("[HIDUSB] Pnp %x\n", IoStack->MinorFunction);
1706
1707 //
1708 // handle requests based on request type
1709 //
1710 switch (IoStack->MinorFunction)
1711 {
1713 {
1714 //
1715 // unconfigure device
1716 // FIXME: Call this on IRP_MN_SURPRISE_REMOVAL, but don't send URBs
1717 // FIXME: Don't call this after we've already seen a surprise removal or stop
1718 //
1720
1721 //
1722 // pass request onto lower driver
1723 //
1725 Status = IoCallDriver(DeviceExtension->NextDeviceObject, Irp);
1726
1727 return Status;
1728 }
1730 {
1731 //
1732 // device can not be disabled
1733 //
1734 Irp->IoStatus.Information |= PNP_DEVICE_NOT_DISABLEABLE;
1735
1736 //
1737 // pass request to next request
1738 //
1740 Status = IoCallDriver(DeviceExtension->NextDeviceObject, Irp);
1741
1742 //
1743 // done
1744 //
1745 return Status;
1746 }
1749 {
1750 //
1751 // we're fine with it
1752 //
1753 Irp->IoStatus.Status = STATUS_SUCCESS;
1754
1755 //
1756 // pass request to next driver
1757 //
1759 Status = IoCallDriver(DeviceExtension->NextDeviceObject, Irp);
1760
1761 //
1762 // done
1763 //
1764 return Status;
1765 }
1766 case IRP_MN_STOP_DEVICE:
1767 {
1768 //
1769 // unconfigure device
1770 //
1772
1773 //
1774 // prepare irp
1775 //
1779
1780 //
1781 // send irp and wait for completion
1782 //
1783 Status = IoCallDriver(DeviceExtension->NextDeviceObject, Irp);
1784 if (Status == STATUS_PENDING)
1785 {
1787 Status = Irp->IoStatus.Status;
1788 }
1789
1790 //
1791 // done
1792 //
1794 return Status;
1795 }
1797 {
1798 //
1799 // prepare irp
1800 //
1804
1805 //
1806 // send irp and wait for completion
1807 //
1808 Status = IoCallDriver(DeviceExtension->NextDeviceObject, Irp);
1809 if (Status == STATUS_PENDING)
1810 {
1812 Status = Irp->IoStatus.Status;
1813 }
1814
1815 if (NT_SUCCESS(Status) && IoStack->Parameters.DeviceCapabilities.Capabilities != NULL)
1816 {
1817 //
1818 // don't need to safely remove
1819 //
1820 IoStack->Parameters.DeviceCapabilities.Capabilities->SurpriseRemovalOK = TRUE;
1821 }
1822
1823 //
1824 // done
1825 //
1827 return Status;
1828 }
1830 {
1831 //
1832 // prepare irp
1833 //
1837
1838 //
1839 // send irp and wait for completion
1840 //
1841 Status = IoCallDriver(DeviceExtension->NextDeviceObject, Irp);
1842 if (Status == STATUS_PENDING)
1843 {
1845 Status = Irp->IoStatus.Status;
1846 }
1847
1848 //
1849 // did the device successfully start
1850 //
1851 if (!NT_SUCCESS(Status))
1852 {
1853 //
1854 // failed
1855 //
1856 DPRINT1("HIDUSB: IRP_MN_START_DEVICE failed with %x\n", Status);
1858 return Status;
1859 }
1860
1861 //
1862 // start device
1863 //
1865
1866 //
1867 // complete request
1868 //
1869 Irp->IoStatus.Status = Status;
1870 DPRINT("[HIDUSB] IRP_MN_START_DEVICE Status %x\n", Status);
1872 return Status;
1873 }
1874 default:
1875 {
1876 //
1877 // forward and forget request
1878 //
1880 return IoCallDriver(DeviceExtension->NextDeviceObject, Irp);
1881 }
1882 }
1883}
NTSTATUS Hid_DisableConfiguration(IN PDEVICE_OBJECT DeviceObject)
Definition: hidusb.c:1282
NTSTATUS Hid_PnpStart(IN PDEVICE_OBJECT DeviceObject)
Definition: hidusb.c:1508
#define IoSkipCurrentIrpStackLocation(Irp)
Definition: ntifs_ex.h:421
#define IoCopyCurrentIrpStackLocationToNext(Irp)
Definition: ntifs_ex.h:413
struct _IO_STACK_LOCATION::@5020::@5047 DeviceCapabilities
#define IRP_MN_QUERY_PNP_DEVICE_STATE
#define PNP_DEVICE_NOT_DISABLEABLE
Definition: iotypes.h:1006
#define IRP_MN_START_DEVICE
#define IRP_MN_REMOVE_DEVICE
#define IRP_MN_QUERY_STOP_DEVICE
#define IRP_MN_QUERY_CAPABILITIES
#define IRP_MN_STOP_DEVICE
#define IRP_MN_QUERY_REMOVE_DEVICE

Referenced by DriverEntry().

◆ HidPower()

NTSTATUS NTAPI HidPower ( IN PDEVICE_OBJECT  DeviceObject,
IN PIRP  Irp 
)

Definition at line 907 of file hidusb.c.

910{
911 PHID_DEVICE_EXTENSION DeviceExtension;
912
913 DeviceExtension = DeviceObject->DeviceExtension;
916 return PoCallDriver(DeviceExtension->NextDeviceObject, Irp);
917}
VOID NTAPI PoStartNextPowerIrp(IN PIRP Irp)
Definition: power.c:758

Referenced by DriverEntry().

◆ HidSystemControl()

NTSTATUS NTAPI HidSystemControl ( IN PDEVICE_OBJECT  DeviceObject,
IN PIRP  Irp 
)

Definition at line 921 of file hidusb.c.

924{
925 PHID_DEVICE_EXTENSION DeviceExtension;
926
927 //
928 // get hid device extension
929 //
930 DeviceExtension = DeviceObject->DeviceExtension;
931
932 //
933 // skip stack location
934 //
936
937 //
938 // submit request
939 //
940 return IoCallDriver(DeviceExtension->NextDeviceObject, Irp);
941}

Referenced by DriverEntry().

◆ HidUsb_AbortPipe()

NTSTATUS HidUsb_AbortPipe ( IN PDEVICE_OBJECT  DeviceObject)

Definition at line 179 of file hidusb.c.

181{
182 PHID_USB_DEVICE_EXTENSION HidDeviceExtension;
183 PHID_DEVICE_EXTENSION DeviceExtension;
184 PURB Urb;
187
188 //
189 // get device extension
190 //
191 DeviceExtension = DeviceObject->DeviceExtension;
192 HidDeviceExtension = DeviceExtension->MiniDeviceExtension;
193
194 //
195 // allocate urb
196 //
198 if (!Urb)
199 {
200 //
201 // no memory
202 //
204 }
205
206 //
207 // get pipe information
208 //
211 ASSERT(PipeInformation->PipeHandle);
212
213 //
214 // init urb
215 //
216 RtlZeroMemory(Urb, sizeof(struct _URB_PIPE_REQUEST));
217 Urb->UrbHeader.Function = URB_FUNCTION_ABORT_PIPE;
218 Urb->UrbHeader.Length = sizeof(struct _URB_PIPE_REQUEST);
219 Urb->UrbPipeRequest.PipeHandle = PipeInformation->PipeHandle;
220
221 //
222 // dispatch request
223 //
225
226 //
227 // free urb
228 //
230
231 //
232 // done
233 //
234 return Status;
235}
PUSBD_PIPE_INFORMATION HidUsb_GetInputInterruptInterfaceHandle(PUSBD_INTERFACE_INFORMATION InterfaceInformation)
Definition: hidusb.c:14
#define URB_FUNCTION_ABORT_PIPE
Definition: usb.h:88
_In_ WDFUSBPIPE _Out_ PWDF_USB_PIPE_INFORMATION PipeInformation
Definition: wdfusb.h:1744

Referenced by HidUsb_ResetWorkerRoutine().

◆ HidUsb_GetInputInterruptInterfaceHandle()

PUSBD_PIPE_INFORMATION HidUsb_GetInputInterruptInterfaceHandle ( PUSBD_INTERFACE_INFORMATION  InterfaceInformation)

Definition at line 14 of file hidusb.c.

16{
18
19 //
20 // sanity check
21 //
22 ASSERT(InterfaceInformation->NumberOfPipes);
23
24 for (Index = 0; Index < InterfaceInformation->NumberOfPipes; Index++)
25 {
26 //DPRINT1("[HIDUSB] EndpointAddress %x PipeType %x PipeHandle %x\n", InterfaceInformation->Pipes[Index].EndpointAddress, InterfaceInformation->Pipes[Index].PipeType, InterfaceInformation->Pipes[Index].PipeHandle);
27 if (InterfaceInformation->Pipes[Index].PipeType == UsbdPipeTypeInterrupt && (InterfaceInformation->Pipes[Index].EndpointAddress & USB_ENDPOINT_DIRECTION_MASK))
28 {
29 //
30 // found handle
31 //
32 return &InterfaceInformation->Pipes[Index];
33 }
34 }
35
36 //
37 // not found
38 //
39 return NULL;
40}
USBD_PIPE_INFORMATION Pipes[1]
Definition: usb.h:297
USBD_PIPE_TYPE PipeType
Definition: usb.h:274
UCHAR EndpointAddress
Definition: usb.h:272
#define USB_ENDPOINT_DIRECTION_MASK
Definition: usb100.h:73
@ UsbdPipeTypeInterrupt
Definition: usb.h:259

Referenced by HidUsb_AbortPipe(), HidUsb_ReadReport(), and HidUsb_ResetInterruptPipe().

◆ HidUsb_GetPortStatus()

NTSTATUS HidUsb_GetPortStatus ( IN PDEVICE_OBJECT  DeviceObject,
IN PULONG  PortStatus 
)

Definition at line 43 of file hidusb.c.

46{
47 PIRP Irp;
50 PHID_DEVICE_EXTENSION DeviceExtension;
51 PIO_STACK_LOCATION IoStack;
53
54 //
55 // get device extension
56 //
57 DeviceExtension = DeviceObject->DeviceExtension;
58
59 //
60 // init result
61 //
62 *PortStatus = 0;
63
64 //
65 // init event
66 //
68
69 //
70 // build irp
71 //
73 DeviceExtension->NextDeviceObject,
74 NULL,
75 0,
76 NULL,
77 0,
78 TRUE,
79 &Event,
80 &IoStatus);
81 if (!Irp)
82 {
83 //
84 // no memory
85 //
87 }
88
89 //
90 // get stack location
91 //
93
94 //
95 // store result buffer
96 //
97 IoStack->Parameters.Others.Argument1 = PortStatus;
98
99 //
100 // call driver
101 //
102 Status = IoCallDriver(DeviceExtension->NextDeviceObject, Irp);
103 if (Status == STATUS_PENDING)
104 {
105 //
106 // wait for completion
107 //
109 return IoStatus.Status;
110 }
111
112 //
113 // done
114 //
115 return Status;
116}
_Outptr_ PUSB_DEVICE_HANDLE _In_ PUSB_DEVICE_HANDLE _In_ USHORT PortStatus
Definition: hubbusif.h:42
#define IOCTL_INTERNAL_USB_GET_PORT_STATUS
Definition: usbioctl.h:44

Referenced by HidUsb_ResetWorkerRoutine().

◆ HidUsb_GetReportDescriptor()

NTSTATUS NTAPI HidUsb_GetReportDescriptor ( IN PDEVICE_OBJECT  DeviceObject,
IN PIRP  Irp 
)

Definition at line 629 of file hidusb.c.

632{
633 PHID_USB_DEVICE_EXTENSION HidDeviceExtension;
634 PHID_DEVICE_EXTENSION DeviceExtension;
635 PVOID Report = NULL;
637 PIO_STACK_LOCATION IoStack;
639
640 //
641 // get device extension
642 //
643 DeviceExtension = DeviceObject->DeviceExtension;
644 HidDeviceExtension = DeviceExtension->MiniDeviceExtension;
645
646 //
647 // sanity checks
648 //
649 ASSERT(HidDeviceExtension);
650 ASSERT(HidDeviceExtension->HidDescriptor);
651 ASSERT(HidDeviceExtension->HidDescriptor->bNumDescriptors >= 1);
652 ASSERT(HidDeviceExtension->HidDescriptor->DescriptorList[0].bReportType == HID_REPORT_DESCRIPTOR_TYPE);
653 ASSERT(HidDeviceExtension->HidDescriptor->DescriptorList[0].wReportLength > 0);
654
655 //
656 // FIXME: support old hid version
657 //
658 BufferLength = HidDeviceExtension->HidDescriptor->DescriptorList[0].wReportLength;
661 sizeof(struct _URB_CONTROL_DESCRIPTOR_REQUEST),
662 &Report,
664 HidDeviceExtension->HidDescriptor->DescriptorList[0].bReportType,
665 0,
666 HidDeviceExtension->InterfaceInfo->InterfaceNumber);
667 if (!NT_SUCCESS(Status))
668 {
669 //
670 // failed to get descriptor
671 // try with old hid version
672 //
673 BufferLength = HidDeviceExtension->HidDescriptor->DescriptorList[0].wReportLength;
676 sizeof(struct _URB_CONTROL_DESCRIPTOR_REQUEST),
677 &Report,
679 HidDeviceExtension->HidDescriptor->DescriptorList[0].bReportType,
680 0,
681 0 /* FIXME*/);
682 if (!NT_SUCCESS(Status))
683 {
684 DPRINT("[HIDUSB] failed to get report descriptor with %x\n", Status);
685 return Status;
686 }
687 }
688
689 //
690 // get current stack location
691 //
693 DPRINT("[HIDUSB] GetReportDescriptor: Status %x ReportLength %lu OutputBufferLength %lu TransferredLength %lu\n", Status, HidDeviceExtension->HidDescriptor->DescriptorList[0].wReportLength, IoStack->Parameters.DeviceIoControl.OutputBufferLength, BufferLength);
694
695 //
696 // get length to copy
697 //
698 Length = min(IoStack->Parameters.DeviceIoControl.OutputBufferLength, BufferLength);
699 ASSERT(Length);
700
701 //
702 // copy result
703 //
704 RtlCopyMemory(Irp->UserBuffer, Report, Length);
705
706 //
707 // store result length
708 //
709 Irp->IoStatus.Information = Length;
710
711 //
712 // free the report buffer
713 //
715
716 //
717 // done
718 //
719 return Status;
720
721}
#define HID_REPORT_DESCRIPTOR_TYPE
Definition: hidport.h:95
UCHAR bNumDescriptors
Definition: hidport.h:39
struct _HID_DESCRIPTOR::_HID_DESCRIPTOR_DESC_LIST DescriptorList[1]
#define URB_FUNCTION_GET_DESCRIPTOR_FROM_INTERFACE
Definition: usb.h:126
#define URB_FUNCTION_GET_DESCRIPTOR_FROM_ENDPOINT
Definition: usb.h:122
_Must_inspect_result_ _In_ WDFDEVICE _In_ DEVICE_REGISTRY_PROPERTY _In_ ULONG BufferLength
Definition: wdfdevice.h:3777

Referenced by HidInternalDeviceControl().

◆ HidUsb_ReadReport()

NTSTATUS NTAPI HidUsb_ReadReport ( IN PDEVICE_OBJECT  DeviceObject,
IN PIRP  Irp 
)

Definition at line 524 of file hidusb.c.

527{
528 PHID_USB_DEVICE_EXTENSION HidDeviceExtension;
529 PHID_DEVICE_EXTENSION DeviceExtension;
530 PIO_STACK_LOCATION IoStack;
531 PURB Urb;
533
534 //
535 // get device extension
536 //
537 DeviceExtension = DeviceObject->DeviceExtension;
538 HidDeviceExtension = DeviceExtension->MiniDeviceExtension;
539
540 //
541 // get current stack location
542 //
544
545 //
546 // sanity checks
547 //
548 ASSERT(IoStack->Parameters.DeviceIoControl.OutputBufferLength);
549 ASSERT(Irp->UserBuffer);
550 ASSERT(HidDeviceExtension->InterfaceInfo);
551
552 //
553 // get interrupt input pipe
554 //
557
558 //
559 // lets allocate urb
560 //
562 if (!Urb)
563 {
564 //
565 // no memory
566 //
568 }
569
570 //
571 // init urb
572 //
574
575 //
576 // sanity check
577 //
578 ASSERT(Irp->UserBuffer);
579 ASSERT(IoStack->Parameters.DeviceIoControl.OutputBufferLength);
580 ASSERT(PipeInformation->PipeHandle);
581
582 //
583 // build the urb
584 //
586 sizeof(struct _URB_BULK_OR_INTERRUPT_TRANSFER),
587 PipeInformation->PipeHandle,
588 Irp->UserBuffer,
589 NULL,
590 IoStack->Parameters.DeviceIoControl.OutputBufferLength,
592 NULL);
593
594 //
595 // store configuration handle
596 //
597 Urb->UrbHeader.UsbdDeviceHandle = HidDeviceExtension->ConfigurationHandle;
598
599 //
600 // get next location to setup irp
601 //
603
604 //
605 // init irp for lower driver
606 //
609 IoStack->Parameters.DeviceIoControl.InputBufferLength = 0;
610 IoStack->Parameters.DeviceIoControl.OutputBufferLength = 0;
611 IoStack->Parameters.DeviceIoControl.Type3InputBuffer = NULL;
612 IoStack->Parameters.Others.Argument1 = Urb;
613
614
615 //
616 // set completion routine
617 //
619
620 //
621 // call driver
622 //
623 return IoCallDriver(DeviceExtension->NextDeviceObject, Irp);
624}
NTSTATUS NTAPI HidUsb_ReadReportCompletion(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp, IN PVOID Context)
Definition: hidusb.c:419
#define USBD_SHORT_TRANSFER_OK
Definition: usb.h:160
#define UsbBuildInterruptOrBulkTransferRequest(urb, length, pipeHandle, transferBuffer, transferBufferMDL, transferBufferLength, transferFlags, link)
Definition: usbdlib.h:12

Referenced by HidInternalDeviceControl().

◆ HidUsb_ReadReportCompletion()

NTSTATUS NTAPI HidUsb_ReadReportCompletion ( IN PDEVICE_OBJECT  DeviceObject,
IN PIRP  Irp,
IN PVOID  Context 
)

Definition at line 419 of file hidusb.c.

423{
424 PURB Urb;
425 PHID_USB_RESET_CONTEXT ResetContext;
426
427 //
428 // get urb
429 //
430 Urb = Context;
431 ASSERT(Urb);
432
433 DPRINT("[HIDUSB] HidUsb_ReadReportCompletion %p Status %x Urb Status %x\n", Irp, Irp->IoStatus, Urb->UrbHeader.Status);
434
435 if (Irp->PendingReturned)
436 {
437 //
438 // mark irp pending
439 //
441 }
442
443 //
444 // did the reading report succeed / cancelled
445 //
446 if (NT_SUCCESS(Irp->IoStatus.Status) || Irp->IoStatus.Status == STATUS_CANCELLED || Irp->IoStatus.Status == STATUS_DEVICE_NOT_CONNECTED)
447 {
448 //
449 // store result length
450 //
451 Irp->IoStatus.Information = Urb->UrbBulkOrInterruptTransfer.TransferBufferLength;
452
453 //
454 // FIXME handle error
455 //
456 ASSERT(Urb->UrbHeader.Status == USBD_STATUS_SUCCESS ||
457 Urb->UrbHeader.Status == USBD_STATUS_CANCELED ||
458 Urb->UrbHeader.Status == USBD_STATUS_DEVICE_GONE);
459
460 //
461 // free the urb
462 //
464
465 //
466 // finish completion
467 //
469 }
470
471 //
472 // allocate reset context
473 //
475 if (ResetContext)
476 {
477 //
478 // allocate work item
479 //
481 if (ResetContext->WorkItem)
482 {
483 //
484 // init reset context
485 //
486 ResetContext->Irp = Irp;
487 ResetContext->DeviceObject = DeviceObject;
488
489 //
490 // queue the work item
491 //
493
494 //
495 // free urb
496 //
498
499 //
500 // defer completion
501 //
503 }
504 //
505 // free context
506 //
507 ExFreePoolWithTag(ResetContext, HIDUSB_TAG);
508 }
509
510 //
511 // free urb
512 //
514
515 //
516 // complete request
517 //
519}
VOID NTAPI HidUsb_ResetWorkerRoutine(IN PDEVICE_OBJECT DeviceObject, IN PVOID Ctx)
Definition: hidusb.c:334
VOID NTAPI IoQueueWorkItem(IN PIO_WORKITEM IoWorkItem, IN PIO_WORKITEM_ROUTINE WorkerRoutine, IN WORK_QUEUE_TYPE QueueType, IN PVOID Context)
Definition: iowork.c:40
PIO_WORKITEM NTAPI IoAllocateWorkItem(IN PDEVICE_OBJECT DeviceObject)
Definition: iowork.c:75
IoMarkIrpPending(Irp)
PDEVICE_OBJECT DeviceObject
Definition: hidusb.h:66
PIO_WORKITEM WorkItem
Definition: hidusb.h:61
#define STATUS_DEVICE_NOT_CONNECTED
Definition: udferr_usr.h:160
#define STATUS_CANCELLED
Definition: udferr_usr.h:170
#define USBD_STATUS_DEVICE_GONE
Definition: usb.h:221
#define USBD_STATUS_CANCELED
Definition: usb.h:224
#define USBD_STATUS_SUCCESS
Definition: usb.h:176
@ DelayedWorkQueue
Definition: extypes.h:190
#define STATUS_CONTINUE_COMPLETION

Referenced by HidUsb_ReadReport().

◆ HidUsb_ResetInterruptPipe()

NTSTATUS HidUsb_ResetInterruptPipe ( IN PDEVICE_OBJECT  DeviceObject)

Definition at line 119 of file hidusb.c.

121{
122 PHID_USB_DEVICE_EXTENSION HidDeviceExtension;
123 PHID_DEVICE_EXTENSION DeviceExtension;
125 PURB Urb;
127
128 //
129 // get device extension
130 //
131 DeviceExtension = DeviceObject->DeviceExtension;
132 HidDeviceExtension = DeviceExtension->MiniDeviceExtension;
133
134 //
135 // get interrupt pipe handle
136 //
137 ASSERT(HidDeviceExtension->InterfaceInfo);
140 ASSERT(PipeInformation->PipeHandle);
141
142 //
143 // allocate urb
144 //
146 if (!Urb)
147 {
148 //
149 // no memory
150 //
152 }
153
154 //
155 // init urb
156 //
157 RtlZeroMemory(Urb, sizeof(struct _URB_PIPE_REQUEST));
159 Urb->UrbHeader.Length = sizeof(struct _URB_PIPE_REQUEST);
160 Urb->UrbPipeRequest.PipeHandle = PipeInformation->PipeHandle;
161
162 //
163 // dispatch request
164 //
166
167 //
168 // free urb
169 //
171
172 //
173 // done
174 //
175 return Status;
176}
#define URB_FUNCTION_SYNC_RESET_PIPE_AND_CLEAR_STALL
Definition: usb.h:116

Referenced by HidUsb_ResetWorkerRoutine().

◆ HidUsb_ResetPort()

NTSTATUS HidUsb_ResetPort ( IN PDEVICE_OBJECT  DeviceObject)

Definition at line 238 of file hidusb.c.

240{
242 PIRP Irp;
243 PHID_DEVICE_EXTENSION DeviceExtension;
246
247 //
248 // get device extension
249 //
250 DeviceExtension = DeviceObject->DeviceExtension;
251
252 //
253 // init event
254 //
256
257 //
258 // build irp
259 //
261 DeviceExtension->NextDeviceObject,
262 NULL,
263 0,
264 NULL,
265 0,
266 TRUE,
267 &Event,
269 if (!Irp)
270 {
271 //
272 // no memory
273 //
275 }
276
277 //
278 // send the irp
279 //
280 Status = IoCallDriver(DeviceExtension->NextDeviceObject, Irp);
281 if (Status == STATUS_PENDING)
282 {
283 //
284 // wait for request completion
285 //
287 Status = IoStatusBlock.Status;
288 }
289
290 //
291 // done
292 //
293 return IoStatusBlock.Status;
294}
_In_ PIO_STATUS_BLOCK IoStatusBlock
Definition: dispmprt.h:608
#define IOCTL_INTERNAL_USB_RESET_PORT
Definition: usbioctl.h:35

Referenced by HidUsb_ResetWorkerRoutine().

◆ HidUsb_ResetWorkerRoutine()

VOID NTAPI HidUsb_ResetWorkerRoutine ( IN PDEVICE_OBJECT  DeviceObject,
IN PVOID  Ctx 
)

Definition at line 334 of file hidusb.c.

337{
340 PHID_USB_RESET_CONTEXT ResetContext;
341 PHID_DEVICE_EXTENSION DeviceExtension;
342
343 DPRINT("[HIDUSB] ResetWorkerRoutine\n");
344
345 //
346 // get context
347 //
348 ResetContext = Ctx;
349
350 //
351 // get device extension
352 //
353 DeviceExtension = ResetContext->DeviceObject->DeviceExtension;
354
355 //
356 // get port status
357 //
359 DPRINT("[HIDUSB] ResetWorkerRoutine GetPortStatus %x PortStatus %x\n", Status, PortStatus);
360 if (NT_SUCCESS(Status))
361 {
363 {
364 //
365 // port is disabled
366 //
368 DPRINT1("[HIDUSB] ResetWorkerRoutine ResetPipe %x\n", Status);
369 }
370 else
371 {
372 //
373 // abort pipe
374 //
375 Status = HidUsb_AbortPipe(ResetContext->DeviceObject);
376 DPRINT1("[HIDUSB] ResetWorkerRoutine AbortPipe %x\n", Status);
377 if (NT_SUCCESS(Status))
378 {
379 //
380 // reset port
381 //
382 Status = HidUsb_ResetPort(ResetContext->DeviceObject);
383 DPRINT1("[HIDUSB] ResetPort %x\n", Status);
385 {
386 //
387 // invalidate device state
388 //
390 }
391
392 //
393 // reset interrupt pipe
394 //
395 if (NT_SUCCESS(Status))
396 {
397 //
398 // reset pipe
399 //
401 DPRINT1("[HIDUSB] ResetWorkerRoutine ResetPipe %x\n", Status);
402 }
403 }
404 }
405 }
406
407 //
408 // cleanup
409 //
411 IoFreeWorkItem(ResetContext->WorkItem);
412 IoCompleteRequest(ResetContext->Irp, IO_NO_INCREMENT);
413 ExFreePoolWithTag(ResetContext, HIDUSB_TAG);
414}
#define PASSIVE_LEVEL
Definition: env_spec_w32.h:693
#define KeGetCurrentIrql()
Definition: env_spec_w32.h:706
NTSTATUS HidUsb_ResetInterruptPipe(IN PDEVICE_OBJECT DeviceObject)
Definition: hidusb.c:119
NTSTATUS HidUsb_AbortPipe(IN PDEVICE_OBJECT DeviceObject)
Definition: hidusb.c:179
NTSTATUS HidUsb_ResetPort(IN PDEVICE_OBJECT DeviceObject)
Definition: hidusb.c:238
NTSTATUS HidUsb_GetPortStatus(IN PDEVICE_OBJECT DeviceObject, IN PULONG PortStatus)
Definition: hidusb.c:43
VOID NTAPI IoFreeWorkItem(IN PIO_WORKITEM IoWorkItem)
Definition: iowork.c:64
VOID NTAPI IoInvalidateDeviceState(IN PDEVICE_OBJECT DeviceObject)
Definition: pnpmgr.c:1848
PVOID DeviceExtension
Definition: env_spec_w32.h:418
PDEVICE_OBJECT PhysicalDeviceObject
Definition: hidport.h:17
#define STATUS_DEVICE_DATA_ERROR
Definition: udferr_usr.h:159
#define USB_PORT_STATUS_ENABLE
Definition: usb200.h:153

Referenced by HidUsb_ReadReportCompletion().