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