MiWriteComplete
VOID __stdcall MiWriteComplete(VOID *Context, _IO_STATUS_BLOCK *IoStatus, UINT64 MaintainIoSizeDespiteError){
_MDL *v3;
INT64 v5;
int v7;
__int16 MdlFlags;
int v9;
unsigned int v10;
unsigned __int64 v11;
unsigned int v12;
int v13;
_CONTROL_AREA *v14;
__int64 v15;
__int64 v16;
INT64 v17;
_MDL *p_Size;
_MDL *Next;
_MMPFN *v20;
_MMPTE v21;
unsigned __int64 v22;
INT64 v23;
INT64 v24;
unsigned __int64 v25;
_MI_CONTROL_AREA_WAIT_BLOCK *v26;
char *v27;
__int64 v28;
_BOOL4 IsRetryIoStatus;
__int64 v30;
char v31;
unsigned __int64 v32;
unsigned __int64 v33;
INT64 v34;
int v35;
_KEVENT *v36;
_FILE_OBJECT *v37;
struct _KPRCB *CurrentPrcb;
__int64 CachedResidentAvailable;
bool v40;
signed __int32 v41;
_WORK_QUEUE_ITEM *Pool;
VOID **v43;
INT64 *v44;
unsigned __int8 v45;
unsigned __int8 v46;
unsigned __int64 v47;
unsigned __int8 v48;
unsigned __int8 v49;
INT64 v50;
int v51;
_CONTROL_AREA *ControlArea;
_KEVENT *Event;
_MDL *v54;
unsigned __int64 v55;
_LARGE_INTEGER CurrentTime;
_MMPFN *v57;
UINT8 FileObject;
_FILE_OBJECT *FileObjecta;
int Status;
int v61;
int Length;
v61 = MaintainIoSizeDespiteError;
v3 = (_MDL *)*((_QWORD *)Context + 25);
v5 = *((_QWORD *)Context + 24);
Length = *((_DWORD *)Context + 34);
v7 = 0;
v51 = 0;
MdlFlags = v3->MdlFlags;
v9 = 0;
if( (MdlFlags & 0x200) != 0 )
{
MiRetardMdl(v3);
MdlFlags = v3->MdlFlags;
}
if( (MdlFlags & 1) != 0 )
MmUnmapLockedPages(v3->MappedSystemVa, v3);
v10 = IoStatus->Status;
v11 = *((_QWORD *)Context + 21);
Status = v10;
ControlArea = (_CONTROL_AREA *)*((_QWORD *)Context + 20);
if( !ControlArea )
{
LODWORD(v50) = v10;
CurrentTime = *(_LARGE_INTEGER *)&KUSER_SHARED_DATA.SystemTime.LowPart;
MI_PAGEFILE_WRITE(
(_MMMOD_WRITER_MDL_ENTRY *)Context,
&CurrentTime,
IoPagingPriorityReserved2|IoPagingPriorityNormal,
0i64,
v50);
v10 = Status;
}
v54 = v3 + 1;
v55 = (unsigned __int64)&v3[1] + 8 * ((Length & 0xFFF) != 0) + 8 * (Length >> 12);
if( v11 )
{
v37 = (_FILE_OBJECT *)*((_QWORD *)Context + 19);
FileObjecta = v37;
if( (v11 & 1) != 0 )
{
v11 &= ~1ui64;
}
else
{
CcNotifyOfMappedWriteComplete(
v37->SectionObjectPointer,
*(_LARGE_INTEGER *)((char *)Context + 176),
(unsigned int)Length,
v10);
v37 = FileObjecta;
}
FsRtlReleaseFileForModWrite(v37, (_ERESOURCE *)v11);
MiDereferenceControlAreaFile(ControlArea, FileObjecta);
}
if( Status >= 0 )
{
v14 = ControlArea;
goto LABEL_13;
}
v12 = (*((_DWORD *)Context + 10) >> 1) & 1;
MmIsWriteErrorFatal((_BYTE *)(ControlArea != 0i64), v12, (unsigned int)Status);
if( !v13 )
goto LABEL_10;
if( !ControlArea )
KeBugCheckEx(0x7Au, (PVOID)0x20, (PVOID)Status, v3, 0i64);
if( (ControlArea->u.LongFlags & 0x10) != 0 )
goto LABEL_11;
if( MiIsRetryIoStatus((unsigned int)Status, Length) && v12 && v55 > (unsigned __int64)&v3[1].Size )
{
LABEL_10:
v9 = 1;
}
else
{
v7 = 1;
v51 = 1;
}
LABEL_11:
v14 = ControlArea;
if( ControlArea )
*(_DWORD *)(v5 + 680) = Status;
else
*(_DWORD *)(v5 + 676) = Status;
LABEL_13:
Event = 0i64;
if( v7 )
MiSetDeleteOnClose(v14, 1ui64);
v15 = MiSwizzleInvalidPte(0i64);
v16 = *((_QWORD *)Context + 18);
v17 = v15;
if( v16 )
{
LODWORD(v34) = MiTransferSoftwarePte(v15, *((_QWORD *)Context + 18), *((_QWORD *)Context + 22) >> 12);
v17 = v34;
}
p_Size = v54;
if( (unsigned __int64)v54 < v55 )
{
do
{
Next = p_Size->Next;
if( Next == (_MDL *)*(&stru_140C4DB30 + 495) )
{
if( (*((_DWORD *)Context + 10) & 0x20) == 0 )
MiReleasePageFileInfo((_MI_PARTITION *)v5, (_MMPTE)v17, 0i64);
v32 = v17;
if( *(&stru_140C4DB30 + 42) && (v17 & 0x10) == 0 )
v32 = v17 & ~*(&stru_140C4DB30 + 42);
v23 = HIDWORD(v32) + 1;
}
else
{
v20 = &MmGetPfnDb()[(_QWORD)Next];
v57 = v20;
FileObject = MiLockPageInline(v20);
if( (v9 & 1) == 0 )
{
if( (*(_BYTE *)(&v20->u3 + 1) & 0x10) == 0 || (*(_DWORD *)(&v20->3 + 1) & 0x400i64) != 0 )
v9 &= ~2u;
else
v9 |= 2u;
}
v9 &= 0xFFFFFFF3;
if( (*((_DWORD *)Context + 10) & 0x20) != 0 )
{
v30 = *(_QWORD *)(*(&stru_140C4DB30 + 267) + 8 * (((unsigned __int64)v20->u4._bf_0 >> 39) & 0x3FF));
if( (v9 & 2) == 0 && (v20->u2._bf_0 & 0x4000000000000000i64) == 0 )
{
v31 = *((_BYTE *)&v20->u3 + 2);
if( v20->u3.ReferenceCount > 1u )
{
*((_BYTE *)&v20->u3 + 2) = v31 | 0x10;
v9 |= 2u;
}
else
{
*((_BYTE *)&v20->u3 + 2) = v31 & 0xF8 | 2;
if( *(_DWORD *)(v30 + 1288) )
v9 |= 4u;
else
v9 |= 8u;
}
}
}
LODWORD(v21.u.Long) = MiWriteCompletePfn(v20);
_InterlockedAnd64(&v57->u2.Lock, 0x7FFFFFFFFFFFFFFFui64);
__writecr8(FileObject);
if( v21.u.Long )
MiReleasePageFileInfo((_MI_PARTITION *)v5, v21, 0i64);
v22 = v17;
if( *(&stru_140C4DB30 + 42) && (v17 & 0x10) == 0 )
v22 = v17 & ~*(&stru_140C4DB30 + 42);
v23 = HIDWORD(v22) + 1;
}
LODWORD(v24) = MiUpdatePageFileHighInPte(v17, v23);
v17 = v24;
p_Size = (_MDL *)&v54->Size;
v54 = p_Size;
}
while( (unsigned __int64)p_Size < v55 );
v16 = *((_QWORD *)Context + 18);
v7 = v51;
}
v25 = *((unsigned int *)Context + 35);
if( (_DWORD)v25 )
{
v33 = *((unsigned int *)Context + 35);
if( v16 )
{
if( (_MI_PARTITION *)v5 == &Irp )
{
CurrentPrcb = KeGetCurrentPrcb();
CachedResidentAvailable = (int)CurrentPrcb->CachedResidentAvailable;
if( (_DWORD)CachedResidentAvailable != -1 )
{
if( v25 + CachedResidentAvailable <= 0x100 )
{
do
{
if( v25 >= 0x80000 )
break;
v41 = _InterlockedCompareExchange(
(volatile signed __int32 *)&CurrentPrcb->CachedResidentAvailable,
v25 + CachedResidentAvailable,
CachedResidentAvailable);
v40 = (_DWORD)CachedResidentAvailable == v41;
LODWORD(CachedResidentAvailable) = v41;
if( v40 )
goto LABEL_30;
}
while( v41 != -1 && v25 + v41 <= 0x100 );
}
if( (int)CachedResidentAvailable > 192
&& (_DWORD)CachedResidentAvailable != -1
&& (_DWORD)CachedResidentAvailable == _InterlockedCompareExchange(
(volatile signed __int32 *)&CurrentPrcb->CachedResidentAvailable,
192,
CachedResidentAvailable) )
{
v33 = (int)CachedResidentAvailable - 192 + v25;
}
}
}
if( v33 )
_InterlockedExchangeAdd64((volatile signed __int64 *)(v5 + 7168), v33);
}
else
{
MiReleaseWriteInProgressCharges((_MI_PARTITION *)v5, *((unsigned int *)Context + 35), 1ui64);
}
}
LABEL_30:
if( *((_QWORD *)Context + 18) )
{
if( (*((_DWORD *)Context + 10) & 0x1Cu) < 8 )
--*(_DWORD *)(v5 + 692);
MiMakePagefileWriterEntryAvailable(Context);
v36 = (_KEVENT *)(v5 + 920);
if( *(_BYTE *)(v5 + 673) != 1 )
v36 = 0i64;
Event = v36;
if( (*((_DWORD *)Context + 10) & 0x20) != 0 )
{
*(_DWORD *)(v5 + 1180) += v35;
Event = v36;
if( !*(_BYTE *)(v5 + 674) )
{
MiStoreCheckCompleteWriteBatch(v5);
Event = v36;
}
}
}
if( ControlArea )
{
if( v7 )
{
Pool = (_WORK_QUEUE_ITEM *)MiAllocatePool(64i64, 0x38ui64, 0x70646D4Dui64);
if( Pool )
{
Pool[1].List.Flink = (_LIST_ENTRY *)MiReferenceControlAreaFile(ControlArea);
LODWORD(Pool[1].List.Blink) = Status;
LOBYTE(Pool[1].WorkerRoutine) = 1;
Pool->WorkerRoutine = (void(__fastcall *)(void *))MiLdwPopupWorker;
Pool->Parameter = Pool;
Pool->List.Flink = 0i64;
ExQueueWorkItem(Pool, DelayedWorkQueue);
}
}
v26 = MiDecrementModifiedWriteCount(ControlArea, 0i64);
if( v26 )
MiReleaseControlAreaWaiters(v26);
_InterlockedDecrement((volatile signed __int32 *)(v5 + 624));
v27 = (char *)*((_QWORD *)Context + 25);
if( v27 != (char *)Context + 208 )
ExFreePoolWithTag(v27, 0);
if( (*((_DWORD *)Context + 10) & 1) != 0 )
{
v43 = *(VOID ***)(v5 + 640);
if( *v43 != (VOID *)(v5 + 632) )
__fastfail(3u);
*(_QWORD *)Context = v5 + 632;
*((_QWORD *)Context + 1) = v43;
*v43 = Context;
*(_QWORD *)(v5 + 640) = Context;
if( *(_BYTE *)(v5 + 672) == 1 )
{
*(_BYTE *)(v5 + 672) = 0;
KeSignalGate((_KGATE *)(v5 + 648), 1i64);
}
}
else
{
MiFreeModWriterEntry((_MMMOD_WRITER_MDL_ENTRY *)Context, 1ui64);
}
v28 = 1003i64;
}
else
{
v28 = 1000i64;
}
if( Status >= 0 )
{
if( ControlArea )
*(_BYTE *)(v5 + 1032) = 0;
if( !*(_BYTE *)(v28 + v5) )
goto LABEL_45;
v44 = (INT64 *)(v5 + 996);
v45 = ExAcquireSpinLockExclusive((INT64 *)(v5 + 996));
v46 = *(_BYTE *)(v28 + v5);
v47 = v45;
if( !v46 )
goto LABEL_130;
if( *(_BYTE *)(v28 + v5 + 2) )
{
if( v46 > 1u )
{
*(_BYTE *)(v28 + v5 + 2) = 0;
LABEL_121:
*(_BYTE *)(v28 + v5) = 0;
}
}
else
{
v40 = (*(_BYTE *)(v28 + v5 + 1))-- == 1;
if( v40 )
{
if( v46 <= 1u )
goto LABEL_129;
goto LABEL_121;
}
}
LABEL_130:
ExReleaseSpinLockExclusiveFromDpcLevel(v44);
__writecr8(v47);
goto LABEL_45;
}
IsRetryIoStatus = MiIsRetryIoStatus((unsigned int)Status, Length);
if( v61 )
{
if( v7 || IsRetryIoStatus )
goto LABEL_45;
goto LABEL_44;
}
if( Status == -1073741740 )
{
LABEL_44:
*(_BYTE *)(v5 + 1032) = 1;
goto LABEL_45;
}
if( IsRetryIoStatus )
{
v44 = (INT64 *)(v5 + 996);
v48 = ExAcquireSpinLockExclusive((INT64 *)(v5 + 996));
v49 = *(_BYTE *)(v28 + v5);
v47 = v48;
if( !v49 )
{
*(_WORD *)(v28 + v5) = 4112;
goto LABEL_130;
}
if( v49 > 1u )
*(_BYTE *)(v28 + v5) = v49 >> 1;
if( *(_BYTE *)(v28 + v5 + 2) )
goto LABEL_130;
v40 = (*(_BYTE *)(v28 + v5 + 1))-- == 1;
if( !v40 )
goto LABEL_130;
LABEL_129:
*(_BYTE *)(v28 + v5 + 2) = 1;
goto LABEL_130;
}
LABEL_45:
if( Event )
KeSetEvent(Event, 0, 0);
}Referenced by:
MiGatherMappedPages
MiGatherPagefilePages
MiStoreWriteModifiedCompleteApc