NtAreMappedFilesTheSame
NTSTATUS __stdcall NtAreMappedFilesTheSame(VOID *File1MappedAsAnImage, VOID *File2MappedAsFile){
_ETHREAD *CurrentThread;
_EX_PUSH_LOCK *v5;
_MMVAD *v6;
_MMVAD *v7;
_MMVAD *v8;
_EX_PUSH_LOCK *v9;
_SUBSECTION *Subsection;
_CONTROL_AREA **p_ControlArea;
_CONTROL_AREA *ControlArea;
_CONTROL_AREA *v13;
int v14;
_FILE_OBJECT *v15;
INT64 v17;
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
LODWORD(v5) = MiObtainReferencedVadEx((UINT64)File1MappedAsAnImage, 2, &v17);
v6 = (_MMVAD *)v5;
if( !v5 )
return -1073741503;
MiUnlockVadShared(&CurrentThread->Tcb, v5);
LODWORD(v7) = MiObtainReferencedVadEx((UINT64)File2MappedAsFile, 2, &v17);
v8 = v7;
if( !v7 )
{
MiLockVadShared((INT64)CurrentThread, (INT64)v6);
MiUnlockAndDereferenceVadShared(v6);
return -1073741503;
}
if( v6 == v7 )
{
MiDereferenceVad(&v6->Core);
MiUnlockAndDereferenceVadShared(v8);
return 0;
}
else if( MiVadIsCfgBitmap(v6) == 1 || MiVadIsCfgBitmap(v8) == 1 )
{
MiUnlockAndDereferenceVadShared(v8);
MiLockVadShared((INT64)CurrentThread, (INT64)v6);
MiUnlockAndDereferenceVadShared(v6);
return -1073741800;
}
else
{
if( File1MappedAsAnImage <= File2MappedAsFile )
{
MiUnlockVadShared(&CurrentThread->Tcb, (_EX_PUSH_LOCK *)v8);
MiLockVadShared((INT64)CurrentThread, (INT64)v6);
v9 = (_EX_PUSH_LOCK *)v8;
}
else
{
v9 = (_EX_PUSH_LOCK *)v6;
}
ExAcquirePushLockSharedEx(v9 + 5, 0i64);
if( MiVadDeleted(&v6->Core) || MiVadDeleted(&v8->Core) )
{
LODWORD(v17) = -1073741503;
}
else if( (v6->Core.u.LongFlags & 0x100000) == 0
&& (v8->Core.u.LongFlags & 0x100000) == 0
&& (Subsection = v6->Subsection) != 0i64
&& (p_ControlArea = &v8->Subsection->ControlArea) != 0i64
&& (ControlArea = Subsection->ControlArea) != 0i64
&& (v13 = *p_ControlArea) != 0i64
&& ControlArea->FilePointer.Value
&& v13->FilePointer.Value )
{
v14 = -1073741612;
v15 = MiReferenceControlAreaFile(v13);
if( ControlArea == v15->SectionObjectPointer->ImageSectionObject )
v14 = 0;
LODWORD(v17) = v14;
MiDereferenceControlAreaFile(v13, v15);
}
else
{
LODWORD(v17) = -1073741800;
}
if( _InterlockedCompareExchange64(&v8->Core.PushLock._bf_0, 0i64, 17i64) != 17 )
ExfReleasePushLockShared(&v8->Core.PushLock);
KeAbPostRelease(&v8->Core.PushLock);
MiUnlockAndDereferenceVadShared(v6);
MiLockVadShared((INT64)CurrentThread, (INT64)v8);
MiUnlockAndDereferenceVadShared(v8);
return v17;
}
}Referenced by:
No references.