📄 romfs.c
字号:
/******************************************************
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>
#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 ){
WARNMSG(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)
{
WARNMSG(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);
WARNMSG(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;
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);
// 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_ERROR, (TEXT("romfs0: CreatFile take error parameter\r\n")));
SetLastError( ERROR_INVALID_PARAMETER);
return INVALID_HANDLE_VALUE;
}
if( ! ROM_IsVolume(pVolume ) ){
WARNMSG(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 );
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -