MiFinishMdlForMappedFileFault

VOID __stdcall MiFinishMdlForMappedFileFault(
        _MMINPAGE_SUPPORT *InPageSupport,
        VOID *TrapInformation,
        UINT64 CommitPages,
        _MMPFN *TransitionPfn,
        UINT64 SessionId){
  _SUBSECTION *Subsection; 
  __int64 ByteCount; 
  __int64 v9; 
  _CONTROL_AREA *ControlArea; 
  _MMPFN *LockedProtoPfn; 
  _MMPTE *v13; 
  union {unsigned __int64 Long;volatile unsigned __int64 VolatileLong;_MMPTE_HARDWARE Hard;_MMPTE_PROTOTYPE Proto;_MMPTE_SOFTWARE Soft;_MMPTE_TIMESTAMP TimeStamp;_MMPTE_TRANSITION Trans;_MMPTE_SUBSECTION Subsect;_MMPTE_LIST List;} v14; 
  UINT64 v15; 
  _LARGE_INTEGER v16; 
  _LARGE_INTEGER v17; 
  unsigned __int64 v18; 
  __int32 bf_0; 
  char v20; 
  int v21; 
  char v22; 
  char *v23; 
  __int64 v24; 
  int v25; 
  _MDL *v26; 
  _MMPFN *v27; 
  __int16 v28; 
  char v29; 
  UINT64 SpinCount; 
  _MMPTE *v31; 
  UINT64 v32; 
  _MMPTE *PointerPte; 

  Subsection = InPageSupport->Subsection;
  ByteCount = InPageSupport->ByteCount;
  v9 = (unsigned int)CommitPages;
  ControlArea = Subsection->ControlArea;
  MiReferenceControlAreaPfn(Subsection->ControlArea, Subsection, CommitPages);
  LockedProtoPfn = InPageSupport->LockedProtoPfn;
  MiObtainProtoReference(LockedProtoPfn, 0i64);
  LODWORD(v32) = 0;
  while( _interlockedbittestandset64((volatile signed __int32 *)&LockedProtoPfn->u2, 0x3Fui64) )
  {
    do
      KeYieldProcessorEx(&v32);
    while( LockedProtoPfn->u2._bf_0 < 0 );
  }
  LockedProtoPfn->u2._bf_0 ^= ((LockedProtoPfn->u2._bf_0 + v9) ^ LockedProtoPfn->u2._bf_0) & 0x3FFFFFFFFFFFFFFFi64;
  _InterlockedAnd64(&LockedProtoPfn->u2.Lock, 0x7FFFFFFFFFFFFFFFui64);
  v13 = (_MMPTE *)(MmGetPfnDb()[InPageSupport->Page[0]].PteLong | 0x8000000000000000ui64);
  v31 = v13;
  if( TransitionPfn )
    MiFlowThroughInsertNode(InPageSupport, TransitionPfn);
  PointerPte = InPageSupport->PointerPte;
  LODWORD(v14.Long) = MI_READ_PTE_LOCK_FREE((INT64)PointerPte);
  v15 = (unsigned int)SessionId;
  InPageSupport->PteContents.u = (union {unsigned __int64 Long;volatile unsigned __int64 VolatileLong;_MMPTE_HARDWARE Hard;_MMPTE_PROTOTYPE Proto;_MMPTE_SOFTWARE Soft;_MMPTE_TIMESTAMP TimeStamp;_MMPTE_TRANSITION Trans;_MMPTE_SUBSECTION Subsect;_MMPTE_LIST List;})v14.Long;
  v16.anonymous_0.LowPart = MiStartingOffset(Subsection, v13, v15);
  v17 = v16;
  LODWORD(v18) = MiEndingOffsetWithLock(Subsection);
  bf_0 = InPageSupport->u1.e1._bf_0;
  if( (bf_0 & 0x20000) != 0 )
  {
    bf_0 &= ~0x20000u;
    v20 = 1;
    InPageSupport->u1.e1._bf_0 = bf_0;
  }
  else
  {
    v20 = 0;
  }
  v21 = bf_0;
  if( (ControlArea->u.LongFlags & 0x20) != 0 && v17.QuadPart + ByteCount > v18 )
  {
    LODWORD(ByteCount) = (v18 - v17.anonymous_0.LowPart + 511) & 0xFFFFFE00;
    v21 = bf_0 | 0x20000;
    InPageSupport->u1.e1._bf_0 = bf_0 | 0x20000;
  }
  v22 = (char)TrapInformation;
  v23 = (char *)((unsigned __int64)TrapInformation & 0xFFFFFFFFFFFFFFFEui64);
  v24 = v22 & 1;
  if( v24 && (v29 = *v23, *v23 == 1) || v24 && (v29 = *v23, *v23 == 2) )
  {
    if( v23 && v29 != 2 )
      InPageSupport->u1.e1._bf_0 = v21 | 8;
  }
  if( PsGetIoPriorityThread((_ETHREAD *)KeGetCurrentThread()) < IoPriorityNormal )
    InPageSupport->u1.e1._bf_0 = v25 | 0x80;
  InPageSupport->Mdl.Next = v26;
  InPageSupport->Mdl.MdlFlags = (__int16)v26;
  InPageSupport->Mdl.Size = 8 * ((((unsigned __int64)(unsigned int)ByteCount + 4095) >> 12) + 6);
  InPageSupport->Mdl.StartVa = v26;
  InPageSupport->Mdl.ByteOffset = (unsigned int)v26;
  InPageSupport->Mdl.ByteCount = ByteCount;
  LODWORD(SpinCount) = (_DWORD)v26;
  if( _interlockedbittestandset64((volatile signed __int32 *)&LockedProtoPfn->u2, 0x3Fui64) )
  {
    do
    {
      do
        KeYieldProcessorEx(&SpinCount);
      while( LockedProtoPfn->u2._bf_0 < 0 );
    }
    while( _interlockedbittestandset64((volatile signed __int32 *)&LockedProtoPfn->u2, 0x3Fui64) );
    v13 = v31;
  }
  *((_BYTE *)&LockedProtoPfn->u3 + 2) &= ~0x20u;
  MiRemoveLockedPageChargeAndDecRef(LockedProtoPfn);
  _InterlockedAnd64(&LockedProtoPfn->u2.Lock, 0x7FFFFFFFFFFFFFFFui64);
  v27 = &MmGetPfnDb()[InPageSupport->Page[PointerPte - v13]];
  v28 = InPageSupport->Mdl.MdlFlags | 0x42;
  InPageSupport->Mdl.MdlFlags = v28;
  if( !v20 )
    InPageSupport->Mdl.MdlFlags = v28 | 0x4000;
  InPageSupport->ReadOffset = v17;
  InPageSupport->BasePte = v13;
  InPageSupport->Pfn = v27;
  InPageSupport->FilePointer = 0i64;
  InPageSupport->ControlArea = ControlArea;
}

Referenced by:

MiResolveMappedFileFault