project64/Source/Project64/main.cpp

267 lines
8.2 KiB
C++

#include "Multilanguage.h"
#include "User Interface.h"
#include "N64 System.h"
#include "Plugin.h"
#include "Support.h"
#include <windows.h>
#include "Validate Binary.h"
//#pragma comment(linker,"/merge:.rdata=.text")
void FixUPXIssue ( BYTE * ProgramLocation )
{
typedef struct
{
DWORD VirtualAddress;
DWORD SizeOfRawData;
DWORD Characteristics;
} ORIGINAL_SECTION;
char FileName[MAX_PATH];
GetModuleFileName((HMODULE)ProgramLocation,FileName,sizeof(FileName));
HANDLE hFile = CreateFile(FileName,GENERIC_READ,FILE_SHARE_WRITE|FILE_SHARE_READ,NULL,OPEN_ALWAYS,0,NULL);
DWORD TestID, NoOfSections, dwRead;
SetFilePointer(hFile,-4,0,FILE_END);
ReadFile(hFile,&TestID,4,&dwRead,NULL);
if (TestID != 0x3345505a)
{
/* //Read Dos Header from file
IMAGE_DOS_HEADER * DosHeader = (IMAGE_DOS_HEADER *)ProgramLocation;
if (DosHeader->e_magic != IMAGE_DOS_SIGNATURE )
{
return;
}
//Read NT (PE) Header
IMAGE_NT_HEADERS * NTHeader = (IMAGE_NT_HEADERS *)(ProgramLocation + DosHeader->e_lfanew);
if (NTHeader->Signature != IMAGE_NT_SIGNATURE )
{
return;
}
IMAGE_SECTION_HEADER * Sections = (IMAGE_SECTION_HEADER *)(ProgramLocation + DosHeader->e_lfanew +
sizeof(DWORD) + sizeof(IMAGE_FILE_HEADER) + NTHeader->FileHeader.SizeOfOptionalHeader);
for (int count = 0; count < NTHeader->FileHeader.NumberOfSections; count ++ )
{
IMAGE_SECTION_HEADER & Section = Sections[count];
LPVOID Address = ProgramLocation + Section.VirtualAddress;
MEMORY_BASIC_INFORMATION Buffer;
if (VirtualQuery(Address,&Buffer,sizeof(Buffer)))
{
DWORD OldProtect = Buffer.Protect;
//VirtualProtect(Address, Section.SizeOfRawData,PAGE_READONLY,&OldProtect);
}
}*/
CloseHandle(hFile);
return;
}
SetFilePointer(hFile,-8,0,FILE_END);
ReadFile(hFile,&NoOfSections,4,&dwRead,NULL);
ORIGINAL_SECTION * Section = new ORIGINAL_SECTION[NoOfSections];
DWORD SizeOfSections = (NoOfSections * sizeof(ORIGINAL_SECTION));
SetFilePointer(hFile,(8 + SizeOfSections) * -1,0,FILE_END);
ReadFile(hFile,Section,SizeOfSections,&dwRead,NULL);
for (int count = 0; count < NoOfSections; count ++ )
{
LPVOID Address = ProgramLocation + Section[count].VirtualAddress;
MEMORY_BASIC_INFORMATION Buffer;
if (VirtualQuery(Address,&Buffer,sizeof(Buffer)))
{
DWORD MemoryProctect = PAGE_EXECUTE_READWRITE;
switch (Section[count].Characteristics & 0xF0000000)
{
case 0x20000000: MemoryProctect = PAGE_EXECUTE; break;
case 0x40000000: MemoryProctect = PAGE_READONLY; break;
case 0x60000000: MemoryProctect = PAGE_EXECUTE_READ; break;
case 0x80000000: MemoryProctect = PAGE_READWRITE; break;
case 0xA0000000: MemoryProctect = PAGE_EXECUTE_READWRITE; break;
case 0xC0000000: MemoryProctect = PAGE_READWRITE; break;
case 0xE0000000: MemoryProctect = PAGE_EXECUTE_READWRITE; break;
}
if (Buffer.Protect != MemoryProctect)
{
DWORD OldProtect;
VirtualProtect(Address, Section[count].SizeOfRawData,MemoryProctect,&OldProtect);
}
}
}
delete [] Section;
CloseHandle(hFile);
/*
//Read Dos Header from file
IMAGE_DOS_HEADER * DosHeader = (IMAGE_DOS_HEADER *)ProgramLocation;
if (DosHeader->e_magic != IMAGE_DOS_SIGNATURE )
{
return;
}
//Read NT (PE) Header
IMAGE_NT_HEADERS * NTHeader = (IMAGE_NT_HEADERS *)(ProgramLocation + DosHeader->e_lfanew);
if (NTHeader->Signature != IMAGE_NT_SIGNATURE )
{
return;
}
DWORD a = sizeof(DWORD);
DWORD b = sizeof(IMAGE_FILE_HEADER);
IMAGE_SECTION_HEADER * Sections = (IMAGE_SECTION_HEADER *)(ProgramLocation + DosHeader->e_lfanew +
sizeof(DWORD) + sizeof(IMAGE_FILE_HEADER) + NTHeader->FileHeader.SizeOfOptionalHeader);
for (int count = 0; count < NTHeader->FileHeader.NumberOfSections; count ++ )
{
IMAGE_SECTION_HEADER & Section = Sections[count];
if (_stricmp((char *)Section.Name,".rdata") == 0)
{
LPVOID Address = ProgramLocation + Section.VirtualAddress;
MEMORY_BASIC_INFORMATION Buffer;
if (VirtualQuery(Address,&Buffer,sizeof(Buffer)))
{
if (Buffer.Protect != 2)
{
DWORD OldProtect;
VirtualProtect(Address, Section.SizeOfRawData,PAGE_READONLY,&OldProtect);
}
}
//break;
}
}*/
}
void LogLevelChanged (CTraceFileLog * LogFile)
{
LogFile->SetTraceLevel((TraceLevel)_Settings->LoadDword(Debugger_AppLogLevel));
}
void LogFlushChanged (CTraceFileLog * LogFile)
{
LogFile->SetFlushFile(_Settings->LoadDword(Debugger_AppLogFlush) != 0);
}
void InitializeLog ( void)
{
CPath LogFilePath(CPath::MODULE_DIRECTORY,_T("Project64.log"));
CTraceFileLog * LogFile = new CTraceFileLog(LogFilePath, _Settings->LoadDword(Debugger_AppLogFlush) != 0, Log_New);
#ifdef VALIDATE_DEBUG
LogFile->SetTraceLevel((TraceLevel)(_Settings->LoadDword(Debugger_AppLogLevel) | TraceValidate));
#else
LogFile->SetTraceLevel((TraceLevel)_Settings->LoadDword(Debugger_AppLogLevel));
#endif
AddTraceModule(LogFile);
_Settings->RegisterChangeCB(Debugger_AppLogLevel,LogFile,(CSettings::SettingChangedFunc)LogLevelChanged);
_Settings->RegisterChangeCB(Debugger_AppLogFlush,LogFile,(CSettings::SettingChangedFunc)LogFlushChanged);
}
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpszArgs, int nWinMode) {
CoInitialize(NULL);
try
{
LPCSTR AppName = "Project64 1.7";
_Lang = new CLanguage();
_Settings = new CSettings;
_Settings->Initilize(AppName);
InitializeLog();
WriteTrace(TraceDebug,"WinMain - Application Starting");
FixUPXIssue((BYTE *)hInstance);
//Create the plugin container
WriteTrace(TraceDebug,"WinMain - Create Plugins");
CPlugins Plugins ( _Settings->LoadString(Directory_Plugin) );
WriteTrace(TraceDebug,"WinMain - Create N64 system");
CN64System N64System ( &Notify(), &Plugins ); //Create the backend n64 system
//Select the language
_Lang->LoadCurrentStrings(true);
//Create the main window with Menu
WriteTrace(TraceDebug,"WinMain - Create Main Window");
stdstr WinTitle(AppName);
if (_Settings->LoadBool(Beta_IsBetaVersion))
{
WinTitle.Format("Project64 %s (%s)",VersionInfo(VERSION_PRODUCT_VERSION).c_str(),_Settings->LoadString(Beta_UserName).c_str());
}
CMainGui MainWindow(WinTitle.c_str(),&Notify(),&N64System), HiddenWindow;
CMainMenu MainMenu(&MainWindow, &N64System);
Plugins.SetRenderWindows(&MainWindow,&HiddenWindow);
Notify().SetMainWindow(&MainWindow);
{
stdstr_f User("%s",_Settings->LoadString(Beta_UserName).c_str());
stdstr_f Email("%s",_Settings->LoadString(Beta_EmailAddress).c_str());
if (MD5(User).hex_digest() != _Settings->LoadString(Beta_UserNameMD5) ||
MD5(Email).hex_digest() != _Settings->LoadString(Beta_EmailAddressMD5))
{
return false;
}
}
if (__argc > 1) {
WriteTraceF(TraceDebug,"WinMain - Cmd line found \"%s\"",__argv[1]);
MainWindow.Show(true); //Show the main window
N64System.RunFileImage(__argv[1]);
} else {
if (_Settings->LoadDword(RomBrowser_Enabled))
{
WriteTrace(TraceDebug,"WinMain - Show Rom Browser");
//Display the rom browser
MainWindow.SetPluginList(&Plugins);
MainWindow.ShowRomList();
MainWindow.Show(true); //Show the main window
MainWindow.HighLightLastRom();
} else {
WriteTrace(TraceDebug,"WinMain - Show Main Window");
MainWindow.Show(true); //Show the main window
}
}
//Process Messages till program is closed
WriteTrace(TraceDebug,"WinMain - Entering Message Loop");
MainWindow.ProcessAllMessages();
WriteTrace(TraceDebug,"WinMain - Message Loop Finished");
N64System.CloseCpu(); //terminate the cpu thread before quiting
WriteTrace(TraceDebug,"WinMain - System Closed");
}
catch(...)
{
WriteTraceF(TraceError,"WinMain - Exception caught (File: \"%s\" Line: %d)",__FILE__,__LINE__);
MessageBox(NULL,stdstr_f("Exception caught\nFile: %s\nLine: %d",__FILE__,__LINE__).c_str(),"Exception",MB_OK);
}
WriteTrace(TraceDebug,"WinMain - cleaning up global objects");
if (_Settings)
{
delete _Settings;
_Settings = NULL;
}
if (_Lang)
{
delete _Lang;
_Lang = NULL;
}
CoUninitialize();
WriteTrace(TraceDebug,"WinMain - Done");
CloseTrace();
return true;
}