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

📄 device.c

📁 深圳市微逻辑电子有限公司 巨果&#8226 Kingmos&reg 系统核心
💻 C
📖 第 1 页 / 共 4 页
字号:
//							 DWORD dwAccess, 
//							 DWORD dwShareMode, 
//							 HANDLE hProc )
// 参数:
//		IN lpszName - 设备名,例如"COM0:","PRN1:" 
//		IN dwAccess - 存取属性
//		IN dwShareMode - 共享模式
//		IN hProc - 拥有者进程句柄
// 返回值:
//		假如成功,返回有效的文件句柄;失败,返回INVALID_HANDLE_VALUE
// 功能描述:
//		打开指定的设备
// 引用: 
//		系统API
// *****************************************************************
#define DEBUG_DEVICE_CREATEFILE 0
HANDLE WINAPI Device_CreateFile( LPCTSTR lpszName, 
							 DWORD dwAccess, 
							 DWORD dwShareMode, 
							 HANDLE hProc )
{
    LPDEVICE_OPEN_FILE lpOpenFile = NULL;
	LPDEVICE_DATA lpDevObj;
	UINT index;

	DEBUGMSG( DEBUG_DEVICE_CREATEFILE, ( "Device_CreateFile: lpszDevName=%s,dwAccess=0x%x,dwShareMode=0x%x.\r\n", lpszName, dwAccess, dwShareMode ) );

	// 检查参数
	if( lpszName == NULL )
	{
		return INVALID_HANDLE_VALUE;  
	}
    if( strlen( lpszName ) < 4 )
		return INVALID_HANDLE_VALUE;
	if( *(lpszName + 3) < '0' || *(lpszName + 3) > '9' )
		return INVALID_HANDLE_VALUE;
	
	index = *(lpszName + 3) - '0';

	if( (lpDevObj = (LPDEVICE_DATA)FindDevice( lpszName, index ) ) ) // 在系统设备对象链表里查找是否有该设备
	{	//系统已经注册
		DEBUGMSG( DEBUG_DEVICE_CREATEFILE, ( "Device_CreateFile: has find device=%s.\r\n", lpszName ) );
		//分配/准备打开设备对象数据结构
		lpOpenFile = malloc( sizeof(DEVICE_OPEN_DATA) );
		if( lpOpenFile )
		{
			lpOpenFile->hProcess = hProc;
			lpOpenFile->lpDev = lpDevObj;
			//调用设备驱动程序的打开函数
			lpOpenFile->hDevOpen = 0;
			if( Sys_CaptureException() == EXCEPTION_NO_ERROR )
			{
				lpOpenFile->hDevOpen = lpDevObj->lpDriver->lpOpen( lpDevObj->hDevInit, dwAccess, dwShareMode );
				Sys_ReleaseException();
			}
			if( lpOpenFile->hDevOpen )  //打开成功 ?
			{  // 是
				Interlock_Increment( (LPLONG)&lpDevObj->obj.iRefCount ); // 增加对该设备的引用数
				//加入打开链表
			    ObjList_Init( (LPOBJLIST*)&lpDeviceOpenObjList, &lpOpenFile->obj, OBJ_DEVOPEN, (ULONG)hProc );
				return (HANDLE)lpOpenFile;
			}
			else
			{
				WARNMSG( DEBUG_DEVICE_CREATEFILE, ( "Device_CreateFile: Dev_Open return NULL.\r\n" ) );
			}
		}
		else
		{
			WARNMSG( DEBUG_DEVICE_CREATEFILE, ( "Device_CreateFile: no enougn memory.\r\n" ) );
		}
		if( lpOpenFile )
		{
		    free( lpOpenFile );
		    lpOpenFile = NULL;
		}
	}
	else
	{
		WARNMSG( DEBUG_DEVICE_CREATEFILE, ( "Device_CreateFile: not find the device(%s).\r\n", lpszName ) );
	}
//	WARNMSG( DEBUG_DEVICE_CREATEFILE, ( "Device_CreateFile: not find the device(%s) or no memory!.\r\n", lpszName ) );
	return INVALID_HANDLE_VALUE;  
}

// *****************************************************************
// 声明:BOOL WINAPI Device_CloseFile( HANDLE hOpenFile )
// 参数:
//		IN hOpenFile - 调用Device_Create返回的句柄 
// 返回值:
//		假如成功,返回TRUE;否则,返回FALSE
// 功能描述:
//		关闭之前打开的设备
// 引用: 
//		系统API
// *****************************************************************

BOOL WINAPI Device_CloseFile( HANDLE hOpenFile )
{
    BOOL bRetv = FALSE;
	LPDEVICE_OPEN_FILE lpOpenFile = (HANDLE)hOpenFile;

	if( lpOpenFile && lpOpenFile->obj.objType == OBJ_DEVOPEN )
	{	// 从对象链表移出
		ObjList_Remove( (LPOBJLIST*)&lpDeviceOpenObjList , &lpOpenFile->obj );
		if( Sys_CaptureException() == EXCEPTION_NO_ERROR )
		{
			if( lpOpenFile->lpDev )
				lpOpenFile->lpDev->lpDriver->lpClose( lpOpenFile->hDevOpen ); // 调用设备驱动程序的关闭函数
			Sys_ReleaseException();
		}
		lpOpenFile->obj.objType = OBJ_NULL;
		free( lpOpenFile );
		bRetv = TRUE;
	}
	return bRetv;
}

// *****************************************************************
// 声明:BOOL WINAPI Device_ReadFile( 
//				  HANDLE hOpenFile,
//				  LPVOID lpvBuffer, 
//				  DWORD dwBytesToRead, 
//				  LPDWORD lpdwNumBytesRead,
//				  LPOVERLAPPED lpOverlapped )
// 参数:
//		IN hOpenFile - 打开文件句柄
//		OUT lpvBuffer - 读入数据的内存
//		IN dwBytesToRead - 需要读的数据大小
//		IN lpdwNumBytesRead - 用来接受真实读取的数据大小
//		IN lpOverlapped - 不支持(必须为NULL)
// 返回值:
//		假如成功,返回TRUE;否则,返回FALSE
// 功能描述:
//		从设备读取数据
// 引用: 
//		系统API
// *****************************************************************

BOOL WINAPI Device_ReadFile( 
				  HANDLE hOpenFile,
				  LPVOID lpvBuffer, 
				  DWORD dwBytesToRead, 
				  LPDWORD lpdwNumBytesRead,
				  LPOVERLAPPED lpOverlapped )
{
    LPDEVICE_OPEN_FILE lpOpenFile = _GetHDEVFilePtr( hOpenFile );
    BOOL bRetv = FALSE;

	if( lpOpenFile )
	{	//简单调用设备驱动程序的读函数
		*lpdwNumBytesRead = 0xffffffff;
		if( Sys_CaptureException() == EXCEPTION_NO_ERROR )
		{
			*lpdwNumBytesRead = lpOpenFile->lpDev->lpDriver->lpRead( lpOpenFile->hDevOpen, lpvBuffer, dwBytesToRead );
			Sys_ReleaseException();
		}
		if( *lpdwNumBytesRead == 0xffffffff )
			*lpdwNumBytesRead = 0;
		else
			bRetv = TRUE;
	}
	return bRetv;

}

// *****************************************************************
// 声明:BOOL WINAPI Device_WriteFile( 
//				   HANDLE hOpenFile, 
//				   LPCVOID lpvBuffer, 
//				   DWORD dwBytesToWrite,
//				   LPDWORD lpdwNumBytesWritten,
//				   LPOVERLAPPED lpOverlapped )
// 参数:
//		IN hOpenFile - 打开文件句柄
//		OUT lpvBuffer - 写入设备的数据内存
//		IN dwBytesToWrite - 需要写的数据大小
//		IN lpdwNumBytesWritten - 用来接受真实写的数据大小
//		IN lpOverlapped - 不支持(必须为NULL)
// 返回值:
//		假如成功,返回TRUE;否则,返回FALSE
// 功能描述:
//		写数据到设备
// 引用: 
//		系统API
// *****************************************************************

BOOL WINAPI Device_WriteFile( 
				   HANDLE hOpenFile, 
				   LPCVOID lpvBuffer, 
				   DWORD dwBytesToWrite,
				   LPDWORD lpdwNumBytesWritten,
				   LPOVERLAPPED lpOverlapped )
{
    LPDEVICE_OPEN_FILE lpOpenFile = _GetHDEVFilePtr( hOpenFile );
    BOOL bRetv = FALSE;

	*lpdwNumBytesWritten = 0;
	if( lpOpenFile )
	{	//简单调用设备驱动程序的写函数
		*lpdwNumBytesWritten = 0xffffffff;
		if( Sys_CaptureException() == EXCEPTION_NO_ERROR )
		{
			*lpdwNumBytesWritten = lpOpenFile->lpDev->lpDriver->lpWrite( lpOpenFile->hDevOpen, lpvBuffer, dwBytesToWrite );
			Sys_ReleaseException();
		}
		if( *lpdwNumBytesWritten == 0xffffffff )
			*lpdwNumBytesWritten = 0;
		else
			bRetv = TRUE;
	}
	return bRetv;
}

// *****************************************************************
// 声明:BOOL WINAPI Device_FlushFileBuffers( HANDLE hOpenFile ) 
// 参数:
//		IN hOpenFile - 打开文件句柄
// 返回值:
//		假如成功,返回TRUE;否则,返回FALSE
// 功能描述:
//		将所有数据刷新到设备
// 引用: 
//		系统API
// *****************************************************************

BOOL WINAPI Device_FlushFileBuffers( HANDLE hOpenFile ) 
{	//暂时不支持
    SetLastError(ERROR_INVALID_FUNCTION);
    return FALSE;
}

// *****************************************************************
// 声明:BOOL WINAPI Device_SetFileTime(
// 				     HANDLE hOpenFile, 
//					 CONST FILETIME *lpCreation, 
//					 CONST FILETIME *lpLastAccess, 
//					 CONST FILETIME *lpLastWrite ) 
// 参数:
//		IN hOpenFile - 打开文件句柄
//		IN lpCreation - 文件创建时间 
//		IN lpLastAccess - 文件最后存取时间
//		IN lpLastWrite  - 文件最后写入时间
// 返回值:
//		假如成功,返回TRUE;否则,返回FALSE
// 功能描述:
//		设置文件时间
// 引用: 
//		系统API
// *****************************************************************

BOOL WINAPI Device_SetFileTime(
 				     HANDLE hOpenFile, 
					 CONST FILETIME *lpCreation, 
					 CONST FILETIME *lpLastAccess, 
					 CONST FILETIME *lpLastWrite ) 
{
    SetLastError(ERROR_INVALID_FUNCTION);
    return FALSE;
}

// *****************************************************************
// 声明:BOOL WINAPI Device_GetFileTime(
// 				     HANDLE hOpenFile, 
//					 LPFILETIME lpftCreation, 
//					 LPFILETIME lpftLastAccess, 
//					 LPFILETIME lpftLastWrite ) 
// 参数:
//		IN hOpenFile - 打开文件句柄
//		OUT lpftCreation - 文件创建时间 
//		OUT lpftLastAccess - 文件最后存取时间
//		OUT lpftLastWrite  - 文件最后写入时间
// 返回值:
//		假如成功,返回TRUE;否则,返回FALSE
// 功能描述:
//		得到文件时间
// 引用: 
//		系统API
// *****************************************************************

BOOL WINAPI Device_GetFileTime(
					HANDLE hOpenFile, 
					LPFILETIME lpftCreation, 
					LPFILETIME lpftLastAccess, 
					LPFILETIME lpftLastWrite ) 
{
    SetLastError(ERROR_INVALID_FUNCTION);
    return FALSE;
}

// *****************************************************************
// 声明:DWORD WINAPI Device_GetFileSize( 
//						HANDLE hOpenFile, 
//						LPDWORD lpdwFileSizeHigh )

// 参数:
//		IN hOpenFile - 打开文件句柄
//		IN lpdwFileSizeHigh - 文件大小的高32位数据
// 返回值:
//		假如成功,返回文件大小的低32位数据,lpdwFileSizeHigh为文件大小的高32位数据;否则,返回0xffffffff
// 功能描述:
// 引用:
//		系统API 
// *****************************************************************

DWORD WINAPI Device_GetFileSize( 
						HANDLE hOpenFile, 
						LPDWORD lpdwFileSizeHigh )
{
    *lpdwFileSizeHigh = 0;
	SetLastError(ERROR_INVALID_FUNCTION);
    return 0xffffffff;
}

// *****************************************************************
// 声明:DWORD WINAPI Device_SetFilePointer(
//						 HANDLE hOpenFile, 
//						 LONG lDistanceToMove, 
//						 PLONG lpDistanceToMoveHigh,
//						 DWORD dwMoveMethod ) 
//
// 参数:
//		IN hOpenFile - 打开文件句柄
//		IN lDistanceToMove - 移动距离的低32位数据
//		IN lpDistanceToMoveHigh - 假如有的话,移动距离的高32位数据
//		IN dwMoveMethod  - 移动方法
// 返回值:
//		假如成功,返回当前的值;否则,返回0xffffffff
// 功能描述:
//		设置文件当前位置
// 引用: 
//		系统API
// *****************************************************************

DWORD WINAPI Device_SetFilePointer(
						 HANDLE hOpenFile, 
						 LONG lDistanceToMove, 
						 PLONG lpDistanceToMoveHigh,
						 DWORD dwMoveMethod ) 
{
    LPDEVICE_OPEN_FILE lpOpenFile = _GetHDEVFilePtr( hOpenFile );

    DWORD dwRetv = 0xffffffff;
    DWORD dodec = 0;

	if( lpOpenFile )
	{	// 简单调用设备驱动程序的定位函数
		if( Sys_CaptureException() == EXCEPTION_NO_ERROR )
		{
			dwRetv = lpOpenFile->lpDev->lpDriver->lpSeek( lpOpenFile->hDevOpen, lDistanceToMove, dwMoveMethod );
			Sys_ReleaseException();
		}
	}
    return dwRetv;
}

// *****************************************************************
// 声明:BOOL WINAPI Device_SetEndOfFile( HANDLE hOpenFile )
// 参数:
//		IN hOpenFile - 打开文件句柄
// 返回值:
//		假如成功,返回TRUE; 否则,返回FALSE
// 功能描述:
//		设置文件结束位置
// 引用: 
//		系统API
// *****************************************************************

BOOL WINAPI Device_SetEndOfFile( HANDLE hOpenFile )
{
    SetLastError(ERROR_INVALID_FUNCTION);
    return FALSE;
}

// *****************************************************************
// 声明:BOOL WINAPI Device_GetFileInformationByHandle(
//									HANDLE hOpenFile,
//									LPBY_HANDLE_FILE_INFORMATION lpFileInfo )

// 参数:
//		IN hOpenFile - 打开文件句柄
//		OUT lpFileInfo - 文件信息结构,用于接受文件信息
// 返回值:
//		假如成功,返回TRUE; 否则,返回FALSE
// 功能描述:
//		得到文件信息
// 引用: 
//		系统API
// *****************************************************************

BOOL WINAPI Device_GetFileInformationByHandle(
									HANDLE hOpenFile,
									LPBY_HANDLE_FILE_INFORMATION lpFileInfo )
{
    SetLastError(ERROR_INVALID_FUNCTION);
    return FALSE;
}

// *****************************************************************
// 声明:BOOL WINAPI Device_IoControl(
//				   HANDLE hOpenFile,
//				   DWORD  dwIoControlCode,
//				   LPVOID lpvInBuf,
//				   DWORD dwInBufSize,
//				   LPVOID lpvOutBuf,
//				   DWORD dwOutBufSize,
//				   LPDWORD lpdwBytesReturned,
//				   LPOVERLAPPED lpOverlapped )
// 参数:
//		IN hOpenFile - 已打开文件句柄
//		IN dwIoControlCode - I/O控制代码
//		IN lpvInBuf - 输入参数内存地址
//		IN dwInBufSize - lpvInBuf的内存大小
//		OUT lpvOutBuf - 输出数据内存地址
//		IN dwOutBufSize - lpvOutBuf的内存大小
//		OUT lpdwBytesReturned - 写入lpvOutBuf的数据大小
//		IN lpOverlapped - 不支持(为NULL)
// 返回值:
//		假如成功,返回TRUE; 否则,返回FALSE
// 功能描述:
//		设备I/O控制函数入口,通过发不同的控制代码已实现对设备的管理控制
// 引用:
//		系统API 
// *****************************************************************

BOOL WINAPI Device_IoControl(
				   HANDLE hOpenFile,
				   DWORD  dwIoControlCode,
				   LPVOID lpvInBuf,
				   DWORD dwInBufSize,
				   LPVOID lpvOutBuf,
				   DWORD dwOutBufSize,
				   LPDWORD lpdwBytesReturned,
				   LPOVERLAPPED lpOverlapped )
{
    LPDEVICE_OPEN_FILE lpOpenFile = _GetHDEVFilePtr( hOpenFile );

    BOOL bRetv = FALSE;

	if( lpOpenFile )
	{	//简单调用设备驱动程序的相关函数
		if( Sys_CaptureException() == EXCEPTION_NO_ERROR )
		{
			bRetv = lpOpenFile->lpDev->lpDriver->lpIOControl( 
													lpOpenFile->hDevOpen, 
													dwIoControlCode,

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -