WbMakeUserDataPagesKernelWritable

__int64 __fastcall WbMakeUserDataPagesKernelWritable(VOID *VirtualAddress, UINT64 Length, _MDL **a3, _QWORD *a4){
  unsigned int v6; 
  INT64 v8; 
  int v9; 
  INT64 v10; 
  NTSTATUS v11; 
  INT64 v12; 
  _MDL *Mdl; 
  VOID *v14; 
  UINT64 v16; 
  UINT64 Priority; 
  VOID *v18[3]; 
  UINT64 v19; 
  UINT64 v20; 

  v6 = Length;
  v8 = 0i64;
  v9 = 0;
  LODWORD(v20) = 0;
  v18[0] = VirtualAddress;
  v19 = (unsigned int)Length;
  v11 = ZwProtectVirtualMemory((VOID *)0xFFFFFFFFFFFFFFFFi64, v18, &v19, 4ui64, &v20);
  if( v11 >= 0 )
  {
    Mdl = IoAllocateMdl(VirtualAddress, v6, 0, 0, 0i64);
    v8 = (INT64)Mdl;
    if( Mdl )
    {
      v9 = 1;
      LOBYTE(v10) = 1;
      MmProbeAndLockPages(Mdl, v10, IoModifyAccess);
      if( (*(_BYTE *)(v8 + 10) & 5) != 0 )
      {
        v14 = *(VOID **)(v8 + 24);
      }
      else
      {
        LODWORD(Priority) = 1073741856;
        LODWORD(v16) = 0;
        v14 = MmMapLockedPagesSpecifyCache((_MDL *)v8, 0, MmCached, 0i64, v16, Priority);
      }
      v18[1] = v14;
      if( v14 )
      {
        if( a4 )
          *a4 = v14;
        if( a3 )
        {
          *a3 = (_MDL *)v8;
          v8 = 0i64;
        }
      }
      else
      {
        v11 = -1073741801;
      }
    }
    else
    {
      v11 = -1073741801;
    }
  }
  if( v8 )
  {
    if( v9 )
      MmUnlockPages(v8, v10, v12);
    IoFreeMdl((PMDL)v8);
  }
  return(unsigned int)v11;
}

Referenced by:

sub_1405D28BC