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