MiZeroPageWrite

NTSTATUS __stdcall MiZeroPageWrite(
        _FILE_OBJECT *FileObject,
        _LARGE_INTEGER *FileOffset,
        UINT64 NumberOfBytes,
        UINT64 MaximumWriteSize){
  unsigned int v4; 
  __int64 v5; 
  _MDL *Mdl; 
  __int64 v7; 
  unsigned __int64 v8; 
  unsigned __int64 v9; 
  __int16 MdlFlags; 
  __int16 v11; 
  _MDL *v12; 
  __int64 v13; 
  unsigned int v14; 
  __int64 v15; 
  unsigned __int64 v16; 
  __int16 v17; 
  _MDL *v18; 
  __int64 v19; 
  int Status; 
  __int16 v21; 
  int v23; 
  __int16 v24; 
  __int16 Object; 
  char v26; 
  char v27; 
  int v28; 
  __int64 v29[2]; 
  _LARGE_INTEGER *StartingOffset; 
  _IO_STATUS_BLOCK IoStatusBlock; 
  _FILE_OBJECT *FileObjecta; 
  char MemoryDescriptorList[176]; 

  HIDWORD(IoStatusBlock.Pointer) = 0;
  v4 = MaximumWriteSize;
  v5 = (unsigned int)NumberOfBytes;
  StartingOffset = FileOffset;
  FileObjecta = FileObject;
  v24 = NumberOfBytes;
  v27 = 0;
  memset(MemoryDescriptorList, 0i64, sizeof(MemoryDescriptorList));
  Mdl = 0i64;
  v7 = (unsigned int)v5;
  v8 = (unsigned __int64)(v5 + 4095) >> 12;
  if( v4 && (unsigned int)v5 > v4 )
    v7 = v4;
  if( (unsigned int)v7 > 0x10000 )
    Mdl = IoAllocateMdl(0i64, (unsigned int)v7, 0, 0, 0i64);
  v9 = (unsigned __int64)(v7 + 4095) >> 12;
  if( Mdl )
  {
    MdlFlags = Mdl->MdlFlags;
  }
  else
  {
    MdlFlags = 0;
    Mdl = (_MDL *)MemoryDescriptorList;
    if( (unsigned int)v9 > 0x10 )
      LODWORD(v9) = 16;
  }
  v23 = 0;
  v11 = MdlFlags | 0x4002;
  v12 = Mdl + 1;
  LODWORD(v13) = v9;
  while( 1 )
  {
    v14 = v8;
    if( (unsigned int)v13 <= (unsigned int)v8 )
      v14 = v13;
    v13 = v14;
    v15 = v14 << 12;
    if( (_DWORD)v8 == v14 )
    {
      LODWORD(v9) = v8;
      if( (v5 & 0xFFF) != 0 )
        v15 = (v5 & 0xFFF | (unsigned int)v15) - 4096;
    }
    v16 = (unsigned int)v15;
    Mdl->ByteCount = v15;
    v17 = 8 * (((unsigned __int64)(v15 + 4095) >> 12) + 6);
    v18 = v12;
    Mdl->Next = 0i64;
    Mdl->Size = v17;
    Mdl->StartVa = 0i64;
    Mdl->ByteOffset = 0;
    Mdl->MdlFlags = v11;
    if( (_DWORD)v13 )
    {
      v19 = v13;
      do
      {
        v18->Next = (_MDL *)*(&stru_140C4DB30 + 498);
        v18 = (_MDL *)((char *)v18 + 8);
        --v19;
      }
      while( v19 );
    }
    Object = 0;
    v29[1] = (__int64)v29;
    v28 = 0;
    v29[0] = (__int64)v29;
    IoStatusBlock.Status = 0;
    IoStatusBlock.Information = 0i64;
    v26 = 6;
    Status = IoSynchronousPageWriteEx(FileObjecta, Mdl, StartingOffset, (_KEVENT *)&Object, 0, 0i64, &IoStatusBlock);
    if( Status >= 0 )
    {
      KeWaitForSingleObject((UINT64)&Object, 19, 0, 0, 0i64);
      Status = IoStatusBlock.Status;
    }
    v21 = Mdl->MdlFlags;
    if( (v21 & 0x200) != 0 )
    {
      MiRetardMdl(Mdl);
      v21 = Mdl->MdlFlags;
    }
    if( (v21 & 1) != 0 )
      MmUnmapLockedPages(Mdl->MappedSystemVa, Mdl);
    if( Status < 0 )
      break;
    LODWORD(v8) = v8 - v13;
    StartingOffset->QuadPart += v16;
    if( v23 )
    {
      --v23;
    }
    else if( (unsigned int)v13 < (unsigned int)v9 )
    {
      LODWORD(v13) = v9;
    }
LABEL_25:
    v12 = Mdl + 1;
    if( !(_DWORD)v8 )
      goto LABEL_26;
    LOWORD(v5) = v24;
  }
  v23 = 8;
  if( MiIsRetryIoStatus((unsigned int)Status, v16) && (_DWORD)v13 != 1 )
  {
    LODWORD(v13) = (unsigned int)v13 >> 1;
    goto LABEL_25;
  }
LABEL_26:
  if( Mdl != (_MDL *)MemoryDescriptorList )
    IoFreeMdl(Mdl);
  return Status;
}

Referenced by:

MmZeroPageWrite