MiLockUnlockCommon
NTSTATUS __fastcall MiLockUnlockCommon(HANDLE Handle, void **a2, PVOID *a3, int a4, __int64 a5, __int64 a6, __int64 a7){
char v7;
KPROCESSOR_MODE v9;
__int64 v10;
__int64 v11;
void *v12;
PVOID v13;
NTSTATUS result;
PVOID Object[5];
v7 = a4;
Object[0] = 0i64;
if( (a4 & 0xFFFFFFFC) != 0 || (a4 & 3) == 0 )
return -1073741811;
v9 = *((_BYTE *)KeGetCurrentThread() + 562);
if( v9 )
{
v10 = 0x7FFFFFFF0000i64;
if( (unsigned __int64)a2 < 0x7FFFFFFF0000i64 )
v10 = (__int64)a2;
*(_QWORD *)v10 = *(_QWORD *)v10;
v11 = 0x7FFFFFFF0000i64;
if( (unsigned __int64)a3 < 0x7FFFFFFF0000i64 )
v11 = (__int64)a3;
*(_QWORD *)v11 = *(_QWORD *)v11;
}
v12 = *a2;
Object[2] = v12;
v13 = *a3;
Object[3] = *a3;
if( (unsigned __int64)v12 > 0x7FFFFFFEFFFFi64 || 0x7FFFFFFF0000i64 - (__int64)v12 < (unsigned __int64)v13 || !v13 )
return -1073741811;
result = ObReferenceObjectByHandleWithTag(Handle, 8u, (POBJECT_TYPE)PsProcessType, v9, 0x6D566D4Du, Object, 0i64);
if( result >= 0 )
{
if( (v7 & 2) == 0 || SeSinglePrivilegeCheck(*(_QWORD *)&SeLockMemoryPrivilege, v9) )
{
*(_QWORD *)a5 = v12;
*(_QWORD *)a6 = v13;
*(PVOID *)a7 = Object[0];
return 0;
}
else
{
ObfDereferenceObjectWithTag(Object[0], 0x6D566D4Dui64);
return -1073741727;
}
}
return result;
}Referenced by:
NtLockVirtualMemory
NtUnlockVirtualMemory