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