diff --git a/contrib/sdk/sources/pe2kos/pe2kos.cpp b/contrib/sdk/sources/pe2kos/pe2kos.cpp new file mode 100644 index 0000000000..01b829a5d4 --- /dev/null +++ b/contrib/sdk/sources/pe2kos/pe2kos.cpp @@ -0,0 +1,139 @@ +// pe2kos.cpp : Defines the entry point for the console application. +// + +//#define TARGET_USES_PATH + +#include +#include +#include + +typedef unsigned __int32 DWORD; +typedef unsigned __int16 WORD; +typedef unsigned __int8 BYTE; + +#pragma pack(1) + +struct kos_Header +{ + char kosSign[8]; + DWORD res1; + DWORD start; + DWORD end; + DWORD memory; + DWORD stack; + DWORD res2; + DWORD res3; + // + kos_Header() + { + memcpy( kosSign, "MENUET01", 8 ); + res1 = 1; + res2 = 0; + res3 = 0; + } +}; + + +void load_section( BYTE *pePtr, BYTE *secDescPtr, FILE *fp ) +{ + DWORD *dwPtr = (DWORD *)secDescPtr; + DWORD virtualSize; + + // + virtualSize = ( dwPtr[2] >= dwPtr[4] ) ? dwPtr[2] : dwPtr[4]; + // + fseek( fp, dwPtr[3], SEEK_SET ); + fwrite( pePtr + dwPtr[5], virtualSize, 1, fp ); +} + + +int main(int argc, char* argv[]) +{ + FILE *pe, *kos; + kos_Header hdr; + BYTE *peBuff; + BYTE *scanPtr; + long peSize; + DWORD baseNdx; + WORD sCount, sLim; + + // + if ( argc != 3 ) return 0; + + // + pe = fopen( argv[1], "rb" ); + if ( pe == NULL ) return 0; + // + kos = fopen( argv[2], "w+b" ); + if ( kos == NULL ) + { + fclose( pe ); + return 0; + } + // + fseek( pe, 0, SEEK_END ); + peSize = ftell( pe ); + fseek( pe, 0, SEEK_SET ); + // + peBuff = new BYTE[peSize]; + fread( peBuff, peSize, 1, pe ); + fclose( pe ); + // + // + scanPtr = peBuff + ((DWORD *)(peBuff + 0x3C))[0]; + // + baseNdx = 0xF8; + // + sLim = ((WORD *)(scanPtr + 6))[0]; + // + for ( sCount = 0; sCount < sLim; sCount++ ) + { + // + switch ( scanPtr[baseNdx + 0x24] ) + { + // + case 0x20: + case 0x40: + load_section( peBuff, scanPtr + baseNdx, kos ); + break; + // + default: + break; + } + // + baseNdx += 0x28; + + } + // + fseek( kos, 0, SEEK_END ); + fflush(kos); + peSize = ftell( kos ); + for (;;) + { + fseek(kos, -1, SEEK_CUR); + if (fgetc(kos)) + break; + fseek(kos, -1, SEEK_CUR); + } + _chsize(_fileno(kos), ftell(kos)); + // + hdr.start = ((DWORD *)(scanPtr + 0x28))[0]; + hdr.end = ftell(kos); + hdr.stack = peSize + 4096; +#ifdef TARGET_USES_PATH + hdr.res3 = hdr.stack; + hdr.memory = hdr.res3 + 2048; +#else + hdr.memory = hdr.stack; +#endif + // + fseek( kos, 0, SEEK_SET ); + fwrite( &hdr, sizeof(hdr), 1, kos ); + + // + delete [] peBuff; + // + fclose( kos ); + + return 0; +} diff --git a/contrib/sdk/sources/pe2kos/readme_eng.txt b/contrib/sdk/sources/pe2kos/readme_eng.txt new file mode 100644 index 0000000000..bcc616f9d7 --- /dev/null +++ b/contrib/sdk/sources/pe2kos/readme_eng.txt @@ -0,0 +1,15 @@ +The tool pe2kos is written by Rabid Rabbit and slightly rectified by me, +diamond. It is used in projects xonix and fara (the author is Rabid Rabbit), +written in Visual C++, at last step after a compilation, when it is needed +to get from a program in the Windows-exe format a true Kolibri-program. +The tool only converts the format of executable, so to get working program +one must satisfy to certain conditions. Of course, a program must +communicate with the outer world by Kolibri facilities (i.e. int 0x40) +and must not use any Windows-libraries. In addition program is required +to be placed on zero address (linker option "/base:0"). How to write +such programs - look to already mentioned projects xonix and fara. +There is two versions of the tool: for programs which use path to executable +file (last dword in MENUET01-header), and others. +Select wanted version. +Usage: (in command line) "pe2kos ". +For example, "pe2kos xonix.exe xonix". \ No newline at end of file diff --git a/contrib/sdk/sources/pe2kos/readme_rus.txt b/contrib/sdk/sources/pe2kos/readme_rus.txt new file mode 100644 index 0000000000..bd36afa652 --- /dev/null +++ b/contrib/sdk/sources/pe2kos/readme_rus.txt @@ -0,0 +1,16 @@ +Утилита pe2kos написана by Rabid Rabbit и немного подправлена мной, +diamond'ом. Она используется в проектах xonix и fara (автор - Rabid Rabbit), +написанных на Visual C++, на завершающем шаге после компиляции, когда +требуется по программе в формате Windows-exe получить настоящую +Kolibri-программу. Утилита всего лишь изменяет формат exe-шника, так что, +чтобы действительно получилась работающая программа, нужно выполнение +определённых условий. Понятно, что требуется, чтобы программа общалась +с внешним миром средствами Колибри (т.е. int 0x40) и не использовала +никаких Windows-библиотек. Помимо этого, требуется также, чтобы программа +размещалась по нулевому адресу (ключ линкера "/base:0"). Как писать такие +программы - смотрите в уже упомянутых проектах xonix и fara. +Есть две версии программы, для программ, использующих путь к исполняемому +файлу (последнее слово в MENUET01-заголовке), и остальных. +Выберите нужную версию. +Использование: (в командной строке) "pe2kos <файл-источник> <файл-приёмник>". +Например, "pe2kos xonix.exe xonix". \ No newline at end of file diff --git a/programs/games/fara/trunk/Release/pe2kos.exe b/programs/games/fara/trunk/Release/pe2kos.exe deleted file mode 100644 index 139e746398..0000000000 Binary files a/programs/games/fara/trunk/Release/pe2kos.exe and /dev/null differ diff --git a/programs/games/rforces/trunk/pe2kos.exe b/programs/games/rforces/trunk/pe2kos.exe deleted file mode 100644 index bef0e7ce2d..0000000000 Binary files a/programs/games/rforces/trunk/pe2kos.exe and /dev/null differ diff --git a/programs/games/xonix/trunk/Release/pe2kos.exe b/programs/games/xonix/trunk/Release/pe2kos.exe deleted file mode 100644 index bef0e7ce2d..0000000000 Binary files a/programs/games/xonix/trunk/Release/pe2kos.exe and /dev/null differ