c++ - visual - ¿Cómo extraigo una secuencia de usuario de una extensión WinDbg?
visual studio code c++ configuration (2)
Incluso si no se ha probado, debería funcionar si rellena StreamType con un valor personalizado (mayor que LastReservedStream = 0xFFFF) en lugar de MiscInfoStream.
He incrustado un flujo personalizado en un volcado (es decir, pasado el argumento UserStreamParam a la función MiniDumpWriteDump ). Ahora, estoy tratando de extraer el flujo de una extensión WinDbg. (Tenga en cuenta que he verificado que puedo recuperar la transmisión usando la función MiniDumpReadDumpStream ).
Estoy usando el método IDebugAdvanced2 :: Request con la solicitud DEBUG_REQUEST_READ_USER_MINIDUMP_STREAM . Puedo recuperar datos de transmisiones estándar. Por ejemplo, el siguiente fragmento recuperará correctamente el contenido de la secuencia de información miscelánea.
DEBUG_READ_USER_MINIDUMP_STREAM rums = {};
rums.StreamType = MiscInfoStream;
rums.Buffer = &buf;
rums.BufferSize = sizeof buf;
hr = p->Request(DEBUG_REQUEST_READ_USER_MINIDUMP_STREAM,
&rums, sizeof rums, 0, 0, 0);
Sin embargo, tratar de recuperar mi propia secuencia dará como resultado un error (0x80070570, ERROR_FILE_CORRUPT) y salidas de WinDbg
Dir entry 11, ??? stream has unknown stream type 6381921
Tenga en cuenta que el mismo mensaje aparece como parte de la salida .dumpdebug
.
Stream 11: type ??? (6381921), size 00000038, RVA 00033FA9
Dir entry 11, ??? stream has unknown stream type 6381921
¿Cuál es el problema? ¿Cómo recupero los contenidos de mi secuencia de usuario?
respuesta muy tardía
StreamType cannot be UserDefined
por el StreamType cannot be UserDefined
StreamTypes
jen-lung chiu of ms
publicado en listas de viento de Osronline largamente atrás
no sé si el último dbgeng tiene esta limitación eliminada
lo recuperas con una función dbghelp independientemente
(No se recomiendan las funciones de dbghelp dentro de las extensiones windbg)
o analiza la secuencia tú mismo con fopen () fread () como a continuación
userstream:/>type ../usrstr.cpp
#include <stdio.h>
#include <engextcpp.hpp>
#include <dbghelp.h>
const ULONG MBUFFSIZE = 0x1000;
PVOID Buff = 0;
int __cdecl ReadUserStream (char *dmpfile)
{
PMINIDUMP_HEADER MiniHeader = 0;
PMINIDUMP_DIRECTORY MiniDir = 0;
PMINIDUMP_USER_STREAM userstream = 0;
size_t result = 0;
ULONG Streams =0;
ULONG i = 0;
FILE * fp = fopen(dmpfile,"rb");
if (fp)
{
result = fread(Buff, 1, sizeof(MINIDUMP_HEADER), fp );
if ( result == sizeof(MINIDUMP_HEADER) )
{
MiniHeader = (PMINIDUMP_HEADER) Buff;
Streams = MiniHeader->NumberOfStreams;
for (i = 0; i < Streams; i++ )
{
result = fread( Buff, 1, sizeof(MINIDUMP_DIRECTORY), fp );
if ( result == sizeof(MINIDUMP_DIRECTORY) )
{
MiniDir = (PMINIDUMP_DIRECTORY) Buff;
if ( MiniDir->StreamType > LastReservedStream )
{
userstream = (PMINIDUMP_USER_STREAM)Buff;
ULONG savedbuffsize = userstream->BufferSize;
ULONG savedtype = userstream->Type;
PCHAR savedbufferptr = (PCHAR)userstream->Buffer;
long pos = ftell(fp);
fseek(fp, (long)savedbufferptr,SEEK_SET);
result = fread( Buff, 1, savedbuffsize, fp );
if ( result == savedbuffsize )
{
printf(
"/n"
"Datastream Type = %.8x/n"
"Buffer Size = %.8x/n"
"Buffer = %p/n"
"Buffer content = %s/n"
"/n",
savedtype,
savedbuffsize,
savedbufferptr,
Buff
);
fseek(fp,pos,SEEK_SET);
continue;
}
else
{
printf(
"failed to read buffer contents at offset %p of
user stream %x/n",
savedbufferptr,
savedtype);
fseek(fp,pos,SEEK_SET);
continue;
}
}
}
else
{
printf("failed to fread Minidump directory exiting /n");
goto getout;
}
}
}
else
{
printf("failed to fread Minidump header exiting /n");
goto getout;
}
}
else
{
printf("failed to open dmp file exiting /n");
goto getout;
}
getout:
if (fp)
fclose(fp);
return 0;
}
int __cdecl main (int argc, char * argv[])
{
if (argc !=2)
{
printf("Usage %s %s/n",argv[0],"somedump.dmp");
return 0;
}
Buff = malloc( MBUFFSIZE );
if (Buff)
{
ReadUserStream(argv[1]);
free(Buff);
return 0;
}
else
{
printf("malloc failed exiting/n");
return 0;
}
}
salida de un userdump que tiene userStreams en él
( oleg staradumov debuginfo.com writeuserstream.cpp
)
userstream:/>usrstr.exe
Usage usrstr.exe somedump.dmp
userstream:/>usrstr.exe test.dmp
Datastream Type = 00010000
Buffer Size = 00000021
Buffer = 000010B6
Buffer content = This is the first data stream...
Datastream Type = 00010001
Buffer Size = 00000023
Buffer = 000010D7
Buffer content = and this is the second data stream