193 lines
3.8 KiB
C
193 lines
3.8 KiB
C
|
#include <windows.h>
|
||
|
#include <stdio.h>
|
||
|
#include <string.h>
|
||
|
|
||
|
typedef struct _BUFFER {
|
||
|
PVOID Data;
|
||
|
ULONG Size;
|
||
|
} BUFFER, *PBUFFER;
|
||
|
|
||
|
PBUFFER
|
||
|
FileRead(
|
||
|
PCHAR Path
|
||
|
)
|
||
|
|
||
|
{
|
||
|
PBUFFER Buffer;
|
||
|
ULONG BytesTransferred;
|
||
|
HANDLE File;
|
||
|
LARGE_INTEGER Size;
|
||
|
|
||
|
File = CreateFile(Path,
|
||
|
GENERIC_READ,
|
||
|
FILE_SHARE_READ,
|
||
|
NULL,
|
||
|
OPEN_EXISTING,
|
||
|
0,
|
||
|
NULL);
|
||
|
|
||
|
if (File == INVALID_HANDLE_VALUE) {
|
||
|
|
||
|
printf("blgen: Error opening %s. [Error=%u]\n",
|
||
|
Path,
|
||
|
GetLastError());
|
||
|
|
||
|
ExitProcess(GetLastError());
|
||
|
}
|
||
|
|
||
|
if (GetFileSizeEx(File, &Size) == FALSE) {
|
||
|
|
||
|
printf("blgen: Error querying size of %s. [Error=%u]\n",
|
||
|
Path,
|
||
|
GetLastError());
|
||
|
|
||
|
ExitProcess(GetLastError());
|
||
|
}
|
||
|
|
||
|
if (Size.HighPart != 0) {
|
||
|
|
||
|
printf("blgen: File is too big!\n");
|
||
|
ExitProcess(ERROR_NOT_ENOUGH_MEMORY);
|
||
|
}
|
||
|
|
||
|
Buffer = (PBUFFER) malloc(sizeof(Buffer));
|
||
|
|
||
|
if (Buffer == NULL) {
|
||
|
|
||
|
printf("blgen: Insufficient memory.\n");
|
||
|
ExitProcess(ERROR_NOT_ENOUGH_MEMORY);
|
||
|
}
|
||
|
|
||
|
Buffer->Data = malloc(Size.LowPart);
|
||
|
|
||
|
if (Buffer->Data == NULL) {
|
||
|
|
||
|
printf("blgen: Insufficient memory.\n");
|
||
|
ExitProcess(ERROR_NOT_ENOUGH_MEMORY);
|
||
|
}
|
||
|
|
||
|
Buffer->Size = Size.LowPart;
|
||
|
|
||
|
if ((ReadFile(File,
|
||
|
Buffer->Data,
|
||
|
Buffer->Size,
|
||
|
&BytesTransferred,
|
||
|
NULL) == FALSE)
|
||
|
|
||
|
||
|
||
|
|
||
|
(BytesTransferred != Buffer->Size)
|
||
|
|
||
|
) {
|
||
|
|
||
|
printf("blgen: Error reading %s. [Error=%u]\n",
|
||
|
Path,
|
||
|
GetLastError());
|
||
|
|
||
|
ExitProcess(GetLastError());
|
||
|
}
|
||
|
|
||
|
CloseHandle(File);
|
||
|
|
||
|
return Buffer;
|
||
|
}
|
||
|
|
||
|
VOID
|
||
|
FileAppend(
|
||
|
PCHAR Path,
|
||
|
PVOID Buffer,
|
||
|
ULONG Length
|
||
|
)
|
||
|
|
||
|
{
|
||
|
ULONG BytesTransferred;
|
||
|
LARGE_INTEGER Distance;
|
||
|
HANDLE File;
|
||
|
|
||
|
File = CreateFile(Path,
|
||
|
GENERIC_READ | GENERIC_WRITE,
|
||
|
0,
|
||
|
NULL,
|
||
|
OPEN_ALWAYS,
|
||
|
FILE_ATTRIBUTE_NORMAL,
|
||
|
NULL);
|
||
|
|
||
|
if (File == INVALID_HANDLE_VALUE) {
|
||
|
|
||
|
printf("blgen: Error opening %s. [Error=%u]\n",
|
||
|
Path,
|
||
|
GetLastError());
|
||
|
|
||
|
ExitProcess(GetLastError());
|
||
|
}
|
||
|
|
||
|
Distance.QuadPart = 0;
|
||
|
|
||
|
if (SetFilePointerEx(File,
|
||
|
Distance,
|
||
|
NULL,
|
||
|
FILE_END) == FALSE) {
|
||
|
|
||
|
printf("blgen: Error setting file pointer. [Error=%u]\n",
|
||
|
GetLastError());
|
||
|
|
||
|
ExitProcess(GetLastError());
|
||
|
}
|
||
|
|
||
|
if ((WriteFile(File,
|
||
|
Buffer,
|
||
|
Length,
|
||
|
&BytesTransferred,
|
||
|
NULL) == FALSE)
|
||
|
|
||
|
||
|
||
|
|
||
|
(BytesTransferred != Length)) {
|
||
|
|
||
|
printf("blgen: Error reading %s. [Error=%u]\n",
|
||
|
Path,
|
||
|
GetLastError());
|
||
|
|
||
|
ExitProcess(GetLastError());
|
||
|
}
|
||
|
|
||
|
CloseHandle(File);
|
||
|
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
int
|
||
|
__cdecl
|
||
|
main(
|
||
|
int argc,
|
||
|
char **argv
|
||
|
)
|
||
|
|
||
|
{
|
||
|
PBUFFER COM;
|
||
|
PBUFFER EXE;
|
||
|
|
||
|
if (argc != 4) {
|
||
|
|
||
|
printf("\n"
|
||
|
"Boot Loader Generator (BLGEN)\n"
|
||
|
"\n"
|
||
|
" Syntax:\n"
|
||
|
"\n"
|
||
|
" blgen COM EXE Target\n"
|
||
|
"\n");
|
||
|
|
||
|
return 1;
|
||
|
}
|
||
|
|
||
|
COM = FileRead(argv[1]);
|
||
|
EXE = FileRead(argv[2]);
|
||
|
|
||
|
DeleteFile(argv[3]);
|
||
|
|
||
|
FileAppend(argv[3], COM->Data, COM->Size);
|
||
|
FileAppend(argv[3], EXE->Data, EXE->Size);
|
||
|
|
||
|
return 0;
|
||
|
}
|