KiOpPatchCode

INT64 __fastcall KiOpPatchCode(INT64 a1, UINT64 a2, CHAR a3){
  NTSTATUS v5; 
  _BYTE *v6; 
  UINT64 NewAccessProtection; 
  SIZE_T NumberOfBytesToProtect; 
  PVOID BaseAddress; 
  char MemoryDescriptorList[56]; 
  memset(&MemoryDescriptorList[12], 0, 20);
  *(_QWORD *)&MemoryDescriptorList[48] = 0i64;
  LODWORD(NewAccessProtection) = 0;
  BaseAddress = (PVOID)a2;
  NumberOfBytesToProtect = 1i64;
  ExAcquireFastMutex(&KiUserCodePatchMutex);
  v5 = ZwProtectVirtualMemory(
         (PVOID)0xFFFFFFFFFFFFFFFFi64,
         &BaseAddress,
         &NumberOfBytesToProtect,
         0x40ui64,
         &NewAccessProtection);
  if( v5 >= 0 )
  {
    *(_DWORD *)&MemoryDescriptorList[52] = 0;
    *(_QWORD *)MemoryDescriptorList = 0i64;
    *(_WORD *)&MemoryDescriptorList[8] = 8 * (((unsigned __int16)((a2 & 0xFFF) + 4096) >> 12) + 6);
    memset(&MemoryDescriptorList[10], 0, 22);
    *(_QWORD *)&MemoryDescriptorList[32] = a2 & 0xFFFFFFFFFFFFF000ui64;
    *(_QWORD *)&MemoryDescriptorList[44] = a2 & 0xFFF;
    *(_DWORD *)&MemoryDescriptorList[40] = 1;
    v5 = 0;
    MiProbeAndLockPages((INT64)MemoryDescriptorList, 1, 1i64);
    if( (MemoryDescriptorList[10] & 5) != 0 )
      v6 = *(_BYTE **)&MemoryDescriptorList[24];
    else
      v6 = MmMapLockedPagesSpecifyCache((PMDL)MemoryDescriptorList, 0, MmCached, 0i64, 0, 0x40000010u);
    if( v6 )
      *v6 = a3;
    else
      v5 = -1073741670;
    MmUnlockPages((_MDL *)MemoryDescriptorList);
    ZwProtectVirtualMemory(
      (PVOID)0xFFFFFFFFFFFFFFFFi64,
      &BaseAddress,
      &NumberOfBytesToProtect,
      (unsigned int)NewAccessProtection,
      &NewAccessProtection);
  }
  KeReleaseGuardedMutex(&KiUserCodePatchMutex);
  return(unsigned int)v5;
}

Referenced by:

KiOp_MOVAPS
KiOp_MOVDQA