Index: drivers/libusb/hub_controller.cpp =================================================================== --- drivers/libusb/hub_controller.cpp (revision 57603) +++ drivers/libusb/hub_controller.cpp (working copy) @@ -740,6 +740,12 @@ Status = STATUS_SUCCESS; break; } + case IRP_MN_SURPRISE_REMOVAL: + { + DPRINT("[USBLIB] HandlePnp IRP_MN_SURPRISE_REMOVAL\n"); + Status = STATUS_SUCCESS; + break; + } default: { // @@ -1827,6 +1833,7 @@ NTSTATUS Status = STATUS_NOT_IMPLEMENTED; PUSBDEVICE UsbDevice; USB_DEFAULT_PIPE_SETUP_PACKET CtrlSetup; + PVOID TransferBuffer = NULL; DPRINT("CHubController::HandleVendorDevice Request %x\n", Urb->UrbControlVendorClassRequest.Request); @@ -1872,12 +1879,26 @@ CtrlSetup.bmRequestType._BM.Dir = BMREQUEST_DEVICE_TO_HOST; } + if (Urb->UrbControlVendorClassRequest.TransferBufferLength > 0) + { + TransferBuffer = ExAllocatePool(NonPagedPool, Urb->UrbControlVendorClassRequest.TransferBufferLength); + ASSERT(TransferBuffer); + } + + // // issue request // - Status = UsbDevice->SubmitSetupPacket(&CtrlSetup, Urb->UrbControlVendorClassRequest.TransferBufferLength, Urb->UrbControlVendorClassRequest.TransferBuffer); - PC_ASSERT(NT_SUCCESS(Status)); + Status = UsbDevice->SubmitSetupPacket(&CtrlSetup, Urb->UrbControlVendorClassRequest.TransferBufferLength, TransferBuffer); + if (Urb->UrbControlVendorClassRequest.TransferBufferLength > 0) + { + RtlCopyMemory(Urb->UrbControlVendorClassRequest.TransferBuffer, TransferBuffer, Urb->UrbControlVendorClassRequest.TransferBufferLength); + ExFreePool(TransferBuffer); + } + + + return Status; }