KeAddTriageDumpDataBlock
NTSTATUS __stdcall KeAddTriageDumpDataBlock(
PKTRIAGE_DUMP_DATA_ARRAY KtriageDumpDataArray,
ULONG MaxDataSize,
PVOID Address,
_SIZE_T Size){
ULONG v4;
char *v6;
ULONG NumBlocksUsed;
char *v9;
_LIST_ENTRY *v10;
unsigned __int64 v12;
char *v13;
v4 = 0;
v6 = *(char **)&MaxDataSize;
if( !KtriageDumpDataArray
|| !KiValidateTriageDumpDataArray((INT64)KtriageDumpDataArray, *(INT64 *)&MaxDataSize, 0i64)
|| !KiIsAddressRangeValid((INT64)v6, (INT64)Address) )
{
return -1073741811;
}
if( !Address )
return 0;
NumBlocksUsed = KtriageDumpDataArray->NumBlocksUsed;
v9 = (char *)Address + (_QWORD)v6;
if( NumBlocksUsed )
{
do
{
v12 = *(_QWORD *)&KtriageDumpDataArray->Blocks[v4].Size;
v13 = (char *)(&KtriageDumpDataArray[1].List.Flink)[2 * v4] + v12;
if( v6 < v13 && (unsigned __int64)v9 > v12 )
{
if( (unsigned __int64)v6 < v12 )
{
if( v9 <= v13 )
v9 = *(char **)&KtriageDumpDataArray->Blocks[v4].Size;
}
else
{
if( v9 <= v13 )
return 0;
v6 = (char *)(&KtriageDumpDataArray[1].List.Flink)[2 * v4] + v12;
}
}
++v4;
}
while( v4 < NumBlocksUsed );
}
if( NumBlocksUsed == KtriageDumpDataArray->NumBlocksTotal )
return -1073741789;
v10 = (_LIST_ENTRY *)(v9 - v6);
if( (unsigned __int64)v10 <= KtriageDumpDataArray->ComponentNameBufferLength - KtriageDumpDataArray->VirtMemSize )
{
(&KtriageDumpDataArray[1].List.Flink)[2 * v4] = v10;
*(_QWORD *)&KtriageDumpDataArray->Blocks[v4].Size = v6;
++KtriageDumpDataArray->NumBlocksUsed;
KtriageDumpDataArray->VirtMemSize += (unsigned int)v10;
return 0;
}
return -1073741670;
}Referenced by:
IoAddTriageDumpDataBlock
IopInitializeTriageDumpData
RtlMarkHiberPhase