CmpPostApc

void __fastcall CmpPostApc(__int64 a1, __int64 a2, __int64 a3, _DWORD *a4, __int64 a5){
  _QWORD *v6; 
  _QWORD *v7; 
  _EWOW64PROCESS *WoW64Process; 
  bool v9; 
  bool v10; 
  __int64 v11; 
  _QWORD *v12; 
  unsigned __int16 Machine; 
  _QWORD *v14; 
  _KEVENT *v15; 
  __int64 v16; 
  _QWORD *v17; 

  v6 = *(_QWORD **)a5;
  v7 = *(_QWORD **)(*(_QWORD *)a5 + 64i64);
  if( (_QWORD *)v7[13] == v7 + 13 )
  {
    DbgPrint("IoStatusBlock pointing onto itself AsyncUser = %p\n", v7);
    if( (_BYTE)KdDebuggerEnabled )
    {
      if( !(_BYTE)KdDebuggerNotPresent )
        __debugbreak();
    }
  }
  WoW64Process = KeGetCurrentThread()->ApcState.Process->WoW64Process;
  v9 = 0;
  if( WoW64Process )
  {
    Machine = WoW64Process->Machine;
    if( Machine == 332 || Machine == 452 )
      v9 = 1;
  }
  **(_DWORD **)(v6[8] + 104i64) = *a4;
  v10 = !v9;
  v11 = *(_QWORD *)(v6[8] + 104i64);
  if( v10 )
    *(_QWORD *)(v11 + 8) = 0i64;
  else
    *(_DWORD *)(v11 + 4) = 0;
  v12 = (_QWORD *)v6[8];
  if( (_QWORD *)v12[13] == v12 + 13 )
  {
    DbgPrint("IoStatusBlock pointing onto itself AsyncUser = %p\n", v12);
    if( (_BYTE)KdDebuggerEnabled )
    {
      if( !(_BYTE)KdDebuggerNotPresent )
        __debugbreak();
    }
  }
  *(_QWORD *)a4 = *(_QWORD *)(v6[8] + 104i64);
  v14 = (_QWORD *)v6[8];
  if( (_QWORD *)v14[13] == v14 + 13 )
  {
    DbgPrint("IoStatusBlock pointing onto itself AsyncUser = %p\n", v14);
    if( (_BYTE)KdDebuggerEnabled )
    {
      if( !(_BYTE)KdDebuggerNotPresent )
        __debugbreak();
    }
  }
  v15 = *(_KEVENT **)(v6[8] + 8i64);
  if( v15 )
  {
    KeSetEvent(v15, 0, 0);
    HalPutDmaAdapter(*(PADAPTER_OBJECT *)(v6[8] + 8i64));
  }
  v16 = v6[2];
  v17 = (_QWORD *)v6[3];
  if( *(_QWORD **)(v16 + 8) != v6 + 2 || (_QWORD *)*v17 != v6 + 2 )
    __fastfail(3u);
  *v17 = v16;
  *(_QWORD *)(v16 + 8) = v17;
  CmpFreeSubordinatePost((INT64)v6);
  CmpFreePostBlock(v6);
}

Referenced by:

No references.