IopQueueIrpToFileObject
UINT8 __stdcall IopQueueIrpToFileObject(_IRP *Irp, _FILE_OBJECT *FileObject){
unsigned __int64 *p_IrpListLock;
unsigned __int8 CurrentIrql;
_LIST_ENTRY *p_IrpList;
_LIST_ENTRY *Flink;
_LIST_ENTRY *v8;
ULONG_PTR v9;
signed __int64 BugCheckParameter4;
_ETHREAD *CurrentThread;
volatile signed __int64 *v12;
signed __int64 v13;
signed __int64 v14;
signed __int64 v15;
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);
return 0;
}
else
{
p_IrpList = &FileObject->IrpList;
Flink = FileObject->IrpList.Flink;
v8 = (_LIST_ENTRY *)((char *)Irp + 32);
if( Flink->Blink != &FileObject->IrpList )
__fastfail(3u);
v8->Flink = Flink;
*((_QWORD *)Irp + 5) = p_IrpList;
Flink->Blink = v8;
p_IrpList->Flink = v8;
v9 = *((_QWORD *)KeGetCurrentThread() + 23);
if( ObpTraceFlags )
ObpPushStackInfo(v9 - 48, 1, 1i64, 1883467593i64);
BugCheckParameter4 = _InterlockedIncrement64((volatile signed __int64 *)(v9 - 48));
if( BugCheckParameter4 <= 1 )
KeBugCheckEx(0x18u, 0i64, v9, 0x10ui64, BugCheckParameter4);
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
v12 = (volatile signed __int64 *)((char *)CurrentThread - 48);
if( ObpTraceFlags )
ObpPushStackInfo((INT64)CurrentThread - 48, 1, 1i64, 1953261124i64);
v13 = _InterlockedIncrement64(v12);
if( v13 <= 1 )
KeBugCheckEx(0x18u, 0i64, (ULONG_PTR)(v12 + 6), 0x10ui64, v13);
*((_DWORD *)Irp + 4) |= 0x2000u;
*((_QWORD *)Irp + 11) = v9;
v14 = *((_QWORD *)Irp + 11);
do
{
v15 = v14;
v14 = _InterlockedCompareExchange64(
(volatile signed __int64 *)Irp + 11,
v14 & 0xFFFFFFFFFFFFFFF9ui64 | ((v14 & 6) + 2),
v14);
}
while( v15 != v14 );
_InterlockedAnd64((volatile signed __int64 *)p_IrpListLock, 0i64);
__writecr8(CurrentIrql);
return 1;
}
}Referenced by:
IopSynchronousServiceTail