MiStackTheftIsr

PVOID __stdcall MiStackTheftIsr(PVOID Argument){
  void *v1; 
  unsigned __int8 CurrentIrql; 
  signed __int32 v4; 
  unsigned int v5; 
  _MMPFN *PfnDb; 
  INT64 v7; 
  INT64 v8; 
  char v9; 
  signed __int32 v10; 
  unsigned int v11; 
  signed __int32 v12; 
  PVOID result; 
  UINT64 SpinCount; 
  UINT64 v15; 
  UINT64 v16; 
  v1 = (void *)*((_QWORD *)Argument + 6);
  CurrentIrql = KeGetCurrentIrql();
  __writecr8(0xFui64);
  LODWORD(v15) = 0;
  v4 = _InterlockedDecrement((volatile signed __int32 *)Argument + 18);
  v5 = ~v4 & 0x80000000;
  if( (v4 & 0x7FFFFFFF) != 0 )
  {
    while( (*((_DWORD *)Argument + 18) & 0x80000000) != v5 )
      KeYieldProcessorEx(&v15);
    LODWORD(v16) = 0;
    v12 = _InterlockedDecrement((volatile signed __int32 *)Argument + 18);
    v11 = ~v12 & 0x80000000;
    if( (v12 & 0x7FFFFFFF) == 0 )
      goto LABEL_3;
    while( (*((_DWORD *)Argument + 18) & 0x80000000) != v11 )
      KeYieldProcessorEx(&v16);
  }
  else
  {
    PfnDb = MmGetPfnDb();
    *((_DWORD *)Argument + 18) = v5 | *((_DWORD *)Argument + 19);
    v7 = (INT64)PfnDb + 48 * *(_QWORD *)Argument;
    v8 = (INT64)PfnDb + 48 * *((_QWORD *)Argument + 1);
    MiCopyKstack(v8, v7, *((_QWORD *)Argument + 2));
    KeFlushSingleCurrentTb(v1);
    MiSwitchKstackPages(v8, v7);
    *(_QWORD *)(v7 + 40) &= ~0x8000000000000000ui64;
    *(_BYTE *)(v7 + 34) &= 0xC7u;
    v9 = *(_BYTE *)(v7 + 35) & 0xDF;
    LODWORD(SpinCount) = 0;
    *(_BYTE *)(v7 + 35) = v9;
    v10 = _InterlockedDecrement((volatile signed __int32 *)Argument + 18);
    v11 = ~v10 & 0x80000000;
    if( (v10 & 0x7FFFFFFF) == 0 )
    {
LABEL_3:
      *((_DWORD *)Argument + 18) = v11 | *((_DWORD *)Argument + 19);
      goto LABEL_13;
    }
    while( (*((_DWORD *)Argument + 18) & 0x80000000) != v11 )
      KeYieldProcessorEx(&SpinCount);
  }
LABEL_13:
  KeFlushSingleCurrentTb(v1);
  result = (PVOID)CurrentIrql;
  __writecr8(CurrentIrql);
  return result;
}

Referenced by:

No references.