MiCommitHotPatchTable
NTSTATUS __stdcall MiCommitHotPatchTable(INT64 a1, UINT64 a2, UINT64 a3){
_EPROCESS *Process;
NTSTATUS result;
_MMSUPPORT_INSTANCE *p_Instance;
char *v9;
UINT64 v10;
unsigned int v11;
_SLIST_ENTRY *v12;
unsigned int v13;
__int64 v14;
UINT64 v15;
UINT8 v16;
UINT8 v17;
VOID *v18;
unsigned __int64 v19;
int v20;
UINT64 v21;
UINT64 v22;
VOID *OpaquePointer;
UINT64 v24;
_MMSUPPORT_FULL *p_Vm;
UINT8 i;
Process = KeGetCurrentThread()->ApcState.Process;
result = MiChargeFullProcessCommitment((ULONG_PTR)Process, a3);
if( result >= 0 )
{
p_Instance = &Process->Vm.Instance;
p_Vm = &Process->Vm;
v9 = 0i64;
v10 = a3 + (((unsigned __int64)*(unsigned __int8 *)(a1 + 34) << 31) | *(_DWORD *)(a1 + 52) & 0x7FFFFFFF);
v11 = 0;
OpaquePointer = 0i64;
*(_DWORD *)(a1 + 52) ^= (v10 ^ *(_DWORD *)(a1 + 52)) & 0x7FFFFFFF;
*(_BYTE *)(a1 + 34) = v10 >> 31;
v12 = (_SLIST_ENTRY *)a2;
v13 = (*(_DWORD *)(a1 + 48) >> 12) & 0x3F;
v14 = MiSwizzleInvalidPte(32i64);
v15 = (UINT64)MmGetPteBase() + ((a2 >> 9) & 0x7FFFFFFFF8i64);
v24 = v15 + 8 * (a3 - 1);
MiLockWorkingSetShared();
v17 = v16;
for( i = v16; v15 <= v24; v12 += 256 )
{
if( v12 == (_SLIST_ENTRY *)a2 || (v15 & 0xFFF) == 0 )
{
if( v11 )
{
MiIncreaseUsedPtesCount(OpaquePointer, (VOID *)v11);
v11 = 0;
}
if( v9 )
MiUnlockPageTableInternal((INT64)p_Instance, (UINT64)v9);
LODWORD(v22) = 0;
v9 = (char *)MmGetPteBase() + ((v15 >> 9) & 0x7FFFFFFFF8i64);
MiMakeSystemAddressValid((VOID *)v15, 0i64, v13, v17, v22);
LODWORD(v18) = MiGetUsedPtesHandle(v12);
OpaquePointer = v18;
}
v19 = v14;
LOBYTE(v20) = MiPteInShadowRange(v15);
if( v20 && (KeGetCurrentThread()->ApcState.Process->Flags3 & 0x1000) != 0 && (v14 & 1) != 0 )
v19 = v14 | 0x8000000000000000ui64;
*(_QWORD *)v15 = v19;
p_Instance = &p_Vm->Instance;
++v11;
v17 = i;
v15 += 8i64;
}
MiIncreaseUsedPtesCount(OpaquePointer, (VOID *)v11);
MiUnlockPageTableInternal((INT64)p_Instance, (UINT64)v9);
LOBYTE(v21) = v17;
MiUnlockWorkingSetShared(p_Instance, v21);
return 0;
}
return result;
}Referenced by:
MiPrepareToHotPatchImage