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

📄 romfs.c

📁 深圳市微逻辑电子有限公司 巨果&#8226 Kingmos&reg 系统核心
💻 C
📖 第 1 页 / 共 3 页
字号:
/******************************************************
Copyright(c) 版权所有,1998-2003微逻辑。保留所有权利。
******************************************************/

/*****************************************************
文件说明:内核romfs主文件
版本号:  1.0.0
开发时期:2003-06-18
作者:    周兵
修改记录:
******************************************************/
 
#include <ewindows.h>
#include <efsdmgr.h>
#include <epalloc.h>
#include <edevice.h>
#include <Eassert.h>
#include <romfs.h>
#include <kromfs.h>

#include <romheader.h>
#include <coresrv.h>
#include <devdrv.h>

#include <epalloc.h>

#define ABS( v ) ( (v) < 0 ? -(v) : (v) )
PROMVOLUME			pVolumeList=NULL;
PROMSEARCH			pSearchList=NULL;
HANDLE				hDll=NULL;
PROMFILE			pFileList=NULL;

CRITICAL_SECTION    Crit_Volume, Crit_File, Crit_Search;

FILECHANGEINFO		FileChanger;
//TCHAR               FolderName[]="kingmos";
//TCHAR				FsdName[] = "ROMFS";

extern  ROMHDR *const pTOC ;

//#define		DEF_PVOL	0x11
#define		DEF_PROC	((HANDLE)0x22)
#define		DEF_HDISK	((HDSK)0x33)

PROMVOLUME	PDEF_ROMVOLUME;

static BOOL   DoROM_CloseFile(PFILE pFileClose);
static DWORD  DoROM_SetFilePointer(PFILE pFileIn, LONG lDistanceToMove, LPLONG pDistanceToMoveHigh, DWORD dwMoveMethod);
static BOOL   DoROM_ReadFile(PFILE pF, PVOID pBufferOut, DWORD cbRead, LPDWORD pcbRead, LPOVERLAPPED pOverlapped);
static DWORD  DoROM_GetFileAttributes(PVOL pVolume, LPCTSTR pwsFileName);
static BOOL  DoROM_MountDisk(HDSK hDisk);
static BOOL  DoROM_UnmountDisk(HDSK hDisk);
static HANDLE DoROM_CreateFile( 
		PVOL pVol, 
		HANDLE hProc, 
		LPCTSTR pwsFileName, 
		DWORD dwAccess, 
		DWORD dwShareMode,
		PSECURITY_ATTRIBUTES pSecurityAttributes, 
		DWORD dwCreate,
		DWORD dwFlagsAndAttributes, 
		HANDLE hTemplateFile );
static BOOL   DoROM_DeviceIoControl(
	PFILE pFile, 
	DWORD dwIoControlCode, 
	LPVOID pInBuf, 
	DWORD nInBufSize, 
	LPVOID pOutBuf, 
	DWORD nOutBufSize, 
	LPDWORD pBytesReturned);

/*struct _FSDDRV RomFSDDrv = {
	&DoROM_CloseFile,
//	&DoROM_CloseVolume,
	NULL,	
//	&DoROM_CreateDirectoryW,
	NULL,
	&DoROM_CreateFile,
//	&DoROM_DeleteAndRenameFileW,
	NULL,
//	&DoROM_DeleteFileW,
	NULL,
	&DoROM_DeviceIoControl,	//have not implement.	
//	&DoROM_FindClose,
//	&DoROM_FindFirstFileW,
//	&DoROM_FindNextFileW,
	NULL,
	NULL,
	NULL,
//	&DoROM_FlushFileBuffers,
	NULL,
//	&DoROM_GetDiskFreeSpaceW,
	NULL,
	&DoROM_GetFileAttributes,
//	&DoROM_GetFileInformationByHandle,
	NULL,
//	&DoROM_GetFileSize,
	NULL,
//	&DoROM_GetFileTime,
	NULL,
	&DoROM_MountDisk,
//	&DoROM_MoveFileW,
	NULL,
//	&DoROM_Notify,				//have not implement.
	NULL,
	&DoROM_ReadFile,
//	&DoROM_ReadFileWithSeek,	//don't have.
	NULL,
//	&DoROM_RegisterFileSystemFunction,
	NULL,
//	&DoROM_RemoveDirectoryW,
	NULL,
//	&DoROM_SetEndOfFile,
	NULL,
//	&DoROM_SetFileAttributesW,
	NULL,
	&DoROM_SetFilePointer,
//	&DoROM_SetFileTime,
	NULL,
	&DoROM_UnmountDisk,
//	&DoROM_WriteFile,
	NULL,
//	&DoROM_WriteFileWithSeek,
	NULL,
	//&DoROM_CopyFile			//don't have.
	NULL
};*/

