/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 <string.h> |
#include <stdio.h> |
#include <io.h> |
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; |
} |
/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 <source file> <destination file>". |
For example, "pe2kos xonix.exe xonix". |
/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". |