应用程序和驱动程序的通信过程是:应用程序使用CreateFile函数打开设备,然后用DeviceIoControl与驱动程序进行通信,包括读和写两种操作。还可以用ReadFile读数据用WriteFile写数据。操作完毕时用CloseHandle关闭设备。我们比较常用的就是用DeviceIoControl对设备进行读写操作。先看看DeviceIoControl是怎么定义的:

BOOL DeviceIoControl(HANDLE hDevice,   // (CreateFile返回的设备句柄)DWORD dwIoControlCode, // (应用程序调用驱动程序的控制命令,就是IOCTL_XXX IOCTLs )LPVOID lpInBuffer,  //(应用程序传递给驱动程序的数据缓冲区地址)DWORD nInBufferSize,  //(应用程序传递给驱动程序的数据缓冲区大小,字节数)LPVOID lpOutBuffer, //(驱动程序返回给应用程序的数据缓冲区地址)DWORD nOutBufferSize,  //(驱动程序返回给应用程序的数据缓冲区大小,字节数)LPDWORD lpBytesReturned,  //(驱动程序实际返回给应用程序的数据字节数地址)LPOVERLAPPED lpOverlapped  // (重叠操作结构)
);

Parameters(参数)

hDevice (CreateFile返回的设备句柄)
[in] Handle to the device that is to perform the operation. To obtain a device handle, call the CreateFile function.
dwIoControlCode (应用程序调用驱动程序的控制命令,就是IOCTL_XXX IOCTLs )
[in] IOCTL for the operation. This value identifies the specific operation to perform and the type of device on which to perform the operation. There are no specific values defined for the dwIoControlCode parameter. However, you can define custom IOCTL_XXX IOCTLs with the CTL_CODE macro. You can then advertise these IOCTLs and an application can use these IOCTLs with DeviceIoControl to perform the driver-specific functions.
lpInBuffer (应用程序传递给驱动程序的数据缓冲区地址)
[in] Long pointer to a buffer that contains the data required to perform the operation. Set to NULL if the dwIoControlCode parameter specifies an operation that does not require input data.
nInBufferSize (应用程序传递给驱动程序的数据缓冲区大小,字节数)
[in] Size, in bytes, of the buffer pointed to by lpInBuffer.
lpOutBuffer (驱动程序返回给应用程序的数据缓冲区地址)
[out] Long pointer to a buffer that receives the output data for the operation. Set to NULL if the dwIoControlCode parameter specifies an operation that does not produce output data.
nOutBufferSize (驱动程序返回给应用程序的数据缓冲区大小,字节数)
[out] Size, in bytes, of the buffer pointed to by lpOutBuffer.
lpBytesReturned (驱动程序实际返回给应用程序的数据字节数地址)
[out] Long pointer to a variable that receives the size, in bytes, of the data stored in lpOutBuffer. The DeviceIoControl function may unnecessarily use this parameter. For example, if an operation does not produce data for lpOutBuffer and lpOutBuffer is NULL, the value of lpBytesReturned is meaningless.
lpOverlapped (重叠操作结构)
[in] Ignored; set to NULL.

Return Values(返回值)

Nonzero indicates success. Zero indicates failure. To obtain extended error information, call the GetLastError function. (非0成功,0失败)
具体使用我们看看列子:
1,向设备传递数据,我们定义一个函数来实现
bool CDeviceOperDlg::SendKeyData(HANDLE handle, BYTE *bData, int iSize)
{
ULONG nOutput;
BYTE bTemp[512];
//将数据放置到发送数组
memset(bTemp,0,sizeof(bTemp));
memcpy(bTemp,&bData[0],iSize);
//向设备发送
if (!DeviceIoControl(handle,         ATST2004_IOCTL_WRITE,     //根据具体的设备有相关的定义bTemp,                    //向设备传递的数据地址iSize,                    //数据大小,字节数NULL,                     //没有返回的数据,置为NULL0,                        //没有返回的数据,置为0&nOutput,NULL))
{return false;
}
return true;
}

2,从设备读取数据
bool CDeviceOperDlg::ReviceKeyData(HANDLE handle, BYTE *bData, int iSize)
{
ULONG nOutput;
BYTE bTemp[512];
//数组清零
memset(bTemp,0,sizeof(bTemp));
//向设备发送
if (!DeviceIoControl(handle,ATST2004_IOCTL_READ,           //根据具体的设备有相关的定义NULL,                          //没有向设备传递的数据,置为NULL0,                             //没有向设备传递的数据,置为NULLbTemp,                         //读取设备的数据返回地址iSize,                         //读取数据的字节数&nOutput,NULL))
{return false;
}
//放置到公用数组
memcpy(&bData[0],&bTemp[0],iSize);
return true;
}

DeviceIoControl的使用说明相关推荐

  1. DeviceIoControl使用说明

    DeviceIoControl的使用说明 16:29 15972人阅读 评论(0) 收藏 举报 应用程序和驱动程序的通信过程是:应用程序使用CreateFile函数打开设备,然后用DeviceIoCo ...

  2. DeviceIoControl详解

    DeviceIoControl的使用说明 应用程序和驱动程序的通信过程是:应用程序使用CreateFile函数打开设备,然后用DeviceIoControl与驱动程序进行通信,包括读和写两种操作.还可 ...

  3. CTL_CODE定义中Method的说明

    我在上一篇中说明CTL_CODE的时候,其中CTL_CODE定义中有一个Method域,该域的功能意义是定义用于与在驱动程序中获取应用程序数据缓冲区的地址方式.如果你看了我前边的文章,你可以看到在De ...

  4. abaqus高性能服务器怎么用,高性能计算平台ABAQUS任务调度使用说明作者陈林E-Mailchenlin.PDF...

    高性能计算平台ABAQUS任务调度使用说明作者陈林E-Mailchenlin.PDF 高性能计算平台ABAQUS 任务调度使用说明 作者:陈林 E-Mail:chenlin@ 日期:2017-1-10 ...

  5. linux 文件拷贝并替换,Linux_cmd replace 文件替换使用说明,帮助信息: 复制代码 代码如 - phpStudy...

    cmd replace 文件替换使用说明 帮助信息: 复制代码 代码如下: 替换文件. REPLACE [drive1:][path1]filename [drive2:][path2] [/A] [ ...

  6. Simple Dynamic Strings(SDS)源码解析和使用说明二

    在<Simple Dynamic Strings(SDS)源码解析和使用说明一>文中,我们分析了SDS库中数据的基本结构和创建.释放等方法.本文将介绍其一些其他方法及实现.(转载请指明出于 ...

  7. Delphi开发的IOCP测试Demo以及使用说明。

    Delphi开发的IOCP,此为压力测试Demo和使用说明.

  8. oracle database link mysql_oracle database link使用说明

    oracle database link使用说明 作用: 将多个oracle数据库逻辑上看成一个数据库,也就是说在一个数据库中可以操作另一个数据库中的对象. 简易语法: CREATE [PUBLIC] ...

  9. 序列拼接工具Bowtie使用说明

    序列拼接工具Bowtie使用说明 2011-06-08 ~ ADMIN Bowtie是一个超级快速的,较为节省内存的短序列拼接至模板基因组的工具.它在拼接35碱基长度的序列时,可以达到每小时2.5亿次 ...

最新文章

  1. 如何从复杂的货币种类中选出人民币格式的数字
  2. [react] 怎么在React中引入其它的UI库,例如Bootstrap
  3. 漫话:应用程序被拖慢?罪魁祸首竟然是Log4j!
  4. mysql in 多个字段_MySQL如何同时自增自减多个字段
  5. 朋友圈设置成昨天发的_如何让你的朋友圈骚到脱颖而出?
  6. mysql 闪回查询 sql_利用闪回查看Oracle表历史时刻数据
  7. servlet (七)javaBean
  8. 针对自动化测试的23种Node.js优秀实践
  9. split(v1,v2)用于把一个字符串分割成字符串数组
  10. 怎么用计算机弹出迪迦,迪迦奥特曼不常用的八大技能,迪迦可以瞬移
  11. 前端请求报错Provisional headers are shown接口请求失败
  12. 唯冠也很苦!赢了苹果也付不出律师费
  13. 到底什么是CE、C++、C+L波段?
  14. ARM CPU Cortex-X3,Cortex-A715,Cortex-A510 | GPU Immortalis-G715
  15. 蓝牙音箱方案选用及设计注意
  16. java安卓计时器_如何在android中设置计时器
  17. 电大计算机应用基础word排版,电大计算机应用基础考试全部操作100题
  18. 如何为你的网站添加标志性的图标(头像)呢?
  19. React-Cropper实现图片裁剪
  20. keytool 错误:java.io.IOException:Incorrect AVA format

热门文章

  1. runc容器逃逸漏洞最强后续:应对之策汇总与热点疑问解答
  2. 百度AI实战营第二季:AI技术商业落地指南
  3. Linux中使用ps、awk、sh一起批量杀死所有的dotnet进程。
  4. 运用大数据破局“大城市病”有效支撑首都人口疏解
  5. Spring提取@Transactional事务注解的源码解析
  6. DateTime格式大全
  7. android 之 ListView 里面嵌套 GridView 遇到的问题及其解决方法。
  8. 新浪微博封装类,以及常见问题sdk修改
  9. 后台CS代码中创建四种常用的SL动画效果
  10. 实模式和保护模式区别及寻址方式