Implemented UsbControlTransfer

This commit is contained in:
Benjamin Höglinger-Stelzer
2020-05-11 14:09:32 +02:00
parent 14ee423fc1
commit 0e278ebe21
6 changed files with 76 additions and 36 deletions

View File

@@ -1033,6 +1033,34 @@ NTSTATUS ViGEm::Bus::Targets::EmulationTargetDS4::UsbBulkOrInterruptTransfer(_UR
return status;
}
NTSTATUS ViGEm::Bus::Targets::EmulationTargetDS4::UsbControlTransfer(PURB Urb)
{
NTSTATUS status;
switch (Urb->UrbControlTransfer.SetupPacket[6])
{
case 0x14:
//
// This is some weird USB 1.0 condition and _must fail_
//
Urb->UrbControlTransfer.Hdr.Status = USBD_STATUS_STALL_PID;
status = STATUS_UNSUCCESSFUL;
break;
case 0x08:
//
// This is some weird USB 1.0 condition and _must fail_
//
Urb->UrbControlTransfer.Hdr.Status = USBD_STATUS_STALL_PID;
status = STATUS_UNSUCCESSFUL;
break;
default:
status = STATUS_SUCCESS;
break;
}
return status;
}
VOID ViGEm::Bus::Targets::EmulationTargetDS4::PendingUsbRequestsTimerFunc(
_In_ WDFTIMER Timer
)

View File

@@ -44,6 +44,7 @@ namespace ViGEm::Bus::Targets
NTSTATUS UsbSelectInterface(PURB Urb) override;
NTSTATUS UsbGetStringDescriptorType(PURB Urb) override;
NTSTATUS UsbBulkOrInterruptTransfer(_URB_BULK_OR_INTERRUPT_TRANSFER* pTransfer, WDFREQUEST Request) override;
NTSTATUS UsbControlTransfer(PURB Urb) override;
private:
static PCWSTR _deviceDescription;

View File

@@ -483,42 +483,7 @@ VOID ViGEm::Bus::Core::EmulationTargetPDO::EvtIoInternalDeviceControl(
TRACE_BUSPDO,
">> >> URB_FUNCTION_CONTROL_TRANSFER");
//switch (urb->UrbControlTransfer.SetupPacket[6])
//{
//case 0x04:
// if (pdoData->TargetType == Xbox360Wired)
// {
// pXusbData = XusbGetData(hDevice);
// blobBuffer = WdfMemoryGetBuffer(pXusbData->InterruptBlobStorage, NULL);
// //
// // Xenon magic
// //
// RtlCopyMemory(
// urb->UrbControlTransfer.TransferBuffer,
// &blobBuffer[XUSB_BLOB_07_OFFSET],
// 0x04
// );
// status = STATUS_SUCCESS;
// }
// break;
//case 0x14:
// //
// // This is some weird USB 1.0 condition and _must fail_
// //
// urb->UrbControlTransfer.Hdr.Status = USBD_STATUS_STALL_PID;
// status = STATUS_UNSUCCESSFUL;
// break;
//case 0x08:
// //
// // This is some weird USB 1.0 condition and _must fail_
// //
// urb->UrbControlTransfer.Hdr.Status = USBD_STATUS_STALL_PID;
// status = STATUS_UNSUCCESSFUL;
// break;
//default:
// status = STATUS_SUCCESS;
// break;
//}
status = ctx->Target->UsbControlTransfer(urb);
break;

View File

@@ -70,6 +70,8 @@ namespace ViGEm::Bus::Core
virtual NTSTATUS UsbBulkOrInterruptTransfer(struct _URB_BULK_OR_INTERRUPT_TRANSFER* pTransfer, WDFREQUEST Request) = 0;
virtual NTSTATUS UsbControlTransfer(PURB Urb) = 0;
protected:
static const ULONG _maxHardwareIdLength = 0xFF;

View File

@@ -917,3 +917,46 @@ NTSTATUS ViGEm::Bus::Targets::EmulationTargetXUSB::UsbBulkOrInterruptTransfer(_U
return status;
}
NTSTATUS ViGEm::Bus::Targets::EmulationTargetXUSB::UsbControlTransfer(PURB Urb)
{
NTSTATUS status;
PUCHAR blobBuffer;
switch (Urb->UrbControlTransfer.SetupPacket[6])
{
case 0x04:
blobBuffer = (PUCHAR)WdfMemoryGetBuffer(this->InterruptBlobStorage, NULL);
//
// Xenon magic
//
RtlCopyMemory(
Urb->UrbControlTransfer.TransferBuffer,
&blobBuffer[XUSB_BLOB_07_OFFSET],
0x04
);
status = STATUS_SUCCESS;
break;
case 0x14:
//
// This is some weird USB 1.0 condition and _must fail_
//
Urb->UrbControlTransfer.Hdr.Status = USBD_STATUS_STALL_PID;
status = STATUS_UNSUCCESSFUL;
break;
case 0x08:
//
// This is some weird USB 1.0 condition and _must fail_
//
Urb->UrbControlTransfer.Hdr.Status = USBD_STATUS_STALL_PID;
status = STATUS_UNSUCCESSFUL;
break;
default:
status = STATUS_SUCCESS;
break;
}
return status;
}

View File

@@ -52,6 +52,7 @@ namespace ViGEm::Bus::Targets
NTSTATUS UsbSelectInterface(PURB Urb) override;
NTSTATUS UsbGetStringDescriptorType(PURB Urb) override;
NTSTATUS UsbBulkOrInterruptTransfer(_URB_BULK_OR_INTERRUPT_TRANSFER* pTransfer, WDFREQUEST Request) override;
NTSTATUS UsbControlTransfer(PURB Urb) override;
private:
static PCWSTR _deviceDescription;