mirror of
https://github.com/nefarius/ViGEmBus.git
synced 2025-08-10 00:52:17 +00:00
Merge branch 'master' into feature/api/vigem_target_x360_get_user_index
This commit is contained in:
95
sys/xusb.c
95
sys/xusb.c
@@ -24,6 +24,7 @@ SOFTWARE.
|
||||
|
||||
|
||||
#include "busenum.h"
|
||||
#include "xusb.tmh"
|
||||
|
||||
NTSTATUS Xusb_PreparePdo(
|
||||
PWDFDEVICE_INIT DeviceInit,
|
||||
@@ -38,7 +39,13 @@ NTSTATUS Xusb_PreparePdo(
|
||||
// prepare device description
|
||||
status = RtlUnicodeStringInit(DeviceDescription, L"Virtual Xbox 360 Controller");
|
||||
if (!NT_SUCCESS(status))
|
||||
{
|
||||
TraceEvents(TRACE_LEVEL_ERROR,
|
||||
TRACE_XUSB,
|
||||
"RtlUnicodeStringInit failed with status %!STATUS!",
|
||||
status);
|
||||
return status;
|
||||
}
|
||||
|
||||
// Set hardware ID
|
||||
RtlUnicodeStringPrintf(&buffer, L"USB\\VID_%04X&PID_%04X", VendorId, ProductId);
|
||||
@@ -47,32 +54,63 @@ NTSTATUS Xusb_PreparePdo(
|
||||
|
||||
status = WdfPdoInitAddHardwareID(DeviceInit, &buffer);
|
||||
if (!NT_SUCCESS(status))
|
||||
{
|
||||
TraceEvents(TRACE_LEVEL_ERROR,
|
||||
TRACE_XUSB,
|
||||
"WdfPdoInitAddHardwareID failed with status %!STATUS!",
|
||||
status);
|
||||
return status;
|
||||
}
|
||||
|
||||
|
||||
// Set compatible IDs
|
||||
RtlUnicodeStringInit(&buffer, L"USB\\MS_COMP_XUSB10");
|
||||
|
||||
status = WdfPdoInitAddCompatibleID(DeviceInit, &buffer);
|
||||
if (!NT_SUCCESS(status))
|
||||
{
|
||||
TraceEvents(TRACE_LEVEL_ERROR,
|
||||
TRACE_XUSB,
|
||||
"WdfPdoInitAddCompatibleID #1 failed with status %!STATUS!",
|
||||
status);
|
||||
return status;
|
||||
}
|
||||
|
||||
RtlUnicodeStringInit(&buffer, L"USB\\Class_FF&SubClass_5D&Prot_01");
|
||||
|
||||
status = WdfPdoInitAddCompatibleID(DeviceInit, &buffer);
|
||||
if (!NT_SUCCESS(status))
|
||||
{
|
||||
TraceEvents(TRACE_LEVEL_ERROR,
|
||||
TRACE_XUSB,
|
||||
"WdfPdoInitAddCompatibleID #2 failed with status %!STATUS!",
|
||||
status);
|
||||
return status;
|
||||
}
|
||||
|
||||
RtlUnicodeStringInit(&buffer, L"USB\\Class_FF&SubClass_5D");
|
||||
|
||||
status = WdfPdoInitAddCompatibleID(DeviceInit, &buffer);
|
||||
if (!NT_SUCCESS(status))
|
||||
{
|
||||
TraceEvents(TRACE_LEVEL_ERROR,
|
||||
TRACE_XUSB,
|
||||
"WdfPdoInitAddCompatibleID #3 failed with status %!STATUS!",
|
||||
status);
|
||||
return status;
|
||||
}
|
||||
|
||||
RtlUnicodeStringInit(&buffer, L"USB\\Class_FF");
|
||||
|
||||
status = WdfPdoInitAddCompatibleID(DeviceInit, &buffer);
|
||||
if (!NT_SUCCESS(status))
|
||||
{
|
||||
TraceEvents(TRACE_LEVEL_ERROR,
|
||||
TRACE_XUSB,
|
||||
"WdfPdoInitAddCompatibleID #4 failed with status %!STATUS!",
|
||||
status);
|
||||
return status;
|
||||
}
|
||||
|
||||
return STATUS_SUCCESS;
|
||||
}
|
||||
@@ -101,7 +139,10 @@ NTSTATUS Xusb_PrepareHardware(WDFDEVICE Device)
|
||||
status = WdfDeviceAddQueryInterface(Device, &ifaceCfg);
|
||||
if (!NT_SUCCESS(status))
|
||||
{
|
||||
KdPrint((DRIVERNAME "Couldn't register unknown interface GUID: %08X-%04X-%04X-%02X%02X%02X%02X%02X%02X%02X%02X (status 0x%x)\n",
|
||||
TraceEvents(TRACE_LEVEL_ERROR,
|
||||
TRACE_XUSB,
|
||||
"Couldn't register unknown interface GUID: %08X-%04X-%04X-%02X%02X%02X%02X%02X%02X%02X%02X " \
|
||||
"(WdfDeviceAddQueryInterface failed with status %!STATUS!)",
|
||||
GUID_DEVINTERFACE_XUSB_UNKNOWN_0.Data1,
|
||||
GUID_DEVINTERFACE_XUSB_UNKNOWN_0.Data2,
|
||||
GUID_DEVINTERFACE_XUSB_UNKNOWN_0.Data3,
|
||||
@@ -113,7 +154,7 @@ NTSTATUS Xusb_PrepareHardware(WDFDEVICE Device)
|
||||
GUID_DEVINTERFACE_XUSB_UNKNOWN_0.Data4[5],
|
||||
GUID_DEVINTERFACE_XUSB_UNKNOWN_0.Data4[6],
|
||||
GUID_DEVINTERFACE_XUSB_UNKNOWN_0.Data4[7],
|
||||
status));
|
||||
status);
|
||||
|
||||
return status;
|
||||
}
|
||||
@@ -125,7 +166,10 @@ NTSTATUS Xusb_PrepareHardware(WDFDEVICE Device)
|
||||
status = WdfDeviceAddQueryInterface(Device, &ifaceCfg);
|
||||
if (!NT_SUCCESS(status))
|
||||
{
|
||||
KdPrint((DRIVERNAME "Couldn't register unknown interface GUID: %08X-%04X-%04X-%02X%02X%02X%02X%02X%02X%02X%02X (status 0x%x)\n",
|
||||
TraceEvents(TRACE_LEVEL_ERROR,
|
||||
TRACE_XUSB,
|
||||
"Couldn't register unknown interface GUID: %08X-%04X-%04X-%02X%02X%02X%02X%02X%02X%02X%02X " \
|
||||
"(WdfDeviceAddQueryInterface failed with status %!STATUS!)",
|
||||
GUID_DEVINTERFACE_XUSB_UNKNOWN_1.Data1,
|
||||
GUID_DEVINTERFACE_XUSB_UNKNOWN_1.Data2,
|
||||
GUID_DEVINTERFACE_XUSB_UNKNOWN_1.Data3,
|
||||
@@ -137,7 +181,7 @@ NTSTATUS Xusb_PrepareHardware(WDFDEVICE Device)
|
||||
GUID_DEVINTERFACE_XUSB_UNKNOWN_1.Data4[5],
|
||||
GUID_DEVINTERFACE_XUSB_UNKNOWN_1.Data4[6],
|
||||
GUID_DEVINTERFACE_XUSB_UNKNOWN_1.Data4[7],
|
||||
status));
|
||||
status);
|
||||
|
||||
return status;
|
||||
}
|
||||
@@ -149,7 +193,10 @@ NTSTATUS Xusb_PrepareHardware(WDFDEVICE Device)
|
||||
status = WdfDeviceAddQueryInterface(Device, &ifaceCfg);
|
||||
if (!NT_SUCCESS(status))
|
||||
{
|
||||
KdPrint((DRIVERNAME "Couldn't register unknown interface GUID: %08X-%04X-%04X-%02X%02X%02X%02X%02X%02X%02X%02X (status 0x%x)\n",
|
||||
TraceEvents(TRACE_LEVEL_ERROR,
|
||||
TRACE_XUSB,
|
||||
"Couldn't register unknown interface GUID: %08X-%04X-%04X-%02X%02X%02X%02X%02X%02X%02X%02X " \
|
||||
"(WdfDeviceAddQueryInterface failed with status %!STATUS!)",
|
||||
GUID_DEVINTERFACE_XUSB_UNKNOWN_2.Data1,
|
||||
GUID_DEVINTERFACE_XUSB_UNKNOWN_2.Data2,
|
||||
GUID_DEVINTERFACE_XUSB_UNKNOWN_2.Data3,
|
||||
@@ -161,7 +208,7 @@ NTSTATUS Xusb_PrepareHardware(WDFDEVICE Device)
|
||||
GUID_DEVINTERFACE_XUSB_UNKNOWN_2.Data4[5],
|
||||
GUID_DEVINTERFACE_XUSB_UNKNOWN_2.Data4[6],
|
||||
GUID_DEVINTERFACE_XUSB_UNKNOWN_2.Data4[7],
|
||||
status));
|
||||
status);
|
||||
|
||||
return status;
|
||||
}
|
||||
@@ -189,7 +236,10 @@ NTSTATUS Xusb_PrepareHardware(WDFDEVICE Device)
|
||||
status = WdfDeviceAddQueryInterface(Device, &ifaceCfg);
|
||||
if (!NT_SUCCESS(status))
|
||||
{
|
||||
KdPrint((DRIVERNAME "WdfDeviceAddQueryInterface failed status 0x%x\n", status));
|
||||
TraceEvents(TRACE_LEVEL_ERROR,
|
||||
TRACE_XUSB,
|
||||
"WdfDeviceAddQueryInterface failed with status %!STATUS!",
|
||||
status);
|
||||
return status;
|
||||
}
|
||||
|
||||
@@ -204,7 +254,7 @@ NTSTATUS Xusb_AssignPdoContext(WDFDEVICE Device, PPDO_IDENTIFICATION_DESCRIPTION
|
||||
WDF_OBJECT_ATTRIBUTES_INIT(&attributes);
|
||||
attributes.ParentObject = Device;
|
||||
|
||||
KdPrint((DRIVERNAME "Initializing XUSB context...\n"));
|
||||
TraceEvents(TRACE_LEVEL_VERBOSE, TRACE_XUSB, "Initializing XUSB context...");
|
||||
|
||||
PXUSB_DEVICE_DATA xusb = XusbGetData(Device);
|
||||
|
||||
@@ -224,7 +274,10 @@ NTSTATUS Xusb_AssignPdoContext(WDFDEVICE Device, PPDO_IDENTIFICATION_DESCRIPTION
|
||||
status = WdfIoQueueCreate(Device, &holdingInQueueConfig, WDF_NO_OBJECT_ATTRIBUTES, &xusb->HoldingUsbInRequests);
|
||||
if (!NT_SUCCESS(status))
|
||||
{
|
||||
KdPrint((DRIVERNAME "WdfIoQueueCreate (HoldingUsbInRequests) failed 0x%x\n", status));
|
||||
TraceEvents(TRACE_LEVEL_ERROR,
|
||||
TRACE_XUSB,
|
||||
"WdfIoQueueCreate (HoldingUsbInRequests) failed with status %!STATUS!",
|
||||
status);
|
||||
return status;
|
||||
}
|
||||
|
||||
@@ -393,11 +446,13 @@ VOID Xusb_GetDeviceDescriptorType(PUSB_DEVICE_DESCRIPTOR pDescriptor, PPDO_DEVIC
|
||||
|
||||
VOID Xusb_SelectConfiguration(PUSBD_INTERFACE_INFORMATION pInfo)
|
||||
{
|
||||
KdPrint((DRIVERNAME ">> >> >> URB_FUNCTION_SELECT_CONFIGURATION: Length %d, Interface %d, Alternate %d, Pipes %d\n",
|
||||
TraceEvents(TRACE_LEVEL_VERBOSE,
|
||||
TRACE_XUSB,
|
||||
">> >> >> URB_FUNCTION_SELECT_CONFIGURATION: Length %d, Interface %d, Alternate %d, Pipes %d",
|
||||
(int)pInfo->Length,
|
||||
(int)pInfo->InterfaceNumber,
|
||||
(int)pInfo->AlternateSetting,
|
||||
pInfo->NumberOfPipes));
|
||||
pInfo->NumberOfPipes);
|
||||
|
||||
pInfo->Class = 0xFF;
|
||||
pInfo->SubClass = 0x5D;
|
||||
@@ -423,11 +478,13 @@ VOID Xusb_SelectConfiguration(PUSBD_INTERFACE_INFORMATION pInfo)
|
||||
|
||||
pInfo = (PUSBD_INTERFACE_INFORMATION)((PCHAR)pInfo + pInfo->Length);
|
||||
|
||||
KdPrint((DRIVERNAME ">> >> >> URB_FUNCTION_SELECT_CONFIGURATION: Length %d, Interface %d, Alternate %d, Pipes %d\n",
|
||||
TraceEvents(TRACE_LEVEL_VERBOSE,
|
||||
TRACE_XUSB,
|
||||
">> >> >> URB_FUNCTION_SELECT_CONFIGURATION: Length %d, Interface %d, Alternate %d, Pipes %d",
|
||||
(int)pInfo->Length,
|
||||
(int)pInfo->InterfaceNumber,
|
||||
(int)pInfo->AlternateSetting,
|
||||
pInfo->NumberOfPipes));
|
||||
pInfo->NumberOfPipes);
|
||||
|
||||
pInfo->Class = 0xFF;
|
||||
pInfo->SubClass = 0x5D;
|
||||
@@ -469,11 +526,13 @@ VOID Xusb_SelectConfiguration(PUSBD_INTERFACE_INFORMATION pInfo)
|
||||
|
||||
pInfo = (PUSBD_INTERFACE_INFORMATION)((PCHAR)pInfo + pInfo->Length);
|
||||
|
||||
KdPrint((DRIVERNAME ">> >> >> URB_FUNCTION_SELECT_CONFIGURATION: Length %d, Interface %d, Alternate %d, Pipes %d\n",
|
||||
TraceEvents(TRACE_LEVEL_VERBOSE,
|
||||
TRACE_XUSB,
|
||||
">> >> >> URB_FUNCTION_SELECT_CONFIGURATION: Length %d, Interface %d, Alternate %d, Pipes %d",
|
||||
(int)pInfo->Length,
|
||||
(int)pInfo->InterfaceNumber,
|
||||
(int)pInfo->AlternateSetting,
|
||||
pInfo->NumberOfPipes));
|
||||
pInfo->NumberOfPipes);
|
||||
|
||||
pInfo->Class = 0xFF;
|
||||
pInfo->SubClass = 0x5D;
|
||||
@@ -491,11 +550,13 @@ VOID Xusb_SelectConfiguration(PUSBD_INTERFACE_INFORMATION pInfo)
|
||||
|
||||
pInfo = (PUSBD_INTERFACE_INFORMATION)((PCHAR)pInfo + pInfo->Length);
|
||||
|
||||
KdPrint((DRIVERNAME ">> >> >> URB_FUNCTION_SELECT_CONFIGURATION: Length %d, Interface %d, Alternate %d, Pipes %d\n",
|
||||
TraceEvents(TRACE_LEVEL_VERBOSE,
|
||||
TRACE_XUSB,
|
||||
">> >> >> URB_FUNCTION_SELECT_CONFIGURATION: Length %d, Interface %d, Alternate %d, Pipes %d",
|
||||
(int)pInfo->Length,
|
||||
(int)pInfo->InterfaceNumber,
|
||||
(int)pInfo->AlternateSetting,
|
||||
pInfo->NumberOfPipes));
|
||||
pInfo->NumberOfPipes);
|
||||
|
||||
pInfo->Class = 0xFF;
|
||||
pInfo->SubClass = 0xFD;
|
||||
|
||||
Reference in New Issue
Block a user