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