MiValidateInPage

INT64 __fastcall MiValidateInPage(__int64 a1){
  _DWORD *v1; 
  ULONG_PTR v2; 
  int v3; 
  INT64 v5; 
  __int64 *v6; 
  __int64 v7; 
  int v8; 
  unsigned __int64 v9; 
  __int64 *v10; 
  unsigned int v11; 
  int v12; 
  __int64 v13; 
  unsigned __int64 v14; 
  int v15; 
  int v16; 
  PVOID MappedSystemVa; 
  __int64 v18; 
  ULONG_PTR v19; 
  __int64 v20; 
  _MMPTE *PteBase; 
  char *v22; 
  unsigned __int64 v23; 
  INT64 *v24; 
  INT64 v25; 
  INT64 result; 
  int v27; 
  __int16 MdlFlags; 
  VOID *v29; 
  UINT64 v30; 
  INT64 v31; 
  UINT64 BugCheckOnFailure; 
  int Priority; 
  PMDL MemoryDescriptorList; 
  ULONG_PTR BugCheckParameter2; 
  int v36; 
  CHAR v37; 
  unsigned int v38; 
  VOID *MappingVa; 
  _EPROCESS *CallingProcess; 
  v1 = (_DWORD *)(a1 + 272);
  v2 = *(_QWORD *)(a1 + 208);
  v3 = *(_DWORD *)(a1 + 184);
  BugCheckParameter2 = v2;
  if( *(_QWORD *)(a1 + 256) )
    v1 = *(_DWORD **)(a1 + 256);
  v38 = 0;
  v5 = *(_QWORD *)(v2 + 96);
  MemoryDescriptorList = (PMDL)v1;
  v6 = (__int64 *)(v1 + 12);
  v7 = (unsigned int)v1[10];
  v8 = v1[11];
  v9 = ((unsigned __int64)(((_WORD)v8 + (unsigned __int16)v1[8]) & 0xFFF) + v7 + 4095) >> 12;
  CallingProcess = (_EPROCESS *)*((_QWORD *)KeGetCurrentThread() + 23);
  v10 = (__int64 *)&v1[2 * (unsigned int)v9 + 12];
  *(_QWORD *)(a1 + 96) += (unsigned int)(v3 - v7 - v8);
  v11 = v3 - v1[11] - v1[10];
  v12 = 2;
  v37 = 0;
  *(_DWORD *)(a1 + 188) += ((v11 & 0xFFF) != 0) + (v11 >> 12);
  v13 = *(_QWORD *)(v5 + 40);
  if( (v13 & 0xFFFFFFFFFFFFFFF8ui64) <= 8 )
    v12 = 0;
  v14 = ((unsigned __int64)MI_READ_PTE_LOCK_FREE((INT64)MmGetPfnDb() + 48 * *v6 + 16) >> 5) & 0x1F;
  v36 = v14;
  if( (*(_DWORD *)(v2 + 92) & 0xC0000) != 0 && (v12 & 2) != 0 )
  {
    v15 = v12 | 1;
  }
  else
  {
    v15 = v12;
    if( (MiFlags & 0x40000) != 0 && (v14 & 2) != 0 )
      v37 = 3;
  }
  if( (*(_DWORD *)(a1 + 192) & 0x10000) != 0 )
  {
    v15 |= 4u;
    if( (MiFlags & 0x4000) != 0 && (v15 & 1) != 0 )
      v15 &= ~4u;
  }
  v16 = v14 & 2;
  if( (v14 & 2) != 0 && (MiFlags & 0x40000) != 0 )
  {
    v31 = (INT64)MemoryDescriptorList;
    if( (MemoryDescriptorList->MdlFlags & 1) != 0 )
      MmUnmapLockedPages(MemoryDescriptorList->MappedSystemVa, MemoryDescriptorList);
    MiFlushEntireTbDueToAttributeChange(v31, (_BYTE *)v14);
  }
  MappedSystemVa = 0i64;
  MappingVa = 0i64;
  if( (v15 & 2) != 0
    && (unsigned int)v9 > 1
    && (MdlFlags = MemoryDescriptorList->MdlFlags, (MdlFlags & 0x4000) != 0)
    && ((MdlFlags & 5) == 0 ? (MappedSystemVa = MmMapLockedPagesSpecifyCache(
                                                  MemoryDescriptorList,
                                                  0,
                                                  MmCached,
                                                  0i64,
                                                  0,
                                                  0xC0000010)) : (MappedSystemVa = MemoryDescriptorList->MappedSystemVa),
        (MappingVa = MappedSystemVa) != 0i64) )
  {
    v29 = (VOID *)(v13 & 0xFFFFFFFFFFFFFFF8ui64);
    if( (v15 & 1) != 0 && !*(_QWORD *)(v5 + 56) )
    {
      result = MiGetSectionStrongImageReference(v5);
      if( (int)result < 0 )
        return result;
    }
    v30 = (unsigned int)((_DWORD)v9 << 12);
    v18 = (__int64)CallingProcess;
    LODWORD(BugCheckOnFailure) = v16 != 0 ? 2 : 0;
    if( (int)SeValidateImageData(v29, MappingVa, v30, *(_QWORD *)(a1 + 96), BugCheckOnFailure, CallingProcess) < 0 )
    {
      MappedSystemVa = 0i64;
      MappingVa = 0i64;
    }
    else
    {
      MappedSystemVa = MappingVa;
    }
  }
  else
  {
    v18 = (__int64)CallingProcess;
  }
  if( v6 >= v10 )
    return v38;
  v19 = BugCheckParameter2;
  v20 = 0i64;
  while( 1 )
  {
    PteBase = MmGetPteBase();
    v22 = (char *)MmGetPfnDb() + 48 * *v6;
    v15 ^= ((unsigned __int8)v15 ^ (unsigned __int8)(2 * v15)) & 8;
    if( v22 == (char *)qword_140C4EAB0 )
      goto LABEL_22;
    if( MappedSystemVa )
    {
      MiMarkPfnVerified((UINT64)v22, v37);
LABEL_30:
      PteBase = MmGetPteBase();
      goto LABEL_17;
    }
    if( (v15 & 2) == 0 )
      goto LABEL_17;
    v27 = MiValidateImagePfn(v19, *(_QWORD *)(a1 + 96), v18, 0xFFFFFFFF, BugCheckOnFailure, v36, *v6, 0);
    if( v27 >= 0 )
      goto LABEL_30;
    if( v27 == -1073741670 )
      break;
    v38 = -1073740748;
    if( (v15 & 1) == 0 || (MiFlags & 0x4000) == 0 )
      goto LABEL_30;
    PteBase = MmGetPteBase();
    if( (*(_DWORD *)(a1 + 192) & 0x10000) != 0 )
      v15 |= 8u;
LABEL_17:
    if( (v15 & 8) == 0 )
      goto LABEL_22;
    if( (MemoryDescriptorList->MdlFlags & 1) != 0 )
    {
      v23 = (unsigned __int64)MemoryDescriptorList->MappedSystemVa + 4096 * (v20 >> 3);
      v24 = (INT64 *)((char *)PteBase + ((v23 >> 9) & 0x7FFFFFFFF8i64));
      v25 = MI_READ_PTE_LOCK_FREE((INT64)v24);
      if( (v25 & 0x42) == 0 )
      {
        *v24 = v25 | 0x842;
        if( (MiFlags & 0x100) == 0 && (MiFlags & 0x200) == 0 )
          KeFlushSingleTb(v23, 0i64, 1i64);
      }
    }
    else
    {
      v23 = 0i64;
    }
    if( (int)MiRelocateImagePfn(BugCheckParameter2, v23, *(_DWORD *)(a1 + 188), *v6, 0i64, Priority, 2) < 0 )
      break;
    v19 = BugCheckParameter2;
LABEL_22:
    *(_QWORD *)(a1 + 96) += 4096i64;
    ++v6;
    ++*(_DWORD *)(a1 + 188);
    v20 += 8i64;
    if( v6 >= v10 )
      return v38;
    MappedSystemVa = MappingVa;
    v18 = (__int64)CallingProcess;
  }
  *(_DWORD *)(a1 + 80) = -1073741670;
  return v38;
}

Referenced by:

MiWaitForInPageComplete