{
ULONG Index;
- //
- // sanity check
- //
- ASSERT(InterfaceInformation->NumberOfPipes);
-
- for(Index = 0; Index < InterfaceInformation->NumberOfPipes; Index++)
- {
- //DPRINT1("[HIDUSB] EndpointAddress %x PipeType %x PipeHandle %x\n", InterfaceInformation->Pipes[Index].EndpointAddress, InterfaceInformation->Pipes[Index].PipeType, InterfaceInformation->Pipes[Index].PipeHandle);
- if (InterfaceInformation->Pipes[Index].PipeType == UsbdPipeTypeInterrupt && (InterfaceInformation->Pipes[Index].EndpointAddress & USB_ENDPOINT_DIRECTION_MASK))
- {
- //
- // found handle
- //
- return &InterfaceInformation->Pipes[Index];
- }
+ //
+ // sanity check
+ //
+ ASSERT(InterfaceInformation->NumberOfPipes);
+
+ for (Index = 0; Index < InterfaceInformation->NumberOfPipes; Index++)
+ {
+ //DPRINT1("[HIDUSB] EndpointAddress %x PipeType %x PipeHandle %x\n", InterfaceInformation->Pipes[Index].EndpointAddress, InterfaceInformation->Pipes[Index].PipeType, InterfaceInformation->Pipes[Index].PipeHandle);
+ if (InterfaceInformation->Pipes[Index].PipeType == UsbdPipeTypeInterrupt && (InterfaceInformation->Pipes[Index].EndpointAddress & USB_ENDPOINT_DIRECTION_MASK))
+ {
+ //
+ // found handle
+ //
+ return &InterfaceInformation->Pipes[Index];
+ }
}
//
//
// get device extension
//
- DeviceExtension = (PHID_DEVICE_EXTENSION)DeviceObject->DeviceExtension;
+ DeviceExtension = DeviceObject->DeviceExtension;
//
// init result
//
// build irp
//
- Irp = IoBuildDeviceIoControlRequest(IOCTL_INTERNAL_USB_GET_PORT_STATUS, DeviceExtension->NextDeviceObject, NULL, 0, NULL, 0, TRUE, &Event, &IoStatus);
+ Irp = IoBuildDeviceIoControlRequest(IOCTL_INTERNAL_USB_GET_PORT_STATUS,
+ DeviceExtension->NextDeviceObject,
+ NULL,
+ 0,
+ NULL,
+ 0,
+ TRUE,
+ &Event,
+ &IoStatus);
if (!Irp)
{
//
//
// store result buffer
//
- IoStack->Parameters.Others.Argument1 = (PVOID)PortStatus;
-
- //
- // call driver
- //
- Status = IoCallDriver(DeviceExtension->NextDeviceObject, Irp);
- if (Status == STATUS_PENDING)
- {
- //
- // wait for completion
- //
- KeWaitForSingleObject(&Event, Executive, KernelMode, 0, NULL);
- return IoStatus.Status;
- }
-
- //
- // done
- //
- return Status;
+ IoStack->Parameters.Others.Argument1 = PortStatus;
+
+ //
+ // call driver
+ //
+ Status = IoCallDriver(DeviceExtension->NextDeviceObject, Irp);
+ if (Status == STATUS_PENDING)
+ {
+ //
+ // wait for completion
+ //
+ KeWaitForSingleObject(&Event, Executive, KernelMode, 0, NULL);
+ return IoStatus.Status;
+ }
+
+ //
+ // done
+ //
+ return Status;
}
NTSTATUS
//
// get device extension
//
- DeviceExtension = (PHID_DEVICE_EXTENSION)DeviceObject->DeviceExtension;
- HidDeviceExtension = (PHID_USB_DEVICE_EXTENSION)DeviceExtension->MiniDeviceExtension;
+ DeviceExtension = DeviceObject->DeviceExtension;
+ HidDeviceExtension = DeviceExtension->MiniDeviceExtension;
//
// get interrupt pipe handle
//
// allocate urb
//
- Urb = ExAllocatePool(NonPagedPool, sizeof(struct _URB_PIPE_REQUEST));
+ Urb = ExAllocatePoolWithTag(NonPagedPool, sizeof(struct _URB_PIPE_REQUEST), HIDUSB_URB_TAG);
if (!Urb)
{
//
//
// free urb
//
- ExFreePool(Urb);
+ ExFreePoolWithTag(Urb, HIDUSB_URB_TAG);
//
// done
//
// get device extension
//
- DeviceExtension = (PHID_DEVICE_EXTENSION)DeviceObject->DeviceExtension;
- HidDeviceExtension = (PHID_USB_DEVICE_EXTENSION)DeviceExtension->MiniDeviceExtension;
+ DeviceExtension = DeviceObject->DeviceExtension;
+ HidDeviceExtension = DeviceExtension->MiniDeviceExtension;
//
// allocate urb
//
- Urb = ExAllocatePool(NonPagedPool, sizeof(struct _URB_PIPE_REQUEST));
+ Urb = ExAllocatePoolWithTag(NonPagedPool, sizeof(struct _URB_PIPE_REQUEST), HIDUSB_URB_TAG);
if (!Urb)
{
//
//
// free urb
//
- ExFreePool(Urb);
+ ExFreePoolWithTag(Urb, HIDUSB_URB_TAG);
//
// done
//
// get device extension
//
- DeviceExtension = (PHID_DEVICE_EXTENSION)DeviceObject->DeviceExtension;
+ DeviceExtension = DeviceObject->DeviceExtension;
//
// init event
//
// build irp
//
- Irp = IoBuildDeviceIoControlRequest(IOCTL_INTERNAL_USB_RESET_PORT, DeviceExtension->NextDeviceObject, NULL, 0, NULL, 0, TRUE, &Event, &IoStatusBlock);
+ Irp = IoBuildDeviceIoControlRequest(IOCTL_INTERNAL_USB_RESET_PORT,
+ DeviceExtension->NextDeviceObject,
+ NULL,
+ 0,
+ NULL,
+ 0,
+ TRUE,
+ &Event,
+ &IoStatusBlock);
if (!Irp)
{
//
//
ASSERT(IoStack->MajorFunction == IRP_MJ_CREATE || IoStack->MajorFunction == IRP_MJ_CLOSE);
+ //
+ // informational debug print
+ //
+ DPRINT("HIDUSB Request: %x\n", IoStack->MajorFunction);
+
//
// complete request
//
Irp->IoStatus.Status = STATUS_SUCCESS;
IoCompleteRequest(Irp, IO_NO_INCREMENT);
- //
- // informal debug print
- //
- DPRINT("HIDUSB Request: %x\n", IoStack->MajorFunction);
-
//
// done
//
//
// get context
//
- ResetContext = (PHID_USB_RESET_CONTEXT)Ctx;
+ ResetContext = Ctx;
//
// get device extension
//
- DeviceExtension = (PHID_DEVICE_EXTENSION)ResetContext->DeviceObject->DeviceExtension;
+ DeviceExtension = ResetContext->DeviceObject->DeviceExtension;
//
// get port status
ASSERT(KeGetCurrentIrql() == PASSIVE_LEVEL);
IoFreeWorkItem(ResetContext->WorkItem);
IoCompleteRequest(ResetContext->Irp, IO_NO_INCREMENT);
- ExFreePool(ResetContext);
+ ExFreePoolWithTag(ResetContext, HIDUSB_TAG);
}
IN PIRP Irp,
IN PVOID Context)
{
- PHID_USB_DEVICE_EXTENSION HidDeviceExtension;
- PHID_DEVICE_EXTENSION DeviceExtension;
PURB Urb;
PHID_USB_RESET_CONTEXT ResetContext;
//
// get urb
//
- Urb = (PURB)Context;
+ Urb = Context;
ASSERT(Urb);
DPRINT("[HIDUSB] HidUsb_ReadReportCompletion %p Status %x Urb Status %x\n", Irp, Irp->IoStatus, Urb->UrbHeader.Status);
//
// free the urb
//
- ExFreePool(Context);
+ ExFreePoolWithTag(Urb, HIDUSB_URB_TAG);
//
// finish completion
return STATUS_CONTINUE_COMPLETION;
}
- //
- // get device extension
- //
- DeviceExtension = (PHID_DEVICE_EXTENSION)DeviceObject->DeviceExtension;
- HidDeviceExtension = (PHID_USB_DEVICE_EXTENSION)DeviceExtension->MiniDeviceExtension;
-
//
// allocate reset context
//
- ResetContext = (PHID_USB_RESET_CONTEXT)ExAllocatePool(NonPagedPool, sizeof(HID_USB_RESET_CONTEXT));
+ ResetContext = ExAllocatePoolWithTag(NonPagedPool, sizeof(HID_USB_RESET_CONTEXT), HIDUSB_TAG);
if (ResetContext)
{
//
//
// free urb
//
- ExFreePool(Urb);
+ ExFreePoolWithTag(Urb, HIDUSB_URB_TAG);
//
// defer completion
//
// free context
//
- ExFreePool(ResetContext);
+ ExFreePoolWithTag(ResetContext, HIDUSB_TAG);
}
//
// free urb
//
- ExFreePool(Urb);
+ ExFreePoolWithTag(Urb, HIDUSB_URB_TAG);
//
// complete request
//
// get device extension
//
- DeviceExtension = (PHID_DEVICE_EXTENSION)DeviceObject->DeviceExtension;
- HidDeviceExtension = (PHID_USB_DEVICE_EXTENSION)DeviceExtension->MiniDeviceExtension;
+ DeviceExtension = DeviceObject->DeviceExtension;
+ HidDeviceExtension = DeviceExtension->MiniDeviceExtension;
//
// get current stack location
//
// lets allocate urb
//
- Urb = (PURB)ExAllocatePool(NonPagedPool, sizeof(struct _URB_BULK_OR_INTERRUPT_TRANSFER));
+ Urb = ExAllocatePoolWithTag(NonPagedPool, sizeof(struct _URB_BULK_OR_INTERRUPT_TRANSFER), HIDUSB_URB_TAG);
if (!Urb)
{
//
IoStack->Parameters.DeviceIoControl.InputBufferLength = 0;
IoStack->Parameters.DeviceIoControl.OutputBufferLength = 0;
IoStack->Parameters.DeviceIoControl.Type3InputBuffer = NULL;
- IoStack->Parameters.Others.Argument1 = (PVOID)Urb;
+ IoStack->Parameters.Others.Argument1 = Urb;
//
// set completion routine
//
- IoSetCompletionRoutine(Irp, HidUsb_ReadReportCompletion, (PVOID)Urb, TRUE, TRUE, TRUE);
+ IoSetCompletionRoutine(Irp, HidUsb_ReadReportCompletion, Urb, TRUE, TRUE, TRUE);
//
// call driver
//
// get device extension
//
- DeviceExtension = (PHID_DEVICE_EXTENSION)DeviceObject->DeviceExtension;
- HidDeviceExtension = (PHID_USB_DEVICE_EXTENSION)DeviceExtension->MiniDeviceExtension;
+ DeviceExtension = DeviceObject->DeviceExtension;
+ HidDeviceExtension = DeviceExtension->MiniDeviceExtension;
//
// sanity checks
// FIXME: support old hid version
//
BufferLength = HidDeviceExtension->HidDescriptor->DescriptorList[0].wReportLength;
- Status = Hid_GetDescriptor(DeviceObject, URB_FUNCTION_GET_DESCRIPTOR_FROM_INTERFACE, sizeof(struct _URB_CONTROL_DESCRIPTOR_REQUEST), &Report, &BufferLength, HidDeviceExtension->HidDescriptor->DescriptorList[0].bReportType, 0, HidDeviceExtension->InterfaceInfo->InterfaceNumber);
+ Status = Hid_GetDescriptor(DeviceObject,
+ URB_FUNCTION_GET_DESCRIPTOR_FROM_INTERFACE,
+ sizeof(struct _URB_CONTROL_DESCRIPTOR_REQUEST),
+ &Report,
+ &BufferLength,
+ HidDeviceExtension->HidDescriptor->DescriptorList[0].bReportType,
+ 0,
+ HidDeviceExtension->InterfaceInfo->InterfaceNumber);
if (!NT_SUCCESS(Status))
{
//
// try with old hid version
//
BufferLength = HidDeviceExtension->HidDescriptor->DescriptorList[0].wReportLength;
- Status = Hid_GetDescriptor(DeviceObject, URB_FUNCTION_GET_DESCRIPTOR_FROM_ENDPOINT, sizeof(struct _URB_CONTROL_DESCRIPTOR_REQUEST), &Report, &BufferLength, HidDeviceExtension->HidDescriptor->DescriptorList[0].bReportType, 0, 0 /* FIXME*/);
+ Status = Hid_GetDescriptor(DeviceObject,
+ URB_FUNCTION_GET_DESCRIPTOR_FROM_ENDPOINT,
+ sizeof(struct _URB_CONTROL_DESCRIPTOR_REQUEST),
+ &Report,
+ &BufferLength,
+ HidDeviceExtension->HidDescriptor->DescriptorList[0].bReportType,
+ 0,
+ 0 /* FIXME*/);
if (!NT_SUCCESS(Status))
{
DPRINT("[HIDUSB] failed to get report descriptor with %x\n", Status);
//
Irp->IoStatus.Information = Length;
+ //
+ // free the report buffer
+ //
+ ExFreePoolWithTag(Report, HIDUSB_TAG);
+
//
// done
//
//
// get device extension
//
- DeviceExtension = (PHID_DEVICE_EXTENSION)DeviceObject->DeviceExtension;
- HidDeviceExtension = (PHID_USB_DEVICE_EXTENSION)DeviceExtension->MiniDeviceExtension;
+ DeviceExtension = DeviceObject->DeviceExtension;
+ HidDeviceExtension = DeviceExtension->MiniDeviceExtension;
//
// get current stack location
//
IoStack = IoGetCurrentIrpStackLocation(Irp);
- switch(IoStack->Parameters.DeviceIoControl.IoControlCode)
+ switch (IoStack->Parameters.DeviceIoControl.IoControlCode)
{
case IOCTL_HID_GET_DEVICE_ATTRIBUTES:
{
DPRINT("[HIDUSB] IOCTL_HID_GET_DEVICE_ATTRIBUTES\n");
ASSERT(HidDeviceExtension->DeviceDescriptor);
Irp->IoStatus.Information = sizeof(HID_DESCRIPTOR);
- Attributes = (PHID_DEVICE_ATTRIBUTES)Irp->UserBuffer;
+ Attributes = Irp->UserBuffer;
Attributes->Size = sizeof(HID_DEVICE_ATTRIBUTES);
Attributes->VendorID = HidDeviceExtension->DeviceDescriptor->idVendor;
Attributes->ProductID = HidDeviceExtension->DeviceDescriptor->idProduct;
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp)
{
- UNIMPLEMENTED
- ASSERT(FALSE);
- return STATUS_NOT_IMPLEMENTED;
+ PHID_DEVICE_EXTENSION DeviceExtension;
+
+ DeviceExtension = DeviceObject->DeviceExtension;
+ PoStartNextPowerIrp(Irp);
+ IoSkipCurrentIrpStackLocation(Irp);
+ return PoCallDriver(DeviceExtension->NextDeviceObject, Irp);
}
NTSTATUS
//
// get hid device extension
//
- DeviceExtension = (PHID_DEVICE_EXTENSION)DeviceObject->DeviceExtension;
+ DeviceExtension = DeviceObject->DeviceExtension;
//
- // copy stack location
+ // skip stack location
//
- IoCopyCurrentIrpStackLocationToNext(Irp);
+ IoSkipCurrentIrpStackLocation(Irp);
//
// submit request
//
// signal event
//
- KeSetEvent((PRKEVENT)Context, 0, FALSE);
+ KeSetEvent(Context, 0, FALSE);
//
// done
return STATUS_MORE_PROCESSING_REQUIRED;
}
-
NTSTATUS
Hid_DispatchUrb(
IN PDEVICE_OBJECT DeviceObject,
{
PIRP Irp;
KEVENT Event;
- PHID_USB_DEVICE_EXTENSION HidDeviceExtension;
PHID_DEVICE_EXTENSION DeviceExtension;
IO_STATUS_BLOCK IoStatus;
PIO_STACK_LOCATION IoStack;
//
// get device extension
//
- DeviceExtension = (PHID_DEVICE_EXTENSION)DeviceObject->DeviceExtension;
- HidDeviceExtension = (PHID_USB_DEVICE_EXTENSION)DeviceExtension->MiniDeviceExtension;
-
+ DeviceExtension = DeviceObject->DeviceExtension;
//
// build irp
//
- Irp = IoBuildDeviceIoControlRequest(IOCTL_INTERNAL_USB_SUBMIT_URB, DeviceExtension->NextDeviceObject, NULL, 0, NULL, 0, TRUE, &Event, &IoStatus);
+ Irp = IoBuildDeviceIoControlRequest(IOCTL_INTERNAL_USB_SUBMIT_URB,
+ DeviceExtension->NextDeviceObject,
+ NULL,
+ 0,
+ NULL,
+ 0,
+ TRUE,
+ &Event,
+ &IoStatus);
if (!Irp)
{
//
//
// store urb
//
- IoStack->Parameters.Others.Argument1 = (PVOID)Urb;
+ IoStack->Parameters.Others.Argument1 = Urb;
//
// set completion routine
//
- IoSetCompletionRoutine(Irp, Hid_PnpCompletion, (PVOID)&Event, TRUE, TRUE, TRUE);
+ IoSetCompletionRoutine(Irp, Hid_PnpCompletion, &Event, TRUE, TRUE, TRUE);
//
// call driver
IN USHORT UrbLength,
IN OUT PVOID *UrbBuffer,
IN OUT PULONG UrbBufferLength,
- IN UCHAR DescriptorType,
+ IN UCHAR DescriptorType,
IN UCHAR Index,
IN USHORT LanguageIndex)
{
//
// allocate urb
//
- Urb = (PURB)ExAllocatePool(NonPagedPool, UrbLength);
+ Urb = ExAllocatePoolWithTag(NonPagedPool, UrbLength, HIDUSB_URB_TAG);
if (!Urb)
{
//
//
// allocate buffer
//
- *UrbBuffer = ExAllocatePool(NonPagedPool, *UrbBufferLength);
+ *UrbBuffer = ExAllocatePoolWithTag(NonPagedPool, *UrbBufferLength, HIDUSB_TAG);
if (!*UrbBuffer)
{
//
// no memory
//
- ExFreePool(Urb);
+ ExFreePoolWithTag(Urb, HIDUSB_URB_TAG);
return STATUS_INSUFFICIENT_RESOURCES;
}
//
// set urb function
//
- Urb->UrbHeader.Function = UrbFunction;
+ Urb->UrbHeader.Function = UrbFunction;
//
// dispatch urb
//
// free allocated buffer
//
- ExFreePool(*UrbBuffer);
+ ExFreePoolWithTag(*UrbBuffer, HIDUSB_TAG);
*UrbBuffer = NULL;
}
//
// free urb
//
- ExFreePool(Urb);
+ ExFreePoolWithTag(Urb, HIDUSB_URB_TAG);
*UrbBufferLength = 0;
return Status;
}
//
// free allocated buffer
//
- ExFreePool(*UrbBuffer);
+ ExFreePoolWithTag(*UrbBuffer, HIDUSB_TAG);
*UrbBuffer = NULL;
}
//
// free urb
//
- ExFreePool(Urb);
+ ExFreePoolWithTag(Urb, HIDUSB_URB_TAG);
*UrbBufferLength = 0;
return STATUS_UNSUCCESSFUL;
}
//
// free urb
//
- ExFreePool(Urb);
+ ExFreePoolWithTag(Urb, HIDUSB_URB_TAG);
//
// completed successfully
//
// get device extension
//
- DeviceExtension = (PHID_DEVICE_EXTENSION)DeviceObject->DeviceExtension;
- HidDeviceExtension = (PHID_USB_DEVICE_EXTENSION)DeviceExtension->MiniDeviceExtension;
+ DeviceExtension = DeviceObject->DeviceExtension;
+ HidDeviceExtension = DeviceExtension->MiniDeviceExtension;
//
// now parse the descriptors
//
// copy interface info
//
- HidDeviceExtension->InterfaceInfo = (PUSBD_INTERFACE_INFORMATION)ExAllocatePool(NonPagedPool, Urb->UrbSelectConfiguration.Interface.Length);
+ HidDeviceExtension->InterfaceInfo = ExAllocatePoolWithTag(NonPagedPool, Urb->UrbSelectConfiguration.Interface.Length, HIDUSB_TAG);
if (HidDeviceExtension->InterfaceInfo)
{
//
//
// free urb request
//
- ExFreePool(Urb);
+ ExFreePoolWithTag(Urb, 0);
//
// done
}
NTSTATUS
-Hid_SetIdle(
+Hid_DisableConfiguration(
IN PDEVICE_OBJECT DeviceObject)
{
- PHID_USB_DEVICE_EXTENSION HidDeviceExtension;
PHID_DEVICE_EXTENSION DeviceExtension;
- PURB Urb;
+ PHID_USB_DEVICE_EXTENSION HidDeviceExtension;
NTSTATUS Status;
+ PURB Urb;
//
// get device extension
//
- DeviceExtension = (PHID_DEVICE_EXTENSION)DeviceObject->DeviceExtension;
- HidDeviceExtension = (PHID_USB_DEVICE_EXTENSION)DeviceExtension->MiniDeviceExtension;
+ DeviceExtension = DeviceObject->DeviceExtension;
+ HidDeviceExtension = DeviceExtension->MiniDeviceExtension;
+
+ //
+ // build urb
+ //
+ Urb = ExAllocatePoolWithTag(NonPagedPool,
+ sizeof(struct _URB_SELECT_CONFIGURATION),
+ HIDUSB_URB_TAG);
+ if (!Urb)
+ {
+ //
+ // no memory
+ //
+ return STATUS_INSUFFICIENT_RESOURCES;
+ }
+
+ //
+ // format urb
+ //
+ UsbBuildSelectConfigurationRequest(Urb,
+ sizeof(struct _URB_SELECT_CONFIGURATION),
+ NULL);
+
+ //
+ // dispatch request
+ //
+ Status = Hid_DispatchUrb(DeviceObject, Urb);
+ if (!NT_SUCCESS(Status))
+ {
+ DPRINT1("[HIDUSB] Dispatching unconfigure URB failed with %lx\n", Status);
+ }
+ else if (!USBD_SUCCESS(Urb->UrbHeader.Status))
+ {
+ DPRINT("[HIDUSB] Unconfigure URB failed with %lx\n", Status);
+ }
+
+ //
+ // free urb
+ //
+ ExFreePoolWithTag(Urb, HIDUSB_URB_TAG);
+
+ //
+ // free resources
+ //
+ HidDeviceExtension->ConfigurationHandle = NULL;
+
+ if (HidDeviceExtension->InterfaceInfo)
+ {
+ ExFreePoolWithTag(HidDeviceExtension->InterfaceInfo, HIDUSB_TAG);
+ HidDeviceExtension->InterfaceInfo = NULL;
+ }
+
+ if (HidDeviceExtension->ConfigurationDescriptor)
+ {
+ ExFreePoolWithTag(HidDeviceExtension->ConfigurationDescriptor, HIDUSB_TAG);
+ HidDeviceExtension->ConfigurationDescriptor = NULL;
+ HidDeviceExtension->HidDescriptor = NULL;
+ }
+
+ if (HidDeviceExtension->DeviceDescriptor)
+ {
+ ExFreePoolWithTag(HidDeviceExtension->DeviceDescriptor, HIDUSB_TAG);
+ HidDeviceExtension->DeviceDescriptor = NULL;
+ }
+
+ //
+ // done
+ //
+ return Status;
+}
+
+NTSTATUS
+Hid_SetIdle(
+ IN PDEVICE_OBJECT DeviceObject)
+{
+ PURB Urb;
+ NTSTATUS Status;
//
// allocate urb
//
- Urb = ExAllocatePool(NonPagedPool, sizeof(struct _URB_CONTROL_VENDOR_OR_CLASS_REQUEST));
+ Urb = ExAllocatePoolWithTag(NonPagedPool, sizeof(struct _URB_CONTROL_VENDOR_OR_CLASS_REQUEST), HIDUSB_URB_TAG);
if (!Urb)
{
//
// format urb
//
UsbBuildVendorRequest(Urb,
- URB_FUNCTION_CLASS_INTERFACE,
+ URB_FUNCTION_CLASS_INTERFACE,
sizeof(struct _URB_CONTROL_VENDOR_OR_CLASS_REQUEST),
0,
0,
//
// free urb
//
- ExFreePool(Urb);
+ ExFreePoolWithTag(Urb, HIDUSB_URB_TAG);
//
// print status
PHID_USB_DEVICE_EXTENSION HidDeviceExtension;
PHID_DEVICE_EXTENSION DeviceExtension;
PURB Urb;
- NTSTATUS Status;
UCHAR Protocol[1];
//
// get device extension
//
- DeviceExtension = (PHID_DEVICE_EXTENSION)DeviceObject->DeviceExtension;
- HidDeviceExtension = (PHID_USB_DEVICE_EXTENSION)DeviceExtension->MiniDeviceExtension;
+ DeviceExtension = DeviceObject->DeviceExtension;
+ HidDeviceExtension = DeviceExtension->MiniDeviceExtension;
ASSERT(HidDeviceExtension->InterfaceInfo);
if (HidDeviceExtension->InterfaceInfo->SubClass != 0x1)
return;
}
-
//
// allocate urb
//
- Urb = ExAllocatePool(NonPagedPool, sizeof(struct _URB_CONTROL_VENDOR_OR_CLASS_REQUEST));
+ Urb = ExAllocatePoolWithTag(NonPagedPool, sizeof(struct _URB_CONTROL_VENDOR_OR_CLASS_REQUEST), HIDUSB_URB_TAG);
if (!Urb)
{
//
// format urb
//
UsbBuildVendorRequest(Urb,
- URB_FUNCTION_CLASS_INTERFACE,
+ URB_FUNCTION_CLASS_INTERFACE,
sizeof(struct _URB_CONTROL_VENDOR_OR_CLASS_REQUEST),
USBD_TRANSFER_DIRECTION_IN,
0,
1,
NULL);
Protocol[0] = 0xFF;
+
//
// dispatch urb
//
- Status = Hid_DispatchUrb(DeviceObject, Urb);
+ Hid_DispatchUrb(DeviceObject, Urb);
//
// free urb
//
- ExFreePool(Urb);
+ ExFreePoolWithTag(Urb, HIDUSB_URB_TAG);
//
// boot protocol active 0x00 disabled 0x1
//
// get device extension
//
- DeviceExtension = (PHID_DEVICE_EXTENSION)DeviceObject->DeviceExtension;
- HidDeviceExtension = (PHID_USB_DEVICE_EXTENSION)DeviceExtension->MiniDeviceExtension;
+ DeviceExtension = DeviceObject->DeviceExtension;
+ HidDeviceExtension = DeviceExtension->MiniDeviceExtension;
//
// get device descriptor
//
DescriptorLength = sizeof(USB_DEVICE_DESCRIPTOR);
- Status = Hid_GetDescriptor(DeviceObject, URB_FUNCTION_GET_DESCRIPTOR_FROM_DEVICE, sizeof(struct _URB_CONTROL_DESCRIPTOR_REQUEST), (PVOID*)&HidDeviceExtension->DeviceDescriptor, &DescriptorLength, USB_DEVICE_DESCRIPTOR_TYPE, 0, 0);
+ Status = Hid_GetDescriptor(DeviceObject,
+ URB_FUNCTION_GET_DESCRIPTOR_FROM_DEVICE,
+ sizeof(struct _URB_CONTROL_DESCRIPTOR_REQUEST),
+ (PVOID *)&HidDeviceExtension->DeviceDescriptor,
+ &DescriptorLength,
+ USB_DEVICE_DESCRIPTOR_TYPE,
+ 0,
+ 0);
if (!NT_SUCCESS(Status))
{
//
// now get the configuration descriptor
//
DescriptorLength = sizeof(USB_CONFIGURATION_DESCRIPTOR);
- Status = Hid_GetDescriptor(DeviceObject, URB_FUNCTION_GET_DESCRIPTOR_FROM_DEVICE, sizeof(struct _URB_CONTROL_DESCRIPTOR_REQUEST), (PVOID*)&HidDeviceExtension->ConfigurationDescriptor, &DescriptorLength, USB_CONFIGURATION_DESCRIPTOR_TYPE, 0, 0);
+ Status = Hid_GetDescriptor(DeviceObject,
+ URB_FUNCTION_GET_DESCRIPTOR_FROM_DEVICE,
+ sizeof(struct _URB_CONTROL_DESCRIPTOR_REQUEST),
+ (PVOID *)&HidDeviceExtension->ConfigurationDescriptor,
+ &DescriptorLength,
+ USB_CONFIGURATION_DESCRIPTOR_TYPE,
+ 0,
+ 0);
if (!NT_SUCCESS(Status))
{
//
//
// delete partial configuration descriptor
//
- ExFreePool(HidDeviceExtension->ConfigurationDescriptor);
+ ExFreePoolWithTag(HidDeviceExtension->ConfigurationDescriptor, HIDUSB_TAG);
HidDeviceExtension->ConfigurationDescriptor = NULL;
//
// get full configuration descriptor
//
- Status = Hid_GetDescriptor(DeviceObject, URB_FUNCTION_GET_DESCRIPTOR_FROM_DEVICE, sizeof(struct _URB_CONTROL_DESCRIPTOR_REQUEST), (PVOID*)&HidDeviceExtension->ConfigurationDescriptor, &DescriptorLength, USB_CONFIGURATION_DESCRIPTOR_TYPE, 0, 0);
+ Status = Hid_GetDescriptor(DeviceObject,
+ URB_FUNCTION_GET_DESCRIPTOR_FROM_DEVICE,
+ sizeof(struct _URB_CONTROL_DESCRIPTOR_REQUEST),
+ (PVOID *)&HidDeviceExtension->ConfigurationDescriptor,
+ &DescriptorLength,
+ USB_CONFIGURATION_DESCRIPTOR_TYPE,
+ 0,
+ 0);
if (!NT_SUCCESS(Status))
{
//
{
NTSTATUS Status;
PIO_STACK_LOCATION IoStack;
- PHID_USB_DEVICE_EXTENSION HidDeviceExtension;
PHID_DEVICE_EXTENSION DeviceExtension;
KEVENT Event;
//
// get device extension
//
- DeviceExtension = (PHID_DEVICE_EXTENSION)DeviceObject->DeviceExtension;
- HidDeviceExtension = (PHID_USB_DEVICE_EXTENSION)DeviceExtension->MiniDeviceExtension;
+ DeviceExtension = DeviceObject->DeviceExtension;
//
// get current stack location
//
// handle requests based on request type
//
- switch(IoStack->MinorFunction)
+ switch (IoStack->MinorFunction)
{
case IRP_MN_REMOVE_DEVICE:
{
//
- // pass request onto lower driver
- //
- IoSkipCurrentIrpStackLocation(Irp);
- Status = IoCallDriver(DeviceExtension->NextDeviceObject, Irp);
-
- //
- // free resources
+ // unconfigure device
+ // FIXME: Call this on IRP_MN_SURPRISE_REMOVAL, but don't send URBs
+ // FIXME: Don't call this after we've already seen a surprise removal or stop
//
- if (HidDeviceExtension->ConfigurationDescriptor)
- {
- ExFreePool(HidDeviceExtension->ConfigurationDescriptor);
- HidDeviceExtension->ConfigurationDescriptor = NULL;
- }
+ Hid_DisableConfiguration(DeviceObject);
//
- // delete and detach device
+ // pass request onto lower driver
//
- IoDetachDevice(DeviceExtension->NextDeviceObject);
- IoDeleteDevice(DeviceObject);
+ IoSkipCurrentIrpStackLocation(Irp);
+ Status = IoCallDriver(DeviceExtension->NextDeviceObject, Irp);
return Status;
}
case IRP_MN_STOP_DEVICE:
{
//
- // FIXME: unconfigure the device
+ // unconfigure device
//
+ Hid_DisableConfiguration(DeviceObject);
//
// prepare irp
//
KeInitializeEvent(&Event, NotificationEvent, FALSE);
IoCopyCurrentIrpStackLocationToNext(Irp);
- IoSetCompletionRoutine(Irp, Hid_PnpCompletion, (PVOID)&Event, TRUE, TRUE, TRUE);
+ IoSetCompletionRoutine(Irp, Hid_PnpCompletion, &Event, TRUE, TRUE, TRUE);
//
// send irp and wait for completion
Status = Irp->IoStatus.Status;
}
- //
- // free resources
- //
- if (HidDeviceExtension->HidDescriptor)
- {
- ExFreePool(HidDeviceExtension->HidDescriptor);
- HidDeviceExtension->HidDescriptor = NULL;
- }
-
//
// done
//
//
KeInitializeEvent(&Event, NotificationEvent, FALSE);
IoCopyCurrentIrpStackLocationToNext(Irp);
- IoSetCompletionRoutine(Irp, Hid_PnpCompletion, (PVOID)&Event, TRUE, TRUE, TRUE);
+ IoSetCompletionRoutine(Irp, Hid_PnpCompletion, &Event, TRUE, TRUE, TRUE);
//
// send irp and wait for completion
//
KeInitializeEvent(&Event, NotificationEvent, FALSE);
IoCopyCurrentIrpStackLocationToNext(Irp);
- IoSetCompletionRoutine(Irp, Hid_PnpCompletion, (PVOID)&Event, TRUE, TRUE, TRUE);
+ IoSetCompletionRoutine(Irp, Hid_PnpCompletion, &Event, TRUE, TRUE, TRUE);
//
// send irp and wait for completion
//
// get device extension
//
- DeviceExtension = (PHID_DEVICE_EXTENSION)DeviceObject->DeviceExtension;
- HidDeviceExtension = (PHID_USB_DEVICE_EXTENSION)DeviceExtension->MiniDeviceExtension;
+ DeviceExtension = DeviceObject->DeviceExtension;
+ HidDeviceExtension = DeviceExtension->MiniDeviceExtension;
//
// init event