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