KiSwapDirectoryTableBaseTarget

VOID __stdcall KiSwapDirectoryTableBaseTarget(
        _KDPC *Dpc,
        VOID *DeferredContext,
        VOID *SystemArgument1,
        VOID *SystemArgument2){
  _EPROCESS *v5; 
  signed __int32 v8; 
  unsigned int v9; 
  signed __int32 v10; 
  unsigned int v11; 
  unsigned __int64 DirectoryTableBase; 
  unsigned __int64 v13; 
  unsigned __int64 v14; 
  unsigned __int64 v15; 
  UINT64 SpinCount; 
  UINT64 v17; 

  LODWORD(SpinCount) = 0;
  v5 = (_EPROCESS *)*((_QWORD *)DeferredContext + 1);
  v8 = _InterlockedDecrement((volatile signed __int32 *)SystemArgument2);
  v9 = ~v8 & 0x80000000;
  if( (v8 & 0x7FFFFFFF) != 0 )
  {
    while( (*(_DWORD *)SystemArgument2 & 0x80000000) != v9 )
      KeYieldProcessorEx(&SpinCount);
  }
  else
  {
    *(_DWORD *)SystemArgument2 = v9 | *((_DWORD *)SystemArgument2 + 1);
  }
  if( MmStealTopLevelPage(*((VOID **)DeferredContext + 2)) )
    *(_BYTE *)DeferredContext = 1;
  v10 = _InterlockedDecrement((volatile signed __int32 *)SystemArgument2);
  v11 = ~v10 & 0x80000000;
  if( (v10 & 0x7FFFFFFF) != 0 )
  {
    LODWORD(v17) = 0;
    while( (*(_DWORD *)SystemArgument2 & 0x80000000) != v11 )
      KeYieldProcessorEx(&v17);
  }
  else
  {
    *(_DWORD *)SystemArgument2 = v11 | *((_DWORD *)SystemArgument2 + 1);
  }
  if( *(_BYTE *)DeferredContext && KeGetCurrentThread()->ApcState.Process == v5 )
  {
    DirectoryTableBase = v5->Pcb.DirectoryTableBase;
    if( KiKvaShadow )
    {
      v13 = DirectoryTableBase | 0x8000000000000000ui64;
      if( (DirectoryTableBase & 2) == 0 )
        v13 = v5->Pcb.DirectoryTableBase;
      __writegsqword(0x9000u, v13);
      KiSetAddressPolicy(v5->Pcb.AddressPolicy);
    }
    __writecr3(DirectoryTableBase);
    if( !KiFlushPcid && KiKvaShadow )
    {
      v14 = __readcr4();
      if( (v14 & 0x20080) != 0 )
      {
        __writecr4(v14 ^ 0x80);
        __writecr4(v14);
      }
      else
      {
        v15 = __readcr3();
        __writecr3(v15);
      }
    }
  }
  _InterlockedDecrement((volatile signed __int32 *)SystemArgument1);
}

Referenced by:

No references.