IopWriteDriverList
VOID __fastcall IopWriteDriverList(
UINT64 BufferAddress,
UINT8 AtBugCheck,
UINT64 DriverListOffset,
UINT64 StringPoolOffset){
INT64 v4;
UINT64 v5;
unsigned int *v6;
int v8;
unsigned int v9;
int v10;
__int64 v11;
UINT64 v12;
v4 = PsLoadedModuleList;
v5 = BufferAddress + (unsigned int)DriverListOffset;
v6 = (unsigned int *)(BufferAddress + (unsigned int)StringPoolOffset);
v8 = BufferAddress;
v9 = 0;
while( (INT64 *)v4 != &PsLoadedModuleList
&& (AtBugCheck != 1
|| KiIsAddressRangeValid(v4, 160i64)
&& KiIsAddressRangeValid(*(_QWORD *)(v4 + 96), *(unsigned __int16 *)(v4 + 88))) )
{
v10 = *(unsigned __int16 *)(v4 + 88) >> 1;
*v6 = v10;
memmove(v6 + 1, *(const VOID **)(v4 + 96), 2 * v10);
*((_WORD *)v6 + *v6 + 2) = 0;
v11 = v9++;
v12 = v5 + 144 * v11;
*(_OWORD *)(v12 + 8) = *(_OWORD *)v4;
*(_OWORD *)(v12 + 24) = *(_OWORD *)(v4 + 16);
*(_OWORD *)(v12 + 40) = *(_OWORD *)(v4 + 32);
*(_OWORD *)(v12 + 56) = *(_OWORD *)(v4 + 48);
*(_OWORD *)(v12 + 72) = *(_OWORD *)(v4 + 64);
*(_OWORD *)(v12 + 88) = *(_OWORD *)(v4 + 80);
*(_OWORD *)(v12 + 104) = *(_OWORD *)(v4 + 96);
*(_OWORD *)(v12 + 120) = *(_OWORD *)(v4 + 112);
*(_QWORD *)(v12 + 136) = *(_QWORD *)(v4 + 128);
*(_DWORD *)(v12 + 136) = *(_DWORD *)(v4 + 156);
*(_DWORD *)(v12 + 72) = *(_DWORD *)(v4 + 152);
*(_DWORD *)v12 = (_DWORD)v6 - v8;
v4 = *(_QWORD *)v4;
v6 = (unsigned int *)(((unsigned __int64)v6 + 2 * *v6 + 13) & 0xFFFFFFFFFFFFFFF8ui64);
}
}Referenced by:
IoFillTriageDumpBuffer
KeCapturePersistentThreadState