Made large address aware, added command line args.

This commit is contained in:
Long Nguyen 2011-08-22 23:09:59 -07:00
parent b2a489ca16
commit 4653d8677e
3 changed files with 29 additions and 10 deletions

View file

@ -9,8 +9,13 @@
int main(int argc, char *argv[])
{
Xbe XbeFile("C:\\Projects\\Xbox\\XGraphicsTest\\Release\\XGraphicsTest.xbe");
XbeFile.WriteExe("C:\\Projects\\Xbox\\DirtboxKernel\\Debug\\xbe.exe");
if (argc < 3)
{
printf("Usage: Dirtbox input output\n");
return 1;
}
Xbe XbeFile(argv[1]);
XbeFile.WriteExe(argv[2]);
return 0;
}

View file

@ -101,12 +101,17 @@ struct MICRO_EXE_HEADERS
#include "AlignPosfix1.h"
const uint16 IMAGE_FILE_MACHINE_I386 = 0x014c; // Intel 386.
const uint16 IMAGE_FILE_RELOCS_STRIPPED = 0x0001; // Relocation info stripped from file.
const uint16 IMAGE_FILE_EXECUTABLE_IMAGE = 0x0002; // File is executable (i.e. no unresolved externel references).
const uint16 IMAGE_FILE_LARGE_ADDRESS_AWARE = 0x0020; // App can handle >2gb addresses
const uint16 IMAGE_FILE_32BIT_MACHINE = 0x0100; // 32 bit word machine.
const uint16 IMAGE_SUBSYSTEM_UNKNOWN = 0;
const uint16 IMAGE_SUBSYSTEM_NATIVE = 1;
const uint16 IMAGE_SUBSYSTEM_WINDOWS_GUI = 2;
const uint16 IMAGE_SUBSYSTEM_WINDOWS_CUI = 3;
const uint16 IMAGE_FILE_MACHINE_I386 = 0x014c; // Intel 386.
const uint16 IMAGE_SUBSYSTEM_UNKNOWN = 0x0000;
const uint16 IMAGE_SUBSYSTEM_NATIVE = 0x0001;
const uint16 IMAGE_SUBSYSTEM_WINDOWS_GUI = 0x0002;
const uint16 IMAGE_SUBSYSTEM_WINDOWS_CUI = 0x0003;
const uint32 EXE_ALIGNMENT = 4;

15
Xbe.cpp
View file

@ -97,7 +97,9 @@ static void __declspec(naked) TrampolineCode()
{
mov edx, 0x000100EC
call dword ptr [edx]
ret 0x10
ret
nop
nop
}
}
@ -380,6 +382,11 @@ Xbe::~Xbe()
// ******************************************************************
int32 Xbe::PatchXbe()
{
printf("Xbe::PatchExe Patching initialization flags in Xbe...");
Header.InitFlags.MountUtilityDrive = 0;
Header.InitFlags.FormatUtilityDrive = 0;
printf("OK\n");
printf("Xbe::PatchExe Patching MapRegisters in Xbe...");
// ******************************************************************
@ -463,7 +470,9 @@ int32 Xbe::WriteExe(const char *Filename)
ExeHeaders.Header.PointerToSymbolTable = 0;
ExeHeaders.Header.NumberOfSymbols = 0;
ExeHeaders.Header.SizeOfOptionalHeader = sizeof(MICRO_EXE_HEADERS::OPTIONAL_HEADER);
ExeHeaders.Header.Characteristics = 0x0103;
ExeHeaders.Header.Characteristics =
IMAGE_FILE_RELOCS_STRIPPED | IMAGE_FILE_EXECUTABLE_IMAGE |
IMAGE_FILE_LARGE_ADDRESS_AWARE | IMAGE_FILE_32BIT_MACHINE;
ExeHeaders.OptionalHeader.Magic = 0x010B;
ExeHeaders.OptionalHeader.MajorLinkerVersion = 0x06;
@ -488,7 +497,7 @@ int32 Xbe::WriteExe(const char *Filename)
ExeHeaders.OptionalHeader.SizeOfImage = Header.SizeOfImage; // already aligned at 0x20
ExeHeaders.OptionalHeader.SizeOfHeaders = RoundUp(sizeof(MICRO_EXE_HEADERS), EXE_ALIGNMENT);
ExeHeaders.OptionalHeader.CheckSum = 0;
ExeHeaders.OptionalHeader.Subsystem = IMAGE_SUBSYSTEM_WINDOWS_GUI;
ExeHeaders.OptionalHeader.Subsystem = IMAGE_SUBSYSTEM_WINDOWS_CUI;
ExeHeaders.OptionalHeader.DllCharacteristics = 0x400;
ExeHeaders.OptionalHeader.SizeOfStackReserve = 0x100000;
ExeHeaders.OptionalHeader.SizeOfStackCommit = 0x1000;