IopDisassociateThreadIrp
INT64 __stdcall IopDisassociateThreadIrp(){
unsigned __int8 CurrentIrql;
__int64 **v1;
KIRQL v2;
__int64 *v3;
KIRQL v4;
INT64 result;
__int64 *v6;
__int64 v7;
__int64 **v8;
__int64 v9;
__int64 v10;
struct _DMA_ADAPTER *v11;
_DWORD *v12;
CurrentIrql = KeGetCurrentIrql();
__writecr8(1ui64);
v1 = (__int64 **)((char *)KeGetCurrentThread() + 1200);
if( *v1 == (__int64 *)v1 )
goto LABEL_4;
v2 = KeAcquireQueuedSpinLock(0xBui64);
v3 = *v1;
v4 = v2;
if( *((char *)*v1 + 35) == *((char *)*v1 + 34) + 2 )
{
KeReleaseQueuedSpinLock(0xBui64, v2);
LABEL_4:
result = CurrentIrql;
__writecr8(CurrentIrql);
return result;
}
ObfReferenceObjectWithTag((PVOID)v3[15], 0x746C6644u);
v6 = *v1;
v7 = **v1;
if( (__int64 **)(*v1)[1] != v1
|| *(__int64 **)(v7 + 8) != v6
|| (*v1 = (__int64 *)v7,
*(_QWORD *)(v7 + 8) = v1,
v3[1] = (__int64)v3,
*v3 = (__int64)v3,
v8 = (__int64 **)qword_140C45B68,
*(__int64 **)qword_140C45B68 != &IopDeadIrps) )
{
__fastfail(3u);
}
*v6 = (__int64)&IopDeadIrps;
v6[1] = (__int64)v8;
*v8 = v6;
qword_140C45B68 = (__int64)v6;
if( *((_BYTE *)v3 + 35) <= *((_BYTE *)v3 + 34)
&& (v10 = v3[20]) != 0
&& (v9 = v3[19], v11 = *(struct _DMA_ADAPTER **)(v9 + 40), *(struct _DMA_ADAPTER **)(v10 + 8) == v11) )
{
ObfReferenceObjectWithTag(*(PVOID *)(v9 + 40), 0x746C6644u);
}
else
{
v11 = 0i64;
}
KeReleaseQueuedSpinLock(0xBui64, v4);
result = CurrentIrql;
__writecr8(CurrentIrql);
if( v11 )
{
LODWORD(v12) = IoAllocateErrorLogEntry(v11, 0x30u);
if( v12 )
{
v12[3] = -2147221450;
IoWriteErrorLogEntry(v12);
}
HalPutDmaAdapter(v11);
}
return result;
}Referenced by:
IoCancelThreadIo