📄 device.c
字号:
// 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 + -