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

📄 romfs.c

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

/*****************************************************
文件说明:rom文件系统
版本号:1.0.0
开发时期:2003-04-40
作者:ZB
修改记录:
	1. 2003-09-13...zb:  add function ROM_GetDiskFreeSpace for shell .
遗留问题:
	1. 2003-09-13...zb:  如何防止其他程序copy XIP文件
******************************************************/

#include <ewindows.h>
#include <efsdmgr.h>
#include <epalloc.h>
#include <edevice.h>
#include <Eassert.h>
#include <romfs.h>

#include <romheader.h>
#include <devdrv.h>
//#include <Rom_m.h>
//#include <VCDioctr.h>
//#include <ROMdisk.h>

//#define FSDAPI VCDFSD

//#include "CDMDAta.h"
//#include "CDMFSD.h"
//#include "extern.h"




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

const ROMHDR * pTOC;


struct _FSDDRV RomFSDDrv = {
	&ROM_CloseFile,
//	&ROM_CloseVolume,
	NULL,	
//	&ROM_CreateDirectoryW,
	NULL,
	&ROM_CreateFileW,
//	&ROM_DeleteAndRenameFileW,
	NULL,
//	&ROM_DeleteFileW,
	NULL,
	&ROM_DeviceIoControl,	//have not implement.	
	&ROM_FindClose,
	&ROM_FindFirstFileW,
	&ROM_FindNextFileW,
//	&ROM_FlushFileBuffers,
	NULL,
	&ROM_GetDiskFreeSpace,
//	NULL,
	&ROM_GetFileAttributesW,
//	&ROM_GetFileInformationByHandle,
	NULL,
	&ROM_GetFileSize,
	&ROM_GetFileTime,
	&ROM_MountDisk,
//	&ROM_MoveFileW,
	NULL,
//	&ROM_Notify,				//have not implement.
	NULL,
	&ROM_ReadFile,
//	&ROM_ReadFileWithSeek,	//don't have.
	NULL,
	&ROM_RegisterFileSystemFunction,
//	&ROM_RemoveDirectoryW,
	NULL,
//	&ROM_SetEndOfFile,
	NULL,
//	&ROM_SetFileAttributesW,
	NULL,
	&ROM_SetFilePointer,
//	&ROM_SetFileTime,
	NULL,
	&ROM_UnmountDisk,
//	&ROM_WriteFile,
	NULL,
//	&ROM_WriteFileWithSeek,
	NULL,
	//&ROM_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;
	}		
}

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

}

