summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAlexWhiter <a.whiter@yandex.ru>2018-04-05 17:21:54 (GMT)
committerAlexWhiter <a.whiter@yandex.ru>2018-04-05 17:21:54 (GMT)
commit833bfaa509c338d9458b3b549194290e78eb7345 (patch)
tree29a34e36d26a27a0db28deee805c3d7f75e1ed07
parenta7749963973ea5448ec203602af67a3a69d3138f (diff)
downloadcv2pdb-833bfaa509c338d9458b3b549194290e78eb7345.zip
cv2pdb-833bfaa509c338d9458b3b549194290e78eb7345.tar.gz
cv2pdb-833bfaa509c338d9458b3b549194290e78eb7345.tar.bz2
1. If exe-file consisted of just a disk letter and a file name (i.e. c:file.exe), AV occured.
2. Aligning the debug section offset to the closest 16-byte boundary.
-rw-r--r--src/cv2pdb.cpp11
-rw-r--r--src/cv2pdb.h1
-rw-r--r--src/main.cpp2
3 files changed, 9 insertions, 5 deletions
diff --git a/src/cv2pdb.cpp b/src/cv2pdb.cpp
index 84cf5f2..9b7edbf 100644
--- a/src/cv2pdb.cpp
+++ b/src/cv2pdb.cpp
@@ -18,7 +18,7 @@
static const int typePrefix = 4;
CV2PDB::CV2PDB(PEImage& image)
-: img(image), pdb(0), dbi(0), tpi(0), ipi(0), libraries(0), rsds(0), modules(0), globmod(0)
+: img(image), pdb(0), dbi(0), tpi(0), ipi(0), libraries(0), rsds(0), rsdsLen(0), modules(0), globmod(0)
, segMap(0), segMapDesc(0), segFrame2Index(0), globalTypeHeader(0)
, globalTypes(0), cbGlobalTypes(0), allocGlobalTypes(0)
, userTypes(0), cbUserTypes(0), allocUserTypes(0)
@@ -166,7 +166,11 @@ bool CV2PDB::openPDB(const TCHAR* pdbname, const TCHAR* pdbref)
printf("PDB::QueryPdbImplementationVersion() = %d\n", pdb->QueryPdbImplementationVersion());
#endif
- rsds = (OMFSignatureRSDS *) new char[24 + strlen(pdbnameA) + 1]; // sizeof(OMFSignatureRSDS) without name
+ rsdsLen = 24 + strlen(pdbnameA) + 1; // sizeof(OMFSignatureRSDS) without name
+ // Growing the RSDS block to the closest 16-byte boundary.
+ if (rsdsLen & 0xF)
+ rsdsLen = (rsdsLen | 0xF) + 1;
+ rsds = (OMFSignatureRSDS *) new char[rsdsLen];
memcpy (rsds->Signature, "RSDS", 4);
pdb->QuerySignature2(&rsds->guid);
rsds->age = pdb->QueryAge();
@@ -3434,8 +3438,7 @@ bool CV2PDB::addSymbols()
bool CV2PDB::writeImage(const TCHAR* opath, PEImage& exeImage)
{
- int len = sizeof(*rsds) + strlen((char*)(rsds + 1)) + 1;
- if (!exeImage.replaceDebugSection(rsds, len, true))
+ if (!exeImage.replaceDebugSection(rsds, rsdsLen, true))
return setError(exeImage.getLastError());
if (!exeImage.save(opath))
diff --git a/src/cv2pdb.h b/src/cv2pdb.h
index 9e5e5d1..03c220b 100644
--- a/src/cv2pdb.h
+++ b/src/cv2pdb.h
@@ -205,6 +205,7 @@ public:
int countEntries;
OMFSignatureRSDS* rsds;
+ int rsdsLen;
OMFSegMap* segMap;
OMFSegMapDesc* segMapDesc;
diff --git a/src/main.cpp b/src/main.cpp
index 9273cbd..70b1563 100644
--- a/src/main.cpp
+++ b/src/main.cpp
@@ -63,7 +63,7 @@ void makefullpath(TCHAR* pdbname)
{
if (pdbname[2] == '\\' || pdbname[2] == '/')
return;
- drive = T_toupper (pdbname[0]);
+ drive = T_toupper (pdbname[0]) - 'A' + 1;
pdbname += 2;
}
else