📄 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>
#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 + -