IopQueueIrpToFileObject
VOID __stdcall IopQueueIrpToFileObject(_IRP *Irp, _FILE_OBJECT *FileObject, PVOID *a3, PVOID a4, UINT8 a5, INT8 a6){
unsigned __int64 *p_IrpListLock;
unsigned __int8 CurrentIrql;
_LIST_ENTRY *p_IrpList;
_LIST_ENTRY *Flink;
_LIST_ENTRY *p_ThreadListEntry;
_EPROCESS *Process;
__int64 BugCheckParameter4;
_ETHREAD *CurrentThread;
volatile signed __int64 *p_Min;
__int64 v17;
signed __int64 UserApcRoutine;
signed __int64 v19;
p_IrpListLock = &FileObject->IrpListLock;
CurrentIrql = KeGetCurrentIrql();
__writecr8(2ui64);
if( _interlockedbittestandset64((volatile signed __int32 *)&FileObject->IrpListLock, 0i64) )
KxWaitForSpinLockAndAcquire(p_IrpListLock);
if( (FileObject->Flags & 0x400) != 0 )
{
KxReleaseSpinLock(p_IrpListLock);
__writecr8(CurrentIrql);
}
else
{
p_IrpList = &FileObject->IrpList;
Flink = FileObject->IrpList.Flink;
p_ThreadListEntry = &Irp->ThreadListEntry;
if( Flink->Blink != &FileObject->IrpList )
__fastfail(3u);
p_ThreadListEntry->Flink = Flink;
Irp->ThreadListEntry.Blink = p_IrpList;
Flink->Blink = p_ThreadListEntry;
p_IrpList->Flink = p_ThreadListEntry;
Process = KeGetCurrentThread()->ApcState.Process;
if( ObpTraceFlags )
ObpPushStackInfo((_OBJECT_HEADER *)&Process[-1].DynamicEnforcedCetCompatibleRanges, 1u, 1ui64, 0x70436F49ui64);
BugCheckParameter4 = _InterlockedIncrement64((volatile signed __int64 *)&Process[-1].DynamicEnforcedCetCompatibleRanges);
if( BugCheckParameter4 <= 1 )
KeBugCheckEx(0x18u, 0i64, Process, (PVOID)0x10, (PVOID)BugCheckParameter4);
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
p_Min = (volatile signed __int64 *)&CurrentThread[-1].LockEntries[5].OwnerTree.Min;
if( ObpTraceFlags )
ObpPushStackInfo(
(_OBJECT_HEADER *)(&CurrentThread[-1].LockEntries[5].CpuPriorityKey + 8),
1u,
1ui64,
0x746C6644ui64);
v17 = _InterlockedIncrement64(p_Min);
if( v17 <= 1 )
KeBugCheckEx(0x18u, 0i64, (PVOID)(p_Min + 6), (PVOID)0x10, (PVOID)v17);
Irp->Flags |= 0x2000u;
Irp->Overlay.UserApcRoutine = (void(__fastcall *)(void *, _IO_STATUS_BLOCK *, unsigned int))Process;
UserApcRoutine = (signed __int64)Irp->Overlay.UserApcRoutine;
do
{
v19 = UserApcRoutine;
UserApcRoutine = _InterlockedCompareExchange64(
(volatile signed __int64 *)&Irp->Overlay,
UserApcRoutine & 0xFFFFFFFFFFFFFFF9ui64 | ((UserApcRoutine & 6) + 2),
UserApcRoutine);
}
while( v19 != UserApcRoutine );
_InterlockedAnd64((volatile signed __int64 *)p_IrpListLock, 0i64);
__writecr8(CurrentIrql);
}
}Referenced by:
IopSynchronousServiceTail