MiLockUnlockCommon
NTSTATUS __stdcall MiLockUnlockCommon(
VOID *ProcessHandle,
VOID **BaseAddress,
VOID **RegionSize,
UINT64 MapType,
VOID **OutCapturedBase,
UINT64 *OutCapturedRegionSize,
VOID **OutTargetProcess){
char v7;
char PreviousMode;
__int64 v10;
__int64 v11;
void *v12;
VOID *v13;
NTSTATUS result;
UINT64 Tag;
PVOID Object[5];
v7 = MapType;
Object[0] = 0i64;
if( (MapType & 0xFFFFFFFC) != 0 || (MapType & 3) == 0 )
return -1073741811;
PreviousMode = KeGetCurrentThread()->PreviousMode;
if( PreviousMode )
{
v10 = 0x7FFFFFFF0000i64;
if( (unsigned __int64)BaseAddress < 0x7FFFFFFF0000i64 )
v10 = (__int64)BaseAddress;
*(_QWORD *)v10 = *(_QWORD *)v10;
v11 = 0x7FFFFFFF0000i64;
if( (unsigned __int64)RegionSize < 0x7FFFFFFF0000i64 )
v11 = (__int64)RegionSize;
*(_QWORD *)v11 = *(_QWORD *)v11;
}
v12 = *BaseAddress;
Object[2] = v12;
v13 = *RegionSize;
Object[3] = *RegionSize;
if( (unsigned __int64)v12 > 0x7FFFFFFEFFFFi64 || 0x7FFFFFFF0000i64 - (__int64)v12 < (unsigned __int64)v13 || !v13 )
return -1073741811;
LODWORD(Tag) = 1834380621;
result = ObReferenceObjectByHandleWithTag(
ProcessHandle,
8ui64,
(_OBJECT_TYPE *)PsProcessType,
PreviousMode,
Tag,
Object,
0i64);
if( result >= 0 )
{
if( (v7 & 2) == 0 || SeSinglePrivilegeCheck(*(_QWORD *)&SeLockMemoryPrivilege, PreviousMode) )
{
*OutCapturedBase = v12;
*OutCapturedRegionSize = (UINT64)v13;
*OutTargetProcess = Object[0];
return 0;
}
else
{
ObfDereferenceObjectWithTag(Object[0], 0x6D566D4Dui64);
return -1073741727;
}
}
return result;
}Referenced by:
NtLockVirtualMemory
NtUnlockVirtualMemory