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