IoQueryKsrPersistentMemorySize

NTSTATUS __fastcall IoQueryKsrPersistentMemorySize(INT64 a1, INT64 a2, size_t *a3){
  __int64 v6; 
  __int16 *v7; 
  _WORD *v8; 
  VOID **v9; 
  VOID **v10; 
  __int64 v11; 
  _WORD *v12; 
  __int64 v13; 
  _WORD *v14; 
  __int64 v15; 
  NTSTATUS result; 
  PVOID BugCheckParameter4; 

  if( KeGetCurrentIrql() )
    KeBugCheckEx(0x121u, (PVOID)1, (PVOID)KeGetCurrentIrql(), 0i64, 0i64);
  if( a2 )
  {
    v6 = *(_QWORD *)(*(_QWORD *)(a2 + 312) + 40i64);
    if( !v6 || (*(_DWORD *)(v6 + 396) & 0x20000) != 0 )
    {
      IoAddTriageDumpDataBlock((VOID *)a2, (_BYTE *)*(unsigned __int16 *)(a2 + 2));
      v7 = *(__int16 **)(a2 + 8);
      if( v7 )
      {
        IoAddTriageDumpDataBlock(v7, (_BYTE *)(unsigned int)v7[1]);
        v8 = (_WORD *)(*(_QWORD *)(a2 + 8) + 56i64);
        if( *v8 )
        {
          IoAddTriageDumpDataBlock(v8, (_BYTE *)2);
          IoAddTriageDumpDataBlock(
            *(VOID **)(*(_QWORD *)(a2 + 8) + 64i64),
            (_BYTE *)*(unsigned __int16 *)(*(_QWORD *)(a2 + 8) + 56i64));
        }
      }
      v9 = *(VOID ***)(*(_QWORD *)(a2 + 312) + 40i64);
      if( v9 )
      {
        v10 = v9 + 5;
        IoAddTriageDumpDataBlock(v9, (_BYTE *)0x310);
        if( *(_WORD *)v10 )
        {
          IoAddTriageDumpDataBlock(v10, (_BYTE *)2);
          IoAddTriageDumpDataBlock(v10[1], (_BYTE *)*(unsigned __int16 *)v10);
        }
        v11 = *(_QWORD *)(a2 + 312);
        v12 = (_WORD *)(*(_QWORD *)(v11 + 40) + 56i64);
        if( *v12 )
        {
          IoAddTriageDumpDataBlock(v12, (_BYTE *)2);
          IoAddTriageDumpDataBlock(
            *(VOID **)(*(_QWORD *)(*(_QWORD *)(a2 + 312) + 40i64) + 64i64),
            (_BYTE *)*(unsigned __int16 *)(*(_QWORD *)(*(_QWORD *)(a2 + 312) + 40i64) + 56i64));
          v11 = *(_QWORD *)(a2 + 312);
        }
        v13 = *(_QWORD *)(*(_QWORD *)(v11 + 40) + 16i64);
        if( v13 )
        {
          v14 = (_WORD *)(v13 + 56);
          if( *v14 )
          {
            IoAddTriageDumpDataBlock(v14, (_BYTE *)2);
            v15 = *(_QWORD *)(*(_QWORD *)(*(_QWORD *)(a2 + 312) + 40i64) + 16i64);
            IoAddTriageDumpDataBlock(*(VOID **)(v15 + 64), (_BYTE *)*(unsigned __int16 *)(v15 + 56));
          }
        }
      }
      KeBugCheckEx(0xCAu, (PVOID)2, (PVOID)a2, 0i64, 0i64);
    }
  }
  *(_QWORD *)a3 = 0i64;
  if( !ExIsSoftBoot() )
    return -1073741637;
  LODWORD(BugCheckParameter4) = 0;
  result = PipGetPersistentMemory(a1, a2, a3, 0i64, (INT64)BugCheckParameter4);
  if( result == -1073741789 && *(_QWORD *)a3 )
    return 0;
  return result;
}

Referenced by:

No references.