📄 msc.c
字号:
terminate_string(&sym->stack_v2.p_name));
break;
case S_BPREL_V3:
symt_add_func_local(msc_dbg->module, curr_func, 0, sym->stack_v3.offset,
block, codeview_get_type(sym->stack_v3.symtype, FALSE),
sym->stack_v3.name);
break;
case S_REGISTER_V1:
symt_add_func_local(msc_dbg->module, curr_func, 0, sym->register_v1.reg,
block, codeview_get_type(sym->register_v1.type, FALSE),
terminate_string(&sym->register_v1.p_name));
break;
case S_REGISTER_V2:
symt_add_func_local(msc_dbg->module, curr_func, 0, sym->register_v2.reg,
block, codeview_get_type(sym->register_v2.type, FALSE),
terminate_string(&sym->register_v2.p_name));
break;
case S_BLOCK_V1:
block = symt_open_func_block(msc_dbg->module, curr_func, block,
codeview_get_address(msc_dbg, sym->block_v1.segment, sym->block_v1.offset),
sym->block_v1.length);
break;
case S_BLOCK_V3:
block = symt_open_func_block(msc_dbg->module, curr_func, block,
codeview_get_address(msc_dbg, sym->block_v3.segment, sym->block_v3.offset),
sym->block_v3.length);
break;
case S_END_V1:
if (block)
{
block = symt_close_func_block(msc_dbg->module, curr_func, block, 0);
}
else if (curr_func)
{
symt_normalize_function(msc_dbg->module, curr_func);
curr_func = NULL;
}
break;
/* FIXME: we should use this as a compiland, instead of guessing it on the fly */
case S_COMPILAND_V1:
TRACE("S-Compiland-V1e %x %s\n",
sym->compiland_v1.unknown,
terminate_string(&sym->compiland_v1.p_name));
break;
case S_COMPILAND_V2:
TRACE("S-Compiland-V2 %s\n",
terminate_string(&sym->compiland_v2.p_name));
if (TRACE_ON(dbghelp_msc))
{
const char* ptr1 = sym->compiland_v2.p_name.name + sym->compiland_v2.p_name.namelen;
const char* ptr2;
while (*ptr1)
{
ptr2 = ptr1 + strlen(ptr1) + 1;
TRACE("\t%s => %s\n", ptr1, ptr2);
ptr1 = ptr2 + strlen(ptr2) + 1;
}
}
break;
case S_COMPILAND_V3:
TRACE("S-Compiland-V3 %s\n", sym->compiland_v3.name);
if (TRACE_ON(dbghelp_msc))
{
const char* ptr1 = sym->compiland_v3.name + strlen(sym->compiland_v3.name);
const char* ptr2;
while (*ptr1)
{
ptr2 = ptr1 + strlen(ptr1) + 1;
TRACE("\t%s => %s\n", ptr1, ptr2);
ptr1 = ptr2 + strlen(ptr2) + 1;
}
}
break;
case S_OBJNAME_V1:
TRACE("S-ObjName %.*s\n", ((const BYTE*)sym)[8], (const BYTE*)sym + 9);
break;
case S_LABEL_V1:
if (curr_func)
{
symt_add_function_point(msc_dbg->module, curr_func, SymTagLabel,
codeview_get_address(msc_dbg, sym->label_v1.segment, sym->label_v1.offset) - curr_func->address,
terminate_string(&sym->label_v1.p_name));
}
else
FIXME("No current function for label %s\n",
terminate_string(&sym->label_v1.p_name));
break;
case S_LABEL_V3:
if (curr_func)
{
symt_add_function_point(msc_dbg->module, curr_func, SymTagLabel,
codeview_get_address(msc_dbg, sym->label_v3.segment, sym->label_v3.offset) - curr_func->address,
sym->label_v3.name);
}
else
FIXME("No current function for label %s\n", sym->label_v3.name);
break;
case S_CONSTANT_V1:
{
int val, vlen;
const struct p_string* name;
const char* x;
struct symt* se;
vlen = numeric_leaf(&val, &sym->constant_v1.cvalue);
name = (const struct p_string*)((const char*)&sym->constant_v1.cvalue + vlen);
se = codeview_get_type(sym->constant_v1.type, FALSE);
if (!se) x = "---";
else if (se->tag == SymTagEnum) x = ((struct symt_enum*)se)->name;
else x = "###";
TRACE("S-Constant-V1 %u %s %x (%s)\n",
val, terminate_string(name), sym->constant_v1.type, x);
/* FIXME: we should add this as a constant value */
}
break;
case S_CONSTANT_V2:
{
int val, vlen;
const struct p_string* name;
const char* x;
struct symt* se;
vlen = numeric_leaf(&val, &sym->constant_v2.cvalue);
name = (const struct p_string*)((const char*)&sym->constant_v2.cvalue + vlen);
se = codeview_get_type(sym->constant_v2.type, FALSE);
if (!se) x = "---";
else if (se->tag == SymTagEnum) x = ((struct symt_enum*)se)->name;
else x = "###";
TRACE("S-Constant-V2 %u %s %x (%s)\n",
val, terminate_string(name), sym->constant_v2.type, x);
/* FIXME: we should add this as a constant value */
}
break;
case S_CONSTANT_V3:
{
int val, vlen;
const char* name;
const char* x;
struct symt* se;
vlen = numeric_leaf(&val, &sym->constant_v3.cvalue);
name = (const char*)&sym->constant_v3.cvalue + vlen;
se = codeview_get_type(sym->constant_v3.type, FALSE);
if (!se) x = "---";
else if (se->tag == SymTagEnum) x = ((struct symt_enum*)se)->name;
else x = "###";
TRACE("S-Constant-V3 %u %s %x (%s)\n",
val, name, sym->constant_v3.type, x);
/* FIXME: we should add this as a constant value */
}
break;
case S_UDT_V1:
if (sym->udt_v1.type)
{
if ((symt = codeview_get_type(sym->udt_v1.type, FALSE)))
symt_new_typedef(msc_dbg->module, symt,
terminate_string(&sym->udt_v1.p_name));
else
FIXME("S-Udt %s: couldn't find type 0x%x\n",
terminate_string(&sym->udt_v1.p_name), sym->udt_v1.type);
}
break;
case S_UDT_V2:
if (sym->udt_v2.type)
{
if ((symt = codeview_get_type(sym->udt_v2.type, FALSE)))
symt_new_typedef(msc_dbg->module, symt,
terminate_string(&sym->udt_v2.p_name));
else
FIXME("S-Udt %s: couldn't find type 0x%x\n",
terminate_string(&sym->udt_v2.p_name), sym->udt_v2.type);
}
break;
case S_UDT_V3:
if (sym->udt_v3.type)
{
if ((symt = codeview_get_type(sym->udt_v3.type, FALSE)))
symt_new_typedef(msc_dbg->module, symt, sym->udt_v3.name);
else
FIXME("S-Udt %s: couldn't find type 0x%x\n",
sym->udt_v3.name, sym->udt_v3.type);
}
break;
/*
* These are special, in that they are always followed by an
* additional length-prefixed string which is *not* included
* into the symbol length count. We need to skip it.
*/
case S_PROCREF_V1:
case S_DATAREF_V1:
case S_LPROCREF_V1:
name = (const char*)sym + length;
length += (*name + 1 + 3) & ~3;
break;
case S_PUB_DATA_V3:
if (!(dbghelp_options & SYMOPT_NO_PUBLICS))
{
flt = codeview_get_linetab(linetab, sym->data_v3.segment, sym->data_v3.offset);
symt_new_public(msc_dbg->module,
flt ? flt->compiland : NULL,
sym->data_v3.name,
codeview_get_address(msc_dbg, sym->data_v3.segment, sym->data_v3.offset),
0, FALSE /* FIXME */, FALSE);
}
break;
case S_PUB_FUNC1_V3:
case S_PUB_FUNC2_V3: /* using a data_v3 isn't what we'd expect */
if (!(dbghelp_options & SYMOPT_NO_PUBLICS))
{
flt = codeview_get_linetab(linetab, sym->data_v3.segment, sym->data_v3.offset);
symt_new_public(msc_dbg->module,
flt ? flt->compiland : NULL,
sym->data_v3.name,
codeview_get_address(msc_dbg, sym->data_v3.segment, sym->data_v3.offset),
0, TRUE /* FIXME */, TRUE);
}
break;
case S_MSTOOL_V3: /* just to silence a few warnings */
break;
default:
FIXME("Unsupported symbol id %x\n", sym->generic.id);
dump(sym, 2 + sym->generic.len);
break;
}
}
if (curr_func) symt_normalize_function(msc_dbg->module, curr_func);
if (linetab) HeapFree(GetProcessHeap(), 0, linetab);
return TRUE;
}
/*========================================================================
* Process PDB file.
*/
struct pdb_lookup
{
const char* filename;
enum {PDB_JG, PDB_DS} kind;
union
{
struct
{
DWORD timestamp;
struct PDB_JG_TOC* toc;
} jg;
struct
{
GUID guid;
struct PDB_DS_TOC* toc;
} ds;
} u;
};
static void* pdb_jg_read(const struct PDB_JG_HEADER* pdb, const WORD* block_list,
int size)
{
int i, num_blocks;
BYTE* buffer;
if (!size) return NULL;
num_blocks = (size + pdb->block_size - 1) / pdb->block_size;
buffer = HeapAlloc(GetProcessHeap(), 0, num_blocks * pdb->block_size);
for (i = 0; i < num_blocks; i++)
memcpy(buffer + i * pdb->block_size,
(const char*)pdb + block_list[i] * pdb->block_size, pdb->block_size);
return buffer;
}
static void* pdb_ds_read(const struct PDB_DS_HEADER* pdb, const DWORD* block_list,
int size)
{
int i, num_blocks;
BYTE* buffer;
if (!size) return NULL;
num_blocks = (size + pdb->block_size - 1) / pdb->block_size;
buffer = HeapAlloc(GetProcessHeap(), 0, num_blocks * pdb->block_size);
for (i = 0; i < num_blocks; i++)
memcpy(buffer + i * pdb->block_size,
(const char*)pdb + block_list[i] * pdb->block_size, pdb->block_size);
return buffer;
}
static void* pdb_read_jg_file(const struct PDB_JG_HEADER* pdb,
const struct PDB_JG_TOC* toc, DWORD file_nr)
{
const WORD* block_list;
DWORD i;
if (!toc || file_nr >= toc->num_files) return NULL;
block_list = (const WORD*) &toc->file[toc->num_files];
for (i = 0; i < file_nr; i++)
block_list += (toc->file[i].size + pdb->block_size - 1) / pdb->block_size;
return pdb_jg_read(pdb, block_list, toc->file[file_nr].size);
}
static void* pdb_read_ds_file(const struct PDB_DS_HEADER* pdb,
const struct PDB_DS_TOC* toc, DWORD
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -