⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 elfmodule.c

📁 深圳市微逻辑电子有限公司 巨果&#8226 Kingmos&reg 系统核心
💻 C
📖 第 1 页 / 共 5 页
字号:
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 + -