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