/*BOOL RegisterRomFSD(void )
{
	if(!FSDMGR_RegisterFSD(FsdName, &RomFSDDrv)){
		RETAILMSG(ZONE_ERROR, (TEXT("Rom FSD: register Rom FSD fail!\r\n")));
		return FALSE;
	}else{
		RETAILMSG(ZONE_ERROR, (TEXT("Rom FSD: register Rom FSD success!\r\n")));
		return TRUE;
	}		
}*/


//
//功能:内核启动时调用,初始化内核的romfs.
//
//
void InitRomFsd(void)
{

	InitializeCriticalSection( &Crit_Volume );
	InitializeCriticalSection( &Crit_File   );
	InitializeCriticalSection( &Crit_Search );

	DoROM_MountDisk( DEF_HDISK );
	//if(!RegisterRomFSD())
	//	DeinitRomFsd();

	//return TRUE;
}

void DeinitRomFsd(void)
{
	DeleteCriticalSection( &Crit_Volume);
	DeleteCriticalSection( &Crit_File  );
	DeleteCriticalSection( &Crit_Search );

	DoROM_UnmountDisk(DEF_HDISK);
}


BOOL  DoROM_MountDisk(HDSK hDisk)
{
	PROMVOLUME		pVolume;
	HVOL			VolumeIdentifer=0;
//	CDCALLBACK      dwCallBackFunc;
	WORD			wFolderLen=0; 
	

	DEBUGMSG(ZONE_MOUNT, (TEXT("romfs: MountDisk entered %x\r\n"),hDisk));

	pVolume = CreateVolume(hDisk  );
	if( pVolume ==NULL ){
		ERRORMSG(ZONE_MOUNT, (TEXT("romfs: MountDisk fail! \r\n")));
		return FALSE;
	}
	PDEF_ROMVOLUME = pVolume;

    return HELP_RegisterVolume(  pVolume );
}
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
BOOL  DoROM_UnmountDisk(HDSK hDisk)
{
	PROMVOLUME pVol , pVolDel;
//	HVOL              hVol;
	BOOL       status=FALSE;

	DEBUGMSG(ZONE_MOUNT, (TEXT("romfs: UnMountDisk entered %x\r\n"),hDisk));
    
	EnterCriticalSection( &Crit_Volume);
	DEBUGMSG(ZONE_MOUNT, (TEXT("romfs: UnMountDisk after critical section\r\n")));

	pVol=pVolumeList;
	if( pVolumeList !=NULL ){

		if( pVolumeList->hDevice ==hDisk ){

			DEBUGMSG(ZONE_MOUNT, (TEXT("romfs: UnMountDisk   device should unMount\r\n")));
			pVolDel=pVolumeList;
			pVolumeList=pVolumeList->next;
			status=TRUE;
		}else{
		
			WARNMSG(ZONE_MOUNT, (TEXT("romfs: UnMountDisk   there are more than 2 device\r\n")));
			while( pVol->next){

				if( pVol->next->hDevice ==hDisk)
				{
					DEBUGMSG(ZONE_MOUNT, (TEXT("romfs: UnMountDisk device%x (%x) has destroyed\r\n"),hDisk,pVol->hVolume));
					pVolDel=pVol->next;
					pVol->next=pVol->next->next;
					status=TRUE;
					break;
				}
				pVol= pVol->next;
			}
		}
	}
	LeaveCriticalSection( &Crit_Volume);

	DEBUGMSG(ZONE_MOUNT, (TEXT("romfs: UnMountDisk  after Crit_Volume\r\n"),hDisk));

	if( status ) {
		CRITICAL_SECTION  crit_this=pVolDel->cs_Volume;
		//hVol=pVolDel->hVolume;

		EnterCriticalSection(&crit_this );
		KHeap_Free( pVolDel, sizeof(ROMVOLUME) );
		LeaveCriticalSection(&crit_this );

		DeleteCriticalSection(&crit_this);
		//FSDMGR_DeregisterVolume( hVol );
		 return TRUE;

	}else{
		SetLastError( ERROR_INVALID_HANDLE);
		ERRORMSG(ZONE_MOUNT, (TEXT("romfs: UnMountDisk  failed\r\n"),hDisk));
	}
	DEBUGMSG(ZONE_MOUNT, (TEXT("romfs: UnMountDisk  leaved\r\n")));
	return status;
}
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
/*BOOL    DoROM_RegisterFileSystemFunction(PVOL pVolume, SHELLFILECHANGEFUNC pfn)
{
	PROMVOLUME  pVol=(PROMVOLUME)pVolume;
	
	RETAILMSG(ZONE_MOUNT, (TEXT("romfs:  DoROM_RegisterFileSystemFunction entered %x\r\n"),pfn));

	EnterCriticalSection( &Crit_Volume);
	pVol->pNotifyFunction = pfn;
	LeaveCriticalSection( &Crit_Volume);

	(*pfn)(&FileChanger);

	return TRUE;
}
*/
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
/*void    DoROM_Notify(PVOL pVolume, DWORD dwFlags)
{
	RETAILMSG(ZONE_OUT, (TEXT("romfs:  The function isn't implement\r\n")));
}*/

