📄 klmisc.c
字号:
/******************************************************
Copyright(c) 版权所有,1998-2003微逻辑。保留所有权利。
******************************************************/
/*****************************************************
文件说明:杂凑功能
版本号:2.0.0
开发时期:2000
作者:李林
修改记录:
2003-06-18, 加入对ROM Filesys的支持
******************************************************/
#include <eframe.h>
#include <eapisrv.h>
#include <eufile.h>
#include <eugwme.h>
#include <eutable.h>
#include <epcore.h>
#include <eobjcall.h>
#include <coresrv.h>
#include <kromfs.h>
#include <epalloc.h>
#include <oemfunc.h>
#define DEBUG_FILE 0
// ********************************************************************
//声明:BOOL WINAPI KL_CloseFile( HANDLE hFile )
//参数:
// hFile - 文件句柄(由CreateFile创建并返回句柄)
//返回值:
// 假如成功,返回TURE;否则,返回FALSE
//功能描述:
// 关闭文件
//引用:
// 由内核使用
// ********************************************************************
typedef BOOL ( WINAPI * PFILE_CLOSEFILE )( HANDLE );
#define DEBUG_KL_CloseFile 0
BOOL WINAPI KL_CloseFile( HANDLE hFile )
{
PFILE_CLOSEFILE pCloseFile;
CALLSTACK cs;
//CALLSTACK * lpcs = KHeap_Alloc( sizeof( CALLSTACK ) );
BOOL retv = FALSE;
// 得到服务功能入口并切换到服务进程空间
if( KC_EnterAPIHandle( API_FILESYS, FILE_CLOSEFILE, &pCloseFile, &cs, &hFile ) )
{
retv = pCloseFile( hFile );
// 离开服务
KL_LeaveAPI();
}
#ifndef INLINE_PROGRAM
else
{ // ROM filesys only
HANDLE hf;
hf = HandleToPtr( hFile, -1 );
DEBUGMSG( DEBUG_KL_CloseFile, ( "call builtin CloseFile,h=0x%x,p=0x%x.\r\n",hFile, hf ) );
retv = ROM_CloseFile( hf );
}
#endif
return retv;
}
// ********************************************************************
//声明:HANDLE WINAPI KL_CreateFile( LPCTSTR lpcszFileName,
// DWORD dwAccess,
// DWORD dwShareMode,
// PSECURITY_ATTRIBUTES pSecurityAttributes,
// DWORD dwCreate,
// DWORD dwFlagsAndAttributes,
// HANDLE hTemplateFile )
//
//参数:
// lpcszFileName-文件名
// fAccess-存取控制,由以下值的位组合:
// GENERIC_WRITE-读操作
// GENERIC_READ-写操作
// dwShareMode-共享模式,由以下值的位组合:
// FILE_SHARE_READ-共享读
// FILE_SHARE_WRITE-共享写
// pSecurityAttributes-安全设置(不支持,为NULL)
// dwCreate-创建方式,包含:
// CREATE_NEW-创建新文件;假如文件存在,则失败
// CREATE_ALWAYS-创建文件;假如文件存在,则覆盖它
// OPEN_EXISTING-打开文件;假如文件不存在,则失败
// OPEN_ALWAYS-打开文件;假如文件不存在,则创建
// dwFlagsAndAttributes-文件属性
// hTemplateFile-临时文件句柄(不支持,为NULL)
//返回值:
// 假如成功,返回有效的文件句柄;否则,返回INVALID_HANDLE_VALUE
//功能描述:
// 打开文件
//引用:
// 由内核使用
// ********************************************************************
#define DEBUG_KL_CreateFile 0
typedef HANDLE ( WINAPI * PFILE_CREATEFILE )( LPCTSTR lpcszFileName, DWORD dwAccess, DWORD dwShareMode, PSECURITY_ATTRIBUTES pSecurityAttributes, DWORD dwCreate, DWORD dwFlagsAndAttributes, HANDLE hTemplateFile );
HANDLE WINAPI KL_CreateFile( LPCTSTR lpcszFileName,
DWORD dwAccess,
DWORD dwShareMode,
PSECURITY_ATTRIBUTES pSecurityAttributes,
DWORD dwCreate,
DWORD dwFlagsAndAttributes,
HANDLE hTemplateFile )
{
PFILE_CREATEFILE pCreateFile;
CALLSTACK cs;
//CALLSTACK * lpcs = KHeap_Alloc( sizeof( CALLSTACK ) );
HANDLE retv = NULL;
// 得到服务功能入口并切换到服务进程空间
if( KC_EnterAPI( API_FILESYS, FILE_CREATEFILE, &pCreateFile, &cs ) )
{
lpcszFileName = MapProcessPtr( lpcszFileName, (LPPROCESS)cs.lpvData );
pSecurityAttributes = MapProcessPtr( pSecurityAttributes, (LPPROCESS)cs.lpvData );
retv = pCreateFile( lpcszFileName, dwAccess, dwShareMode, pSecurityAttributes, dwCreate, dwFlagsAndAttributes, hTemplateFile );
KL_LeaveAPI( );
}
#ifndef INLINE_PROGRAM
else
{ // ROM Filesys only
HANDLE h;
h = retv = ROM_CreateFile( lpcszFileName, dwAccess, dwShareMode, pSecurityAttributes, dwCreate, dwFlagsAndAttributes, hTemplateFile );
//2004-10-21, add code
if( retv != INVALID_HANDLE_VALUE )
{
retv = (HANDLE)Handle_Alloc( lpCurThread->lpCurProcess, h, OBJ_FILE );
//retv = (HANDLE)Handle_Alloc( 0, h, OBJ_FILE );
}
DEBUGMSG( DEBUG_KL_CreateFile, ( "call builtin CreateFile=%s,h=0x%x,p=0x%x,lpCurThread->lpCurProcess=0x%x.\r\n",lpcszFileName, retv, h, lpCurThread->lpCurProcess ) );
}
#endif
//KHeap_Free( lpcs, sizeof( CALLSTACK ) );
return retv;
}
// ********************************************************************
//声明:DWORD WINAPI KL_GetFileAttributes( LPCTSTR lpcszFileName )
//参数:
// lpcszFileName-文件名
//返回值:
// 假如成功,返回属性;否则,返回0xFFFFFFFF
//功能描述:
// 得到文件属性
//引用:
// 由内核使用
// ********************************************************************
#define DEBUG_KL_GetFileAttributes 0
typedef DWORD ( WINAPI * PFILE_GETATTRIBUTES )( LPCTSTR lpcszFileName );
DWORD WINAPI KL_GetFileAttributes( LPCTSTR lpcszFileName )
{
PFILE_GETATTRIBUTES pGetAttributes;
CALLSTACK cs;
//CALLSTACK * lpcs = KHeap_Alloc( sizeof( CALLSTACK ) );
DWORD retv = -1;
if( KC_EnterAPI( API_FILESYS, FILE_GETATTRIBUTES, &pGetAttributes, &cs ) )
{
//RETAILMSG( 1, ( "filesys GetFileAttributes=%s.\r\n",lpcszFileName ) );
lpcszFileName = MapProcessPtr( lpcszFileName, (LPPROCESS)cs.lpvData );
retv = pGetAttributes( lpcszFileName );
KL_LeaveAPI( );
}
#ifndef INLINE_PROGRAM
else
{ // ROM Filesys only
DEBUGMSG( DEBUG_KL_GetFileAttributes, ( "call builtin filesys GetFileAttributes=%s.\r\n",lpcszFileName ) );
retv = ROM_GetFileAttributes( lpcszFileName );
}
#endif
// KHeap_Free( lpcs, sizeof( CALLSTACK ) );
return retv;
}
// ********************************************************************
//声明:BOOL WINAPI KL_ReadFile( HANDLE hFile,
// LPVOID lpvBuffer,
// DWORD dwNumToRead,
// LPDWORD lpdwNumRead,
// LPOVERLAPPED lpOverlapped )
//参数:
// hFile-文件句柄
// lpvBuffer-用于接受数据的内存
// dwNumToRead-欲读的字节数
// lpdwNumRead-返回实际读的字节数;假如lpdwNumRead为NULL,则不返回
// lpOverlapped-覆盖(不支持,为NULL)
//返回值:
// 假如成功,返回TRUE,lpdwNumRead保存实际读的数据;否则,返回FALSE
//功能描述:
// 从文件里读数据
//引用:
// 由内核使用
// ********************************************************************
#define DEBUG_KL_ReadFile 0
typedef BOOL ( WINAPI * PFILE_READ )( HANDLE hFile, LPVOID lpvBuffer, DWORD dwNumToRead, LPDWORD lpdwNumRead, LPOVERLAPPED lpOverlapped );
BOOL WINAPI KL_ReadFile( HANDLE hFile,
LPVOID lpvBuffer,
DWORD dwNumToRead,
LPDWORD lpdwNumRead,
LPOVERLAPPED lpOverlapped )
{
PFILE_READ pRead;
CALLSTACK cs;
// CALLSTACK * lpcs = KHeap_Alloc( sizeof( CALLSTACK ) );
BOOL retv = FALSE;
if( KC_EnterAPIHandle( API_FILESYS, FILE_READ, &pRead, &cs, &hFile ) )
{
lpvBuffer = MapProcessPtr( lpvBuffer, (LPPROCESS)cs.lpvData );
lpdwNumRead = MapProcessPtr( lpdwNumRead, (LPPROCESS)cs.lpvData );
lpOverlapped = MapProcessPtr( lpOverlapped, (LPPROCESS)cs.lpvData );
retv = pRead( hFile, lpvBuffer, dwNumToRead, lpdwNumRead, lpOverlapped );
KL_LeaveAPI( );
}
#ifndef INLINE_PROGRAM
else
{ // ROM Filesys only
DEBUGMSG( DEBUG_KL_ReadFile, ( "call builtin filesys ReadFile, handle=0x%x.\r\n",hFile ) );
hFile = HandleToPtr( hFile, -1 );
retv = ROM_ReadFile( hFile, lpvBuffer, dwNumToRead, lpdwNumRead, lpOverlapped );
}
#endif
//KHeap_Free( lpcs, sizeof( CALLSTACK ) );
return retv;
}
// ********************************************************************
//声明:BOOL WINAPI KL_WriteFile( HANDLE hFile,
// LPCVOID lpvBuffer,
// DWORD dwNumToWrite,
// LPDWORD lpdwNumWrite,
// LPOVERLAPPED pOverlapped )
//参数:
// hFile-文件句柄
// lpvBuffer-欲写的数据的存放内存
// dwNumToWrite-欲写的字节数
// lpdwNumWrite-返回实际写的字节数;假如lpdwNumWrite为NULL,则不返回
// pOverlapped-覆盖(不支持,为NULL)
//返回值:
// 假如成功,返回TRUE,lpdwNumWrite保存实际写的数据;否则,返回FALSE
//功能描述:
// 写数据到文件
//引用:
// 由内核使用
// ********************************************************************
typedef BOOL ( WINAPI * PFILE_WRITE )( HANDLE hFile, LPCVOID lpvBuffer, DWORD dwNumToWrite, LPDWORD lpdwNumWrite, LPOVERLAPPED pOverlapped );
BOOL WINAPI KL_WriteFile( HANDLE hFile,
LPCVOID lpvBuffer,
DWORD dwNumToWrite,
LPDWORD lpdwNumWrite,
LPOVERLAPPED pOverlapped )
{
PFILE_WRITE pWrite;
CALLSTACK cs;
// CALLSTACK * lpcs = KHeap_Alloc( sizeof( CALLSTACK ) );
BOOL retv = FALSE;
if( KC_EnterAPIHandle( API_FILESYS, FILE_WRITE, &pWrite, &cs, &hFile ) )
{
lpvBuffer = MapProcessPtr( lpvBuffer, (LPPROCESS)cs.lpvData );
lpdwNumWrite = MapProcessPtr( lpdwNumWrite, (LPPROCESS)cs.lpvData );
pOverlapped = MapProcessPtr( pOverlapped, (LPPROCESS)cs.lpvData );
retv = pWrite( hFile, lpvBuffer, dwNumToWrite, lpdwNumWrite, pOverlapped );
KL_LeaveAPI( );
}
else
{
}
//KHeap_Free( lpcs, sizeof( CALLSTACK ) );
return retv;
}
// ********************************************************************
//声明:DWORD WINAPI KL_SetFilePointer( HANDLE hFile,
// LONG lDistanceToMove,
// LPLONG lpDistanceToMoveHigh,
// DWORD dwMoveMethod )
//参数:
//hFile-文件句柄
//lDistance-相对偏移值
//lpDistanceHigh-(高32bits,不支持,为NULL)
//dwMethod-偏移的起始位置,包含:
// FILE_BEGIN-文件开始位置
// FILE_CURRENT-文件当前位置
// FILE_END-文件结束位置
//返回值:
// 假如成功,返回返回新的文件位置;否则,返回0xffffffff
//功能描述:
// 设置存取文件位置
//引用:
// 由内核使用
// ********************************************************************
typedef DWORD ( WINAPI * PFILE_SETPOINTER )( HANDLE hFile, LONG lDistanceToMove, LPLONG lpDistanceToMoveHigh, DWORD dwMoveMethod );
DWORD WINAPI KL_SetFilePointer( HANDLE hFile,
LONG lDistanceToMove,
LPLONG lpDistanceToMoveHigh,
DWORD dwMoveMethod )
{
PFILE_SETPOINTER pSetPointer;// = (PRGN_EQUAL)lpRgnAPI[RGN_EQUAL];
CALLSTACK cs;
// CALLSTACK * lpcs = KHeap_Alloc( sizeof( CALLSTACK ) );
BOOL retv = FALSE;
if( KC_EnterAPIHandle( API_FILESYS, FILE_SETPOINTER, &pSetPointer, &cs, &hFile ) )
{
lpDistanceToMoveHigh = MapProcessPtr( lpDistanceToMoveHigh, (LPPROCESS)cs.lpvData );
retv = pSetPointer( hFile, lDistanceToMove, lpDistanceToMoveHigh, dwMoveMethod );
KL_LeaveAPI( );
}
#ifndef INLINE_PROGRAM
else
{
hFile = HandleToPtr( hFile, -1 );
retv = ROM_SetFilePointer( hFile, lDistanceToMove, lpDistanceToMoveHigh, dwMoveMethod );
}
#endif
//KHeap_Free( lpcs, sizeof( CALLSTACK ) );
return retv;
}
// ********************************************************************
//声明:BOOL WINAPI KL_DeviceIoControl(
// HANDLE hFile,
// DWORD dwIoControlCode,
// LPVOID lpInBuf,
// DWORD nInBufSize,
// LPVOID lpOutBuf,
// DWORD nOutBufSize,
// LPDWORD lpdwBytesReturned,
// LPOVERLAPPED lpOverlapped )
//参数:
//hFile-文件句柄
//dwIoControlCode-I/O控制命令,文件系统包含:
// IOCTL_DISK_SCAN_VOLUME-通知文件系统去扫描卷的错误
// IOCTL_DISK_FORMAT_VOLUME-通知文件系统去格式化卷
// lpInBuf-输入缓存
// nInBufSize-输入缓存的尺寸
// lpOutBuf-输出缓存
// nOutBufSize-输出缓存的尺寸
// lpBytesReturned-返回的数据的尺寸,该数据在返回时已存入lpOutBuf
// lpOverlapped-支持覆盖(不支持,为NULL)
//返回值:
// 假如成功,返回TRUE;否则,返回FALSE
//功能描述:
// 文件控制
//引用:
// 由内核使用
// ********************************************************************
typedef BOOL ( WINAPI * PFILE_DEVICEIOCONTROL )( HANDLE hFile, DWORD dwIoControlCode,LPVOID lpInBuf,DWORD nInBufSize,LPVOID lpOutBuf,DWORD nOutBufSize,LPDWORD lpdwBytesReturned,LPOVERLAPPED lpOverlapped );
BOOL WINAPI KL_DeviceIoControl(
HANDLE hFile,
DWORD dwIoControlCode,
LPVOID lpInBuf,
DWORD nInBufSize,
LPVOID lpOutBuf,
DWORD nOutBufSize,
LPDWORD lpdwBytesReturned,
LPOVERLAPPED lpOverlapped )
{
PFILE_DEVICEIOCONTROL pDeviceIoControl;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -