PopInternalSaveStackToDumpFile

VOID __stdcall PopInternalSaveStackToDumpFile(DEVICE_OBJECT *DeviceObject){
  DEVICE_OBJECT *v1; 
  __int64 v2; 
  void *v3; 
  __int64 v4; 
  __int64 v5; 
  unsigned __int16 *v6; 
  INT64 v7; 
  void *v8; 
  if( DeviceObject )
  {
    v1 = DeviceObject;
    do
    {
      if( !KiIsAddressRangeValid((INT64)v1, 336i64) )
        break;
      IoAddTriageDumpDataBlock(v1, *((unsigned __int16 *)v1 + 1));
      v2 = *((_QWORD *)v1 + 1);
      if( v2 )
      {
        if( KiIsAddressRangeValid(*((_QWORD *)v1 + 1), 336i64) )
        {
          IoAddTriageDumpDataBlock((PVOID)v2, (unsigned int)*(__int16 *)(v2 + 2));
          v3 = *(void **)(v2 + 64);
          if( v3 )
            IoAddTriageDumpDataBlock(v3, *(unsigned __int16 *)(v2 + 56));
        }
      }
      v4 = *((_QWORD *)v1 + 39);
      if( v4 && KiIsAddressRangeValid(*((_QWORD *)v1 + 39), 8i64) )
      {
        IoAddTriageDumpDataBlock((PVOID)v4, *(unsigned __int16 *)(v4 + 2));
        v5 = *(_QWORD *)(v4 + 40);
        if( v5 )
          IoAddTriageDumpDataBlock(
            (PVOID)(v5 & 0xFFFFFFFFFFFFF000ui64),
            ((*(_QWORD *)(v4 + 40) & 0xFFF) + 4607) & 0xFFFFF000);
        v6 = *(unsigned __int16 **)(v4 + 48);
        if( v6 && KiIsAddressRangeValid(*(_QWORD *)(v4 + 48), 336i64) )
          IoAddTriageDumpDataBlock(v6, v6[1]);
        v7 = *(_QWORD *)(v4 + 72);
        if( v7 && KiIsAddressRangeValid(v7, 96i64) )
          IoAddTriageDumpDataBlock(*(PVOID *)(v4 + 72), (unsigned int)*(__int16 *)(*(_QWORD *)(v4 + 72) + 2i64));
        v8 = *(void **)(v4 + 24);
        if( v8 )
          IoAddTriageDumpDataBlock(v8, 0x60ui64);
      }
      v1 = (DEVICE_OBJECT *)*((_QWORD *)v1 + 3);
    }
    while( v1 );
  }
}

Referenced by:

PopInternalAddToDumpFile