MiInitializeImageProtos

VOID __stdcall MiInitializeImageProtos(_CONTROL_AREA *ControlArea, _MDL *Mdl, _MMPFN *HeaderPfn){
  _CONTROL_AREA *v3; 
  unsigned int EffectivePagePriorityThread; 
  char v5; 
  _CONTROL_AREA *v6; 
  _MMPFN *v7; 
  _CONTROL_AREA *v8; 
  unsigned __int64 v9; 
  __int64 v10; 
  __int64 v11; 
  unsigned __int64 v12; 
  unsigned __int64 v13; 
  __int16 v14; 
  UINT64 v15; 
  UINT64 v16; 
  char *v17; 
  _MMPFN *v18; 
  UINT64 v19; 
  UINT64 Priority; 
  unsigned __int64 ByteCount; 
  _MI_PARTITION *Partition; 
  unsigned __int64 v23; 
  unsigned __int64 v24; 
  _CONTROL_AREA *v25; 
  UINT8 PageIrql; 
  UINT64 SpinCount; 

  v3 = ControlArea;
  Partition = *(_MI_PARTITION **)(*(&stru_140C4DB30 + 267) + 8i64 * (ControlArea->u1.Flags._bf_0 & 0x3FF));
  ByteCount = Mdl->ByteCount;
  EffectivePagePriorityThread = MiGetEffectivePagePriorityThread((_ETHREAD *)KeGetCurrentThread());
  v5 = EffectivePagePriorityThread;
  if( EffectivePagePriorityThread > 5 )
  {
    v5 = 5;
  }
  else if( EffectivePagePriorityThread )
  {
    v5 = EffectivePagePriorityThread - 1;
  }
  v6 = v3 + 1;
  PageIrql = 17;
  v7 = 0i64;
  if( v3 != (_CONTROL_AREA *)-128i64 )
  {
    do
    {
      v8 = *(_CONTROL_AREA **)&v6->gap8[8];
      v9 = *(_QWORD *)v6->gap8;
      v25 = v8;
      if( (v6->NumberOfPfnReferences & 0x20000) == 0 )
      {
        LODWORD(v10) = MiStartingOffset((_SUBSECTION *)v6, (_MMPTE *)v9, 0xFFFFFFFFui64);
        v11 = v10;
        MiEndingOffset((_SUBSECTION *)v6);
        v23 = v12;
        v13 = v9 + 8i64 * HIDWORD(v6->NumberOfMappedViews);
        v24 = v13;
        if( v9 < v13 )
        {
          while( 1 )
          {
            if( (v9 & 0xFFF) != 0 && v7 )
              goto LABEL_9;
            if( v7 )
              MiUnlockProtoPoolPage((ULONG_PTR)v7, PageIrql);
            v7 = MiLockProtoPoolPage((_MMPTE *)v9, &PageIrql);
            if( v7 )
            {
LABEL_9:
              if( v11 + 4096 > ByteCount )
              {
                v8 = 0i64;
                break;
              }
              v14 = MI_READ_PTE_LOCK_FREE(v9);
              if( (v14 & 1) == 0 && (v14 & 0xC00) != 2048i64 && (v14 & 0x400) != 0 )
              {
                MiGetPageForHeader(Partition, (v3->u.LongFlags >> 20) & 0x3F);
                v16 = v15;
                if( v15 != -1i64 )
                {
                  if( (Mdl->MdlFlags & 5) == 0 )
                  {
                    LODWORD(Priority) = -1073741792;
                    LODWORD(v19) = 0;
                    MmMapLockedPagesSpecifyCache(Mdl, 0, MmCached, 0i64, v19, Priority);
                  }
                  v17 = (char *)MiMapPageInHyperSpaceWorker(v16, 0i64, 0x80000000ui64);
                  KeCopyPage(v17);
                  if( v11 + 4096 > v23 )
                    memset(&v17[-(unsigned int)(v11 - v23 + 4096) + 4096], 0i64, v11 - v23 + 4096);
                  MiUnmapPageInHyperSpaceWorker(v17, 0x11u, 0x80000000ui64);
                  v18 = &MmGetPfnDb()[v16];
                  MiReferenceControlAreaPfn(ControlArea, 0i64, 1ui64);
                  LODWORD(SpinCount) = 0;
                  while( _interlockedbittestandset64((volatile signed __int32 *)&v18->u2, 0x3Fui64) )
                  {
                    do
                      KeYieldProcessorEx(&SpinCount);
                    while( v18->u2._bf_0 < 0 );
                  }
                  MiInitializeTransitionPfn(v16, (_MMPTE *)v9);
                  *((_BYTE *)&v18->u3 + 3) ^= (*((_BYTE *)&v18->u3 + 3) ^ v5) & 7;
                  MiRemoveLockedPageChargeAndDecRef(v18);
                  _InterlockedAnd64(&v18->u2.Lock, 0x7FFFFFFFFFFFFFFFui64);
                  v13 = v24;
                }
                v3 = ControlArea;
              }
              v9 += 8i64;
              v11 += 4096i64;
            }
            else
            {
              MmAccessFault(2ui64, (PVOID)v9, 0, 0i64);
            }
            if( v9 >= v13 )
            {
              v8 = v25;
              break;
            }
          }
        }
        if( v7 )
        {
          MiUnlockProtoPoolPage((ULONG_PTR)v7, PageIrql);
          v7 = 0i64;
        }
      }
      v6 = v8;
    }
    while( v8 );
  }
}

Referenced by:

MiCreateImageFileMap