104 sizeof(FilterAudioVolumePropertySet) /
sizeof(KSPROPERTY_ITEM),
105 (
const KSPROPERTY_ITEM*)&FilterAudioVolumePropertySet,
115 sizeof(FilterAudioMutePropertySet) /
sizeof(KSPROPERTY_ITEM),
116 (
const KSPROPERTY_ITEM*)&FilterAudioMutePropertySet,
154 TransferBufferLength,
173 for (NodeIndex = 0; NodeIndex < NodeContext[
Index].NodeCount; NodeIndex++)
175 if (NodeContext[
Index].Nodes[NodeIndex] == NodeId)
177 return &NodeContext[
Index];
218 Irp->IoStatus.Information =
sizeof(
BOOL);
273 Irp->IoStatus.Information =
sizeof(
BOOL);
286 if (TransferBuffer[0] >
Value)
289 Value = TransferBuffer[0];
292 if (TransferBuffer[1] <
Value)
295 Value = TransferBuffer[1];
299 TransferBuffer[2] =
Value;
306 Irp->IoStatus.Information =
sizeof(
LONG);
330 ULONG DescriptorCount = 0;
340 if (InterfaceHeaderDescriptor !=
NULL)
343 while (CommonDescriptor)
385 NodeCount += MixerUnitDescriptor->
bNrInPins + 1;
403 *OutDescriptorCount = DescriptorCount;
420 return &NodeContext[
Index];
431 ULONG NodeCount,
Index, DescriptorCount, StreamingTerminalIndex, NonStreamingTerminalDescriptorCount, TotalTerminalDescriptorCount, StreamingTerminalPinOffset, ControlDescriptorCount,
Length;
441 PKSNODE_DESCRIPTOR NodeDescriptors;
444 PKSAUTOMATION_TABLE AutomationTable;
447 DeviceExtension =
Device->Context;
467 DeviceExtension->NodeContextCount = ControlDescriptorCount;
478 if (InterfaceHeaderDescriptor !=
NULL)
481 while (CommonDescriptor)
493 NodeContext[DescriptorCount].
Descriptor = CommonDescriptor;
494 NodeContext[DescriptorCount].
NodeCount = 1;
500 else if ((InputTerminalDescriptor->
wTerminalType & 0xFF00) == 0x200)
507 NodeContext[DescriptorCount].
Descriptor = CommonDescriptor;
508 NodeContext[DescriptorCount].
NodeCount = 1;
515 else if ((InputTerminalDescriptor->
wTerminalType & 0xFF00) == 0x300)
522 NodeContext[DescriptorCount].
Descriptor = CommonDescriptor;
523 NodeContext[DescriptorCount].
NodeCount = 1;
543 NodeContext[DescriptorCount].
Descriptor = CommonDescriptor;
544 NodeContext[DescriptorCount].
NodeCount = 1;
550 else if ((InputTerminalDescriptor->
wTerminalType & 0xFF00) == 0x300)
557 NodeContext[DescriptorCount].
Descriptor = CommonDescriptor;
558 NodeContext[DescriptorCount].
NodeCount = 1;
591 AutomationTable->PropertySetsCount = 1;
592 AutomationTable->PropertyItemSize =
sizeof(KSPROPERTY_ITEM);
597 NodeContext[DescriptorCount].
NodeCount++;
609 AutomationTable->PropertySetsCount = 1;
610 AutomationTable->PropertyItemSize =
sizeof(KSPROPERTY_ITEM);
615 NodeContext[DescriptorCount].
NodeCount++;
628 NodeContext[DescriptorCount].
NodeCount++;
641 NodeContext[DescriptorCount].
NodeCount++;
654 NodeContext[DescriptorCount].
NodeCount++;
668 NodeContext[DescriptorCount].
NodeCount++;
681 NodeContext[DescriptorCount].
NodeCount++;
695 NodeContext[DescriptorCount].
NodeCount++;
699 NodeContext[DescriptorCount].
Descriptor = CommonDescriptor;
714 NodeContext[DescriptorCount].
NodeCount++;
725 NodeContext[DescriptorCount].
NodeCount++;
726 NodeContext[DescriptorCount].
Descriptor = CommonDescriptor;
738 NodeContext[DescriptorCount].
Descriptor = CommonDescriptor;
739 NodeContext[DescriptorCount].
NodeCount = 1;
767 StreamingTerminalIndex = 0;
770 CountTerminalUnits(DeviceExtension->ConfigurationDescriptor, &NonStreamingTerminalDescriptorCount, &TotalTerminalDescriptorCount);
771 StreamingTerminalPinOffset = TotalTerminalDescriptorCount - NonStreamingTerminalDescriptorCount;
780 if (InterfaceHeaderDescriptor !=
NULL)
783 while (CommonDescriptor)
795 StreamingTerminalIndex++;
805 StreamingTerminalPinOffset++;
813 if (PreviousNodeContext)
829 StreamingTerminalIndex++;
839 StreamingTerminalPinOffset++;
847 if (PreviousNodeContext)
873 if (PreviousNodeContext)
897 if (PreviousNodeContext)
931 PKSFILTERFACTORY FilterFactory;
936 if (FilterFactory ==
NULL)
972 OUT PULONG NonStreamingTerminalDescriptorCount,
979 ULONG NonStreamingTerminalCount = 0;
980 ULONG TotalTerminalCount = 0;
989 if (InterfaceHeaderDescriptor !=
NULL)
992 while (CommonDescriptor)
999 NonStreamingTerminalCount++;
1001 TotalTerminalCount++;
1009 else if (
Descriptor->bInterfaceSubClass == 0x03)
1014 *NonStreamingTerminalDescriptorCount = NonStreamingTerminalCount;
1015 *TotalTerminalDescriptorCount = TotalTerminalCount;
1071 ULONG TerminalCount = 0;
1080 if (InterfaceHeaderDescriptor !=
NULL)
1083 while (CommonDescriptor)
1090 if (TerminalCount ==
Index)
1092 return InputTerminalDescriptor;
1117 ULONG TerminalCount = 0;
1126 if (InterfaceHeaderDescriptor !=
NULL)
1129 while (CommonDescriptor)
1136 if (TerminalCount ==
Index)
1138 return InputTerminalDescriptor;
1165 ULONG NumFrequency, DataRangeCount, DataRangeIndex,
Index;
1176 if (StreamingInterfaceDescriptor !=
NULL)
1180 if (StreamingInterfaceDescriptor->
bTerminalLink == bTerminalID)
1183 DPRINT1(
"StreamingInterfaceDescriptor %p TerminalID %x\n", StreamingInterfaceDescriptor, bTerminalID);
1191 if (DataRangeAudioArray ==
NULL)
1205 if (StreamingInterfaceDescriptor !=
NULL)
1209 if (StreamingInterfaceDescriptor->
bTerminalLink == bTerminalID)
1217 if (DataRangeAudio ==
NULL)
1230 NumFrequency = StreamingFormatDescriptor->
bSamFreqType;
1238 DataRangeAudioArray[DataRangeIndex] = (
PKSDATARANGE)DataRangeAudio;
1246 *OutDataRanges = DataRangeAudioArray;
1247 *OutDataRangesCount = DataRangeCount;
1255 PULONG PinDescriptorsCount,
1256 PULONG PinDescriptorSize)
1259 PKSPIN_DESCRIPTOR_EX Pins;
1260 ULONG TotalTerminalDescriptorCount = 0;
1261 ULONG NonStreamingTerminalDescriptorCount = 0;
1266 DeviceExtension =
Device->Context;
1268 CountTerminalUnits(DeviceExtension->ConfigurationDescriptor, &NonStreamingTerminalDescriptorCount, &TotalTerminalDescriptorCount);
1269 DPRINT(
"TotalTerminalDescriptorCount %lu NonStreamingTerminalDescriptorCount %lu\n", TotalTerminalDescriptorCount, NonStreamingTerminalDescriptorCount);
1272 Pins =
AllocFunction(
sizeof(KSPIN_DESCRIPTOR_EX) * TotalTerminalDescriptorCount);
1281 if (
Index < (TotalTerminalDescriptorCount - NonStreamingTerminalDescriptorCount))
1288 Pins[
Index].PinDescriptor.InterfacesCount = 1;
1290 Pins[
Index].PinDescriptor.MediumsCount = 1;
1301 Pins[
Index].Flags = KSPIN_FLAG_PROCESS_IN_RUN_STATE_ONLY | KSFILTER_FLAG_CRITICAL_PROCESSING;
1309 Pins[
Index].Flags = KSPIN_FLAG_PROCESS_IN_RUN_STATE_ONLY | KSPIN_FLAG_GENERATE_EOS_EVENTS;
1316 Pins[
Index].InstancesPossible = 1;
1322 Pins[
Index].PinDescriptor.InterfacesCount = 1;
1324 Pins[
Index].PinDescriptor.MediumsCount = 1;
1327 Pins[
Index].PinDescriptor.DataRangesCount = 1;
1344 *PinDescriptorSize =
sizeof(KSPIN_DESCRIPTOR_EX);
1345 *PinDescriptorsCount = TotalTerminalDescriptorCount;
1367 ASSERT(DescriptorLength);
1479 LPWSTR DescriptionBuffer;
1486 DeviceExtension =
Device->Context;
1495 INIT_USBAUDIO_PRODUCT_NAME(&TempGuid, DeviceExtension->DeviceDescriptor->idVendor, DeviceExtension->DeviceDescriptor->idProduct, 0);
1497 if (DeviceExtension->DeviceDescriptor->iProduct)
ACPI_BUFFER *RetBuffer ACPI_BUFFER *RetBuffer char ACPI_WALK_RESOURCE_CALLBACK void *Context ACPI_BUFFER *RetBuffer UINT16 ACPI_RESOURCE **ResourcePtr ACPI_GENERIC_ADDRESS *Reg UINT32 *ReturnValue UINT8 UINT8 *Slp_TypB ACPI_PHYSICAL_ADDRESS PhysicalAddress64 UINT32 UINT32 *TimeElapsed UINT32 ACPI_STATUS const char UINT32 ACPI_STATUS const char UINT32 const char const char UINT32 ComponentId
NTSTATUS NTAPI KsAddItemToObjectBag(IN KSOBJECT_BAG ObjectBag, IN PVOID Item, IN PFNKSFREE Free OPTIONAL)
IN PUNICODE_STRING IN POBJECT_ATTRIBUTES ObjectAttributes
#define NT_SUCCESS(StatCode)
static const WCHAR Connections[]
KSDDKAPI PKSFILTER NTAPI KsGetFilterFromIrp(IN PIRP Irp)
KSDDKAPI PVOID NTAPI KsGetParent(IN PVOID Object)
GUID NodeTypeCommunicationSpeaker
static KSFILTER_DISPATCH USBAudioFilterDispatch
NTSTATUS BuildUSBAudioFilterTopology(PKSDEVICE Device, PKSFILTER_DESCRIPTOR FilterDescriptor)
PUSB_AUDIO_CONTROL_INPUT_TERMINAL_DESCRIPTOR UsbAudioGetStreamingTerminalDescriptorByIndex(IN PUSB_CONFIGURATION_DESCRIPTOR ConfigurationDescriptor, IN ULONG Index)
GUID NodeTypePersonalMicrophone
VOID NTAPI CountTerminalUnits(IN PUSB_CONFIGURATION_DESCRIPTOR ConfigurationDescriptor, OUT PULONG NonStreamingTerminalDescriptorCount, OUT PULONG TotalTerminalDescriptorCount)
GUID NodeTypeHeadphonesSpeaker
PNODE_CONTEXT FindNodeContextWithNode(IN PNODE_CONTEXT NodeContext, IN ULONG NodeContextCount, IN ULONG NodeId)
GUID NodeTypeDesktopSpeaker
NTSTATUS USBAudioRegCreateMediaCategoriesKey(IN PUNICODE_STRING Name, OUT PHANDLE OutHandle)
PNODE_CONTEXT FindNodeContextWithId(IN PNODE_CONTEXT NodeContext, IN ULONG NodeContextCount, IN UCHAR TerminalId)
GUID NodeTypeOmmniMicrophone
NTSTATUS NTAPI USBAudioFilterCreate(PKSFILTER Filter, PIRP Irp)
PUSB_AUDIO_CONTROL_INPUT_TERMINAL_DESCRIPTOR UsbAudioGetNonStreamingTerminalDescriptorByIndex(IN PUSB_CONFIGURATION_DESCRIPTOR ConfigurationDescriptor, IN ULONG Index)
KSDATARANGE BridgePinAudioFormat[]
static KSPROPERTY_SET FilterAudioVolumePropertySetArray[]
static PKSDATARANGE BridgePinAudioFormats[]
GUID NodeTypeDesktopMicrophone
KSPIN_MEDIUM StandardPinMedium
NTSTATUS NTAPI USBAudioGetStringDescriptor(IN PDEVICE_OBJECT DeviceObject, IN ULONG DescriptorLength, IN UCHAR DescriptorIndex, IN LANGID LanguageId, OUT PVOID *OutDescriptor)
GUID GUID_KSCATEGORY_AUDIO
NTSTATUS USBAudioPinBuildDescriptors(PKSDEVICE Device, PKSPIN_DESCRIPTOR_EX *PinDescriptors, PULONG PinDescriptorsCount, PULONG PinDescriptorSize)
static KSPIN_DISPATCH UsbAudioPinDispatch
static KSPROPERTY_SET FilterAudioMutePropertySetArray[]
GUID NodeTypeArrayMicrophone
NTSTATUS USBAudioInitComponentId(PKSDEVICE Device, IN PKSCOMPONENTID ComponentId)
NTSTATUS NTAPI FilterAudioVolumeHandler(IN PIRP Irp, IN PKSIDENTIFIER Request, IN OUT PVOID Data)
KSPIN_INTERFACE StandardPinInterface
NTSTATUS UsbAudioGetSetProperty(IN PDEVICE_OBJECT DeviceObject, IN UCHAR Request, IN USHORT Value, IN USHORT Index, IN PVOID TransferBuffer, IN ULONG TransferBufferLength, IN ULONG TransferFlags)
ULONG CountTopologyComponents(IN PUSB_CONFIGURATION_DESCRIPTOR ConfigurationDescriptor, OUT PULONG OutDescriptorCount)
GUID NodeTypeProcessingArrayMicrophone
NTSTATUS NTAPI USBAudioGetDescriptor(IN PDEVICE_OBJECT DeviceObject, IN UCHAR DescriptorType, IN ULONG DescriptorLength, IN UCHAR DescriptorIndex, IN LANGID LanguageId, OUT PVOID *OutDescriptor)
NTSTATUS NTAPI USBAudioCreateFilterContext(PKSDEVICE Device)
VOID UsbAudioGetDataRanges(IN PUSB_CONFIGURATION_DESCRIPTOR ConfigurationDescriptor, IN UCHAR bTerminalID, OUT PKSDATARANGE **OutDataRanges, OUT PULONG OutDataRangesCount)
LPGUID UsbAudioGetPinCategoryFromTerminalDescriptor(IN PUSB_AUDIO_CONTROL_INPUT_TERMINAL_DESCRIPTOR TerminalDescriptor)
NTSTATUS NTAPI FilterAudioMuteHandler(IN PIRP Irp, IN PKSIDENTIFIER Request, IN OUT PVOID Data)
NTSTATUS NTAPI USBAudioPinCreate(_In_ PKSPIN Pin, _In_ PIRP Irp)
VOID NTAPI USBAudioPinReset(_In_ PKSPIN Pin)
NTSTATUS NTAPI USBAudioPinProcess(_In_ PKSPIN Pin)
NTSTATUS NTAPI USBAudioPinClose(_In_ PKSPIN Pin, _In_ PIRP Irp)
NTSTATUS NTAPI UsbAudioPinDataIntersect(_In_ PVOID Context, _In_ PIRP Irp, _In_ PKSP_PIN Pin, _In_ PKSDATARANGE DataRange, _In_ PKSDATARANGE MatchingDataRange, _In_ ULONG DataBufferSize, _Out_ PVOID Data, _Out_ PULONG DataSize)
NTSTATUS NTAPI USBAudioPinSetDeviceState(_In_ PKSPIN Pin, _In_ KSSTATE ToState, _In_ KSSTATE FromState)
NTSTATUS NTAPI USBAudioPinSetDataFormat(_In_ PKSPIN Pin, _In_opt_ PKSDATAFORMAT OldFormat, _In_opt_ PKSMULTIPLE_ITEM OldAttributeList, _In_ const KSDATARANGE *DataRange, _In_opt_ const KSATTRIBUTE_LIST *AttributeRange)
#define KSPROPERTY_TYPE_GET
KSDDKAPI NTSTATUS NTAPI KsCreateFilterFactory(IN PDEVICE_OBJECT DeviceObject, IN const KSFILTER_DESCRIPTOR *Descriptor, IN PWSTR RefString OPTIONAL, IN PSECURITY_DESCRIPTOR SecurityDescriptor OPTIONAL, IN ULONG CreateItemFlags, IN PFNKSFILTERFACTORYPOWER SleepCallback OPTIONAL, IN PFNKSFILTERFACTORYPOWER WakeCallback OPTIONAL, OUT PKSFILTERFACTORY *FilterFactory OPTIONAL)
_Must_inspect_result_ _In_opt_ PFLT_FILTER Filter
_In_ PLIST_ENTRY _In_ PSTRING _In_ USHORT _In_opt_ PSTRING _In_opt_ PSTRING _In_ ULONG _In_ ULONG _In_opt_ PVOID _In_opt_ PVOID FilterContext
PVOID NTAPI AllocFunction(IN ULONG ItemSize)
VOID NTAPI FreeFunction(IN PVOID Item)
_CRTIMP size_t __cdecl wcslen(_In_z_ const wchar_t *_Str)
#define OBJ_KERNEL_HANDLE
#define OBJ_CASE_INSENSITIVE
NTSYSAPI NTSTATUS WINAPI RtlStringFromGUID(REFGUID, PUNICODE_STRING)
#define STATIC_KSINTERFACESETID_Standard
#define KSMEDIUM_TYPE_ANYINSTANCE
#define STATIC_KSDATAFORMAT_SPECIFIER_NONE
#define STATIC_KSMEDIUMSETID_Standard
@ KSPIN_COMMUNICATION_BRIDGE
@ KSPIN_COMMUNICATION_BOTH
@ KSPIN_COMMUNICATION_SINK
@ KSINTERFACE_STANDARD_STREAMING
union KSDATAFORMAT * PKSDATARANGE
#define InitializeObjectAttributes(p, n, a, r, s)
NTSYSAPI NTSTATUS NTAPI ZwClose(_In_ HANDLE Handle)
_Out_ _Inout_ POEM_STRING DestinationString
NTSYSAPI VOID NTAPI RtlInitUnicodeString(PUNICODE_STRING DestinationString, PCWSTR SourceString)
NTSYSAPI VOID NTAPI RtlFreeUnicodeString(PUNICODE_STRING UnicodeString)
_In_ ULONG _In_ ULONG _In_ ULONG Length
const KSFILTER_DESCRIPTOR FilterDescriptor
const KSPIN_DESCRIPTOR_EX PinDescriptors[]
ULONG MinimumBitsPerSample
ULONG MaximumBitsPerSample
ULONG MaximumSampleFrequency
ULONG MinimumSampleFrequency
PUSB_COMMON_DESCRIPTOR Descriptor
Property(long _type, long _tag, INREAL _value)
struct _URB_CONTROL_DESCRIPTOR_REQUEST UrbControlDescriptorRequest
#define STATUS_INVALID_PARAMETER
#define STATUS_INSUFFICIENT_RESOURCES
struct _USB_INTERFACE_DESCRIPTOR * PUSB_INTERFACE_DESCRIPTOR
#define USB_STRING_DESCRIPTOR_TYPE
struct _USB_COMMON_DESCRIPTOR * PUSB_COMMON_DESCRIPTOR
#define USB_DEVICE_CLASS_AUDIO
#define URB_FUNCTION_CLASS_INTERFACE
#define USBD_TRANSFER_DIRECTION_IN
#define USBD_STATUS_INSUFFICIENT_RESOURCES
#define USBD_TRANSFER_DIRECTION_OUT
NTSTATUS SubmitUrbSync(IN PDEVICE_OBJECT DeviceObject, IN PURB Urb)
#define USB_AUDIO_OUTPUT_TERMINAL
struct USB_AUDIO_CONTROL_OUTPUT_TERMINAL_DESCRIPTOR * PUSB_AUDIO_CONTROL_OUTPUT_TERMINAL_DESCRIPTOR
#define USB_AUDIO_MICROPHONE_TERMINAL_TYPE
#define USB_AUDIO_ARRAY_MICROPHONE_TERMINAL_TYPE
#define USB_AUDIO_COMMUNICATION_SPEAKER_TERMINAL_TYPE
#define USB_AUDIO_HMDA_TERMINAL_TYPE
struct USB_AUDIO_CONTROL_FEATURE_UNIT_DESCRIPTOR * PUSB_AUDIO_CONTROL_FEATURE_UNIT_DESCRIPTOR
#define USB_AUDIO_DESKTOP_MICROPHONE_TERMINAL_TYPE
struct FILTER_CONTEXT * PFILTER_CONTEXT
#define USB_AUDIO_PERSONAL_MICROPHONE_TERMINAL_TYPE
struct USB_AUDIO_CONTROL_SELECTOR_UNIT_DESCRIPTOR * PUSB_AUDIO_CONTROL_SELECTOR_UNIT_DESCRIPTOR
#define USB_AUDIO_DESKTOP_SPEAKER_TERMINAL_TYPE
struct USB_AUDIO_CONTROL_INTERFACE_HEADER_DESCRIPTOR * PUSB_AUDIO_CONTROL_INTERFACE_HEADER_DESCRIPTOR
#define USB_AUDIO_OMMNI_MICROPHONE_TERMINAL_TYPE
struct USB_AUDIO_CONTROL_INPUT_TERMINAL_DESCRIPTOR * PUSB_AUDIO_CONTROL_INPUT_TERMINAL_DESCRIPTOR
#define USB_AUDIO_STREAMING_TERMINAL_TYPE
#define USB_AUDIO_CONTROL_TERMINAL_DESCRIPTOR_TYPE
#define USB_AUDIO_ROOM_SPEAKER_TERMINAL_TYPE
#define DEFINE_KSPROPERTY_TABLE_AUDIO_VOLUME(TopologySet, Handler)
struct USB_AUDIO_CONTROL_MIXER_UNIT_DESCRIPTOR * PUSB_AUDIO_CONTROL_MIXER_UNIT_DESCRIPTOR
#define DEFINE_KSPROPERTY_TABLE_AUDIO_MUTE(TopologySet, Handler)
#define USB_AUDIO_SPEAKER_TERMINAL_TYPE
#define USB_HEADPHONES_SPEAKER_TERMINAL_TYPE
#define USB_AUDIO_INPUT_TERMINAL
struct USB_AUDIO_STREAMING_FORMAT_TYPE_DESCRIPTOR * PUSB_AUDIO_STREAMING_FORMAT_TYPE_DESCRIPTOR
struct USB_AUDIO_STREAMING_INTERFACE_DESCRIPTOR * PUSB_AUDIO_STREAMING_INTERFACE_DESCRIPTOR
#define USB_AUDIO_ARRAY_PROCESSING_MICROPHONE_TERMINAL_TYPE
#define USB_AUDIO_SUBWOOFER_TERMINAL_TYPE
PUSB_COMMON_DESCRIPTOR NTAPI USBD_ParseDescriptors(PVOID DescriptorBuffer, ULONG TotalLength, PVOID StartPosition, LONG DescriptorType)
PUSB_INTERFACE_DESCRIPTOR NTAPI USBD_ParseConfigurationDescriptorEx(PUSB_CONFIGURATION_DESCRIPTOR ConfigurationDescriptor, PVOID StartPosition, LONG InterfaceNumber, LONG AlternateSetting, LONG InterfaceClass, LONG InterfaceSubClass, LONG InterfaceProtocol)
#define UsbBuildGetDescriptorRequest(urb, length, descriptorType, descriptorIndex, languageId, transferBuffer, transferBufferMDL, transferBufferLength, link)
#define UsbBuildVendorRequest(urb, cmd, length, transferFlags, reservedbits, request, value, index, transferBuffer, transferBufferMDL, transferBufferLength, link)
_In_ ULONG _In_ PVOID _In_ LONG DescriptorType
_Must_inspect_result_ _In_ WDFDEVICE Device
_In_ WDFCOLLECTION _In_ ULONG Index
_In_ PDEVICE_OBJECT DeviceObject
_Must_inspect_result_ _In_ WDFDEVICE _In_ CONST GUID _In_opt_ PCUNICODE_STRING ReferenceString
_Must_inspect_result_ _In_ WDFKEY _In_ PCUNICODE_STRING _Out_opt_ PUSHORT _Inout_opt_ PUNICODE_STRING Value
_Must_inspect_result_ _In_ WDFIORESLIST _In_ PIO_RESOURCE_DESCRIPTOR Descriptor