KiOpPatchCode
__int64 __fastcall KiOpPatchCode(__int64 a1, unsigned __int64 a2, char a3){
NTSTATUS v5;
INT64 v6;
INT64 v7;
_BYTE *v8;
UINT64 *OldProtect;
UINT64 Priority;
UINT64 NewProtectWin32;
UINT64 RegionSize;
VOID *BaseAddress;
INT64 v15;
__int16 v16;
__int16 v17;
_BYTE v18[20];
unsigned __int64 v19;
int v20;
char v21[12];
memset(v18, 0, sizeof(v18));
*(_QWORD *)&v21[4] = 0i64;
LODWORD(NewProtectWin32) = 0;
BaseAddress = (VOID *)a2;
RegionSize = 1i64;
ExAcquireFastMutex(&KiUserCodePatchMutex);
v5 = ZwProtectVirtualMemory((VOID *)0xFFFFFFFFFFFFFFFFi64, &BaseAddress, &RegionSize, 0x40ui64, &NewProtectWin32);
if( v5 >= 0 )
{
memset(v18, 0, sizeof(v18));
*(_DWORD *)&v21[8] = 0;
v15 = 0i64;
v16 = 8 * (((unsigned __int16)((a2 & 0xFFF) + 4096) >> 12) + 6);
v17 = 0;
v19 = a2 & 0xFFFFFFFFFFFFF000ui64;
*(_QWORD *)v21 = a2 & 0xFFF;
v20 = 1;
v5 = 0;
MiProbeAndLockPages((INT64)&v15, 1, 1i64);
if( (v17 & 5) != 0 )
{
v8 = *(_BYTE **)&v18[12];
}
else
{
LODWORD(Priority) = 1073741840;
LODWORD(OldProtect) = 0;
v8 = MmMapLockedPagesSpecifyCache((_MDL *)&v15, 0, MmCached, 0i64, (UINT64)OldProtect, Priority);
}
if( v8 )
*v8 = a3;
else
v5 = -1073741670;
MmUnlockPages((INT64)&v15, v6, v7);
ZwProtectVirtualMemory(
(VOID *)0xFFFFFFFFFFFFFFFFi64,
&BaseAddress,
&RegionSize,
(unsigned int)NewProtectWin32,
&NewProtectWin32);
}
KeReleaseGuardedMutex(&KiUserCodePatchMutex);
return(unsigned int)v5;
}Referenced by:
KiOp_MOVAPS
KiOp_MOVDQA