📄 romfs.c
字号:
/******************************************************
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 + -