CmNotifyRunDown

void __fastcall CmNotifyRunDown(__int64 a1){
  _QWORD *v2; 
  _QWORD *v3; 
  unsigned __int8 CurrentIrql; 
  _QWORD *v5; 
  __int64 *v6; 
  __int64 v7; 
  char *v8; 
  int v9; 
  _QWORD *v10; 
  _EWOW64PROCESS *WoW64Process; 
  _QWORD *v12; 
  unsigned __int16 Machine; 
  __int64 v14; 
  _QWORD *v15; 
  VOID **v16; 
  _QWORD *v17; 
  _QWORD *v18; 

  v2 = (_QWORD *)(a1 + 1096);
  v3 = *(_QWORD **)(a1 + 1096);
  if( v3 && v3 != v2 )
  {
    CmpLockRegistry();
    ExAcquireFastMutexUnsafe((PFAST_MUTEX)((char *)&CmpDummyThreadEvent + 800));
    CurrentIrql = KeGetCurrentIrql();
    __writecr8(1ui64);
    if( *v2 )
    {
      while( 1 )
      {
        v5 = (_QWORD *)(a1 + 1096);
        v6 = *(__int64 **)(a1 + 1096);
        if( v6 == (__int64 *)(a1 + 1096) )
          break;
        v7 = *v6;
        if( (_QWORD *)v6[1] != v5 || *(__int64 **)(v7 + 8) != v6 )
LABEL_32:
          __fastfail(3u);
        *v5 = v7;
        *(_QWORD *)(v7 + 8) = v5;
        v8 = (char *)(v6 - 2);
        v9 = *((_DWORD *)v8 + 14);
        if( (v9 & 0x10000) != 0 )
        {
          if( (_WORD)v9 != 2 )
            goto LABEL_27;
          v10 = (_QWORD *)*((_QWORD *)v8 + 8);
          if( (_QWORD *)v10[13] == v10 + 13 )
          {
            DbgPrint("IoStatusBlock pointing onto itself AsyncUser = %p\n", v10);
            if( (_BYTE)KdDebuggerEnabled )
            {
              if( !(_BYTE)KdDebuggerNotPresent )
                __debugbreak();
            }
          }
          WoW64Process = KeGetCurrentThread()->ApcState.Process->WoW64Process;
          if( WoW64Process && ((Machine = WoW64Process->Machine, Machine == 332) || Machine == 452) )
          {
            **(_DWORD **)(*((_QWORD *)v8 + 8) + 104i64) = 267;
            *(_DWORD *)(*(_QWORD *)(*((_QWORD *)v8 + 8) + 104i64) + 4i64) = 0;
          }
          else
          {
            **(_DWORD **)(*((_QWORD *)v8 + 8) + 104i64) = 267;
            *(_QWORD *)(*(_QWORD *)(*((_QWORD *)v8 + 8) + 104i64) + 8i64) = 0i64;
          }
          v12 = (_QWORD *)*((_QWORD *)v8 + 8);
          if( (_QWORD *)v12[13] == v12 + 13 )
          {
            DbgPrint("IoStatusBlock pointing onto itself AsyncUser = %p\n", v12);
            if( (_BYTE)KdDebuggerEnabled )
            {
              if( !(_BYTE)KdDebuggerNotPresent )
                __debugbreak();
            }
          }
          v14 = *((_QWORD *)v8 + 8);
          if( *(_QWORD *)(v14 + 8) )
          {
            KeSetEvent(*(PRKEVENT *)(v14 + 8), 0, 0);
            HalPutDmaAdapter(*(PADAPTER_OBJECT *)(*((_QWORD *)v8 + 8) + 8i64));
            v14 = *((_QWORD *)v8 + 8);
          }
          if( !KeRemoveQueueApc(v14 + 16) )
          {
LABEL_27:
            v15 = *(_QWORD **)v8;
            v16 = (VOID **)*((_QWORD *)v8 + 1);
            if( *(char **)(*(_QWORD *)v8 + 8i64) != v8 || *v16 != v8 )
              goto LABEL_32;
            *v16 = v15;
            v15[1] = v16;
            CmpCancelSubordinatePost((INT64)v8, 0i64);
          }
          CmpFreeSubordinatePost((INT64)v8);
          CmpFreePostBlock(v8);
        }
        else
        {
          v17 = v8 + 16;
          v18 = *(_QWORD **)(a1 + 1104);
          if( (_QWORD *)*v18 != v5 )
            goto LABEL_32;
          *v17 = v5;
          v17[1] = v18;
          *v18 = v17;
          *(_QWORD *)(a1 + 1104) = v17;
        }
      }
    }
    __writecr8(CurrentIrql);
    ExReleaseFastMutexUnsafe((PFAST_MUTEX)((char *)&CmpDummyThreadEvent + 800));
    CmpUnlockRegistry();
  }
}

Referenced by:

PspExitThread