Files
BlitzNext/Linker/lib/dlltoexe.cpp
T
2019-01-19 18:29:24 +01:00

82 lines
1.6 KiB
C++

#include "dlltoexe.hpp"
#include <fstream>
#include <Windows.h>
#pragma pack(push, 1)
struct Head {
short machine, num_sects;
int timedata, sym_table, num_syms;
short opt_size, chars;
};
struct Opt1 {
short magic;
char major, minor;
int code_size, data_size, udata_size;
int entry, code_base, data_base;
};
struct Sect {
char name[8];
int virt_size, virt_addr; //in mem
int data_size, data_addr; //on disk
int relocs, lines; //file ptrs
short num_relocs, num_lines;
int chars;
};
#pragma pack(pop)
bool dllToExe(const char* exe_file, const char* dll_file, const char* entry_func)
{
//find proc address of bbWinMain
HMODULE hmod = LoadLibrary(dll_file);
if (!hmod)
return false;
int proc = (int)GetProcAddress(hmod, entry_func);
int entry = proc - (int)hmod;
FreeLibrary(hmod);
if (!proc)
return false;
//Convert dll to exe
std::fstream in(dll_file, std::ios_base::binary | std::ios_base::in);
if (!in.is_open())
return false;
std::fstream out(exe_file, std::ios::binary | std::ios_base::out | std::ios_base::trunc);
if (!out.is_open())
return false;
int offs;
in.seekg(0x3c);
in.read((char*)&offs, 4);
//copy first bit...
in.seekg(0);
for (int k = 0; k < offs + 4; ++k)
out.put(in.get());
//reader file header
Head head = {0};
in.read((char*)&head, sizeof(head));
//change DLL to EXE
head.chars = 0x10e;
out.write((char*)&head, sizeof(head));
//read opts 1
Opt1 opt1 = {0};
in.read((char*)&opt1, sizeof(opt1));
opt1.entry = entry;
out.write((char*)&opt1, sizeof(opt1));
//copy rest of file...
while (!in.eof()) {
out.put(in.get());
}
out.close();
in.close();
return true;
}