summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorsagitario <sagitario@fc51e93f-b9fe-4711-8d8d-3ae870c5f7d8>2010-06-04 07:26:26 (GMT)
committersagitario <sagitario@fc51e93f-b9fe-4711-8d8d-3ae870c5f7d8>2010-06-04 07:26:26 (GMT)
commit259c6e72e8ed783d224648e9d0012adb6398e5b0 (patch)
tree4a6c84d74c6e3259c4f6657ec366684b8d008a60 /src
parent1f7f18ddaa3298b5d2a21e9dfb9cb18ad95d58a9 (diff)
downloadcv2pdb-259c6e72e8ed783d224648e9d0012adb6398e5b0.zip
cv2pdb-259c6e72e8ed783d224648e9d0012adb6398e5b0.tar.gz
cv2pdb-259c6e72e8ed783d224648e9d0012adb6398e5b0.tar.bz2
Version 0.13
* adapted to mspdb100.dll which comes with VS2010 * tweaked autoexp.dat modifications to be more stable with uninitialized data * autoexp.snippet now split into two files
Diffstat (limited to 'src')
-rw-r--r--src/cv2pdb.cpp32
-rw-r--r--src/cv2pdb.h2
-rw-r--r--src/demangle.cpp9
-rw-r--r--src/mspdb.cpp29
-rw-r--r--src/mspdb.h161
-rw-r--r--src/symutil.cpp1
6 files changed, 159 insertions, 75 deletions
diff --git a/src/cv2pdb.cpp b/src/cv2pdb.cpp
index 0a66e8e..a934d2f 100644
--- a/src/cv2pdb.cpp
+++ b/src/cv2pdb.cpp
@@ -12,6 +12,7 @@
#include <direct.h>
#define REMOVE_LF_DERIVED 1 // types wrong by DMD
+#define PRINT_INTERFACEVERSON 0
static const int kIncomplete = 0x80;
@@ -125,9 +126,11 @@ bool CV2PDB::openPDB(const char* pdbname)
if (!pdb)
return setError("cannot create PDB file");
- //printf("PDB::QueryInterfaceVersion() = %d\n", pdb->QueryInterfaceVersion());
- //printf("PDB::QueryImplementationVersion() = %d\n", pdb->QueryImplementationVersion());
- //printf("PDB::QueryPdbImplementationVersion() = %d\n", pdb->QueryPdbImplementationVersion());
+#if PRINT_INTERFACEVERSON
+ printf("PDB::QueryInterfaceVersion() = %d\n", pdb->QueryInterfaceVersion());
+ printf("PDB::QueryImplementationVersion() = %d\n", pdb->QueryImplementationVersion());
+ printf("PDB::QueryPdbImplementationVersion() = %d\n", pdb->QueryPdbImplementationVersion());
+#endif
rsds = (OMFSignatureRSDS *) new char[24 + strlen(pdbname) + 1]; // sizeof(OMFSignatureRSDS) without name
memcpy (rsds->Signature, "RSDS", 4);
@@ -139,10 +142,20 @@ bool CV2PDB::openPDB(const char* pdbname)
if (rc <= 0 || !dbi)
return setError("cannot create DBI");
+#if PRINT_INTERFACEVERSON
+ printf("DBI::QueryInterfaceVersion() = %d\n", dbi->QueryInterfaceVersion());
+ printf("DBI::QueryImplementationVersion() = %d\n", dbi->QueryImplementationVersion());
+#endif
+
rc = pdb->OpenTpi("", &tpi);
if (rc <= 0 || !tpi)
return setError("cannot create TPI");
+#if PRINT_INTERFACEVERSON
+ printf("TPI::QueryInterfaceVersion() = %d\n", tpi->QueryInterfaceVersion());
+ printf("TPI::QueryImplementationVersion() = %d\n", tpi->QueryImplementationVersion());
+#endif
+
return true;
}
@@ -192,6 +205,15 @@ bool CV2PDB::createModules()
return setError("cannot create mod");
mod = modules[entry->iMod];
}
+#if PRINT_INTERFACEVERSON
+ static bool once;
+ if(!once)
+ {
+ printf("Mod::QueryInterfaceVersion() = %d\n", mod->QueryInterfaceVersion());
+ printf("Mod::QueryImplementationVersion() = %d\n", mod->QueryImplementationVersion());
+ once = true;
+ }
+#endif
for (int s = 0; s < module->cSeg; s++)
{
@@ -2501,7 +2523,9 @@ bool CV2PDB::writeSymbols(mspdb::Mod* mod, DWORD* data, int databytes, int prefi
data[3] = 1;
int rc = mod->AddSymbols((BYTE*) data, ((databytes + 3) / 4 + prefix) * 4);
if (rc <= 0)
- return setError("cannot add symbols to module");
+ return setError(mspdb::DBI::isVS10
+ ? "cannot add symbols to module, probably msobj100.dll missing"
+ : "cannot add symbols to module, probably msobj80.dll missing");
return true;
}
diff --git a/src/cv2pdb.h b/src/cv2pdb.h
index 48b67d5..c95fa52 100644
--- a/src/cv2pdb.h
+++ b/src/cv2pdb.h
@@ -49,7 +49,7 @@ public:
int addFieldMember(codeview_fieldtype* dfieldtype, int attr, int offset, int type, const char* name);
int addFieldStaticMember(codeview_fieldtype* dfieldtype, int attr, int type, const char* name);
- int addFieldNestedType(codeview_fieldtype* dfieldtype, int type, const char* name);
+ int addFieldNestedType(codeview_fieldtype* dfieldtype, int type, const char* name);
void checkUserTypeAlloc(int size = 1000, int add = 10000);
diff --git a/src/demangle.cpp b/src/demangle.cpp
index 87bef71..01ee4f2 100644
--- a/src/demangle.cpp
+++ b/src/demangle.cpp
@@ -16,6 +16,8 @@
#include <ctype.h>
#include <assert.h>
+#include "symutil.h"
+
using namespace std;
typedef unsigned char ubyte;
@@ -493,13 +495,16 @@ void unittest()
string r = d.demangle(table[i][0]);
assert(r == table[i][1]);
// "table entry #" + toString(i) + ": '" + name[0] + "' demangles as '" + r + "' but is expected to be '" + name[1] + "'");
-
}
+
+ const char s[] = "_D12intellisen\xd1" "11LibraryInfo14findDe\xeaitionMFKS\x80\x8f\xaf" "0SearchDataZA\x80\x91\x9d\x80\x8a\xbb" "8count\x80\x83\x90MFAyaP\x80\x8f\xaa" "9JSONscopeH\x80\x83\x93S3std4json\x80\x85\x98ValueZb";
+ char buf[512];
+ dsym2c((const BYTE*) s, sizeof(s) - 1, buf, sizeof(buf));
}
bool d_demangle(const char* name, char* demangled, int maxlen, bool plain)
{
- // static bool once; if(!once) unittest(); once = true;
+ static bool once; if(!once) { once = true; unittest(); }
Demangle d;
string r = d.demangle(name, plain);
diff --git a/src/mspdb.cpp b/src/mspdb.cpp
index fe10243..76ec6d7 100644
--- a/src/mspdb.cpp
+++ b/src/mspdb.cpp
@@ -13,7 +13,10 @@
HMODULE modMsPdb;
mspdb::fnPDBOpen2W *pPDBOpen2W;
-char* mspdb_dll = "mspdb80.dll";
+char* mspdb80_dll = "mspdb80.dll";
+char* mspdb100_dll = "mspdb100.dll";
+
+bool mspdb::DBI::isVS10 = false;
bool getInstallDir(const char* version, char* installDir, DWORD size)
{
@@ -46,15 +49,29 @@ bool tryLoadMsPdb(const char* version, const char* mspdb)
bool initMsPdb()
{
if (!modMsPdb)
- modMsPdb = LoadLibraryA(mspdb_dll);
+ modMsPdb = LoadLibraryA(mspdb80_dll);
+
+ if (!modMsPdb)
+ tryLoadMsPdb("VisualStudio\\9.0", mspdb80_dll);
if (!modMsPdb)
- tryLoadMsPdb("VisualStudio\\9.0", mspdb_dll);
+ tryLoadMsPdb("VisualStudio\\8.0", mspdb80_dll);
if (!modMsPdb)
- tryLoadMsPdb("VisualStudio\\8.0", mspdb_dll);
+ tryLoadMsPdb("VCExpress\\9.0", mspdb80_dll);
if (!modMsPdb)
- tryLoadMsPdb("VCExpress\\9.0", mspdb_dll);
+ tryLoadMsPdb("VCExpress\\8.0", mspdb80_dll);
+
+#if 1
if (!modMsPdb)
- tryLoadMsPdb("VCExpress\\8.0", mspdb_dll);
+ {
+ modMsPdb = LoadLibraryA(mspdb100_dll);
+ if (!modMsPdb)
+ tryLoadMsPdb("VisualStudio\\10.0", mspdb100_dll);
+ if (!modMsPdb)
+ tryLoadMsPdb("VCExpress\\10.0", mspdb100_dll);
+ if (modMsPdb)
+ mspdb::DBI::isVS10 = true;
+ }
+#endif
if (!modMsPdb)
return false;
diff --git a/src/mspdb.h b/src/mspdb.h
index 7104fc2..16209b4 100644
--- a/src/mspdb.h
+++ b/src/mspdb.h
@@ -30,7 +30,6 @@ struct MRECmp2;
struct PDB;
struct Src;
struct Mod;
-struct DBI;
struct StreamCached;
struct GSI;
struct TPI;
@@ -41,18 +40,22 @@ struct EnumNameMap;
#define PDBCommon PDB
#define SrcCommon Src
#define ModCommon Mod
-#define DBICommon DBI
#define MREUtil2 MREUtil
#define MREFile2 MREFile
#define MREBag2 MREBag
#define Mod2 Mod
-#define DBI2 DBI
#define GSI2 GSI
#define TPI2 TPI
#define NameMap2 NameMap
#define EnumNameMap2 EnumNameMap
+struct DBI;
+/*
+#define DBICommon DBI
+#define DBI2 DBI
+*/
+
struct MREUtil {
public: virtual int MREUtil::FRelease(void);
public: virtual void MREUtil::EnumSrcFiles(int (__stdcall*)(struct MREUtil *,struct EnumFile &,enum EnumType),unsigned short const *,void *);
@@ -338,64 +341,100 @@ public: virtual int Mod::QueryLines2(long,unsigned char *,long *);
};
-struct DBI {
-public: virtual unsigned long DBI::QueryImplementationVersion(void);
-public: virtual unsigned long DBI::QueryInterfaceVersion(void);
-public: virtual int DBICommon::OpenMod(char const *objName,char const *libName,struct Mod * *);
-public: virtual int DBI::DeleteMod(char const *);
-public: virtual int DBI2::QueryNextMod(struct Mod *,struct Mod * *);
-public: virtual int DBI::OpenGlobals(struct GSI * *);
-public: virtual int DBI::OpenPublics(struct GSI * *);
-public: virtual int DBI::AddSec(unsigned short sec,unsigned short flags,long offset,long cbseg);
-public: virtual int DBI2::QueryModFromAddr(unsigned short,long,struct Mod * *,unsigned short *,long *,long *);
-public: virtual int DBI::QuerySecMap(unsigned char *,long *);
-public: virtual int DBI::QueryFileInfo(unsigned char *,long *);
-public: virtual void DBI::DumpMods(void);
-public: virtual void DBI::DumpSecContribs(void);
-public: virtual void DBI::DumpSecMap(void);
-public: virtual int DBI2::Close(void);
-public: virtual int DBI::AddThunkMap(long *,unsigned int,long,struct SO *,unsigned int,unsigned short,long);
-public: virtual int DBI::AddPublic(char const *,unsigned short,long);
-public: virtual int DBI2::getEnumContrib(struct Enum * *);
-public: virtual int DBI::QueryTypeServer(unsigned char,struct TPI * *);
-public: virtual int DBI::QueryItsmForTi(unsigned long,unsigned char *);
-public: virtual int DBI::QueryNextItsm(unsigned char,unsigned char *);
-public: virtual int DBI::reinitialize(void); // returns 0
-public: virtual int DBI::SetLazyTypes(int);
-public: virtual int DBI::FindTypeServers(long *,char *);
-public: virtual void DBI::noop(void); // noop
-public: virtual int DBI::OpenDbg(enum DBGTYPE,struct Dbg * *);
-public: virtual int DBI::QueryDbgTypes(enum DBGTYPE *,long *);
-public: virtual int DBI::QueryAddrForSec(unsigned short *,long *,unsigned short,long,unsigned long,unsigned long);
-public: virtual int DBI::QuerySupportsEC(void);
-public: virtual int DBI2::QueryPdb(struct PDB * *);
-public: virtual int DBI::AddLinkInfo(struct LinkInfo *);
-public: virtual int DBI::QueryLinkInfo(struct LinkInfo *,long *);
-public: virtual unsigned long DBI::QueryAge(void)const ;
-public: virtual int DBI2::reinitialize2(void); // returns 0
-public: virtual void DBI::FlushTypeServers(void);
-public: virtual int DBICommon::QueryTypeServerByPdb(char const *,unsigned char *);
-public: virtual int DBI2::OpenModW(unsigned short const *objName,unsigned short const *libName,struct Mod * *);
-public: virtual int DBI::DeleteModW(unsigned short const *);
-public: virtual int DBI::AddPublicW(unsigned short const *name,unsigned short sec,long off,unsigned long type);
-public: virtual int DBI::QueryTypeServerByPdbW(unsigned short const *,unsigned char *);
-public: virtual int DBI::AddLinkInfoW(struct LinkInfoW *);
-public: virtual int DBI::AddPublic2(char const *name,unsigned short sec,long off,unsigned long type);
-public: virtual unsigned short DBI::QueryMachineType(void)const ;
-public: virtual void DBI::SetMachineType(unsigned short);
-public: virtual void DBI::RemoveDataForRva(unsigned long,unsigned long);
-public: virtual int DBI::FStripped(void);
-public: virtual int DBI2::QueryModFromAddr2(unsigned short,long,struct Mod * *,unsigned short *,long *,long *,unsigned long *);
-public: virtual int DBI::QueryNoOfMods(long *);
-public: virtual int DBI2::QueryMods(struct Mod * *,long);
-public: virtual int DBI2::QueryImodFromAddr(unsigned short,long,unsigned short *,unsigned short *,long *,long *,unsigned long *);
-public: virtual int DBI2::OpenModFromImod(unsigned short,struct Mod * *);
-public: virtual int DBI::QueryHeader2(long,unsigned char *,long *);
-public: virtual int DBI::FAddSourceMappingItem(unsigned short const *,unsigned short const *,unsigned long);
-public: virtual int DBI::FSetPfnNotePdbUsed(void *,void (__cdecl*)(void *,unsigned short const *,int,int));
-public: virtual int DBI::FCTypes(void);
-public: virtual int DBI::QueryFileInfo2(unsigned char *,long *);
-public: virtual int DBI::FSetPfnQueryCallback(void *,int (__cdecl*(__cdecl*)(void *,enum DOVC))(void));
+struct DBI_part1 {
+public: virtual unsigned long QueryImplementationVersion(void);
+public: virtual unsigned long QueryInterfaceVersion(void);
+public: virtual int OpenMod(char const *objName,char const *libName,struct Mod * *);
+public: virtual int DeleteMod(char const *);
+public: virtual int QueryNextMod(struct Mod *,struct Mod * *);
+public: virtual int OpenGlobals(struct GSI * *);
+public: virtual int OpenPublics(struct GSI * *);
+public: virtual int AddSec(unsigned short sec,unsigned short flags,long offset,long cbseg);
+public: virtual int QueryModFromAddr(unsigned short,long,struct Mod * *,unsigned short *,long *,long *);
+public: virtual int QuerySecMap(unsigned char *,long *);
+public: virtual int QueryFileInfo(unsigned char *,long *);
+public: virtual void DumpMods(void);
+public: virtual void DumpSecContribs(void);
+public: virtual void DumpSecMap(void);
+public: virtual int Close(void);
+public: virtual int AddThunkMap(long *,unsigned int,long,struct SO *,unsigned int,unsigned short,long);
+public: virtual int AddPublic(char const *,unsigned short,long);
+public: virtual int getEnumContrib(struct Enum * *);
+public: virtual int QueryTypeServer(unsigned char,struct TPI * *);
+public: virtual int QueryItsmForTi(unsigned long,unsigned char *);
+public: virtual int QueryNextItsm(unsigned char,unsigned char *);
+public: virtual int reinitialize(void); // returns 0 (QueryLazyTypes in 10.0)
+public: virtual int SetLazyTypes(int);
+public: virtual int FindTypeServers(long *,char *);
+public: virtual void noop(void); // noop (_Reserved_was_QueryMreLog in 10.0)
+public: virtual int OpenDbg(enum DBGTYPE,struct Dbg * *);
+public: virtual int QueryDbgTypes(enum DBGTYPE *,long *);
+public: virtual int QueryAddrForSec(unsigned short *,long *,unsigned short,long,unsigned long,unsigned long);
+};
+struct DBI_part2 : public DBI_part1 {
+// in mspdb100.dll:
+public: virtual int QueryAddrForSecEx(unsigned short *,long *,unsigned short,long,unsigned long,unsigned long);
+};
+
+template<class BASE>
+struct DBI_BASE : public BASE {
+public: virtual int QuerySupportsEC(void);
+public: virtual int QueryPdb(struct PDB * *);
+public: virtual int AddLinkInfo(struct LinkInfo *);
+public: virtual int QueryLinkInfo(struct LinkInfo *,long *);
+public: virtual unsigned long QueryAge(void)const ;
+public: virtual int reinitialize2(void); // returns 0 (QueryLazyTypes in 10.0)
+public: virtual void FlushTypeServers(void);
+public: virtual int QueryTypeServerByPdb(char const *,unsigned char *);
+public: virtual int OpenModW(unsigned short const *objName,unsigned short const *libName,struct Mod * *);
+public: virtual int DeleteModW(unsigned short const *);
+public: virtual int AddPublicW(unsigned short const *name,unsigned short sec,long off,unsigned long type);
+public: virtual int QueryTypeServerByPdbW(unsigned short const *,unsigned char *);
+public: virtual int AddLinkInfoW(struct LinkInfoW *);
+public: virtual int AddPublic2(char const *name,unsigned short sec,long off,unsigned long type);
+public: virtual unsigned short QueryMachineType(void)const ;
+public: virtual void SetMachineType(unsigned short);
+public: virtual void RemoveDataForRva(unsigned long,unsigned long);
+public: virtual int FStripped(void);
+public: virtual int QueryModFromAddr2(unsigned short,long,struct Mod * *,unsigned short *,long *,long *,unsigned long *);
+public: virtual int QueryNoOfMods(long *);
+public: virtual int QueryMods(struct Mod * *,long);
+public: virtual int QueryImodFromAddr(unsigned short,long,unsigned short *,unsigned short *,long *,long *,unsigned long *);
+public: virtual int OpenModFromImod(unsigned short,struct Mod * *);
+public: virtual int QueryHeader2(long,unsigned char *,long *);
+public: virtual int FAddSourceMappingItem(unsigned short const *,unsigned short const *,unsigned long);
+public: virtual int FSetPfnNotePdbUsed(void *,void (__cdecl*)(void *,unsigned short const *,int,int));
+public: virtual int FCTypes(void);
+public: virtual int QueryFileInfo2(unsigned char *,long *);
+public: virtual int FSetPfnQueryCallback(void *,int (__cdecl*(__cdecl*)(void *,enum DOVC))(void));
+};
+
+struct DBI_VS9 : public DBI_BASE<DBI_part1> {};
+struct DBI_VS10 : public DBI_BASE<DBI_part2> {};
+
+struct DBI
+{
+ static bool isVS10;
+ DBI_VS9 vs9;
+
+ unsigned long QueryImplementationVersion() { return vs9.QueryImplementationVersion(); }
+ unsigned long QueryInterfaceVersion() { return vs9.QueryInterfaceVersion(); }
+ int Close() { return vs9.Close(); }
+ int OpenMod(char const *objName,char const *libName,struct Mod * *pmod) { return vs9.OpenMod(objName,libName,pmod); }
+ int AddSec(unsigned short sec,unsigned short flags,long offset,long cbseg) { return vs9.AddSec(sec,flags,offset,cbseg); }
+
+ int AddPublic2(char const *name,unsigned short sec,long off,unsigned long type)
+ {
+ if(isVS10)
+ return ((DBI_VS10*) &vs9)->AddPublic2(name, sec, off, type);
+ return vs9.AddPublic2(name, sec, off, type);
+ }
+ void SetMachineType(unsigned short type)
+ {
+ if(isVS10)
+ return ((DBI_VS10*) &vs9)->SetMachineType(type);
+ return vs9.SetMachineType(type);
+ }
};
struct StreamCached {
diff --git a/src/symutil.cpp b/src/symutil.cpp
index fe8f3e6..0b761f2 100644
--- a/src/symutil.cpp
+++ b/src/symutil.cpp
@@ -36,7 +36,6 @@ int dsym2c(const BYTE* p, BYTE len, char* cname, int maxclen)
for(int z = 0; z < zlen; z++)
cname[cpos + z] = cname[cpos - zpos + z];
cpos += zlen;
- break;
}
else if (ch > 0x80)
{