void InitRomFsd(void)
{
	//
	//Add for get pToc by zb...2003-7-1.
	//
	

	pTOC = (const ROMHDR *)GetSysTOC();
	//RETAILMSG(1, (TEXT("InitRomFsd,pTOC=0x%x!\r\n"), pTOC));

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

	if(!RegisterRomFSD())
		DeinitRomFsd();

	//return TRUE;
}

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

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

	pVolume = CreateVolume(hDisk  );
	if( pVolume ==NULL )
		return FALSE;

    return HELP_RegisterVolume(  pVolume );

}
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
BOOL  ROM_UnmountDisk(HDSK hDisk)
{
	PROMVOLUME pVol , pVolDel;
	HVOL              hVol;
	BOOL       status=FALSE;

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

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

		if( pVolumeList->hDevice ==hDisk ){

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

				if( pVol->next->hDevice ==hDisk)
				{
					RETAILMSG(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);

	RETAILMSG(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 );
		free( pVolDel );
		LeaveCriticalSection(&crit_this );

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

	}else{
		SetLastError( ERROR_INVALID_HANDLE);
		RETAILMSG(ZONE_MOUNT, (TEXT("romfs: UnMountDisk  failed\r\n"),hDisk));
	}
	RETAILMSG(ZONE_MOUNT, (TEXT("romfs: UnMountDisk  leaved\r\n")));
	return status;
}


BOOL ROM_GetDiskFreeSpace( PVOL pVolume, LPCTSTR lpcszPathName, LPDWORD pSectorsPerCluster, LPDWORD pBytesPerSector, LPDWORD pFreeClusters, LPDWORD pClusters )
{

	PROMVOLUME			pVol=(PROMVOLUME)pVolume;

	RETAILMSG(ZONE_FILE, (TEXT("romfs:  ROM_GetDiskFreeSpace\r\n")));

	//RETAILMSG(1, ("romfs: %s\r\n",lpcszPathName));

	if(stricmp(lpcszPathName,"\\") != 0){
		RETAILMSG(1, ("romfs: not the kingmos path!\r\n"));
		return FALSE;
	}

	if( ! HELP_IsVolume(pVol ) ){

		RETAILMSG(ZONE_ERROR, (TEXT("romfs: ROM_GetDiskFreeSpace volume  %x is invalid\r\n"),pVol));
		return  FALSE;
	}
	
 
	*pSectorsPerCluster	= 1;
	*pFreeClusters		= 0;
	*pBytesPerSector	= 512;
	*pClusters = (pTOC->physlast - pTOC->physfirst) / *pBytesPerSector;
	

	RETAILMSG(ZONE_DISK, (TEXT("CDMFSD:  GetDiskFreeSpace succeeded!   \r\n")));
	return TRUE;
}

//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
BOOL    ROM_RegisterFileSystemFunction(PVOL pVolume, SHELLFILECHANGEFUNC pfn)
{
	PROMVOLUME  pVol=(PROMVOLUME)pVolume;
	
	RETAILMSG(ZONE_MOUNT, (TEXT("romfs:  ROM_RegisterFileSystemFunction entered %x\r\n"),pfn));

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

	(*pfn)(&FileChanger);

	return TRUE;
}
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
void    ROM_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(!HELP_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(!HELP_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(!HELP_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(!HELP_FindFile(pFile->cFileName, &index, &FileMode))
		return FALSE;

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

	RETAILMSG(ZONE_DEBUG, (TEXT("elf info:.........\r\n")));
	RETAILMSG(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(!HELP_FindFile(pFile->cFileName, &index, &FileMode))
		return FALSE;

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

	RETAILMSG(ZONE_DEBUG, (TEXT("elf info:.........\r\n")));
	RETAILMSG(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);
		RETAILMSG(ZONE_DEBUG, (TEXT("romfs:### %x:%x\r\n"),sizeof(MODULE_SEG),*pBytesReturned ));
		return TRUE;		
	}
	//if the module no res, set flag: 0;
	*pBytesReturned = 0;
	RETAILMSG(ZONE_DEBUG, (TEXT("romfs:!!!### %x\r\n"),*pBytesReturned ));
	return TRUE;

	//return FALSE;	
}


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

	RETAILMSG(ZONE_OUT, (TEXT("ROM_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:
		RETAILMSG(ZONE_DEBUG, (TEXT("ROMFS: unknown iocontrolcode...\r\n")));
	}

	//do action ....
	switch(dwIoControlCode)
	{
	case IOCTL_ROM_GET_ELF_INFO:
		RETAILMSG(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:
		RETAILMSG(ZONE_DEBUG, (TEXT("ROMFS: unknown iocontrolcode...\r\n")));
	}

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


HANDLE ROM_CreateFileW( 
		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;

	RETAILMSG(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 ) 
	{		
		RETAILMSG(ZONE_ERROR, (TEXT("romfs: CreatFile  take error parameter\r\n")));
		SetLastError( ERROR_INVALID_PARAMETER);
		return INVALID_HANDLE_VALUE;
	}

	if( ! HELP_IsVolume(pVolume ) ){

		RETAILMSG(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 = malloc(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,NULL);
		if(pSearch == INVALID_HANDLE_VALUE)
			goto  Error_Return;
		
		free(pSearch);

		//The line is removed by zb...2003-07-12...
		//HELP_FindFirstFile have <strcpy>!
		//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")));
		

⌨️ 快捷键说明

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