MmIsFileMapped
NTSTATUS __stdcall MmIsFileMapped(_EPROCESS *TargetProcess, _FILE_OBJECT *FileObject){
_SECTION_OBJECT_POINTERS *SectionObjectPointer;
NTSTATUS v3;
_EPROCESS *v4;
_ETHREAD *CurrentThread;
int v6;
_RTL_BALANCED_NODE *Root;
_MMVAD_SHORT *i;
_MMVAD_SHORT **ExtraCreateInfo;
_MMVAD_SHORT *v10;
_MMVAD_SHORT *v11;
_MMVAD_SHORT *NextVad;
_CONTROL_AREA **v13;
_CONTROL_AREA *v14;
_FILE_OBJECT *v15;
_KAPC_STATE ApcState;
SectionObjectPointer = FileObject->SectionObjectPointer;
memset(&ApcState, 0, sizeof(ApcState));
v3 = 0;
v4 = TargetProcess;
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
if( CurrentThread->Tcb.ApcState.Process == TargetProcess )
{
v6 = 0;
}
else
{
KiStackAttachProcess(TargetProcess, 0i64, &ApcState);
v6 = 1;
}
LOCK_ADDRESS_SPACE_SHARED(CurrentThread, v4);
Root = v4->VadRoot.Root;
i = 0i64;
while( Root )
{
i = (_MMVAD_SHORT *)Root;
Root = Root->Children[0];
}
if( i )
{
do
{
ExtraCreateInfo = (_MMVAD_SHORT **)i->ExtraCreateInfo;
v10 = i;
v11 = i;
if( ExtraCreateInfo )
{
NextVad = *ExtraCreateInfo;
for( i = (_MMVAD_SHORT *)i->ExtraCreateInfo; NextVad; NextVad = NextVad->NextVad )
i = NextVad;
}
else
{
while( 1 )
{
i = (_MMVAD_SHORT *)(i->VadNode.ParentValue & 0xFFFFFFFFFFFFFFFCui64);
if( !i || i->NextVad == v11 )
break;
v11 = i;
}
}
if( (v10->u.LongFlags & 0x100000) == 0 )
{
MiLockVadShared((INT64)CurrentThread, (INT64)v10);
if( !MiVadDeleted(v10) )
{
v13 = (_CONTROL_AREA **)v10[1].ExtraCreateInfo;
v14 = *v13;
if( (*v13)->FilePointer.Value )
{
v15 = MiReferenceControlAreaFile(*v13);
if( v15->SectionObjectPointer == SectionObjectPointer )
v3 = 1;
MiDereferenceControlAreaFile(v14, v15);
}
}
MiUnlockVadShared(&CurrentThread->Tcb, (_EX_PUSH_LOCK *)v10);
if( v3 == 1 )
break;
}
}
while( i );
v4 = TargetProcess;
}
UNLOCK_ADDRESS_SPACE_SHARED(CurrentThread, v4);
if( v6 == 1 )
KiUnstackDetachProcess(&ApcState, 0i64);
return v3;
}Referenced by:
IopQueryProcessIdsUsingFile