⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 klmisc.c

📁 深圳市微逻辑电子有限公司 巨果&#8226 Kingmos&reg 系统核心
💻 C
📖 第 1 页 / 共 2 页
字号:
/******************************************************
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 + -