BOOL DEV_AllocFile(PROMFILE pFile, LPDWORD pFileBase, DWORD nOutBufSize, LPDWORD pBytesReturned)
{
	UINT				index, FileMode;
	LPFILESentry		pFileentry;

	if(!ROM_FindFile(pFile->cFileName, &index, &FileMode))
		return FALSE;

	if(FileMode != FILE_MODE_FILE)
		return FALSE;
	
	pFileentry = (LPFILESentry)pTOC->ulModOffset;
	pFileentry += index;

	*pFileBase = pFileentry->ulLoadOffset;
	*pBytesReturned = sizeof(UINT);

	return TRUE;		
}

BOOL DEV_GetExeInfo(PROMFILE pFile, EXE_ROM *pExeInfo, DWORD nOutBufSize, LPDWORD pBytesReturned)
{
	UINT	index, FileMode;
	LPTOCentry		pTocentry;

	if(!ROM_FindFile(pFile->cFileName, &index, &FileMode))
		return FALSE;

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

	pExeInfo = (EXE_ROM *)pTocentry->ulExeOffset;
	*pBytesReturned = sizeof(UINT);

	return TRUE;		
}

BOOL DEV_GetObjInfo(PROMFILE pFile, OBJ_ROM *pObjInfo, DWORD nOutBufSize, LPDWORD pBytesReturned)
{
	UINT	index, FileMode;
	LPTOCentry		pTocentry;

	if(!ROM_FindFile(pFile->cFileName, &index, &FileMode))
		return FALSE;

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

	pObjInfo = (OBJ_ROM *)pTocentry->ulObjOffset;
	*pBytesReturned = sizeof(UINT);

	return TRUE;		
}

BOOL DEV_GetElfInfo(PROMFILE pFile, PELF_INFO pElfInfo, DWORD nOutBufSize, LPDWORD pBytesReturned)
{
	UINT	index, FileMode;
	LPTOCentry		pTocentry;

	if(!ROM_FindFile(pFile->cFileName, &index, &FileMode))
		return FALSE;

	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));

	memcpy(pElfInfo, &pTocentry->ElfInfo, sizeof(ELF_INFO));
	*pBytesReturned = sizeof(ELF_INFO);

	return TRUE;		
}

BOOL DEV_GetSegInfo(PROMFILE pFile, PMODULE_SEG pElfInfo, DWORD nOutBufSize, LPDWORD pBytesReturned)
{
	UINT	index, FileMode;
	LPTOCentry		pTocentry;

	if(!ROM_FindFile(pFile->cFileName, &index, &FileMode))
		return FALSE;

⌨️ 快捷键说明

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