📄 romfs.c
字号:
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);
return lpv;
//2004-10-21, remove to klmisc.c
// 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_FILE, (TEXT("romfs0: CreatFile take error parameter\r\n")));
SetLastError( ERROR_INVALID_PARAMETER);
return INVALID_HANDLE_VALUE;
}
if( ! ROM_IsVolume(pVolume ) ){
ERRORMSG(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 );
//RETAILMSG(ZONE_FILE, (TEXT("romfs: CreatFile before CriticalSection\r\n")));
EnterCriticalSection( &Crit_File ); // insert this node into list.
pFile->next = pFileList;
pFileList = pFile;
LeaveCriticalSection( &Crit_File);
DEBUGMSG(ZONE_FILE, (TEXT("romfs: CreatFile leaved %x\r\n"),pFile));
return (HANDLE)pFile;
}
Error_Return:
if( pFile )
KHeap_Free( pFile, sizeof( ROMFILE) );
//free(pFile);
DEBUGMSG(ZONE_FILE, (TEXT("romfs: CreatFile Failed\r\n")));
LeaveCriticalSection( &pVolume->cs_Volume );
return INVALID_HANDLE_VALUE;
}
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
DWORD ROM_GetFileAttributes(
LPCTSTR lpFileName // name of file or directory
)
{
return DoROM_GetFileAttributes( (PVOL)PDEF_ROMVOLUME, lpFileName);
}
#define DEBUG_DoROM_GetFileAttributes 0
static DWORD DoROM_GetFileAttributes(PVOL pVolume, LPCTSTR pwsFileName)
{
FILE_FIND_DATA File;
PROMSEARCH pSearch;
DWORD dwAttr=0xFFFFFFFF;
PROMVOLUME pVol=(PROMVOLUME)pVolume;
DEBUGMSG(ZONE_FILE|DEBUG_DoROM_GetFileAttributes, (TEXT("DoROM_GetFileAttributes: entered ( %s ).\r\n"),pwsFileName));
//RETAILMSG(ZONE_ERROR, (TEXT("romfs: %s\r\n"),pwsFileName));
//if((strcmp(pwsFileName, "\\hellores.exe") != 0) &&
// (strcmp(pwsFileName, "\\libtestdll1.so") != 0))
// ASSERT(0);
if( ! ROM_IsVolume(pVol ) ){
ERRORMSG(ZONE_ERROR, (TEXT("DoROM_GetFileAttributes: GetFileAttribute volume %x is invalid\r\n"),pVol));
return 0xFFFFFFFF;
}
//RETAILMSG(ZONE_FILE, (TEXT("romfs: DoROM_GetFileAttributesW %s before Crit\r\n"),pwsFileName));
EnterCriticalSection( &pVol->cs_Volume );
DEBUGMSG(DEBUG_DoROM_GetFileAttributes,(TEXT("DoROM_GetFileAttributes:call HELP_FindFirstFile.\r\n")));
pSearch=( PROMSEARCH )HELP_FindFirstFile(pVolume, pwsFileName, &File, FIND_NORMAL_CALL);
if((HANDLE) pSearch != INVALID_HANDLE_VALUE ) {
dwAttr=File.dwFileAttributes;
KHeap_Free(pSearch, sizeof( ROMSEARCH ));
DEBUGMSG(DEBUG_DoROM_GetFileAttributes, (TEXT("DoROM_GetFileAttributes: get attrib(%x).\r\n"),dwAttr ));
//RETAILMSG(ZONE_FILE, (TEXT("romfs: DoROM_GetFileAttributesW leaved %x\r\n"),dwAttr));
}
DEBUGMSG(DEBUG_DoROM_GetFileAttributes, (TEXT("DoROM_GetFileAttributes: LeaveCriticalSection.\r\n") ));
LeaveCriticalSection ( &pVol->cs_Volume );
DEBUGMSG(ZONE_FILE|DEBUG_DoROM_GetFileAttributes, (TEXT("DoROM_GetFileAttributes: leaved retv(%x).\r\n"),dwAttr ));
return dwAttr;
}
BOOL ROM_ReadFile(
HANDLE hFile, // handle to file
LPVOID lpBuffer, // data buffer
DWORD nNumberOfBytesToRead, // number of bytes to read
LPDWORD lpNumberOfBytesRead, // number of bytes read
LPOVERLAPPED lpOverlapped // overlapped buffer
)
{
return DoROM_ReadFile((PFILE)hFile, lpBuffer, nNumberOfBytesToRead, lpNumberOfBytesRead, lpOverlapped);
}
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
static BOOL DoROM_ReadFile(PFILE pF, PVOID pBufferOut, DWORD cbRead, LPDWORD pcbRead, LPOVERLAPPED pOverlapped)
{
PROMFILE pFile = (PROMFILE)pF;
PUCHAR pOut = (PUCHAR)pBufferOut;
// WORD wSectorSize;
// DWORD dwReadSectorNum; // this time, the how many sectors should be read out.
// DWORD dwReadStartSector; // which sector should start read from this time ?
// WORD wBytesBeforeSector; // before read the dwReadStartSector, how many bytes should be read,
// WORD wBytesAfterSector;//after read the dwReadStartSector, how many bytes should be read,
BOOL status = TRUE;
DEBUGMSG(ZONE_READ, (TEXT("romfs: ReadFile: < %x %x\r\n"),pFile,cbRead ));
if( ! HELP_IsFile( pFile) ){
WARNMSG(ZONE_READ, (TEXT("romfs: error pFile, ReadFile :> %x %x\r\n"),pFile,cbRead ));
return FALSE;
}
if( pBufferOut ==NULL || pcbRead==NULL )
{
SetLastError( ERROR_INVALID_PARAMETER);
WARNMSG(ZONE_READ, (TEXT("romfs: ReadFile :> %x %x\r\n"),pFile,cbRead ));
return FALSE;
}
EnterCriticalSection( & (pFile->cs_File) );
if( pFile->dwFilePointer >= pFile->nFileSizeLow ) {
WARNMSG(ZONE_READ, (TEXT("romfs: ReadFile reach EOF \r\n") ));
if( pcbRead )
*pcbRead = 0;
goto Error_Return;
}
cbRead = min( cbRead, ( pFile->nFileSizeLow - pFile->dwFilePointer ));
DEBUGMSG(ZONE_READ, (TEXT("romfs: ReadFile cbRead=%x \r\n"),cbRead ));
memcpy( pOut, (const void*)(pFile->dwFileBase + pFile->dwFilePointer), cbRead);
if( pcbRead != NULL ) {
*pcbRead = cbRead;
}
pFile->dwFilePointer += cbRead;
if( pFile->dwFilePointer > pFile->nFileSizeLow)
pFile->dwFilePointer = pFile->nFileSizeLow;
Error_Return:
LeaveCriticalSection( &pFile->cs_File);
DEBUGMSG(ZONE_READ, (TEXT("romfs: ReadFile leaved %x ,%x\r\n"),*pcbRead ,status ));
return status;
//return TRUE;
}
DWORD ROM_SetFilePointer(
HANDLE hFile, // handle to file
LONG lDistanceToMove, // bytes to move pointer
PLONG lpDistanceToMoveHigh, // bytes to move pointer
DWORD dwMoveMethod // starting point
)
{
return DoROM_SetFilePointer((PFILE)hFile, lDistanceToMove, lpDistanceToMoveHigh, dwMoveMethod);
}
static DWORD DoROM_SetFilePointer(PFILE pFileIn, LONG lDistanceToMove, LPLONG pDistanceToMoveHigh, DWORD dwMoveMethod)
{
DWORD dwPointer;
PROMFILE pFile=(PROMFILE)pFileIn;
BOOL status=TRUE;
DEBUGMSG(ZONE_FILE, (TEXT("romfs:SetFilePointer %d \r\n"),lDistanceToMove));
if( ! HELP_IsFile(pFile) ){
return 0xFFFFFFFF;
}
EnterCriticalSection( &(pFile->cs_File) );
switch( dwMoveMethod ) {
case FILE_CURRENT:
DEBUGMSG(ZONE_FILE, (TEXT("romfs: SetFilePointer in CURRENT \r\n")));
if( lDistanceToMove < 0 ){
if( (DWORD)ABS(lDistanceToMove) > pFile->dwFilePointer){
SetLastError( ERROR_NEGATIVE_SEEK );
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -