PnpQueryInterface
NTSTATUS __stdcall PnpQueryInterface(
DEVICE_OBJECT *DeviceObject,
GUID *InterfaceGuid,
UINT16 InterfaceVersion,
UINT16 InterfaceSize,
PVOID InterfaceSpecificData,
INTERFACE *Interface){
DEVICE_OBJECT *v10;
_DEVICE_OBJECT *v11;
IRP *v12;
__int64 v13;
NTSTATUS Status;
IO_STATUS_BLOCK IoStatusBlock;
struct _KEVENT Event;
VOID *ReturnAddress;
memset(&Event, 0, sizeof(Event));
IoStatusBlock = 0i64;
if( InterfaceSize < 0x20u )
return -1073741811;
memset((INT64)Interface, 0i64);
Interface->Size = InterfaceSize;
Interface->Version = InterfaceVersion;
KeInitializeEvent(&Event, NotificationEvent, 0);
LODWORD(v10) = IoGetAttachedDeviceReferenceWithTag(DeviceObject, 0x49706E50u);
v11 = v10;
v12 = IopBuildSynchronousFsdRequest(0x1Bui64, v10, 0i64, 0i64, 0i64, &Event, &IoStatusBlock, ReturnAddress);
if( v12 )
{
v13 = *((_QWORD *)v12 + 23);
*((_BYTE *)v12 + 64) = 0;
*((_DWORD *)v12 + 12) = -1073741637;
*(_QWORD *)(v13 - 40) = InterfaceSpecificData;
*(_BYTE *)(v13 - 71) = 8;
*(_QWORD *)(v13 - 64) = InterfaceGuid;
*(_WORD *)(v13 - 56) = InterfaceSize;
*(_WORD *)(v13 - 54) = InterfaceVersion;
*(_QWORD *)(v13 - 48) = Interface;
Status = IofCallDriver(v11, v12);
if( Status == 259 )
{
KeWaitForSingleObject(&Event, Executive, 0, 0, 0i64);
Status = IoStatusBlock.Status;
}
}
else
{
Status = -1073741670;
}
ObfDereferenceObjectWithTag(v11, 0x49706E50ui64);
return Status;
}Referenced by:
IoQueryInterface
IopQueryBusResourceUpdateInterface
IopQueryInterfaceRecurseUp
PiGetDmaAdapterFromBusInterface
PiIommuGetInterface
PiProcessDriversLoadedOnSecureDevice
PiProcessNewDeviceNode
PipUnprotectDevice
PnpGetDeviceLocationStrings
PnprIdentifyUnits
PnprQueryReplaceFeatures