mirror of
https://github.com/NationalSecurityAgency/ghidra.git
synced 2025-10-04 18:29:37 +02:00
Merge remote-tracking branch 'origin/GT-2747_PDB' into patch
This commit is contained in:
commit
c9ac20f6e7
7 changed files with 148 additions and 107 deletions
|
@ -64,7 +64,7 @@ void iterateEnums() {
|
||||||
BSTR type = getTypeAsString(pSymbol);
|
BSTR type = getTypeAsString(pSymbol);
|
||||||
ULONGLONG len = getLength(pSymbol);
|
ULONGLONG len = getLength(pSymbol);
|
||||||
|
|
||||||
printf("%s<enum name=\"%ws\" type=\"%ws\" length=\"0x%x\" >\n", indent(8), name, type, len);
|
printf("%s<enum name=\"%ws\" type=\"%ws\" length=\"0x%I64x\" >\n", indent(8), name, type, len);
|
||||||
|
|
||||||
iterateEnumMembers(pSymbol);
|
iterateEnumMembers(pSymbol);
|
||||||
|
|
||||||
|
@ -89,7 +89,7 @@ void iterateMembers(IDiaSymbol * pSymbol) {
|
||||||
if (celt != 1) {
|
if (celt != 1) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
printf("%s<member name=\"%ws\" datatype=\"%ws\" offset=\"0x%x\" kind=\"%ws\" length=\"0x%x\" />\n",
|
printf("%s<member name=\"%ws\" datatype=\"%ws\" offset=\"0x%x\" kind=\"%ws\" length=\"0x%I64x\" />\n",
|
||||||
indent(12),
|
indent(12),
|
||||||
getName(pMember),
|
getName(pMember),
|
||||||
getTypeAsString(pMember),
|
getTypeAsString(pMember),
|
||||||
|
@ -133,7 +133,7 @@ void iterateDataTypes() {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
printf("%s<datatype name=\"%ws\" kind=\"%ws\" length=\"0x%x\" >\n", indent(8), name, kind, len);
|
printf("%s<datatype name=\"%ws\" kind=\"%ws\" length=\"0x%I64x\" >\n", indent(8), name, kind, len);
|
||||||
|
|
||||||
iterateMembers(pSymbol);
|
iterateMembers(pSymbol);
|
||||||
|
|
||||||
|
@ -207,7 +207,7 @@ void iterateClasses() {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
printf("%s<class name=\"%ws\" length=\"0x%x\" >\n", indent(8), name, len);
|
printf("%s<class name=\"%ws\" length=\"0x%I64x\" >\n", indent(8), name, len);
|
||||||
|
|
||||||
iterateMembers(pSymbol);
|
iterateMembers(pSymbol);
|
||||||
|
|
||||||
|
@ -235,7 +235,7 @@ void dumpFunctionStackVariables( DWORD rva )
|
||||||
while ( pEnum != NULL && SUCCEEDED( pEnum->Next( 1, &pSymbol, &celt ) ) && celt == 1 ) {
|
while ( pEnum != NULL && SUCCEEDED( pEnum->Next( 1, &pSymbol, &celt ) ) && celt == 1 ) {
|
||||||
pSymbol->get_symTag( &tag );
|
pSymbol->get_symTag( &tag );
|
||||||
if ( tag == SymTagData ) {
|
if ( tag == SymTagData ) {
|
||||||
printf("%s<stack_variable name=\"%ws\" kind=\"%ws\" offset=\"0x%x\" datatype=\"%ws\" length=\"0x%x\" />\n",
|
printf("%s<stack_variable name=\"%ws\" kind=\"%ws\" offset=\"0x%x\" datatype=\"%ws\" length=\"0x%I64x\" />\n",
|
||||||
indent(12),
|
indent(12),
|
||||||
getName(pSymbol),
|
getName(pSymbol),
|
||||||
getKindAsString(pSymbol),
|
getKindAsString(pSymbol),
|
||||||
|
@ -355,7 +355,7 @@ void iterateFunctions() {
|
||||||
DWORD address = getRVA(pSymbol);
|
DWORD address = getRVA(pSymbol);
|
||||||
ULONGLONG len = getLength(pSymbol);
|
ULONGLONG len = getLength(pSymbol);
|
||||||
|
|
||||||
printf("%s<function name=\"%ws\" address=\"0x%x\" length=\"0x%x\">\n", indent(8), name, address, len);
|
printf("%s<function name=\"%ws\" address=\"0x%x\" length=\"0x%I64x\">\n", indent(8), name, address, len);
|
||||||
|
|
||||||
dumpFunctionStackVariables(address);
|
dumpFunctionStackVariables(address);
|
||||||
dumpFunctionLines(pSymbol, pSession);
|
dumpFunctionLines(pSymbol, pSession);
|
||||||
|
@ -387,7 +387,7 @@ void iterateSymbolTable(IDiaEnumSymbols * pSymbols) {
|
||||||
printf("%s", indent(12));
|
printf("%s", indent(12));
|
||||||
printf("<symbol name=\"%ws\" ", name);
|
printf("<symbol name=\"%ws\" ", name);
|
||||||
printf("address=\"0x%x\" ", getRVA(pSymbol));
|
printf("address=\"0x%x\" ", getRVA(pSymbol));
|
||||||
printf("length=\"0x%x\" ", getLength(pSymbol));
|
printf("length=\"0x%I64x\" ", getLength(pSymbol));
|
||||||
printf("tag=\"%ws\" ", getTagAsString(pSymbol));
|
printf("tag=\"%ws\" ", getTagAsString(pSymbol));
|
||||||
printf("kind=\"%ws\" ", getKindAsString(pSymbol));
|
printf("kind=\"%ws\" ", getKindAsString(pSymbol));
|
||||||
printf("index=\"0x%x\" ", getIndex(pSymbol));
|
printf("index=\"0x%x\" ", getIndex(pSymbol));
|
||||||
|
@ -444,7 +444,7 @@ void iterateSegments(IDiaEnumSegments * pSegments) {
|
||||||
*/
|
*/
|
||||||
void iterateSections(IDiaEnumSectionContribs * pSecContribs) {
|
void iterateSections(IDiaEnumSectionContribs * pSecContribs) {
|
||||||
DWORD celt;
|
DWORD celt;
|
||||||
IDiaSymbol * pSym;
|
IDiaSymbol * pSym = NULL;
|
||||||
IDiaSectionContrib * pSecContrib;
|
IDiaSectionContrib * pSecContrib;
|
||||||
|
|
||||||
while ( 1 ) {
|
while ( 1 ) {
|
||||||
|
@ -466,7 +466,6 @@ void iterateSections(IDiaEnumSectionContribs * pSecContribs) {
|
||||||
pSecContrib->get_addressSection( &isect );
|
pSecContrib->get_addressSection( &isect );
|
||||||
pSecContrib->get_addressOffset( &offset );
|
pSecContrib->get_addressOffset( &offset );
|
||||||
pSecContrib = NULL;
|
pSecContrib = NULL;
|
||||||
IDiaSymbol * pSym;
|
|
||||||
if ( pSession->findSymbolByAddr( isect, offset, SymTagNull, &pSym ) != S_OK ) {
|
if ( pSession->findSymbolByAddr( isect, offset, SymTagNull, &pSym ) != S_OK ) {
|
||||||
pSym = NULL;
|
pSym = NULL;
|
||||||
}
|
}
|
||||||
|
@ -512,7 +511,7 @@ void iterateInjectedSource(IDiaEnumInjectedSources * pInjectedSrcs) {
|
||||||
ULONGLONG length;
|
ULONGLONG length;
|
||||||
pInjectedSrc->get_length(&length);
|
pInjectedSrc->get_length(&length);
|
||||||
|
|
||||||
printf("%s<injected_source filename=\"%ws\" objectname=\"%ws\" crc=\"0x%x\" length=\"0x%x\" />\n",
|
printf("%s<injected_source filename=\"%ws\" objectname=\"%ws\" crc=\"0x%x\" length=\"0x%I64x\" />\n",
|
||||||
indent(8),
|
indent(8),
|
||||||
filename,
|
filename,
|
||||||
objectname,
|
objectname,
|
||||||
|
|
|
@ -17,6 +17,7 @@
|
||||||
#include "find.h"
|
#include "find.h"
|
||||||
#include "print.h"
|
#include "print.h"
|
||||||
#include "symbol.h"
|
#include "symbol.h"
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
IDiaSession * pSession;//Provides a query context for debug symbols
|
IDiaSession * pSession;//Provides a query context for debug symbols
|
||||||
IDiaSymbol * pGlobal;
|
IDiaSymbol * pGlobal;
|
||||||
|
@ -51,14 +52,16 @@ int init(const char * szFilename, const char * szSignature, const char * szAge)
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
char msg[256];
|
char msg[256];
|
||||||
sprintf(msg, "Unspecified error occurred: 0x%x\n", hr);
|
sprintf_s(msg, 256, "Unspecified error occurred: 0x%lx\n", hr);
|
||||||
fatal(msg);
|
fatal(msg);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
wchar_t wszFilename[ _MAX_PATH ];
|
size_t sz = strlen(szFilename) + 1;
|
||||||
mbstowcs( wszFilename, szFilename, sizeof( wszFilename ) );
|
wchar_t* wszFilename = new wchar_t[sz];
|
||||||
|
size_t outsz;
|
||||||
|
mbstowcs_s(&outsz, wszFilename, sz, szFilename, sz - 1);
|
||||||
|
|
||||||
if (szSignature == NULL && szAge == NULL) {
|
if (szSignature == NULL && szAge == NULL) {
|
||||||
hr = pSource->loadDataFromPdb( wszFilename );
|
hr = pSource->loadDataFromPdb( wszFilename );
|
||||||
|
@ -81,6 +84,7 @@ int init(const char * szFilename, const char * szSignature, const char * szAge)
|
||||||
fatal("Invalid combination of GUID/Signature/Age parameters specified!");
|
fatal("Invalid combination of GUID/Signature/Age parameters specified!");
|
||||||
}
|
}
|
||||||
checkErr(hr);
|
checkErr(hr);
|
||||||
|
delete [] wszFilename;
|
||||||
|
|
||||||
if (pSource->openSession( &pSession ) < 0) {
|
if (pSource->openSession( &pSession ) < 0) {
|
||||||
fatal("Unable to open session\n");
|
fatal("Unable to open session\n");
|
||||||
|
@ -100,13 +104,19 @@ int init(const char * szFilename, const char * szSignature, const char * szAge)
|
||||||
GUID currGUID;
|
GUID currGUID;
|
||||||
BSTR guidString;
|
BSTR guidString;
|
||||||
|
|
||||||
DWORD currAge;
|
DWORD currAge = 0;
|
||||||
|
|
||||||
// Include PDB GUID and age in XML output for compatibility checking
|
// Include PDB GUID and age in XML output for compatibility checking
|
||||||
if (pGlobal->get_guid( &currGUID ) == S_OK) {
|
if (pGlobal->get_guid( &currGUID ) == S_OK) {
|
||||||
size_t maxGUIDStrLen = 64;
|
int maxGUIDStrLen = 64;
|
||||||
wchar_t * guidStr = (wchar_t *)calloc(maxGUIDStrLen, sizeof(wchar_t));
|
wchar_t * guidStr = (wchar_t *)calloc(maxGUIDStrLen, sizeof(wchar_t));
|
||||||
StringFromGUID2(currGUID, guidStr, maxGUIDStrLen);
|
if (guidStr == NULL) {
|
||||||
|
fatal("Unable to allocate GUID\n");
|
||||||
|
exit(-1);
|
||||||
|
}
|
||||||
|
if (StringFromGUID2(currGUID, guidStr, maxGUIDStrLen) <= 0) {
|
||||||
|
fatal("Unable to convert GUID\n");
|
||||||
|
}
|
||||||
guidString = guidStr;
|
guidString = guidStr;
|
||||||
|
|
||||||
if (pGlobal->get_age( &currAge ) == S_OK) {
|
if (pGlobal->get_age( &currAge ) == S_OK) {
|
||||||
|
|
|
@ -34,68 +34,71 @@ wchar_t * printVariant( VARIANT & v ) {
|
||||||
return L"null";
|
return L"null";
|
||||||
}
|
}
|
||||||
|
|
||||||
size_t printfFormatBufferLen = 100;
|
size_t blen = 100;
|
||||||
wchar_t * variant = (wchar_t *)calloc(printfFormatBufferLen, sizeof(wchar_t));
|
wchar_t * variant = (wchar_t *)calloc(blen, sizeof(wchar_t));
|
||||||
|
if (variant == NULL) {
|
||||||
|
return L"error";
|
||||||
|
}
|
||||||
switch( v.vt ) {
|
switch( v.vt ) {
|
||||||
case VT_ARRAY://Indicates a SAFEARRAY pointer.
|
case VT_ARRAY://Indicates a SAFEARRAY pointer.
|
||||||
swprintf(variant, L"%d", v.parray);//TODO
|
swprintf_s(variant, blen, L"%I64d", (ULONGLONG) v.parray);//TODO
|
||||||
return variant;
|
return variant;
|
||||||
case VT_BYREF://Indicates that a value is a reference.
|
case VT_BYREF://Indicates that a value is a reference.
|
||||||
swprintf(variant, L"%d", v.cVal);//TODO
|
swprintf_s(variant, blen, L"%I64d", (ULONGLONG) v.cVal);//TODO
|
||||||
return variant;
|
return variant;
|
||||||
case VT_CY://Indicates a currency value.
|
case VT_CY://Indicates a currency value.
|
||||||
swprintf(variant, L"%f", v.cyVal);
|
swprintf_s(variant, blen, L"%I64d", (ULONGLONG) v.cyVal.int64);
|
||||||
return variant;
|
return variant;
|
||||||
case VT_DATE://Indicates a DATE value.
|
case VT_DATE://Indicates a DATE value.
|
||||||
swprintf(variant, L"%d", v.date);
|
swprintf_s(variant, blen, L"%I64d", (ULONGLONG) v.date);
|
||||||
return variant;
|
return variant;
|
||||||
case VT_DISPATCH://Indicates an IDispatch pointer.
|
case VT_DISPATCH://Indicates an IDispatch pointer.
|
||||||
swprintf(variant, L"%d", v.pdispVal);
|
swprintf_s(variant, blen, L"%I64d", (ULONGLONG) v.pdispVal);
|
||||||
return variant;
|
return variant;
|
||||||
case VT_ERROR://Indicates an SCODE.
|
case VT_ERROR://Indicates an SCODE.
|
||||||
swprintf(variant, L"0x%x", v.scode);
|
swprintf_s(variant, blen, L"0x%x", v.scode);
|
||||||
return variant;
|
return variant;
|
||||||
case VT_I1://CHAR
|
case VT_I1://CHAR
|
||||||
swprintf(variant, L"%d", v.cVal);
|
swprintf_s(variant, blen, L"%d", v.cVal);
|
||||||
return variant;
|
return variant;
|
||||||
case VT_I2://SHORT
|
case VT_I2://SHORT
|
||||||
swprintf(variant, L"%d", v.iVal);
|
swprintf_s(variant, blen, L"%d", v.iVal);
|
||||||
return variant;
|
return variant;
|
||||||
case VT_I4://LONG
|
case VT_I4://LONG
|
||||||
swprintf(variant, L"%d", v.lVal );
|
swprintf_s(variant, blen, L"%d", v.lVal );
|
||||||
return variant;
|
return variant;
|
||||||
case VT_I8: //LONGLONG
|
case VT_I8: //LONGLONG
|
||||||
swprintf(variant, L"%ld", v.llVal );
|
swprintf_s(variant, blen, L"%I64d", v.llVal );
|
||||||
return variant;
|
return variant;
|
||||||
case VT_INT://INT
|
case VT_INT://INT
|
||||||
swprintf(variant, L"%d", v.intVal);
|
swprintf_s(variant, blen, L"%d", v.intVal);
|
||||||
return variant;
|
return variant;
|
||||||
case VT_R4://Indicates a float value.
|
case VT_R4://Indicates a float value.
|
||||||
swprintf(variant, L"%f", v.fltVal);
|
swprintf_s(variant, blen, L"%f", v.fltVal);
|
||||||
return variant;
|
return variant;
|
||||||
case VT_R8://Indicates a double value.
|
case VT_R8://Indicates a double value.
|
||||||
swprintf(variant, L"%f", v.dblVal);
|
swprintf_s(variant, blen, L"%f", v.dblVal);
|
||||||
return variant;
|
return variant;
|
||||||
case VT_UI1://BYTE
|
case VT_UI1://BYTE
|
||||||
swprintf(variant, L"%d", v.bVal);
|
swprintf_s(variant, blen, L"%d", v.bVal);
|
||||||
return variant;
|
return variant;
|
||||||
case VT_UI2://USHORT
|
case VT_UI2://USHORT
|
||||||
swprintf(variant, L"%d", v.uiVal);
|
swprintf_s(variant, blen, L"%d", v.uiVal);
|
||||||
return variant;
|
return variant;
|
||||||
case VT_UI4://ULONG
|
case VT_UI4://ULONG
|
||||||
swprintf(variant, L"%d", v.ulVal);
|
swprintf_s(variant, blen, L"%d", v.ulVal);
|
||||||
return variant;
|
return variant;
|
||||||
case VT_UI8://ULONGLONG
|
case VT_UI8://ULONGLONG
|
||||||
swprintf(variant, L"%ld", v.ullVal);
|
swprintf(variant, blen, L"%I64d", v.ullVal);
|
||||||
return variant;
|
return variant;
|
||||||
case VT_UINT://UINT
|
case VT_UINT://UINT
|
||||||
swprintf(variant, L"%d", v.uintVal);
|
swprintf_s(variant, blen, L"%d", v.uintVal);
|
||||||
return variant;
|
return variant;
|
||||||
case VT_UNKNOWN://Indicates an IUnknown pointer.
|
case VT_UNKNOWN://Indicates an IUnknown pointer.
|
||||||
swprintf(variant, L"%d", v.punkVal);
|
swprintf_s(variant, blen, L"%I64d", (ULONGLONG) v.punkVal);
|
||||||
return variant;
|
return variant;
|
||||||
case VT_VARIANT://Indicates a VARIANT far pointer.
|
case VT_VARIANT://Indicates a VARIANT far pointer.
|
||||||
swprintf(variant, L"%d", v.pvarVal);
|
swprintf_s(variant, blen, L"%I64d", (ULONGLONG) v.pvarVal);
|
||||||
return variant;
|
return variant;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
|
@ -134,8 +137,10 @@ BSTR printType( IDiaSymbol * pType, BSTR suffix ) {
|
||||||
if ( pType->get_type( &pBaseType ) == S_OK ) {
|
if ( pType->get_type( &pBaseType ) == S_OK ) {
|
||||||
size_t length = wcslen(suffix) + 3; // length of: suffix + " *\0"
|
size_t length = wcslen(suffix) + 3; // length of: suffix + " *\0"
|
||||||
wchar_t * str = (wchar_t *)calloc(length, sizeof(wchar_t));
|
wchar_t * str = (wchar_t *)calloc(length, sizeof(wchar_t));
|
||||||
swprintf(str, L"%ws *", suffix );
|
if (str != NULL) {
|
||||||
return (BSTR)printType( pBaseType, (BSTR)str );
|
swprintf_s(str, length, L"%ws *", suffix);
|
||||||
|
return (BSTR)printType(pBaseType, (BSTR)str);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
return L"";
|
return L"";
|
||||||
|
@ -146,8 +151,10 @@ BSTR printType( IDiaSymbol * pType, BSTR suffix ) {
|
||||||
BSTR bt = getBaseTypeAsString( pType );
|
BSTR bt = getBaseTypeAsString( pType );
|
||||||
size_t length = wcslen(bt) + wcslen(suffix) + 1; // length of: bt + suffix + "\0"
|
size_t length = wcslen(bt) + wcslen(suffix) + 1; // length of: bt + suffix + "\0"
|
||||||
wchar_t * str = (wchar_t *)calloc(length, sizeof(wchar_t));
|
wchar_t * str = (wchar_t *)calloc(length, sizeof(wchar_t));
|
||||||
swprintf(str, L"%ws%ws", bt, suffix );
|
if (str != NULL) {
|
||||||
return str;
|
swprintf_s(str, length, L"%ws%ws", bt, suffix);
|
||||||
|
return str;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( tag == SymTagArrayType ) {
|
if ( tag == SymTagArrayType ) {
|
||||||
|
@ -162,9 +169,10 @@ BSTR printType( IDiaSymbol * pType, BSTR suffix ) {
|
||||||
}
|
}
|
||||||
size_t strLen = wcslen(suffix) + 64 + 3; // length of suffix + wag_for_numeric_value + "[]\0"
|
size_t strLen = wcslen(suffix) + 64 + 3; // length of suffix + wag_for_numeric_value + "[]\0"
|
||||||
wchar_t * str = (wchar_t *)calloc(strLen, sizeof(wchar_t));
|
wchar_t * str = (wchar_t *)calloc(strLen, sizeof(wchar_t));
|
||||||
swprintf(str, L"%ws[%ld]", suffix, lenArray/lenElem );
|
if (str != NULL) {
|
||||||
|
swprintf_s(str, strLen, L"%ws[%I64d]", suffix, lenArray / lenElem);
|
||||||
return printType( pBaseType, (BSTR)str);
|
return printType(pBaseType, (BSTR)str);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( tag == SymTagFunctionType ) {
|
if ( tag == SymTagFunctionType ) {
|
||||||
|
@ -175,17 +183,22 @@ BSTR printType( IDiaSymbol * pType, BSTR suffix ) {
|
||||||
DWORD id;
|
DWORD id;
|
||||||
DWORD rec;
|
DWORD rec;
|
||||||
GUID guid;
|
GUID guid;
|
||||||
if ( pType->get_guid( &guid ) == S_OK ) {
|
if (pType->get_guid(&guid) == S_OK) {
|
||||||
size_t maxGUIDStrLen = 64;
|
int maxGUIDStrLen = 64;
|
||||||
wchar_t * guidStr = (wchar_t *)calloc(maxGUIDStrLen, sizeof(wchar_t));
|
wchar_t* guidStr = (wchar_t*)calloc((size_t)maxGUIDStrLen, sizeof(wchar_t));
|
||||||
StringFromGUID2(guid, guidStr, maxGUIDStrLen);
|
if (guidStr != NULL) {
|
||||||
return (BSTR)guidStr;
|
if (StringFromGUID2(guid, guidStr, maxGUIDStrLen) > 0) {
|
||||||
|
return (BSTR)guidStr;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else if ( pType->get_oemId( &id ) == S_OK && pType->get_oemSymbolId( &rec ) == S_OK ) {
|
else if ( pType->get_oemId( &id ) == S_OK && pType->get_oemSymbolId( &rec ) == S_OK ) {
|
||||||
size_t strLen = 256; // wag_for_2_hex_numbers "0xNNNNN:0xNNNNN"
|
size_t strLen = 256; // wag_for_2_hex_numbers "0xNNNNN:0xNNNNN"
|
||||||
wchar_t * str = (wchar_t *)calloc(strLen, sizeof(wchar_t));
|
wchar_t * str = (wchar_t *)calloc(strLen, sizeof(wchar_t));
|
||||||
swprintf(str, L"0x%x:0x%x", id, rec);
|
if (str != NULL) {
|
||||||
return (BSTR)str;
|
swprintf_s(str, strLen, L"0x%x:0x%x", id, rec);
|
||||||
|
return (BSTR)str;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return L"";
|
return L"";
|
||||||
}
|
}
|
||||||
|
@ -193,8 +206,10 @@ BSTR printType( IDiaSymbol * pType, BSTR suffix ) {
|
||||||
if ( name != NULL ) {
|
if ( name != NULL ) {
|
||||||
size_t length = wcslen(name) + wcslen(suffix) + 1; // length of name + suffix + "\0"
|
size_t length = wcslen(name) + wcslen(suffix) + 1; // length of name + suffix + "\0"
|
||||||
wchar_t * str = (wchar_t *)calloc(length, sizeof(wchar_t));
|
wchar_t * str = (wchar_t *)calloc(length, sizeof(wchar_t));
|
||||||
swprintf(str, L"%ws%ws", name, suffix);
|
if (str != NULL) {
|
||||||
return (BSTR)str;
|
swprintf_s(str, length, L"%ws%ws", name, suffix);
|
||||||
|
return (BSTR)str;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return L"Undefined";
|
return L"Undefined";
|
||||||
|
|
|
@ -168,15 +168,17 @@ static wchar_t* BASIC_TYPE_STRINGS [] = {
|
||||||
};
|
};
|
||||||
|
|
||||||
BSTR getName(IDiaSymbol * pSymbol) {
|
BSTR getName(IDiaSymbol * pSymbol) {
|
||||||
BSTR name, escapedName;
|
BSTR name, escapedName = NULL;
|
||||||
DWORD symIndexId, locType;
|
DWORD symIndexId, locType;
|
||||||
ULONGLONG len;
|
ULONGLONG len;
|
||||||
if (pSymbol->get_name( &name ) == 0) {
|
if (pSymbol->get_name( &name ) == 0) {
|
||||||
if (wcscmp(name, L"") == 0) {
|
if (wcscmp(name, L"") == 0) {
|
||||||
size_t length = 7; // length of: "NONAME\0"
|
size_t length = 7; // length of: "NONAME\0"
|
||||||
wchar_t * str = (wchar_t *)calloc(length, sizeof(wchar_t));
|
wchar_t * str = (wchar_t *)calloc(length, sizeof(wchar_t));
|
||||||
swprintf(str, L"NONAME");
|
if (str != NULL) {
|
||||||
escapedName = escapeXmlEntities(str);
|
swprintf_s(str, length, L"NONAME");
|
||||||
|
escapedName = escapeXmlEntities(str);
|
||||||
|
}
|
||||||
} else
|
} else
|
||||||
if(wcsstr(name, L"unnamed-tag") != NULL){
|
if(wcsstr(name, L"unnamed-tag") != NULL){
|
||||||
if(pSymbol->get_symIndexId(&symIndexId) != 0){
|
if(pSymbol->get_symIndexId(&symIndexId) != 0){
|
||||||
|
@ -184,16 +186,20 @@ BSTR getName(IDiaSymbol * pSymbol) {
|
||||||
}
|
}
|
||||||
size_t length = 16; // length of: "<unnamed_NNNN>\0" + 1 extra
|
size_t length = 16; // length of: "<unnamed_NNNN>\0" + 1 extra
|
||||||
wchar_t * str = (wchar_t *)calloc(length, sizeof(wchar_t));
|
wchar_t * str = (wchar_t *)calloc(length, sizeof(wchar_t));
|
||||||
swprintf(str, L"<unnamed_%04x>", symIndexId);
|
if (str != NULL) {
|
||||||
escapedName = escapeXmlEntities(str);
|
swprintf_s(str, length, L"<unnamed_%04x>", symIndexId);
|
||||||
|
escapedName = escapeXmlEntities(str);
|
||||||
|
}
|
||||||
} else
|
} else
|
||||||
if(pSymbol->get_locationType(&locType) == 0 &&
|
if(pSymbol->get_locationType(&locType) == 0 &&
|
||||||
locType == LocIsBitField &&
|
locType == LocIsBitField &&
|
||||||
pSymbol->get_length(&len) == 0){
|
pSymbol->get_length(&len) == 0){
|
||||||
size_t length = wcslen(name) + 4 + 32; // length of: name + ":0x\0" + wag_hex_numeric_str_len
|
size_t length = wcslen(name) + 4 + 32; // length of: name + ":0x\0" + wag_hex_numeric_str_len
|
||||||
wchar_t * str = (wchar_t *)calloc(length, sizeof(wchar_t));
|
wchar_t * str = (wchar_t *)calloc(length, sizeof(wchar_t));
|
||||||
swprintf(str, L"%ws:0x%x", name, len);
|
if (str != NULL) {
|
||||||
escapedName = escapeXmlEntities(str);
|
swprintf_s(str, length, L"%ws:0x%I64x", name, len);
|
||||||
|
escapedName = escapeXmlEntities(str);
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
escapedName = escapeXmlEntities(name);
|
escapedName = escapeXmlEntities(name);
|
||||||
}
|
}
|
||||||
|
|
|
@ -15,7 +15,7 @@
|
||||||
*/
|
*/
|
||||||
#include "util.h"
|
#include "util.h"
|
||||||
|
|
||||||
void zero_out(const char * str, int len) {
|
void zero_out(const char * str, size_t len) {
|
||||||
char * tmp = (char *)str;
|
char * tmp = (char *)str;
|
||||||
for (int i = 0 ; i < len ; ++i) {
|
for (int i = 0 ; i < len ; ++i) {
|
||||||
tmp[i] = '\0';
|
tmp[i] = '\0';
|
||||||
|
@ -39,14 +39,18 @@ int find_char(const char * str, char c) {
|
||||||
*/
|
*/
|
||||||
int atog(GUID * guid, const char * szGUID) {
|
int atog(GUID * guid, const char * szGUID) {
|
||||||
char * tmp = (char *)szGUID;
|
char * tmp = (char *)szGUID;
|
||||||
char buff[256];
|
size_t sz = 256;
|
||||||
|
char * buff = (char *) calloc(sz, sizeof(char));
|
||||||
|
if (buff == NULL) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
/*****************************************/
|
/*****************************************/
|
||||||
int index = find_char(tmp, '-');
|
int index = find_char(tmp, '-');
|
||||||
if (index == -1) {
|
if (index == -1) {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
zero_out(buff, 256);
|
zero_out(buff, sz);
|
||||||
strncpy(buff, tmp, index);
|
strncpy_s(buff, sz, tmp, index);
|
||||||
|
|
||||||
//the value could be too large and cause overflow. eg, "9b8c55da"
|
//the value could be too large and cause overflow. eg, "9b8c55da"
|
||||||
if (strlen(buff) == 8 && buff[0] >= '8') {
|
if (strlen(buff) == 8 && buff[0] >= '8') {
|
||||||
|
@ -72,8 +76,8 @@ int atog(GUID * guid, const char * szGUID) {
|
||||||
if (index == -1) {
|
if (index == -1) {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
zero_out(buff, 256);
|
zero_out(buff, sz);
|
||||||
strncpy(buff, tmp, index);
|
strncpy_s(buff, sz, tmp, index);
|
||||||
guid->Data2 = (unsigned short)strtol(buff, NULL, 16);
|
guid->Data2 = (unsigned short)strtol(buff, NULL, 16);
|
||||||
/*****************************************/
|
/*****************************************/
|
||||||
tmp = tmp+index+1;
|
tmp = tmp+index+1;
|
||||||
|
@ -81,50 +85,52 @@ int atog(GUID * guid, const char * szGUID) {
|
||||||
if (index == -1) {
|
if (index == -1) {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
zero_out(buff, 256);
|
zero_out(buff, sz);
|
||||||
strncpy(buff, tmp, index);
|
strncpy_s(buff, sz, tmp, index);
|
||||||
guid->Data3 = (unsigned short)strtol(buff, NULL, 16);
|
guid->Data3 = (unsigned short)strtol(buff, NULL, 16);
|
||||||
/*****************************************/
|
/*****************************************/
|
||||||
tmp = tmp+index+1;
|
tmp = tmp+index+1;
|
||||||
index = find_char(tmp, '-');
|
index = find_char(tmp, '-');
|
||||||
if (index == -1) {
|
if (index == -1 || index >= sz) {
|
||||||
|
free(buff);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
zero_out(buff, 256);
|
zero_out(buff, sz);
|
||||||
strncpy(buff, tmp, index);
|
strncpy_s(buff, sz, tmp, index);
|
||||||
int ivalue = strtol(buff, NULL, 16);
|
int ivalue = strtol(buff, NULL, 16);
|
||||||
guid->Data4[0] = ivalue >> 8;
|
guid->Data4[0] = ivalue >> 8;
|
||||||
guid->Data4[1] = ivalue & 0xff;
|
guid->Data4[1] = ivalue & 0xff;
|
||||||
/*****************************************/
|
/*****************************************/
|
||||||
tmp = tmp+index+1;
|
tmp = tmp+index+1;
|
||||||
zero_out(buff, 256);
|
zero_out(buff, sz);
|
||||||
strncpy(buff, tmp, 2);
|
strncpy_s(buff, sz, tmp, 2);
|
||||||
guid->Data4[2] = (unsigned char)strtol(buff, NULL, 16);
|
guid->Data4[2] = (unsigned char)strtol(buff, NULL, 16);
|
||||||
/*****************************************/
|
/*****************************************/
|
||||||
tmp = tmp+2;
|
tmp = tmp+2;
|
||||||
zero_out(buff, 256);
|
zero_out(buff, sz);
|
||||||
strncpy(buff, tmp, 2);
|
strncpy_s(buff, sz, tmp, 2);
|
||||||
guid->Data4[3] = (unsigned char)strtol(buff, NULL, 16);
|
guid->Data4[3] = (unsigned char)strtol(buff, NULL, 16);
|
||||||
/*****************************************/
|
/*****************************************/
|
||||||
tmp = tmp+2;
|
tmp = tmp+2;
|
||||||
zero_out(buff, 256);
|
zero_out(buff, sz);
|
||||||
strncpy(buff, tmp, 2);
|
strncpy_s(buff, sz, tmp, 2);
|
||||||
guid->Data4[4] = (unsigned char)strtol(buff, NULL, 16);
|
guid->Data4[4] = (unsigned char)strtol(buff, NULL, 16);
|
||||||
/*****************************************/
|
/*****************************************/
|
||||||
tmp = tmp+2;
|
tmp = tmp+2;
|
||||||
zero_out(buff, 256);
|
zero_out(buff, sz);
|
||||||
strncpy(buff, tmp, 2);
|
strncpy_s(buff, sz, tmp, 2);
|
||||||
guid->Data4[5] = (unsigned char)strtol(buff, NULL, 16);
|
guid->Data4[5] = (unsigned char)strtol(buff, NULL, 16);
|
||||||
/*****************************************/
|
/*****************************************/
|
||||||
tmp = tmp+2;
|
tmp = tmp+2;
|
||||||
zero_out(buff, 256);
|
zero_out(buff, sz);
|
||||||
strncpy(buff, tmp, 2);
|
strncpy_s(buff, sz, tmp, 2);
|
||||||
guid->Data4[6] = (unsigned char)strtol(buff, NULL, 16);
|
guid->Data4[6] = (unsigned char)strtol(buff, NULL, 16);
|
||||||
/*****************************************/
|
/*****************************************/
|
||||||
tmp = tmp+2;
|
tmp = tmp+2;
|
||||||
zero_out(buff, 256);
|
zero_out(buff, sz);
|
||||||
strncpy(buff, tmp, 2);
|
strncpy_s(buff, sz, tmp, 2);
|
||||||
guid->Data4[7] = (unsigned char)strtol(buff, NULL, 16);
|
guid->Data4[7] = (unsigned char)strtol(buff, NULL, 16);
|
||||||
/*****************************************/
|
/*****************************************/
|
||||||
|
free(buff);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -15,15 +15,15 @@
|
||||||
*/
|
*/
|
||||||
#include "xml.h"
|
#include "xml.h"
|
||||||
|
|
||||||
char * indent(int nSpaces) {
|
char* indent(size_t nSpaces) {
|
||||||
switch (nSpaces) {
|
switch (nSpaces) {
|
||||||
case 1: return " ";
|
case 1: return " ";
|
||||||
case 2: return " ";
|
case 2: return " ";
|
||||||
case 4: return " ";
|
case 4: return " ";
|
||||||
case 6: return " ";
|
case 6: return " ";
|
||||||
case 8: return " ";
|
case 8: return " ";
|
||||||
case 10: return " ";
|
case 10: return " ";
|
||||||
case 12: return " ";
|
case 12: return " ";
|
||||||
}
|
}
|
||||||
|
|
||||||
// NOTE: memory leak if following code is hit, but luckily there are no callers
|
// NOTE: memory leak if following code is hit, but luckily there are no callers
|
||||||
|
@ -32,16 +32,18 @@ char * indent(int nSpaces) {
|
||||||
if (nSpaces < 0) {
|
if (nSpaces < 0) {
|
||||||
nSpaces = 0;
|
nSpaces = 0;
|
||||||
}
|
}
|
||||||
char * indent = (char *)calloc(nSpaces+1, sizeof(char));
|
char* indent = (char*)calloc(nSpaces + 1, sizeof(char));
|
||||||
for (int i = 0 ; i < nSpaces ; ++i) {
|
if (indent != NULL) {
|
||||||
indent[i] = ' ';
|
for (int i = 0; i < nSpaces; ++i) {
|
||||||
|
indent[i] = ' ';
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return indent;
|
return indent;
|
||||||
}
|
}
|
||||||
|
|
||||||
BSTR escapeXmlEntities(BSTR bstr) {
|
BSTR escapeXmlEntities(BSTR bstr) {
|
||||||
WCHAR * str = (WCHAR *)bstr;
|
WCHAR * str = (WCHAR *)bstr;
|
||||||
int len = wcslen(str);
|
size_t len = wcslen(str);
|
||||||
if (len == 0) return str;
|
if (len == 0) return str;
|
||||||
size_t destLen = 0;
|
size_t destLen = 0;
|
||||||
|
|
||||||
|
@ -69,30 +71,34 @@ BSTR escapeXmlEntities(BSTR bstr) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
destLen += 1;
|
||||||
|
|
||||||
WCHAR * newstr = (WCHAR *)calloc(destLen + 1, sizeof(WCHAR));
|
WCHAR * newstr = (WCHAR *)calloc(destLen, sizeof(WCHAR));
|
||||||
|
if (newstr == NULL) {
|
||||||
|
return newstr;
|
||||||
|
}
|
||||||
WCHAR * tmp = newstr;
|
WCHAR * tmp = newstr;
|
||||||
|
|
||||||
for (int i = 0 ; i < len ; ++i) {
|
for (int i = 0 ; i < len ; ++i) {
|
||||||
switch (str[i]) {
|
switch (str[i]) {
|
||||||
case '&' :
|
case '&' :
|
||||||
wcscpy(tmp, L"&");
|
wcscpy_s(tmp, destLen, L"&");
|
||||||
tmp += 5;
|
tmp += 5;
|
||||||
break;
|
break;
|
||||||
case '<' :
|
case '<' :
|
||||||
wcscpy(tmp, L"<");
|
wcscpy_s(tmp, destLen, L"<");
|
||||||
tmp += 4;
|
tmp += 4;
|
||||||
break;
|
break;
|
||||||
case '>' :
|
case '>' :
|
||||||
wcscpy(tmp, L">");
|
wcscpy_s(tmp, destLen, L">");
|
||||||
tmp += 4;
|
tmp += 4;
|
||||||
break;
|
break;
|
||||||
case '\'' :
|
case '\'' :
|
||||||
wcscpy(tmp, L"'");
|
wcscpy_s(tmp, destLen, L"'");
|
||||||
tmp += 6;
|
tmp += 6;
|
||||||
break;
|
break;
|
||||||
case '"' :
|
case '"' :
|
||||||
wcscpy(tmp, L""");
|
wcscpy_s(tmp, destLen, L""");
|
||||||
tmp += 6;
|
tmp += 6;
|
||||||
break;
|
break;
|
||||||
case 0x7F :
|
case 0x7F :
|
||||||
|
|
|
@ -1,6 +1,5 @@
|
||||||
/* ###
|
/* ###
|
||||||
* IP: GHIDRA
|
* IP: GHIDRA
|
||||||
* REVIEWED: YES
|
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
|
@ -18,9 +17,9 @@
|
||||||
#define __PDB__XML__H__
|
#define __PDB__XML__H__
|
||||||
|
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include "comutil.h"
|
#include <comutil.h>
|
||||||
|
|
||||||
char * indent(int nSpaces);
|
char * indent(size_t nSpaces);
|
||||||
BSTR escapeXmlEntities(BSTR bstr);
|
BSTR escapeXmlEntities(BSTR bstr);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue