MiFinishMdlForMappedFileFault

VOID __fastcall MiFinishMdlForMappedFileFault(
        _MMINPAGE_SUPPORT *InPageSupport,
        VOID *TrapInformation,
        UINT64 CommitPages,
        _MMPFN *TransitionPfn,
        UINT64 SessionId){
  _CONTROL_AREA **v5; 
  __int64 v7; 
  __int64 v9; 
  _CONTROL_AREA *v11; 
  INT64 v12; 
  unsigned __int64 v13; 
  INT64 v14; 
  unsigned int v15; 
  unsigned __int64 v16; 
  UINT64 v17; 
  int v18; 
  char v19; 
  int v20; 
  char v21; 
  char *v22; 
  __int64 v23; 
  int v24; 
  __int64 v25; 
  char *v26; 
  __int16 v27; 
  char v28; 
  UINT64 SpinCount; 
  unsigned __int64 v30; 
  UINT64 v31; 
  INT64 v32; 
  v5 = (_CONTROL_AREA **)*((_QWORD *)InPageSupport + 26);
  v7 = *((unsigned int *)InPageSupport + 46);
  v9 = (unsigned int)CommitPages;
  v11 = *v5;
  MiReferenceControlAreaPfn(*v5, (_SUBSECTION *)v5, CommitPages);
  v12 = *((_QWORD *)InPageSupport + 20);
  MiObtainProtoReference(v12, 0);
  LODWORD(v31) = 0;
  while( _interlockedbittestandset64((volatile signed __int32 *)(v12 + 24), 0x3Fui64) )
  {
    do
      KeYieldProcessorEx(&v31);
    while( *(__int64 *)(v12 + 24) < 0 );
  }
  *(_QWORD *)(v12 + 24) ^= ((*(_QWORD *)(v12 + 24) + v9) ^ *(_QWORD *)(v12 + 24)) & 0x3FFFFFFFFFFFFFFFi64;
  _InterlockedAnd64((volatile signed __int64 *)(v12 + 24), 0x7FFFFFFFFFFFFFFFui64);
  v13 = *((_QWORD *)MmGetPfnDb() + 6 * *((_QWORD *)InPageSupport + 40) + 1) | 0x8000000000000000ui64;
  v30 = v13;
  if( TransitionPfn )
    MiFlowThroughInsertNode(InPageSupport, TransitionPfn);
  v32 = *((_QWORD *)InPageSupport + 29);
  v14 = MI_READ_PTE_LOCK_FREE(v32);
  v15 = SessionId;
  *((_QWORD *)InPageSupport + 21) = v14;
  v16 = MiStartingOffset((__int64)v5, v13, v15);
  v17 = MiEndingOffsetWithLock((__int64)v5);
  v18 = *((_DWORD *)InPageSupport + 48);
  if( (v18 & 0x20000) != 0 )
  {
    v18 &= ~0x20000u;
    v19 = 1;
    *((_DWORD *)InPageSupport + 48) = v18;
  }
  else
  {
    v19 = 0;
  }
  v20 = v18;
  if( (*((_DWORD *)v11 + 14) & 0x20) != 0 && v16 + v7 > v17 )
  {
    LODWORD(v7) = (v17 - v16 + 511) & 0xFFFFFE00;
    v20 = v18 | 0x20000;
    *((_DWORD *)InPageSupport + 48) = v18 | 0x20000;
  }
  v21 = (char)TrapInformation;
  v22 = (char *)((unsigned __int64)TrapInformation & 0xFFFFFFFFFFFFFFFEui64);
  v23 = v21 & 1;
  if( v23 && (v28 = *v22, *v22 == 1) || v23 && (v28 = *v22, *v22 == 2) )
  {
    if( v22 && v28 != 2 )
      *((_DWORD *)InPageSupport + 48) = v20 | 8;
  }
  if( (int)PsGetIoPriorityThread((__int64)KeGetCurrentThread()) < 2 )
    *((_DWORD *)InPageSupport + 48) = v24 | 0x80;
  *((_QWORD *)InPageSupport + 34) = v25;
  *((_WORD *)InPageSupport + 141) = v25;
  *((_WORD *)InPageSupport + 140) = 8 * ((((unsigned __int64)(unsigned int)v7 + 4095) >> 12) + 6);
  *((_QWORD *)InPageSupport + 38) = v25;
  *((_DWORD *)InPageSupport + 79) = v25;
  *((_DWORD *)InPageSupport + 78) = v7;
  LODWORD(SpinCount) = v25;
  if( _interlockedbittestandset64((volatile signed __int32 *)(v12 + 24), 0x3Fui64) )
  {
    do
    {
      do
        KeYieldProcessorEx(&SpinCount);
      while( *(__int64 *)(v12 + 24) < 0 );
    }
    while( _interlockedbittestandset64((volatile signed __int32 *)(v12 + 24), 0x3Fui64) );
    v13 = v30;
  }
  *(_BYTE *)(v12 + 34) &= ~0x20u;
  MiRemoveLockedPageChargeAndDecRef((_MMPFN *)v12);
  _InterlockedAnd64((volatile signed __int64 *)(v12 + 24), 0x7FFFFFFFFFFFFFFFui64);
  v26 = (char *)MmGetPfnDb() + 48 * *((_QWORD *)InPageSupport + ((__int64)(v32 - v13) >> 3) + 40);
  v27 = *((_WORD *)InPageSupport + 141) | 0x42;
  *((_WORD *)InPageSupport + 141) = v27;
  if( !v19 )
    *((_WORD *)InPageSupport + 141) = v27 | 0x4000;
  *((_QWORD *)InPageSupport + 12) = v16;
  *((_QWORD *)InPageSupport + 30) = v13;
  *((_QWORD *)InPageSupport + 31) = v26;
  *((_QWORD *)InPageSupport + 25) = 0i64;
  *((_QWORD *)InPageSupport + 26) = v11;
}

Referenced by:

MiResolveMappedFileFault