MiStackTheftIsr

ULONG_PTR __fastcall MiStackTheftIsr(ULONG_PTR Argument){
  VOID *v1; 
  __int64 v2; 
  unsigned __int8 CurrentIrql; 
  signed __int32 v4; 
  unsigned int v5; 
  _MMPFN *PfnDb; 
  _MMPFN *v7; 
  _MMPFN *v8; 
  char v9; 
  signed __int32 v10; 
  unsigned int v11; 
  signed __int32 v12; 
  ULONG_PTR result; 
  UINT64 SpinCount; 
  UINT64 v15; 
  UINT64 v16; 

  v1 = *(VOID **)(*(_QWORD *)&Argument + 48i64);
  v2 = *(_QWORD *)&Argument;
  CurrentIrql = KeGetCurrentIrql();
  __writecr8(0xFui64);
  LODWORD(v15) = 0;
  v4 = _InterlockedDecrement((volatile signed __int32 *)(*(_QWORD *)&Argument + 72i64));
  v5 = ~v4 & 0x80000000;
  if( (v4 & 0x7FFFFFFF) != 0 )
  {
    while( (*(_DWORD *)(v2 + 72) & 0x80000000) != v5 )
      KeYieldProcessorEx(&v15);
    LODWORD(v16) = 0;
    v12 = _InterlockedDecrement((volatile signed __int32 *)(v2 + 72));
    v11 = ~v12 & 0x80000000;
    if( (v12 & 0x7FFFFFFF) == 0 )
      goto LABEL_3;
    while( (*(_DWORD *)(v2 + 72) & 0x80000000) != v11 )
      KeYieldProcessorEx(&v16);
  }
  else
  {
    PfnDb = MmGetPfnDb();
    *(_DWORD *)(v2 + 72) = v5 | *(_DWORD *)(v2 + 76);
    v7 = &PfnDb[*(_QWORD *)v2];
    v8 = &PfnDb[*(_QWORD *)(v2 + 8)];
    MiCopyKstack(v8, v7, *(_MMPTE **)(v2 + 16));
    KeFlushSingleCurrentTb(v1);
    MiSwitchKstackPages(v8, v7);
    v7->u4._bf_0 &= ~0x8000000000000000ui64;
    *((_BYTE *)&v7->u3 + 2) &= 0xC7u;
    v9 = *((_BYTE *)&v7->u3 + 3) & 0xDF;
    LODWORD(SpinCount) = 0;
    *((_BYTE *)&v7->u3 + 3) = v9;
    v10 = _InterlockedDecrement((volatile signed __int32 *)(v2 + 72));
    v11 = ~v10 & 0x80000000;
    if( (v10 & 0x7FFFFFFF) == 0 )
    {
LABEL_3:
      *(_DWORD *)(v2 + 72) = v11 | *(_DWORD *)(v2 + 76);
      goto LABEL_13;
    }
    while( (*(_DWORD *)(v2 + 72) & 0x80000000) != v11 )
      KeYieldProcessorEx(&SpinCount);
  }
LABEL_13:
  KeFlushSingleCurrentTb(v1);
  result = CurrentIrql;
  __writecr8(CurrentIrql);
  return result;
}

Referenced by:

No references.