mirror of
https://github.com/nefarius/ViGEmBus.git
synced 2025-08-10 00:52:17 +00:00
Implemented UsbControlTransfer
This commit is contained in:
@@ -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
|
||||
)
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user