Also, ich wollte mal so was wie einen Binder schreiben. Im Moment bin ich so weit, dass der Builder zwei Dateien als Resource in einer exe-datei mit resource-sektion speichert. Doch will mein Builder einfach keinen Speicherplatz reservieren, und wirft eine Exception, sogar bei sehr kleinen Dateien:
Stub.exe, bisher nur zu Testzwecken. Hat eine Resource-Sektion.
Kompiliert mit Dev-C++, also MinGW.
Code:
#include <cstdlib>
#include <iostream>
#include <windows.h>
using namespace std;
void error_exit(char *msg);
int main(int argc, char *argv[])
{
char exe1[255], exe2[255], stub[255], c;
FILE *FirstFile, *SecondFile;
HANDLE hHandle;
void *ptr1, *ptr2;
int size1, size2, i;
/*char *buffer1, *buffer2;*/
cout << "Please enter path to stub: ";
cin >> stub;
cout << "Please enter path to first file to bind: ";
cin >> exe1;
cout << "Please enter path to second file to bind: ";
cin >> exe2;
FirstFile = fopen(exe1, "rb"); //info about first file
if(FirstFile == NULL)
error_exit("FirstFile == NULL");
fseek(FirstFile, 0, SEEK_END);
size1 = ftell(FirstFile);
fseek(FirstFile, 0, SEEK_SET);
SecondFile = fopen(exe2, "rb");
if(SecondFile == NULL)
error_exit("SecondFile == NULL"); //info about second file
fseek(SecondFile, 0, SEEK_END);
size1 = ftell(SecondFile);
fseek(SecondFile, 0, SEEK_SET);
/*buffer1 = (char *)malloc(size1); //buffer for first file
if(buffer1 == NULL)
error_exit("Not enough memory available");*/
/*buffer2 = (char *)malloc(size2); //buffer for second file
if(buffer2 == NULL)
error_exit("Not enough memory available");*/
char *buffer1 = new char[size1];
char *buffer2 = new char[size2];
for(i = 0; i < size1; i++)
{
buffer1[i] = fgetc(FirstFile);
}
fclose(FirstFile);
for(i = 0; i < size1; i++)
{
buffer2[i] = fgetc(SecondFile);
}
fclose(SecondFile);
ptr1 = (void *)&buffer1; //conversion to void ptr
ptr2 = (void *)&buffer2; //conversion to void ptr
hHandle = BeginUpdateResource(stub, 1);
if(hHandle == NULL)
error_exit("Couldn 't open the specified file...");
if(!UpdateResource(hHandle, MAKEINTRESOURCE(0x1337), MAKEINTRESOURCE(0x1337), 0, ptr1, size1))
error_exit("Updating resources failed");
if(!UpdateResource(hHandle, MAKEINTRESOURCE(0x1336), MAKEINTRESOURCE(0x1336), 0, ptr2, size2))
error_exit("Updating resources failed");
if(!EndUpdateResource(hHandle, 0))
error_exit("EndUpdateResource failed");
delete[] buffer1;
delete[] buffer2;
return EXIT_SUCCESS;
}
void error_exit(char *msg)
{
cerr << msg << endl;
getchar();
exit(1);
}
Stub.exe, bisher nur zu Testzwecken. Hat eine Resource-Sektion.
Kompiliert mit Dev-C++, also MinGW.