NtAreMappedFilesTheSame
NTSTATUS __stdcall NtAreMappedFilesTheSame(PVOID File1MappedAsAnImage, PVOID File2MappedAsFile){
_ETHREAD *CurrentThread;
INT64 v5;
INT64 v6;
INT64 v7;
INT64 v8;
INT64 v9;
_QWORD *v10;
__int64 *v11;
_QWORD *v12;
__int64 v13;
int v14;
_FILE_OBJECT *v15;
INT64 v17;
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
v5 = MiObtainReferencedVadEx((UINT64)File1MappedAsAnImage, 2, &v17);
v6 = v5;
if( !v5 )
return -1073741503;
MiUnlockVadShared((INT64)CurrentThread, v5);
v7 = MiObtainReferencedVadEx((UINT64)File2MappedAsFile, 2, &v17);
v8 = v7;
if( !v7 )
{
MiLockVadShared((INT64)CurrentThread, v6);
MiUnlockAndDereferenceVadShared((PVOID)v6);
return -1073741503;
}
if( v6 == v7 )
{
MiDereferenceVad(v6);
MiUnlockAndDereferenceVadShared((PVOID)v8);
return 0;
}
else if( (unsigned int)MiVadIsCfgBitmap((_MMVAD *)v6) == 1 || (unsigned int)MiVadIsCfgBitmap((_MMVAD *)v8) == 1 )
{
MiUnlockAndDereferenceVadShared((PVOID)v8);
MiLockVadShared((INT64)CurrentThread, v6);
MiUnlockAndDereferenceVadShared((PVOID)v6);
return -1073741800;
}
else
{
if( File1MappedAsAnImage <= File2MappedAsFile )
{
MiUnlockVadShared((INT64)CurrentThread, v8);
MiLockVadShared((INT64)CurrentThread, v6);
v9 = v8;
}
else
{
v9 = v6;
}
ExAcquirePushLockSharedEx(v9 + 40, 0i64);
if( (unsigned int)MiVadDeleted(v6) || (unsigned int)MiVadDeleted(v8) )
{
LODWORD(v17) = -1073741503;
}
else if( (*(_DWORD *)(v6 + 48) & 0x100000) == 0
&& (*(_DWORD *)(v8 + 48) & 0x100000) == 0
&& (v10 = *(_QWORD **)(v6 + 72)) != 0i64
&& (v11 = *(__int64 **)(v8 + 72)) != 0i64
&& (v12 = (_QWORD *)*v10) != 0i64
&& (v13 = *v11) != 0
&& v12[8]
&& *(_QWORD *)(v13 + 64) )
{
v14 = -1073741612;
v15 = MiReferenceControlAreaFile((_CONTROL_AREA *)v13);
if( v12 == v15->SectionObjectPointer->ImageSectionObject )
v14 = 0;
LODWORD(v17) = v14;
MiDereferenceControlAreaFile(v13, (unsigned __int64)v15);
}
else
{
LODWORD(v17) = -1073741800;
}
if( _InterlockedCompareExchange64((volatile signed __int64 *)(v8 + 40), 0i64, 17i64) != 17 )
ExfReleasePushLockShared((INT64 *)(v8 + 40));
KeAbPostRelease((PVOID)(v8 + 40));
MiUnlockAndDereferenceVadShared((PVOID)v6);
MiLockVadShared((INT64)CurrentThread, v8);
MiUnlockAndDereferenceVadShared((PVOID)v8);
return v17;
}
}Referenced by:
No references.