summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRainer Schuetze <r.sagitario@gmx.de>2018-04-08 20:31:49 (GMT)
committerGitHub <noreply@github.com>2018-04-08 20:31:49 (GMT)
commit5b9f385b546de9006acb9f81dca14a9cef354e6f (patch)
treeb179ad862830182e75f03da693fa2268093ed0bd
parenta7749963973ea5448ec203602af67a3a69d3138f (diff)
parent1d4c3438c8aa285dffdf56986fc7d1e94bd53541 (diff)
downloadcv2pdb-5b9f385b546de9006acb9f81dca14a9cef354e6f.zip
cv2pdb-5b9f385b546de9006acb9f81dca14a9cef354e6f.tar.gz
cv2pdb-5b9f385b546de9006acb9f81dca14a9cef354e6f.tar.bz2
Merge pull request #27 from AlexWhiter/master
Access violation fixed. Better aligning of debug section.
-rw-r--r--src/PEImage.cpp12
-rw-r--r--src/cv2pdb.cpp8
-rw-r--r--src/cv2pdb.h1
-rw-r--r--src/main.cpp2
4 files changed, 13 insertions, 10 deletions
diff --git a/src/PEImage.cpp b/src/PEImage.cpp
index f0bb580..e8e405a 100644
--- a/src/PEImage.cpp
+++ b/src/PEImage.cpp
@@ -140,7 +140,13 @@ bool PEImage::replaceDebugSection (const void* data, int datalen, bool initCV)
if(dbgDir)
debugdir = *dbgDir;
else
+ {
memset(&debugdir, 0, sizeof(debugdir));
+ debugdir.Type = IMAGE_DEBUG_TYPE_CODEVIEW;
+ }
+ int datalenRaw = datalen;
+ // Growing the data block to the closest 16-byte boundary to make sure the debug directory is aligned.
+ datalen = (datalen + 0xf) & ~0xf;
int xdatalen = datalen + sizeof(debugdir);
// assume there is place for another section because of section alignment
@@ -221,12 +227,8 @@ bool PEImage::replaceDebugSection (const void* data, int datalen, bool initCV)
// append debug data chunk to existing file image
memcpy(newdata, dump_base, dump_total_len);
memset(newdata + dump_total_len, 0, fill);
- memcpy(newdata + dump_total_len + fill, data, datalen);
+ memcpy(newdata + dump_total_len + fill, data, datalenRaw);
- if(!dbgDir)
- {
- debugdir.Type = 2;
- }
dbgDir = (IMAGE_DEBUG_DIRECTORY*) (newdata + dump_total_len + fill + datalen);
memcpy(dbgDir, &debugdir, sizeof(debugdir));
diff --git a/src/cv2pdb.cpp b/src/cv2pdb.cpp
index 84cf5f2..bb30799 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,8 @@ 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
+ rsds = (OMFSignatureRSDS *) new char[rsdsLen];
memcpy (rsds->Signature, "RSDS", 4);
pdb->QuerySignature2(&rsds->guid);
rsds->age = pdb->QueryAge();
@@ -3434,8 +3435,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