📄 elfmodule.c
字号:
MY_STATIC char *FormatModuleName(LPCTSTR lpszFileName)
{
char *pTmp = NULL;
int ch = '\\';
//RETAILMSG(TONE_MOD, ( "FormatModuleName:< %s\r\n", lpszFileName) );
if(!(pTmp = strrchr(lpszFileName, ch))){
pTmp = (char*)lpszFileName;
//RETAILMSG(TONE_MOD, ( "FormatModuleName:> %s1\r\n", pTmp) );
return pTmp;
}
pTmp++;
//RETAILMSG(TONE_MOD, ( "FormatModuleName:> %s 1\r\n", pTmp) );
return pTmp;
}
MY_STATIC BOOL SetModuleHandle(PMODULE_HANDLE lp, struct exe_module *pmod, struct __dlmodule *__dl_module, UINT flag )
{
DWORD dwReturn = -1;
RETAILMSG(TONE_MOD, ( "SetModuleHandle:< \r\n") );
ASSERT(lp);
// ASSERT(pmod);
// ASSERT(__dl_module);
if(flag != MODULE_LOAD_EXE){
//2004-10-20
lp->info = (LOAD_MODULE *)KHeap_Alloc( sizeof( LOAD_MODULE ));
//lp->info = (LOAD_MODULE *)_kalloc(sizeof( LOAD_MODULE ));//KHeap_Alloc( sizeof( LOAD_MODULE ));
//
if(lp->info == NULL)
{
RETAILMSG(TONE_MOD,( "KHeap_Alloc fail!\r\n" ));
return FALSE;
}
RETAILMSG(TONE_MOD, ( "SetModuleHandle: -> 1 \r\n") );
if(flag == MODULE_EXEC_EXE){
RETAILMSG(TONE_MOD, ( "SetModuleHandle: -> 2 \r\n") );
//memcpy(lp->info, pmod->exe_info, sizeof( LOAD_MODULE ));
lp->info->start = pmod->exe_info->start;
lp->info->end = pmod->exe_info->end;
lp->info->addr = pmod->exe_info->addr;
lp->info->entry = pmod->exe_info->entry;
}else{
//if(lp->lpModule->uPos == UNDEF_MODULE)
// lp->lpModule->uPos = __dl_module->filetype;
ASSERT(__dl_module);
RETAILMSG(TONE_MOD, ( "SetModuleHandle: -> 3 \r\n") );
//lp->info->nphdr = __dl_module->l_phnum;
lp->info->addr = __dl_module->l_addr;
lp->info->start = __dl_module->l_map_start;
lp->info->end = __dl_module->l_map_end;
lp->info->entry = __dl_module->l_entry;
//lp->info->nld = 0;
lp->info->strtab = (const void *) D_PTR (__dl_module, l_info[DT_STRTAB]);
lp->info->symtab = (const void *) D_PTR (__dl_module, l_info[DT_SYMTAB]);
lp->info->l_nchain = __dl_module->l_nchain;
if(__dl_module->l_info[DT_INIT])
lp->info->initproc = D_PTR (__dl_module, l_info[DT_INIT]);
else
lp->info->initproc = NULL;
if(__dl_module->l_info[DT_FINI])
lp->info->finiproc = D_PTR (__dl_module, l_info[DT_FINI]);
else
lp->info->finiproc = NULL;
}
/*lp->info->ld = NULL;
lp->info->phdr = (Elf32_Phdr *)KHeap_Alloc( sizeof( Elf32_Phdr) * lp->info->nphdr);
if(lp->info->phdr == NULL){
RETAILMSG(TONE_MOD,( "KHeap_Alloc fail!\r\n" ));
KHeap_Free( lp->info, sizeof( LOAD_MODULE ));
return FALSE;
}
if(flag == MODULE_EXEC_EXE)
memcpy(lp->info->phdr, pmod->exe_info->phdr, sizeof( Elf32_Phdr) * lp->info->nphdr);
else
memcpy(lp->info->phdr, __dl_module->l_phdr, sizeof( Elf32_Phdr) * lp->info->nphdr);
*/
}
//if((flag == CREATE_EXE) || (flag == MODULE_LOAD_EXE))
// lp->seg_info = pmod->seg_info;
if((flag == MODULE_EXEC_EXE) || (flag == MODULE_LOAD_EXE))
lp->hFile = pmod->hFile;
else
lp->hFile = __dl_module->hFile;
if(lp->lpModule->seg_info == NULL){ //以前未获取过module的段信息.
RETAILMSG(TONE_DEBUG, ("SEG1\r\n"));
if(lp->lpModule->uPos != XIP_MODULE){
RETAILMSG(TONE_DEBUG, ("SEG2\r\n"));
//Add for test...
//if(lp->lpModule->seg_info == NULL)
lp->lpModule->seg_info = GetSegInfo(lp->hFile);
}else{
RETAILMSG(TONE_DEBUG, ("SEG3\r\n"));
lp->lpModule->seg_info = (struct module_seg *)KHeap_Alloc(sizeof(struct module_seg ));//_kalloc (sizeof(struct module_seg ));
if(lp->lpModule->seg_info == NULL){
RETAILMSG(TONE_ERROR, ("SetModuleHandle: _kalloc fail\r\n"));
return FALSE;
}
//
//Add the line to fix bug...
//
memset(lp->lpModule->seg_info, 0, sizeof(struct module_seg ));
if(!DeviceIoControl(lp->hFile, IOCTL_ROM_GET_SEG_RES, NULL, 0, lp->lpModule->seg_info, 0, &dwReturn, NULL)){
KHeap_Free(lp->lpModule->seg_info,sizeof(struct module_seg ));//_kfree(lp->lpModule->seg_info);
lp->lpModule->seg_info = NULL;
/*if(dwReturn == 0){
RETAILMSG(TONE_ERROR, ("SetModuleHandle: no res seg\r\n"));
return TRUE;
}else{
RETAILMSG(TONE_ERROR, ("SetModuleHandle: get res seg fail\r\n"));
return FALSE;
}*/
RETAILMSG(TONE_ERROR, ("SetModuleHandle: get res seg fail\r\n"));
return FALSE;
}
if(dwReturn == 0){
KHeap_Free(lp->lpModule->seg_info,sizeof(struct module_seg ));
//_kfree(lp->lpModule->seg_info);
lp->lpModule->seg_info = NULL;
RETAILMSG(TONE_DEBUG, ("SetModuleHandle: no res seg\r\n"));
return TRUE;
}
lp->lpModule->seg_info->sh_name = (char*)_kalloc(sizeof(SECT_NAME_RES) + 1);
if(lp->lpModule->seg_info->sh_name == NULL){
//_kfree(lp->lpModule->seg_info);
KHeap_Free(lp->lpModule->seg_info,sizeof(struct module_seg ));
lp->lpModule->seg_info = NULL;
RETAILMSG(TONE_ERROR, ("SetModuleHandle: _kalloc fail\r\n"));
return FALSE;
}
strcpy(lp->lpModule->seg_info->sh_name , SECT_NAME_RES);
}
}
RETAILMSG(TONE_MOD, ( "SetModuleHandle:> \r\n") );
return TRUE;
}
/*MY_STATIC PMODULE_HANDLE GetNewModule(struct __dlmodule *__dl_module, HANDLE hProc, UINT flag)
{
//struct exe_module *pmod;
PMODULE_HANDLE pMod ;
int len;
RETAILMSG(TONE_MOD, ( "GetNewModule: <\r\n") );
pMod = (PMODULE_HANDLE)KHeap_Alloc( sizeof( MODULE_HANDLE ));
if(pMod == NULL){
RETAILMSG(TONE_MOD,("GetNewModule fail!\r\n"));
RETAILMSG(TONE_MOD, ( "GetNewModule: >\r\n") );
return NULL;
}
//init the members of struct MODULE_NODE.
memset(pMod, 0, sizeof(MODULE_HANDLE));
pMod->uRef++;
pMod->hProc = hProc;
pMod->uMode = flag;
//pMod->uRef = 1;
// if(flag == MODULE_LOAD){
// LoadModule(pMod);
// }else{
// if( pMod->uType != CREATE_EXE)
// goto createfail;
// }
// pMod->lpStart = __dl_module->l_entry;
pMod->info = (LOAD_MODULE *)KHeap_Alloc( sizeof( LOAD_MODULE ));
if(pMod->info == NULL)
{
RETAILMSG(TONE_MOD,( "KHeap_Alloc fail!\r\n" ));
KHeap_Free( pMod, sizeof( MODULE_HANDLE ) );
return 0;
}
//memcpy(lp->info, pmod->exe_info, sizeof( LOAD_MODULE ));
pMod->info->nphdr = __dl_module->l_phnum;
pMod->info->addr = __dl_module->l_addr;
pMod->info->start = __dl_module->l_map_start;
pMod->info->end = __dl_module->l_map_end;
pMod->info->entry = __dl_module->l_entry;
pMod->info->nld = 0;
//pMod->info->hFile = NULL;
pMod->hFile = __dl_module->hFile;
pMod->info->ld = NULL;
pMod->info->phdr = (Elf32_Phdr *)KHeap_Alloc( sizeof( Elf32_Phdr) * pMod->info->nphdr);
if(pMod->info->phdr == NULL){
RETAILMSG(TONE_MOD,( "KHeap_Alloc fail!\r\n" ));
KHeap_Free( pMod->info, sizeof( LOAD_MODULE ));
KHeap_Free( pMod, sizeof( MODULE_HANDLE ) );
return 0;
}
memcpy(pMod->info->phdr, __dl_module->l_phdr, sizeof( Elf32_Phdr) * pMod->info->nphdr);
//memcpy(lp->info->ld, pmod->exe_info->ld, sizeof( Elf32_Dyn) * lp->info->nld);
RETAILMSG(TONE_MOD, ( "GetNewModule: > OK\r\n") );
return pMod;
}*/
/*BOOL GetDllSegInfo(HANDLE hFile, PMODULE_HANDLE lpHandle)
{
Elf32_Ehdr ehdr;
RETAILMSG(TONE_MOD, ("GetDllSegInfo: <\n"));
if (read_file (hFile, (char*)&ehdr, sizeof(Elf32_Ehdr), 0) != sizeof(Elf32_Ehdr))
{
RETAILMSG(TONE_MOD, ("GetDllSegInfo: >xx\n"));
return FALSE;
}
RETAILMSG(TONE_MOD, ("lpHandle->seg_info: %x\n", lpHandle->seg_info));
lpHandle->seg_info = GetSegInfo(hFile, &ehdr);
RETAILMSG(TONE_MOD, ("lpHandle->seg_info: %x\n", lpHandle->seg_info));
if(lpHandle->seg_info == NULL){
RETAILMSG(TONE_MOD, ("GetSegInfo fail!\n"));
return FALSE;
}
RETAILMSG(TONE_MOD, ("GetDllSegInfo: 11xx\n"));
RETAILMSG(TONE_MOD, ("GetDllSegInfo: >ok\n"));
return TRUE;
}*/
#define DEBUG_GetModulePos 0
void GetModulePos(PMODULE_NODE lpMod)
{
char lpszBin[MAX_PATH];
DWORD dwFileAttr;
DEBUGMSG(TONE_MOD|DEBUG_GetModulePos,("GetModulePos entry(%s).\r\n", lpMod->lpszApName));
//RETAILMSG(TONE_TEST,("F1:%s\r\n", lpMod->lpszApName));
if(!elf_find_binary(lpMod->lpszApName, lpszBin)){
RETAILMSG(TONE_ERROR|1, ("GetModulePos: %s no find!\r\n", lpMod->lpszApName));
RETAILMSG(TONE_MOD,("GetModulePos:> fail !\n"));
return ;
}
RETAILMSG(TONE_MOD,("::%s\r\n",lpszBin ));
dwFileAttr = GetFileAttributes(lpszBin);
ASSERT(dwFileAttr != (DWORD)-1);
//RETAILMSG(TONE_EXEC,("-- file attr:%x !\n", dwFileAttr));
if(dwFileAttr & FILE_ATTRIBUTE_ROMMODULE )
{
RETAILMSG(TONE_MOD, ("=xip\r\n"));
lpMod->uPos = XIP_MODULE;
//uFileType = ROM_MODULE;
}else{
RETAILMSG(TONE_MOD, ("=non_xip\r\n"));
lpMod->uPos = NON_XIP_MODULE;
}
//RETAILMSG(TONE_TEST,("F2:%s\r\n", lpMod->lpszApName));
DEBUGMSG(TONE_MOD|DEBUG_GetModulePos,("GetModulePos leave(%s).\r\n", lpMod->lpszApName));
return ;
}
//note: 2003-09-06...zb
#define DEBUG_IsLoadModule 0
BOOL IsLoadModule(LPCTSTR lpszFileName)
{
char lpszBin[MAX_PATH];
DWORD dwFileAttr;
DEBUGMSG(TONE_MOD | DEBUG_IsLoadModule,("IsLoadModule: entry( %s ).\n", lpszFileName));
//RETAILMSG(TONE_TEST,("F1:%s\r\n", lpMod->lpszApName));
if(!elf_find_binary(lpszFileName, lpszBin)){
WARNMSG(TONE_ERROR|DEBUG_IsLoadModule, ("IsLoadModule: %s no find!\r\n", lpszFileName));
return FALSE;
}
DEBUGMSG(TONE_MOD|DEBUG_IsLoadModule,("IsLoadModule lpszBin=%s.\r\n",lpszBin ));
dwFileAttr = GetFileAttributes(lpszBin);
ASSERT(dwFileAttr != (DWORD)-1);
//RETAILMSG(TONE_EXEC,("-- file attr:%x !\n", dwFileAttr));
if(dwFileAttr & FILE_ATTRIBUTE_ROMMODULE )
{
int leng;
//RETAILMSG(TONE_MOD, ("=xip\r\n"));
leng = strlen("\\kingmos\\");
*(lpszBin + leng) = 0;
if(stricmp(lpszBin, "\\kingmos\\") != 0){
WARNMSG(DEBUG_IsLoadModule, ("IsLoadModule: xip module %s isn't in rom!\r\n", lpszFileName));
return FALSE;
}
}else{
//RETAILMSG(TONE_MOD, ("=non_xip\r\n"));
}
DEBUGMSG(TONE_MOD|DEBUG_IsLoadModule,("IsLoadModule:leave(%s).!\n", lpszFileName));
return TRUE;
}//note: 2003-09-06...zb
#define DEBUG_CreateModuleNode 0
PMODULE_NODE CreateModuleNode(LPCTSTR lpszFileName, UINT flag)
{
PMODULE_NODE pMod ;
// UINT len;
//char *modulename;
//MODULE_HANDLE *pModHandle;
DEBUGMSG(TONE_MOD|DEBUG_CreateModuleNode, ("CreateModuleNode: entry:%s:\n", lpszFileName));
//KL_EnterCriticalSection( &csModuleList );
//2004-10-20
pMod = (PMODULE_NODE)KHeap_Alloc( sizeof( MODULE_NODE ));
//pMod = (PMODULE_NODE)_kalloc(sizeof( MODULE_NODE ));//KHeap_Alloc( sizeof( MODULE_NODE ));
//
if(pMod == NULL){
WARNMSG(TONE_ERROR|DEBUG_CreateModuleNode, ("CreateModuleNode: alloc struct MODULE_NODE fail! \n"));
//KL_LeaveCriticalSection( &csModuleList );
return NULL;
}
DEBUGMSG(TONE_MOD|DEBUG_CreateModuleNode, ("1111.\n" ) );
//init the members of struct MODULE_NODE.
memset(pMod, 0, sizeof(MODULE_NODE));
pMod->lpNext = lpElfModList;
lpElfModList = pMod;
pMod->uRef = 1;
//len = strlen( lpszFileName ) + 1;
//2004-10-20
//DEBUGMSG(TONE_MOD|1, ("Call KHeap_Alloc(%s).\n", lpszFileName ) );
pMod->lpszApName = KHeap_AllocString( ( strlen( lpszFileName ) + 1) * sizeof( TCHAR ) );//KHeap_Alloc( len * sizeof( TCHAR ) );
//pMod->lpszApName = _kalloc( len * sizeof( TCHAR ) );
//
DEBUGMSG(TONE_MOD|DEBUG_CreateModuleNode, ("2222.\n" ) );
if( pMod->lpszApName == NULL ){
//2004-10-20
KHeap_Free( pMod, sizeof( MODULE_NODE ) );
//_kfree( pMod );
//
//KL_LeaveCriticalSection( &csModuleList );
WARNMSG( TONE_MOD |DEBUG_CreateModuleNode, ("CreateModuleNode: alloc pMod->lpszApName failure.\r\n"));
return NULL;
}
DEBUGMSG(TONE_MOD|DEBUG_CreateModuleNode, ("3333.\n" ) );
strcpy( pMod->lpszApName, lpszFileName );
pMod->uType = flag;
//RETAILMSG(1, ("Calling GetModulePos!\r\n"));
DEBUGMSG(TONE_MOD|DEBUG_CreateModuleNode, ("GetModulePos++.\n" ) );
GetModulePos(pMod);
DEBUGMSG(TONE_MOD|DEBUG_CreateModuleNode, ("GetModulePos--.\n" ) );
/* file = strrchr (lpszFileName, '\\');
if(file != NULL){
if(strstr(lpszFileName, KING_PATH)){
pMod->uPos = ROM_MODULE;
}else{
pMod->uPos = NORMAL_MODULE;
}
}*/
//GetModuleType(pMod, flag);
//KL_LeaveCriticalSection( &csModuleList );
DEBUGMSG(TONE_MOD|DEBUG_CreateModuleNode, ("CreateModuleNode: leave.\r\n"));
return pMod;
}
PMODULE_NODE FindOrCreateModule(LPCTSTR lpszFileName, UINT *uResult, UINT flag)
{
PMODULE_NODE pMod ;
UINT len;
//char *modulename;
//MODULE_HANDLE *pModHandle;
RETAILMSG(TONE_MOD, ("FindOrCreateModule: <:%s:\n", lpszFileName));
if(pMod = FindLoadedMod( lpszFileName )){
ASSERT(pMod->lpHandle);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -