MiDbgWriteCheck

VOID *__stdcall MiDbgWriteCheck(VOID *VirtualAddress, _HARDWARE_PTE *Opaque, UINT64 ForceWritableIfPossible){
  NTSTATUS v4; 
  NTSTATUS v5; 
  char *v6; 
  UINT64 v7; 
  UINT64 v8; 
  unsigned __int64 v9; 
  UINT64 v10; 
  UINT64 v11; 
  unsigned __int64 v12; 
  _MMPFN *v13; 
  _MMPFN *PfnDb; 
  int v15; 
  UINT64 v16; 
  __int64 v17; 
  unsigned __int64 v18; 
  int v19; 
  UINT64 v20; 
  UINT64 v22; 
  _STRING PrivilegedIdentity; 
  NTSTATUS v25; 

  Opaque->_bf_0 = 0i64;
  if( !MmIsAddressValidEx((INT64)VirtualAddress) )
    return 0i64;
  v4 = MI_IS_PHYSICAL_ADDRESS(VirtualAddress);
  v25 = v4;
  v5 = v4;
  if( v4 )
  {
    if( v4 != 1
      || PsNtosImageBase
      && PsHalImageBase
      && ((unsigned __int64)VirtualAddress < PsNtosImageBase || (unsigned __int64)VirtualAddress >= PsNtosImageEnd)
      && (VirtualAddress < PsHalImageBase || (unsigned __int64)VirtualAddress >= PsHalImageEnd) )
    {
      return VirtualAddress;
    }
    v6 = (char *)MmGetPdeBase() + (((unsigned __int64)VirtualAddress >> 18) & 0x3FFFFFF8);
    LODWORD(v7) = MI_READ_PTE_LOCK_FREE((INT64)v6);
    v22 = v7;
    v8 = v7;
    MiPteInShadowRange((UINT64)&v22);
    v9 = ((v8 >> 12) & 0xFFFFFFFFFi64) + (((unsigned __int64)VirtualAddress >> 12) & 0x1FF);
  }
  else
  {
    v6 = (char *)MmGetPteBase() + (((unsigned __int64)VirtualAddress >> 9) & 0x7FFFFFFFF8i64);
    LODWORD(v10) = MI_READ_PTE_LOCK_FREE((INT64)v6);
    v22 = v10;
    v11 = v10;
    MiPteInShadowRange((UINT64)&v22);
    v9 = (v11 >> 12) & 0xFFFFFFFFFi64;
  }
  if( (MiFlags & 0x10000) == 0 )
    goto LABEL_26;
  v12 = 0i64;
  v13 = 0i64;
  PrivilegedIdentity = 0i64;
  if( (MiFlags & 0x1000) == 0 )
  {
    *(_QWORD *)&PrivilegedIdentity.Length = VirtualAddress;
LABEL_21:
    v15 = (unsigned int)KeSetPagePrivilege((_PREFIX_TABLE *)v9, &PrivilegedIdentity, 12);
    goto LABEL_22;
  }
  if( v9 <= 0xFFFFFFFFFi64 && (((unsigned __int64)MmGetPfnDb()[v9].u4._bf_0 >> 50) & 1) != 0 )
  {
    PfnDb = MmGetPfnDb();
    v13 = &PfnDb[v9];
    if( _interlockedbittestandset64((volatile signed __int32 *)&v13->u2, 0x3Fui64) )
      return 0i64;
    v12 = 0x8000000000000000ui64;
    if( (MiFlags & 0x10000) == 0
      || MiGetPagePrivilege((_DWORD)PfnDb + 48 * v9, 1ui64, (_KE_PRIVILEGED_PAGE_IDENTITY *)&PrivilegedIdentity) )
    {
      goto LABEL_21;
    }
  }
  v15 = 0;
LABEL_22:
  if( v12 )
    _InterlockedAnd64(&v13->u2.Lock, ~v12);
  if( v15 < 0 )
    return 0i64;
  v5 = v25;
LABEL_26:
  if( (v22 & 0x800) != 0 && (v22 & 0x42) != 0 )
  {
LABEL_35:
    if( (MiFlags & 0x100) == 0 )
    {
      LODWORD(v20) = MiGetLeafVa((UINT64)VirtualAddress);
      MiRealVaToFlushType(v20);
      KeFlushSingleCurrentTb(VirtualAddress);
    }
    return VirtualAddress;
  }
  if( v5 || MiDbgMarkPfnModified(VirtualAddress, (_MMPTE)v22) )
  {
    v16 = v22;
    Opaque->_bf_0 = v22;
    v17 = v16 | 0x862;
    v22 = v17;
    _InterlockedIncrement((_DWORD *)&stru_140C4DB30 + 681);
    v18 = v17;
    LOBYTE(v19) = MiPteInShadowRange((UINT64)v6);
    if( v19 && (KeGetCurrentThread()->ApcState.Process->Flags3 & 0x1000) != 0 && (v17 & 1) != 0 )
      v18 = v17 | 0x8000000000000000ui64;
    *(_QWORD *)v6 = v18;
    _InterlockedDecrement((_DWORD *)&stru_140C4DB30 + 681);
    goto LABEL_35;
  }
  return 0i64;
}

Referenced by:

No references.