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