📄 main.c
字号:
/*++
Copyright (c) 1998-2001 Klaus P. Gerlicher
Module Name:
main.c
Abstract:
loader/translator for pIce LINUX
Environment:
User mode only
Author:
Klaus P. Gerlicher
Reactos Port by Eugene Ingerman
Revision History:
04-Aug-1998: created
15-Nov-2000: general cleanup of source files
Copyright notice:
This file may be distributed under the terms of the GNU Public License.
--*/
///////////////////////////////////////////////////////////////////////////////////
// includes
#include "stdinc.h"
#include <wchar.h>
///////////////////////////////////////////////////////////////////////////////////
// constant defines
///////////////////////////////////////////////////////////////////////////////////
// global variables
char SrcFileNames[2048][2048];
ULONG ulCurrentSrcFile = 0;
HANDLE debugger_file;
ULONG ulGlobalVerbose = 0;
///////////////////////////////////////////////////////////////////////////////////
// process_stabs()
//
///////////////////////////////////////////////////////////////////////////////////
void process_stabs(
char* pExeName, // name of exe
HANDLE fileout, // symbol file handle
PIMAGE_SECTION_HEADER section, //Elf32_Shdr* pSHdr,
int sectionHeadersSize, //int nSHdrSize,
void* p, // ptr to memory where whole exe was read
PSTAB_ENTRY pStab, // ptr to stabs
int nStabLen, // size of stabs
char* pStr, // ptr to stabs strings
int nStrLen, // sizeof stabs strings
char* pGlobals, // ptr to global symbols
int nGlobalLen, // sizeof of globals
char* pGlobalsStr, // ptr to global strings
int nGlobalStrLen) // size of global strings
{
unsigned i,strLen;
int nOffset=0,nNextOffset=0;
PSTAB_ENTRY pStabCopy = pStab;
char* pName,szCurrentPath[2048];
PICE_SYMBOLFILE_HEADER SymbolFileHeader;
LPSTR pSlash,pDot;
char temp[2048];
char* pCopyExeName = temp;
WCHAR tempstr[64];
DWORD wrote;
//printf("LOADER: enter process_stabs()\n");
//get the name of the executable file
memset((void*)&SymbolFileHeader,0,sizeof(SymbolFileHeader));
SymbolFileHeader.magic = PICE_MAGIC;
strcpy(temp,pExeName);
pSlash = strrchr(temp,'\\');
pDot = strchr(temp,'.');
if(pDot)
{
*pDot = 0;
}
if(pSlash)
{
pCopyExeName = pSlash+1;
}
strLen = MultiByteToWideChar(CP_ACP, NULL, pCopyExeName, -1, tempstr, 64 );
if( !strLen )
printf("Cannot convert string to multibyte: %s\n", pCopyExeName );
wcscpy(SymbolFileHeader.name,tempstr);
for(i=0;i<(nStabLen/sizeof(STAB_ENTRY));i++)
{
pName = &pStr[pStabCopy->n_strx + nOffset];
#if 0
//printf("LOADER: \n%.8x %.2x %.2x %.4x %.8x %s\n",
pStabCopy->n_strx,
pStabCopy->n_type,
pStabCopy->n_other,
pStabCopy->n_desc,
pStabCopy->n_value,
pName
);
#endif
switch(pStabCopy->n_type)
{
case N_UNDF:
nOffset += nNextOffset;
nNextOffset = pStabCopy->n_value;
//printf("LOADER: changing string offset %x %x\n",nOffset,nNextOffset);
break;
case N_SO:
if((strLen = strlen(pName)))
{
if(pName[strLen-1]!='/')
{
if(strlen(szCurrentPath))
{
//printf("LOADER: ###########################################################################\n");
strcat(szCurrentPath,pName);
//printf("LOADER: changing source file %s\n",szCurrentPath);
strcpy(SrcFileNames[ulCurrentSrcFile++],szCurrentPath);
szCurrentPath[0]=0;
}
else
{
//printf("LOADER: ###########################################################################\n");
//printf("LOADER: changing source file %s\n",pName);
strcpy(SrcFileNames[ulCurrentSrcFile++],pName);
}
}
else
strcpy(szCurrentPath,pName);
}
else
{
//printf("LOADER: END source file\n");
//printf("LOADER: ###########################################################################\n");
}
break;
/* case N_SLINE:
//printf("LOADER: code source line number #%u for addr. %x\n",pStabCopy->n_desc,pStabCopy->n_value);
break;
case N_DSLINE:
//printf("LOADER: data source line number #%u for addr. %x\n",pStabCopy->n_desc,pStabCopy->n_value);
break;
case N_BSLINE:
//printf("LOADER: BSS source line number #%u for addr. %x\n",pStabCopy->n_desc,pStabCopy->n_value);
break;
case N_GSYM:
//printf("LOADER: global symbol %s @ addr. %x (%x)\n",pName,pStabCopy->n_value,pStabCopy->n_desc);
break;
case N_BINCL:
//printf("LOADER: include file %s\n",pName);
break;
case N_EINCL:
break;
case N_FUN:
if(strlen(pName))
//printf("LOADER: function %s @ addr. %x (%x)\n",pName,pStabCopy->n_value,pStabCopy->n_desc);
else
//printf("LOADER: text segment %x (%x)\n",pName,pStabCopy->n_value,pStabCopy->n_desc);
break;
case N_PSYM:
//printf("LOADER: parameter %s @ [EBP%+d] (%x)\n",pName,pStabCopy->n_value,pStabCopy->n_desc);
break;
case N_RSYM:
//printf("LOADER: register variable %s @ reg. %x (%x)\n",pName,pStabCopy->n_value,pStabCopy->n_desc);
break;
case N_LBRAC:
//printf("LOADER: lexical block %s @ reg. %x (%x)\n",pName,pStabCopy->n_value,pStabCopy->n_desc);
break;
case N_RBRAC:
//printf("LOADER: END of lexical block %s @ reg. %x (%x)\n",pName,pStabCopy->n_value,pStabCopy->n_desc);
break;
case N_STSYM:
//printf("LOADER: static variable %s @ %x (%x)\n",pName,pStabCopy->n_value,pStabCopy->n_desc);
break;
case N_LCSYM:
//printf("LOADER: BSS variable %s @ %x (%x)\n",pName,pStabCopy->n_value,pStabCopy->n_desc);
break;
case N_LSYM:
if(pStabCopy->n_value)
{
//printf("LOADER: stack variable %s @ [EBP%+d] (%x)\n",pName,pStabCopy->n_value,pStabCopy->n_desc);
}
else
{
//printf("LOADER: global variable %s \n",pName);
}
break;
*/
}
pStabCopy++;
}
//printf("LOADER: SymbolFileHeader.ulSizeOfHeader= %x (%x)\n",nSHdrSize,(LPSTR)pSHdr-(LPSTR)p);
//printf("LOADER: SymbolFileHeader.ulSizeOfGlobals = %x (%x)\n",nGlobalLen,(LPSTR)pGlobals-(LPSTR)p);
//printf("LOADER: SymbolFileHeader.ulSizeOfGlobalsStrings = %x (%x)\n",nGlobalStrLen,(LPSTR)pGlobalsStr-(LPSTR)p);
//printf("LOADER: SymbolFileHeader.ulSizeOfStabs = %x (%x)\n",nStabLen,(LPSTR)pStab-(LPSTR)p);
//printf("LOADER: SymbolFileHeader.ulSizeOfStabsStrings = %x (%x)\n",nStrLen,(LPSTR)pStr-(LPSTR)p);
SymbolFileHeader.ulOffsetToHeaders = sizeof(PICE_SYMBOLFILE_HEADER);
SymbolFileHeader.ulSizeOfHeader = sectionHeadersSize;
SymbolFileHeader.ulOffsetToGlobals = sizeof(PICE_SYMBOLFILE_HEADER)+sectionHeadersSize;
SymbolFileHeader.ulSizeOfGlobals = nGlobalLen;
SymbolFileHeader.ulOffsetToGlobalsStrings = sizeof(PICE_SYMBOLFILE_HEADER)+sectionHeadersSize+nGlobalLen;
SymbolFileHeader.ulSizeOfGlobalsStrings = nGlobalStrLen;
SymbolFileHeader.ulOffsetToStabs = sizeof(PICE_SYMBOLFILE_HEADER)+sectionHeadersSize+nGlobalLen+nGlobalStrLen;
SymbolFileHeader.ulSizeOfStabs = nStabLen;
SymbolFileHeader.ulOffsetToStabsStrings = sizeof(PICE_SYMBOLFILE_HEADER)+sectionHeadersSize+nGlobalLen+nGlobalStrLen+nStabLen;
SymbolFileHeader.ulSizeOfStabsStrings = nStrLen;
SymbolFileHeader.ulOffsetToSrcFiles = sizeof(PICE_SYMBOLFILE_HEADER)+sectionHeadersSize+nGlobalLen+nGlobalStrLen+nStabLen+nStrLen;
SymbolFileHeader.ulNumberOfSrcFiles = ulCurrentSrcFile;
printf("sectionHeaderSize: %ld, nGlobalLen: %ld, nGlobalStrLen: %ld, nStabLen: %ld, "
"nStrLen: %ld, ulCurrentSrcFile: %ld, ulOffsetToStabs: %ld\n",
sectionHeadersSize, nGlobalLen, nGlobalStrLen,
nStabLen, nStrLen, ulCurrentSrcFile, SymbolFileHeader.ulOffsetToStabs);
WriteFile(fileout,&SymbolFileHeader,sizeof(PICE_SYMBOLFILE_HEADER),&wrote, NULL);
WriteFile(fileout,section,sectionHeadersSize,&wrote, NULL);
WriteFile(fileout,pGlobals,nGlobalLen,&wrote, NULL);
WriteFile(fileout,pGlobalsStr,nGlobalStrLen,&wrote, NULL);
WriteFile(fileout,pStab,nStabLen,&wrote, NULL);
WriteFile(fileout,pStr,nStrLen,&wrote, NULL);
for(i=0;i<ulCurrentSrcFile;i++)
{
HANDLE file;
int len;
PVOID pFile;
PICE_SYMBOLFILE_SOURCE pss;
file = CreateFile(SrcFileNames[i],GENERIC_READ , 0, NULL, OPEN_EXISTING, 0, 0);
//printf("Trying To Open: %s, result: %x\n", SrcFileNames[i], file );
if( file == INVALID_HANDLE_VALUE ){
//let's try win format drive:/file
char srctmp[2048];
strcpy(srctmp, SrcFileNames[i] );
if(strncmp(srctmp,"//",2)==0){
*(srctmp) = *(srctmp+2);
*(srctmp+1) = ':';
*(srctmp+2) = '/';
file = CreateFile(srctmp,GENERIC_READ, 0, NULL, OPEN_EXISTING, 0, 0);
//printf("Trying To Open: %s, handle: %x\n", srctmp, file );
if( file == INVALID_HANDLE_VALUE )
printf("Can't open file: %s\n", srctmp );
}
}
if(file != INVALID_HANDLE_VALUE)
{
//printf("LOADER: [%u] opened %s as FD %x\n",i,SrcFileNames[i],file);
len = SetFilePointer(file,0,NULL,FILE_END);
//printf("LOADER: length = %d\n",(int)len);
SetFilePointer(file,0,NULL,FILE_BEGIN);
strcpy(pss.filename,SrcFileNames[i]);
pss.ulOffsetToNext = len+sizeof(PICE_SYMBOLFILE_SOURCE);
pFile = malloc(len+1);
//printf("LOADER: memory for file @ %x\n",pFile);
if(pFile)
{
//printf("LOADER: reading file...\n");
ReadFile(file,pFile,len+1,&wrote,NULL);
//printf("read: %d, error: %d\n", wrote, GetLastError());
WriteFile(fileout,&pss,sizeof(PICE_SYMBOLFILE_SOURCE),&wrote, NULL);
WriteFile(fileout,pFile,len,&wrote, NULL);
//printf("LOADER: writing file...%d\n%s\n",wrote,pFile );
free(pFile);
}
CloseHandle(file);
}
}
//printf("LOADER: leave process_stabs()\n");
}
///////////////////////////////////////////////////////////////////////////////////
// find_stab_sections()
//
///////////////////////////////////////////////////////////////////////////////////
void find_stab_sections(void* p,PIMAGE_SECTION_HEADER section, unsigned cSections,
PSTAB_ENTRY* ppStab,int* pLen,char** ppStr,int* pnStabStrLen)
{
unsigned i;
//printf("LOADER: enter find_stab_sections()\n");
*ppStab = 0;
*ppStr = 0;
for ( i=1; i <= cSections; i++, section++ )
{
if(strcmp(section->Name,".stab") == 0)
{
*ppStab = (PSTAB_ENTRY)((int)p + section->PointerToRawData);
*pLen = section->SizeOfRawData;
printf("LOADER: .stab @ %x (offset %x) len = %x\n",*ppStab,section->PointerToRawData,section->SizeOfRawData);
}
else if(strncmp(section->Name,".stabstr",strlen(".stabstr")) == 0)
{
*ppStr = (char*)((int)p + section->PointerToRawData);
*pnStabStrLen = section->SizeOfRawData;
printf("LOADER: .stabstr @ %x (offset %x) len = %x\n",*ppStab,section->PointerToRawData,section->SizeOfRawData);
}
}
//printf("LOADER: leave find_stab_sections()\n");
}
///////////////////////////////////////////////////////////////////////////////////
// process_pe()
//
///////////////////////////////////////////////////////////////////////////////////
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -