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

📄 romfs.c

📁 深圳市微逻辑电子有限公司 巨果&#8226 Kingmos&reg 系统核心
💻 C
📖 第 1 页 / 共 3 页
字号:

	if(FileMode != FILE_MODE_MOD)
		return FALSE;
	
	pTocentry = (LPTOCentry)pTOC->ulModOffset;
	pTocentry += index;

	DEBUGMSG(ZONE_DEBUG, (TEXT("elf info:.........\r\n")));
	DEBUGMSG(ZONE_DEBUG, (TEXT("ulEntry: %x,ulFileBase:%x\r\n"), pTocentry->ElfInfo.ulEntry, pTocentry->ElfInfo.ulFileBase));

	if(pTocentry->bValidRes == TRUE){
		memcpy(pElfInfo, &pTocentry->ResSeg, sizeof(MODULE_SEG));
		*pBytesReturned = sizeof(MODULE_SEG);
		return TRUE;		
	}
	//if the module no res, set flag: 0;
	*pBytesReturned = 0;
	return TRUE;

	//return FALSE;	
}

BOOL ROM_DeviceIoControl(
  HANDLE hDevice,              // handle to device
  DWORD dwIoControlCode,       // operation
  LPVOID lpInBuffer,           // input data buffer
  DWORD nInBufferSize,         // size of input data buffer
  LPVOID lpOutBuffer,          // output data buffer
  DWORD nOutBufferSize,        // size of output data buffer
  LPDWORD lpBytesReturned,     // byte count
  LPOVERLAPPED lpOverlapped    // overlapped information
)
{
	return DoROM_DeviceIoControl((PFILE)hDevice, dwIoControlCode, lpInBuffer, nInBufferSize, lpOutBuffer,
							nOutBufferSize, lpBytesReturned);
}

static BOOL   DoROM_DeviceIoControl(
	PFILE pFile, 
	DWORD dwIoControlCode, 
	LPVOID pInBuf, 
	DWORD nInBufSize, 
	LPVOID pOutBuf, 
	DWORD nOutBufSize, 
	LPDWORD pBytesReturned)
{
	PROMFILE   pF	=	(PROMFILE)pFile;
	BOOL		bStatus =	FALSE;

	DEBUGMSG(ZONE_OUT, (TEXT("DoROM_DeviceIoControl: < (Control code %x)\r\n"),dwIoControlCode));

	if(pF == NULL)
		return FALSE;

	//Check parms ....
	switch(dwIoControlCode)
	{
	case IOCTL_ROM_ALLOC_FILE:
		break;
	case IOCTL_ROM_GET_EXE_INFO:
		break;
	case IOCTL_ROM_GET_OBJ_INFO:
		break;
	case IOCTL_ROM_GET_ELF_INFO:
		break;
	case IOCTL_ROM_GET_SEG_RES:
		break;
	default:
		WARNMSG(ZONE_DEBUG, (TEXT("ROMFS: unknown iocontrolcode...\r\n")));
	}

	//do action ....
	switch(dwIoControlCode)
	{
	case IOCTL_ROM_GET_ELF_INFO:
		DEBUGMSG(ZONE_DEBUG, (TEXT("ROMFS: addr:%x\r\n"), pOutBuf));

		bStatus = DEV_GetElfInfo(pF, pOutBuf, nOutBufSize, pBytesReturned);
		break;
	case IOCTL_ROM_ALLOC_FILE:
		bStatus = DEV_AllocFile(pF, pOutBuf, nOutBufSize, pBytesReturned);
		break;
	case IOCTL_ROM_GET_EXE_INFO:
		bStatus = DEV_GetExeInfo(pF, pOutBuf, nOutBufSize, pBytesReturned);
		break;
	case IOCTL_ROM_GET_OBJ_INFO:
		bStatus = DEV_GetObjInfo(pF, pOutBuf, nOutBufSize, pBytesReturned);
		break;
	case IOCTL_ROM_GET_SEG_RES:
		bStatus = DEV_GetSegInfo(pF, pOutBuf, nOutBufSize, pBytesReturned);
		break;

	default:
		WARNMSG(ZONE_DEBUG, (TEXT("ROMFS: unknown iocontrolcode...\r\n")));
	}

	DEBUGMSG(ZONE_OUT, (TEXT("DoROM_DeviceIoControl: > %x\r\n"),bStatus));
	return bStatus;
}


HANDLE ROM_CreateFile(
  LPCTSTR lpFileName,                         // file name
  DWORD dwDesiredAccess,                      // access mode
  DWORD dwShareMode,                          // share mode
  LPSECURITY_ATTRIBUTES lpSecurityAttributes, // SD
  DWORD dwCreationDisposition,                // how to create
  DWORD dwFlagsAndAttributes,                 // file attributes
  HANDLE hTemplateFile                        // handle to template file
  )
{
	LPVOID lpv = DoROM_CreateFile( (PVOL)PDEF_ROMVOLUME, DEF_PROC, lpFileName, dwDesiredAccess, dwShareMode, lpSecurityAttributes,
							dwCreationDisposition, dwFlagsAndAttributes, hTemplateFile);	
	return lpv;
	//2004-10-21, remove to klmisc.c
	// 2003-06-27, ADD-begin by ln
//	if( (HANDLE)lpv != INVALID_HANDLE_VALUE )
//        return (HANDLE)Handle_Alloc( 0, lpv, OBJ_FILE );
//	else
//		return INVALID_HANDLE_VALUE;
	// 2003-06-27, ADD-end by ln
}

static HANDLE DoROM_CreateFile( 
		PVOL pVol, 
		HANDLE hProc, 
		LPCTSTR pwsFileName, 
		DWORD dwAccess, 
		DWORD dwShareMode,
		PSECURITY_ATTRIBUTES pSecurityAttributes, 
		DWORD dwCreate,
		DWORD dwFlagsAndAttributes, 
		HANDLE hTemplateFile )
{
	PROMSEARCH  pSearch;
	PROMFILE    pFile;
	HANDLE      ret=INVALID_HANDLE_VALUE;
	PROMVOLUME     pVolume=(PROMVOLUME)pVol;

	DEBUGMSG(ZONE_FILE, (TEXT("romfs: CreatFile entered  %s\r\n"),pwsFileName));
//  now, check the actual parameters.
	if( !(dwCreate == OPEN_EXISTING || dwCreate == OPEN_ALWAYS) || 
		 pwsFileName == NULL || 
		 dwAccess != GENERIC_READ ) 
	{		
		WARNMSG(ZONE_FILE, (TEXT("romfs0: CreatFile  take error parameter\r\n")));
		SetLastError( ERROR_INVALID_PARAMETER);
		return INVALID_HANDLE_VALUE;
	}
	if( ! ROM_IsVolume(pVolume ) ){

		ERRORMSG(ZONE_ERROR, (TEXT("romfs: CreatFile volume  %x is invalid\r\n"),pVol));
		return  INVALID_HANDLE_VALUE;
	}
	if( ! IsFileOpened( pVolume,pwsFileName ) ){
		SetLastError( ERROR_SHARING_VIOLATION );  // share violation.
		return INVALID_HANDLE_VALUE;
	}
    EnterCriticalSection( &pVolume->cs_Volume );

	//pFile=LocalAlloc(LPTR, sizeof( ROMFILE));
	pFile = KHeap_Alloc( sizeof( ROMFILE) );
	if( pFile != NULL ){

		//RETAILMSG(ZONE_ERROR,(TEXT("rom:3\r\n")));

		pSearch = HELP_FindFirstFile(pVol, pwsFileName, (FILE_FIND_DATA *)pFile, FIND_CREATE_CALL);
		if(pSearch == INVALID_HANDLE_VALUE)
			goto  Error_Return;
		
		//free(pSearch);
		KHeap_Free( pSearch, sizeof( ROMSEARCH ));

		strcpy(pFile->cFileName, pwsFileName);
		pFile->pVolume		= pVolume;
		pFile->dwFilePointer= 0;
		pFile->dwShareMode	=dwShareMode;
		InitializeCriticalSection(& (pFile->cs_File) );
		
		LeaveCriticalSection( &pVolume->cs_Volume );
		
		//RETAILMSG(ZONE_FILE, (TEXT("romfs: CreatFile before CriticalSection\r\n")));
		
		EnterCriticalSection( &Crit_File ); // insert this node into list.
		pFile->next	=	pFileList;
		pFileList	=	pFile;
		LeaveCriticalSection( &Crit_File);
		
		DEBUGMSG(ZONE_FILE, (TEXT("romfs: CreatFile leaved  %x\r\n"),pFile));
		return (HANDLE)pFile;			   
	}
	   
Error_Return:
	if( pFile )
	    KHeap_Free( pFile, sizeof( ROMFILE) );
	//free(pFile);
	

	DEBUGMSG(ZONE_FILE, (TEXT("romfs: CreatFile  Failed\r\n")));

	LeaveCriticalSection( &pVolume->cs_Volume );
 	return INVALID_HANDLE_VALUE;
}


//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
DWORD ROM_GetFileAttributes(
  LPCTSTR lpFileName   // name of file or directory
)
{
	return DoROM_GetFileAttributes( (PVOL)PDEF_ROMVOLUME, lpFileName);
}

#define DEBUG_DoROM_GetFileAttributes 0
static DWORD  DoROM_GetFileAttributes(PVOL pVolume, LPCTSTR pwsFileName)
{
    FILE_FIND_DATA		File;
	PROMSEARCH			pSearch;
	DWORD				dwAttr=0xFFFFFFFF;
	PROMVOLUME			pVol=(PROMVOLUME)pVolume;

	DEBUGMSG(ZONE_FILE|DEBUG_DoROM_GetFileAttributes, (TEXT("DoROM_GetFileAttributes: entered ( %s ).\r\n"),pwsFileName));
	//RETAILMSG(ZONE_ERROR, (TEXT("romfs: %s\r\n"),pwsFileName));

	//if((strcmp(pwsFileName, "\\hellores.exe") != 0) && 
	//	(strcmp(pwsFileName, "\\libtestdll1.so") != 0))
	//	ASSERT(0);

	if( ! ROM_IsVolume(pVol ) ){

		ERRORMSG(ZONE_ERROR, (TEXT("DoROM_GetFileAttributes: GetFileAttribute volume  %x is invalid\r\n"),pVol));
		return  0xFFFFFFFF;
	}
	//RETAILMSG(ZONE_FILE, (TEXT("romfs:  DoROM_GetFileAttributesW  %s  before Crit\r\n"),pwsFileName));

    EnterCriticalSection( &pVol->cs_Volume );
	
	DEBUGMSG(DEBUG_DoROM_GetFileAttributes,(TEXT("DoROM_GetFileAttributes:call HELP_FindFirstFile.\r\n")));

	pSearch=( PROMSEARCH )HELP_FindFirstFile(pVolume, pwsFileName, &File, FIND_NORMAL_CALL);
	
	if((HANDLE) pSearch != INVALID_HANDLE_VALUE ) {
		
		dwAttr=File.dwFileAttributes;
		
		KHeap_Free(pSearch, sizeof( ROMSEARCH ));

		DEBUGMSG(DEBUG_DoROM_GetFileAttributes, (TEXT("DoROM_GetFileAttributes: get attrib(%x).\r\n"),dwAttr ));
		
		//RETAILMSG(ZONE_FILE, (TEXT("romfs:  DoROM_GetFileAttributesW leaved %x\r\n"),dwAttr));
	}
	DEBUGMSG(DEBUG_DoROM_GetFileAttributes, (TEXT("DoROM_GetFileAttributes: LeaveCriticalSection.\r\n") ));
	
	LeaveCriticalSection ( &pVol->cs_Volume );

	DEBUGMSG(ZONE_FILE|DEBUG_DoROM_GetFileAttributes, (TEXT("DoROM_GetFileAttributes: leaved retv(%x).\r\n"),dwAttr ));
	return dwAttr;
}

BOOL ROM_ReadFile(
  HANDLE hFile,                // handle to file
  LPVOID lpBuffer,             // data buffer
  DWORD nNumberOfBytesToRead,  // number of bytes to read
  LPDWORD lpNumberOfBytesRead, // number of bytes read
  LPOVERLAPPED lpOverlapped    // overlapped buffer
)
{
	return DoROM_ReadFile((PFILE)hFile, lpBuffer, nNumberOfBytesToRead, lpNumberOfBytesRead, lpOverlapped);
}

//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
static BOOL   DoROM_ReadFile(PFILE pF, PVOID pBufferOut, DWORD cbRead, LPDWORD pcbRead, LPOVERLAPPED pOverlapped)
{
	PROMFILE   pFile	=	(PROMFILE)pF;
	PUCHAR     pOut		=	(PUCHAR)pBufferOut;
//	WORD       wSectorSize;
//	DWORD      dwReadSectorNum;    // this time, the how many sectors should be read out.
//	DWORD      dwReadStartSector;  // which sector should  start read from this time ?
//	WORD       wBytesBeforeSector; // before read the dwReadStartSector, how many bytes should be read,
//	WORD       wBytesAfterSector;//after read the dwReadStartSector, how many bytes should be read,
	BOOL       status	=	TRUE;

	DEBUGMSG(ZONE_READ, (TEXT("romfs:  ReadFile: < %x  %x\r\n"),pFile,cbRead ));


	if( ! HELP_IsFile( pFile) ){
		WARNMSG(ZONE_READ, (TEXT("romfs: error pFile, ReadFile :> %x  %x\r\n"),pFile,cbRead ));
		return   FALSE;
	}
	if( pBufferOut ==NULL || pcbRead==NULL )
	{
		SetLastError( ERROR_INVALID_PARAMETER);
		WARNMSG(ZONE_READ, (TEXT("romfs:  ReadFile :> %x  %x\r\n"),pFile,cbRead ));

		return   FALSE;
	}
	EnterCriticalSection( & (pFile->cs_File) );

	if( pFile->dwFilePointer >= pFile->nFileSizeLow ) {

		WARNMSG(ZONE_READ, (TEXT("romfs:  ReadFile reach EOF \r\n") ));
		if( pcbRead )
			*pcbRead = 0;
		goto  Error_Return;
	}


	cbRead = min( cbRead,  ( pFile->nFileSizeLow - pFile->dwFilePointer ));

	DEBUGMSG(ZONE_READ, (TEXT("romfs:  ReadFile  cbRead=%x \r\n"),cbRead ));
	
	memcpy(  pOut, (const void*)(pFile->dwFileBase + pFile->dwFilePointer), cbRead);

	if( pcbRead != NULL ) {
		*pcbRead = cbRead;
	}
    pFile->dwFilePointer += cbRead;

	if( pFile->dwFilePointer > pFile->nFileSizeLow)
		pFile->dwFilePointer = pFile->nFileSizeLow;

Error_Return:
	LeaveCriticalSection( &pFile->cs_File);

	DEBUGMSG(ZONE_READ, (TEXT("romfs:  ReadFile leaved %x ,%x\r\n"),*pcbRead ,status ));

	return status;
	//return TRUE;
}

DWORD ROM_SetFilePointer(
  HANDLE hFile,                // handle to file
  LONG lDistanceToMove,        // bytes to move pointer
  PLONG lpDistanceToMoveHigh,  // bytes to move pointer
  DWORD dwMoveMethod           // starting point
)
{
	return DoROM_SetFilePointer((PFILE)hFile, lDistanceToMove, lpDistanceToMoveHigh, dwMoveMethod);
}

static DWORD  DoROM_SetFilePointer(PFILE pFileIn, LONG lDistanceToMove, LPLONG pDistanceToMoveHigh, DWORD dwMoveMethod)
{
	DWORD			dwPointer;
	PROMFILE		pFile=(PROMFILE)pFileIn;
	BOOL            status=TRUE;

	DEBUGMSG(ZONE_FILE, (TEXT("romfs:SetFilePointer %d \r\n"),lDistanceToMove));

	if( ! HELP_IsFile(pFile) ){
		return  0xFFFFFFFF;
	}

	EnterCriticalSection( &(pFile->cs_File) );
	switch( dwMoveMethod ) {
	
		case FILE_CURRENT:

			DEBUGMSG(ZONE_FILE, (TEXT("romfs:  SetFilePointer in CURRENT \r\n")));
			if( lDistanceToMove < 0 ){
				if( (DWORD)ABS(lDistanceToMove) > pFile->dwFilePointer){
					SetLastError( ERROR_NEGATIVE_SEEK );

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -