MiFillPerSessionProtos

VOID __stdcall MiFillPerSessionProtos(
        _CONTROL_AREA *ControlArea,
        _MMPTE *PointerProtoPte,
        UINT64 *PageArray,
        UINT64 NumberOfPtes){
  int v4; 
  unsigned __int64 v8; 
  _MI_PARTITION *ControlAreaPartition; 
  signed __int64 v10; 
  unsigned int NextPageColor; 
  UINT64 j; 
  UINT64 v13; 
  UINT64 DriverPage; 
  UINT64 v15; 
  _MMPFN *v16; 
  LONGLONG *v17; 
  NTSTATUS v18; 
  UINT64 *PteFromCopyList; 
  int v20; 
  INT64 v21[2]; 
  UINT64 v22[2]; 
  __int64 v23; 
  signed __int64 i; 
  unsigned int ProtectionMask; 
  unsigned int v27; 
  __int64 v28; 
  _QWORD *v29; 
  LARGE_INTEGER *ThawTimeout; 
  v4 = NumberOfPtes;
  *(_OWORD *)v22 = 0i64;
  v23 = 0i64;
  *(_OWORD *)v21 = 0i64;
  if( !v29 )
  {
    v8 = (unsigned int)NumberOfPtes * ((v28 != 0) + 2) + 1;
    MiCreatePteCopyList(v8, (unsigned int)v8, (__int64)v22);
    if( !HIDWORD(v22[0]) )
      return;
    MiInitializePageColorBase(0i64, 0i64, (INT64)v21);
  }
  ControlAreaPartition = MiGetControlAreaPartition(ControlArea);
  if( v4 )
  {
    v10 = PointerProtoPte - (_MMPTE *)PageArray;
    for( i = v10; ; v10 = i )
    {
      if( v29 )
      {
        DriverPage = (UINT64)MiAllocateDriverPage();
      }
      else
      {
        NextPageColor = MiGetNextPageColor((INT64)v21);
        for( j = NextPageColor; ; j = NextPageColor )
        {
          DriverPage = MiGetPage(ControlAreaPartition, j, 0i64);
          if( DriverPage != -1i64 )
            break;
          MiWaitForFreePage(ControlAreaPartition, v13);
        }
      }
      v16 = (_MMPFN *)((char *)MmGetPfnDb() + 48 * DriverPage);
      MiInitializeProtoPfn(DriverPage, (MMPTE *)((char *)PageArray + v10), ProtectionMask, v15);
      if( v29 )
      {
        v17 = (LONGLONG *)ThawTimeout;
        v20 = 0;
        v18 = KeCopyPrivilegedPage((LARGE_INTEGER *)DriverPage, ThawTimeout, *PageArray);
        if( v18 < 0 )
          KeBugCheckEx(0x1Au, 0x5150Aui64, *PageArray, DriverPage, v18);
        MiMarkPfnVerified((UINT64)v16, 0);
      }
      else
      {
        MiCopyPage(DriverPage, *PageArray, (__int128 *)v22, 72);
        if( v28 )
        {
          PteFromCopyList = MiGetPteFromCopyList(v22, DriverPage, -1i64);
          MiRelocateImagePfn(
            (ULONG_PTR)ControlArea,
            (__int64)(((_QWORD)PteFromCopyList << 25) - ((_QWORD)MmGetPteBase() << 25)) >> 16,
            v27,
            DriverPage,
            v28,
            v20,
            2);
          *PteFromCopyList = ZeroPte;
        }
        MiReturnPfnReferenceCount(v16);
        v17 = (LONGLONG *)ThawTimeout;
      }
      ++v27;
      ++PageArray;
      --v4;
      if( v29 )
      {
        *v29 += 4096i64;
        *v17 += 4096i64;
      }
      if( !v4 )
        break;
    }
  }
  MiReleasePteCopyList((INT64)v22);
}

Referenced by:

MiAllocatePerSessionProtos