forked from KolibriOS/kolibrios
Add pe2kos source (0770 sdk), remove pe2kos.exe.
git-svn-id: svn://kolibrios.org@7115 a494cfbc-eb01-0410-851d-a64ba20cac60
This commit is contained in:
parent
afdc8496fb
commit
d968eec3b9
139
contrib/sdk/sources/pe2kos/pe2kos.cpp
Normal file
139
contrib/sdk/sources/pe2kos/pe2kos.cpp
Normal file
@ -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;
|
||||||
|
}
|
15
contrib/sdk/sources/pe2kos/readme_eng.txt
Normal file
15
contrib/sdk/sources/pe2kos/readme_eng.txt
Normal file
@ -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".
|
16
contrib/sdk/sources/pe2kos/readme_rus.txt
Normal file
16
contrib/sdk/sources/pe2kos/readme_rus.txt
Normal file
@ -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".
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
Loading…
Reference in New Issue
Block a user