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.