PopAllocateIrp

NTSTATUS __stdcall PopAllocateIrp(
        _DEVICE_OBJECT *DeviceObject,
        _IRP *SystemIrp,
        INT64 MinorFunction,
        POWER_STATE_TYPE PowerStateType,
        POWER_STATE PowerState,
        INT64 MustSucceed,
        INT64 AllocatePendingIrp,
        VOID *CallerCompletion,
        _DEVICE_OBJECT *a9,
        UINT8 a10,
        POWER_STATE a11,
        VOID *a12,
        _IO_STATUS_BLOCK *a13,
        VOID *CallerContext,
        _IRP **PowerIrp,
        POP_IRP_DATA **PowerIrpData){
  void *BugCheckParameter4; 
  POWER_STATE_TYPE v17; 
  _IRP *v19; 
  POWER_STATE *v20; 
  _DEVICE_OBJECT *v21; 
  _DEVICE_OBJECT *v22; 
  _DEVICE_OBJECT *DeviceAttachmentBaseRefWithTag; 
  _DEVICE_NODE *DeviceNode; 
  char v25; 
  NTSTATUS v26; 
  NTSTATUS v27; 
  unsigned int v28; 
  INT64 v29; 
  unsigned int v30; 
  __int64 FxDevice; 
  POWER_STATE *v32; 
  _IO_STACK_LOCATION *CurrentStackLocation; 
  _IO_STACK_LOCATION *v34; 
  POWER_STATE **v35; 
  _DEVICE_OBJECT *v36; 
  int SpinLock[2]; 
  POWER_STATE v39[2]; 
  _LARGE_INTEGER Interval; 
  _POP_FX_DEVICE *v41; 
  _KLOCK_QUEUE_HANDLE LockHandle; 
  _DEVICE_OBJECT *v44; 
  char v45; 

  v45 = MinorFunction;
  BugCheckParameter4 = 0i64;
  *(_QWORD *)&LockHandle.OldIrql = 0i64;
  *(_QWORD *)&v39[0].SystemState = 0i64;
  v17 = PowerStateType;
  *(_QWORD *)SpinLock = 0i64;
  v19 = 0i64;
  *(_QWORD *)a10 = 0i64;
  v20 = 0i64;
  LockHandle.LockQueue = 0i64;
  **(_QWORD **)&a11.SystemState = 0i64;
  LODWORD(v21) = IoGetAttachedDeviceReferenceWithTag(DeviceObject, 0x72496F50u);
  v22 = v21;
  DeviceAttachmentBaseRefWithTag = IoGetDeviceAttachmentBaseRefWithTag(DeviceObject, 0x72496F50ui64);
  v44 = DeviceAttachmentBaseRefWithTag;
  if( DeviceAttachmentBaseRefWithTag )
    DeviceNode = (_DEVICE_NODE *)DeviceAttachmentBaseRefWithTag->DeviceObjectExtension->DeviceNode;
  else
    DeviceNode = 0i64;
  if( !DeviceNode )
  {
    v36 = DeviceAttachmentBaseRefWithTag;
    v27 = -1073741808;
LABEL_37:
    if( (_BYTE)MustSucceed && v27 != 259 )
    {
      LOBYTE(BugCheckParameter4) = v17 != SystemPowerState;
      KeBugCheckEx(0xA0u, (PVOID)1, (PVOID)6, v22, BugCheckParameter4);
    }
    goto LABEL_24;
  }
  v25 = v45;
  if( PowerStateType == DevicePowerState && v45 == 2 )
  {
    v26 = PopFxAllocatePowerIrp(
            (INT64)DeviceNode,
            (INT64)DeviceObject,
            (unsigned int)PowerState.SystemState,
            (INT64)CallerCompletion,
            (INT64)a9,
            AllocatePendingIrp,
            (INT64)v39,
            SpinLock);
    v27 = v26;
    if( v26 >= 0 || v26 == -1073741130 )
    {
      v19 = *(_IRP **)&v39[0].SystemState;
      v20 = *(POWER_STATE **)SpinLock;
      if( v26 != 259 )
      {
        v25 = 2;
        goto LABEL_11;
      }
    }
    else
    {
      v19 = *(_IRP **)&v39[0].SystemState;
      v20 = *(POWER_STATE **)SpinLock;
    }
LABEL_41:
    v36 = v44;
LABEL_23:
    if( v19 )
      goto LABEL_24;
LABEL_34:
    v17 = PowerStateType;
    goto LABEL_37;
  }
  v27 = -1073741130;
LABEL_11:
  if( v27 >= 0 )
  {
    FxDevice = (__int64)DeviceNode->FxDevice;
    if( v22->StackSize > *(_BYTE *)(*(_QWORD *)(FxDevice + 16) + 66i64) )
    {
      ObfDereferenceObjectWithTag(v22, 0x72496F50ui64);
      ObfReferenceObjectWithTag(*(VOID **)(FxDevice + 104), 0x72496F50ui64);
      v22 = *(_DEVICE_OBJECT **)(FxDevice + 104);
    }
LABEL_21:
    IoReuseIrp(v19, -1073741637);
    IovUtilWatermarkIrp(v19, 1ui64);
    v19->IoStatus.Information = 0i64;
    v19->Tail.ListEntry.Blink = &v19->Tail.ListEntry;
    v19->Tail.ListEntry.Flink = &v19->Tail.ListEntry;
    memset(v20, 0i64, 0x100u);
    *(_QWORD *)&v20[8].SystemState = v22;
    *(_QWORD *)&v20[6].SystemState = v44;
    LOBYTE(v20[46].SystemState) = v45;
    v20[47].SystemState = PowerStateType;
    v20[48].SystemState = PowerState.SystemState;
    *(_QWORD *)&v20[4].SystemState = v19;
    *(_QWORD *)&v20[50].SystemState = FxDevice;
    v32 = *(POWER_STATE **)SpinLock;
    v19 = *(_IRP **)&v39[0].SystemState;
    *(_DWORD *)(*(_QWORD *)SpinLock + 212i64) = _InterlockedIncrement(&PopCurrentIrpSequenceID);
    *(_QWORD *)&v32[54].SystemState = CallerCompletion;
    *(_QWORD *)&v32[56].SystemState = a9;
    *(_QWORD *)&v32[58].SystemState = DeviceObject;
    CurrentStackLocation = v19->Tail.CurrentStackLocation;
    CurrentStackLocation[-1].DeviceObject = 0i64;
    CurrentStackLocation[-1].Context = v32;
    v34 = --v19->Tail.CurrentStackLocation;
    --v19->CurrentLocation;
    v34[-1].MajorFunction = 22;
    v34[-1].MinorFunction = v45;
    v34[-1].DeviceObject = v22;
    KeAcquireInStackQueuedSpinLock((PKSPIN_LOCK)&stru_140C23628 + 121, &LockHandle);
    v35 = (POWER_STATE **)*(&stru_140C23628 + 120);
    if( (_UNKNOWN *)**(&stru_140C23628 + 120) != (_UNKNOWN *)((char *)&stru_140C23628 + 952) )
      __fastfail(3u);
    *(_QWORD *)&v32->SystemState = (char *)&stru_140C23628 + 952;
    *(_QWORD *)&v32[2].SystemState = v35;
    *v35 = v32;
    *(&stru_140C23628 + 120) = v32;
    KeReleaseInStackQueuedSpinLock(&LockHandle);
    v22 = 0i64;
    v36 = 0i64;
    v20 = 0i64;
    v27 = 0;
    *(_QWORD *)a10 = v19;
    **(_QWORD **)&a11.SystemState = v32;
    goto LABEL_23;
  }
  if( v25 )
    v41 = 0i64;
  else
    v41 = PopFxLockDevice(DeviceNode, 0);
  Interval.QuadPart = -500000i64;
  v28 = 0;
  while( 1 )
  {
    if( v28 && KeGetCurrentIrql() <= 1u )
      KeDelayExecutionThread(0, 0, &Interval);
    ++v28;
    *(_QWORD *)SpinLock = ExAllocateFromNPagedLookasideList(&unk_140CEC900);
    v20 = *(POWER_STATE **)SpinLock;
    if( *(_QWORD *)SpinLock )
      break;
    if( !(_BYTE)MustSucceed || v28 >= 0xA )
      goto LABEL_41;
  }
  v30 = 0;
  while( 1 )
  {
    if( v30 && KeGetCurrentIrql() <= 1u )
      KeDelayExecutionThread(0, 0, &Interval);
    LOBYTE(v29) = v22->StackSize + 1;
    ++v30;
    *(_QWORD *)&v39[0].SystemState = IoAllocateIrp(v29, 0);
    v19 = *(_IRP **)&v39[0].SystemState;
    if( *(_QWORD *)&v39[0].SystemState )
    {
      FxDevice = (__int64)v41;
      goto LABEL_21;
    }
    if( !(_BYTE)MustSucceed )
      break;
    if( v30 >= 0xA )
    {
      v36 = v44;
      goto LABEL_34;
    }
  }
  v36 = v44;
LABEL_24:
  if( v20 )
    ExFreeToNPagedLookasideList(&unk_140CEC900, v20);
  if( v22 )
    ObfDereferenceObjectWithTag(v22, 0x72496F50ui64);
  if( v36 )
    ObfDereferenceObjectWithTag(v36, 0x72496F50ui64);
  return v27;
}

Referenced by:

PopNotifyDevice
PopRequestPowerIrp