84#ifndef IMAGE_FILE_MACHINE_ARM
85# define IMAGE_FILE_MACHINE_ARM 0x01c0
88#ifndef IMAGE_FILE_MACHINE_THUMB
89# define IMAGE_FILE_MACHINE_THUMB 0x01c2
92#ifndef IMAGE_FILE_MACHINE_ARMNT
93# define IMAGE_FILE_MACHINE_ARMNT 0x01c4
96#ifndef IMAGE_FILE_MACHINE_ARM64
97# define IMAGE_FILE_MACHINE_ARM64 0xaa64
137 PIMAGE_FILE_HEADER pImageFileHeader)
139 return (PIMAGE_SECTION_HEADER)((DWORD_PTR)pImageFileHeader +
140 IMAGE_SIZEOF_FILE_HEADER +
141 pImageFileHeader->SizeOfOptionalHeader);
147 return (PIMAGE_SECTION_HEADER)((DWORD_PTR)pImageFileHeader +
152std::wstring
ToWide(
const std::string &str)
155 const int wlength = MultiByteToWideChar(
156 CP_UTF8, 0, str.data(),
int(str.size()),
NULL, 0);
158 wchar_t *wdata =
new wchar_t[wlength];
159 int r = MultiByteToWideChar(CP_UTF8, 0, str.data(),
160 int(str.size()), wdata, wlength);
162 wstr = std::wstring(wdata, wlength);
181 std::string::iterator bp =
s.begin();
184 while (isspace(*bp)) {
187 if (*bp ==
'\n' || *bp ==
'\0') {
195 argv[argc++] = &(*bp);
197 while (*bp !=
'\0') {
232 while ((hint = (
const char *)memchr(
start, find[0],
size - len + 1))) {
234 if (!strncmp(hint, find, len))
245 class ObjectHeaderType,
247 class SymbolTableType >
260 std::set<std::string> &dataSymbols,
bool isI386)
304 if (pSymbolTable->SectionNumber > 0 &&
305 (pSymbolTable->Type == 0x20 || pSymbolTable->Type == 0x0)) {
306 if (pSymbolTable->StorageClass == IMAGE_SYM_CLASS_EXTERNAL) {
310 if (pSymbolTable->N.Name.Short != 0) {
312 symbol.insert(0, (
const char *)pSymbolTable->N.ShortName, 8);
314 symbol = stringTable + pSymbolTable->N.Name.Long;
318 while (isspace(symbol[0]))
322 if (symbol[0] ==
'_') {
323 std::string::size_type posAt = symbol.find(
'@');
324 if (posAt != std::string::npos) {
329 if (this->
IsI386 && symbol[0] ==
'_') {
337 const char *scalarPrefix =
"??_G";
338 const char *vectorPrefix =
"??_E";
342 if (symbol.compare(0, 4, scalarPrefix) &&
343 symbol.compare(0, 4, vectorPrefix)) {
347 if (symbol.find(
'.') == std::string::npos) {
348 if (!pSymbolTable->Type && (SectChar & IMAGE_SCN_MEM_WRITE)) {
352 if (pSymbolTable->Type || !(SectChar & IMAGE_SCN_MEM_READ) ||
353 (SectChar & IMAGE_SCN_MEM_EXECUTE)) {
365 i += pSymbolTable->NumberOfAuxSymbols;
366 pSymbolTable += pSymbolTable->NumberOfAuxSymbols;
382 std::set<std::string> &dataSymbols)
389 FILE_SHARE_READ,
NULL, OPEN_EXISTING,
390 FILE_ATTRIBUTE_NORMAL, 0);
393 fprintf(stderr,
"Couldn't open file '%s' with CreateFile()\n",
filename);
397 hFileMapping = CreateFileMapping(hFile,
NULL, PAGE_READONLY, 0, 0,
NULL);
398 if (hFileMapping == 0) {
400 fprintf(stderr,
"Couldn't open file mapping with CreateFileMapping()\n");
404 lpFileBase = MapViewOfFile(hFileMapping, FILE_MAP_READ, 0, 0, 0);
405 if (lpFileBase == 0) {
406 CloseHandle(hFileMapping);
408 fprintf(stderr,
"Couldn't map view of file with MapViewOfFile()\n");
412 const PIMAGE_DOS_HEADER dosHeader = (PIMAGE_DOS_HEADER)lpFileBase;
413 if (dosHeader->e_magic == IMAGE_DOS_SIGNATURE) {
414 fprintf(stderr,
"File is an executable. I don't dump those.\n");
417 const PIMAGE_FILE_HEADER imageHeader = (PIMAGE_FILE_HEADER)lpFileBase;
419 if (((imageHeader->Machine == IMAGE_FILE_MACHINE_I386) ||
420 (imageHeader->Machine == IMAGE_FILE_MACHINE_AMD64) ||
424 (imageHeader->Characteristics == 0)) {
432 (PIMAGE_FILE_HEADER)lpFileBase, symbols, dataSymbols,
433 (imageHeader->Machine == IMAGE_FILE_MACHINE_I386));
439 if (
h->Sig1 == 0x0 &&
h->Sig2 == 0xffff) {
442 dataSymbols, (
h->Machine == IMAGE_FILE_MACHINE_I386));
450 UnmapViewOfFile(lpFileBase);
451 CloseHandle(hFileMapping);
463 fprintf(
file,
"EXPORTS \n");
465 fprintf(
file,
"\t%s \t DATA\n", ds.c_str());
467 for (std::string
const &
s : this->
Symbols) {
468 fprintf(
file,
"\t%s\n",
s.c_str());
482 char *outfile =
NULL;
486 fprintf(stderr,
"Usage: %s ?-o outfile? ?-f(ull)? <dllname> <object filenames> ..\n", argv[0]);
491 while (argv[arg][0] ==
'-') {
492 if (strcmp(argv[arg],
"--") == 0) {
495 }
else if (strcmp(argv[arg],
"-f") == 0) {
497 }
else if (strcmp(argv[arg],
"-x") == 0) {
499 }
else if (strcmp(argv[arg],
"-o") == 0) {
513 fout = fopen(outfile,
"w+");
515 fprintf(stderr,
"Unable to open \'%s\' for writing:\n",
530 fprintf(fout,
"LIBRARY %s\n", dllname);
532 fprintf(fout,
"CODE PRELOAD MOVEABLE DISCARDABLE\n");
533 fprintf(fout,
"DATA PRELOAD MOVEABLE MULTIPLE\n\n");
537 for (; arg < argc; arg++) {
538 WIN32_FIND_DATA FindFileData;
540 if (argv[arg][0] ==
'@') {
541 std::ifstream fargs(&argv[arg][1]);
543 fprintf(stderr,
"Unable to open \'%s\' for reading:\n",
549 for (i = 0; i < arg; i++) {
554 std::getline(fargs,
line);
556 fprintf(stderr,
"%s\n",
line.c_str());
565 SearchFile = FindFirstFile(argv[arg], &FindFileData);
567 fprintf(stderr,
"Unable to find \'%s\' for reading:\n",
580 if (i >= 0) strncpy(path,
filename, i + 1);
582 if (!deffile.
AddObjectFile(strcat(path, FindFileData.cFileName))) {
585 }
while (FindNextFile(SearchFile, &FindFileData));
587 FindClose(SearchFile);
size_t size(const MatrixT &matrix)
retrieve the size of a square matrix
#define INVALID_HANDLE_VALUE
bool DumpFile(const char *filename, std::set< std::string > &symbols, std::set< std::string > &dataSymbols)
#define IMAGE_FILE_MACHINE_ARMNT
const char * StrNStr(const char *start, const char *find, size_t &size)
#define IMAGE_FILE_MACHINE_ARM
struct _cmIMAGE_SYMBOL_EX cmIMAGE_SYMBOL_EX
#define IMAGE_FILE_MACHINE_ARM64
PIMAGE_SECTION_HEADER GetSectionHeaderOffset(PIMAGE_FILE_HEADER pImageFileHeader)
int GetArgcArgv(std::string &s, char **argv)
std::wstring ToWide(const std::string &str)
cmIMAGE_SYMBOL_EX UNALIGNED * cmPIMAGE_SYMBOL_EX
SymbolTableType * SymbolTable
DumpSymbols(ObjectHeaderType *ih, std::set< std::string > &symbols, std::set< std::string > &dataSymbols, bool isI386)
ObjectHeaderType * ObjectImageHeader
std::set< std::string > & Symbols
void DumpExternalsObjects()
std::set< std::string > & DataSymbols
PIMAGE_SECTION_HEADER SectionHeaders
std::set< std::string > Symbols
std::set< std::string > DataSymbols
bool AddObjectFile(const char *filename)
void WriteFile(FILE *file)
printf("Client 0: bytes recv = %d, bytes sent = %d\n", s0->GetBytesRecv(), s0->GetBytesSent())
struct _cmIMAGE_SYMBOL_EX::@057136276216350343327256316142167222203321244034::@247246144036221236273071310077012231114347052377 Name