开启辅助访问 切换到宽版

精易论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

用微信号发送消息登录论坛

新人指南 邀请好友注册 - 我关注人的新帖 教你赚取精币 - 每日签到


求职/招聘- 论坛接单- 开发者大厅

论坛版规 总版规 - 建议/投诉 - 应聘版主 - 精华帖总集 积分说明 - 禁言标准 - 有奖举报

查看: 2550|回复: 3
收起左侧

[图文教程] DeviceIoControl之:通过API访问设备驱动程序

[复制链接]

结帖率:33% (1/3)
发表于 2013-2-17 01:32:02 | 显示全部楼层 |阅读模式   上海市上海市

在 NT/2000/XP 中,我想用 VC 编写应用程序访问硬件设备,如获取磁盘参数、读写绝对扇区数据、测试光驱实际速度等,该从哪里入手呢?

A 在 NT/2000/XP 中,应用程序可以通过 API 函数 DeviceIoControl 来实现对设备的访问—获取信息,发送命令,交换数据等。利用该接口函数向指定的设备驱动发送正确的控制码及数据,然后分析它的响应,就可以达到我们的目的。 

  1. DeviceIoControl 的函数原型为
  2. BOOL DeviceIoControl(
  3. HANDLE hDevice, // 设备句柄
  4. DWORD dwIoControlCode, // 控制码
  5. LPVOID lpInBuffer, // 输入 数据缓冲区指针
  6. DWORD nInBufferSize, // 输入数据缓冲区长度
  7. LPVOID lpOutBuffer, // 输出数据缓冲区指针
  8. DWORD nOutBufferSize, // 输出数据缓冲区长度
  9. LPDWORD lpBytesReturned, // 输出数据实际长度单元长度
  10. LPOVERLAPPED lpOverlapped // 重叠操作结构 指针
  11. );
复制代码

设备句柄用来标识你所访问的设备。

发送不同的控制码,可以调用 设备驱动程序的不同类型的功能。在头文件winioctl.h 中,预定义的标准设备控制码,都以 IOCTL 或 FSCTL 开头。例如,

IOCTL_DISK_GET_DRIVE_GEOMETRY 是对物理驱动器取结构参数( 介质类型、柱面数、每柱面磁道数、每磁道扇区数等)的控制码,FSCTL_LOCK_VOLUME 是对逻辑驱动器的卷加锁的控制码。

输入输出数据缓冲区是否需要,是何种结构,以及占多少字 节空间,完全由不同设备的不同操作类型决定。在头文件 winioctl.h 中,已经为标准设备预定义了一些输入输出数据结构。重叠操作结构指针设置为 NULL,DeviceIoControl 将进行阻塞调用;否则,应在编程时按异步操作设计。

Q 设备句柄是从哪里获得的?

A 设备句柄可以 用 API 函数 CreateFile 获得。它的原型为

  1. HANDLE CreateFile(
  2. LPCTSTR lpFileName, // 文件名
  3. DWORD dwDesiredAccess, // 访问方式 DWORD dwShareMode, // 共享方 式
  4. LPSECURITY_ATTRIBUTES lpSecurityAttributes, // 安全描述符指针
  5. DWORD dwCreationDisposition, // 创建方式
  6. DWORD dwFlagsAndAttributes, // 文件属性及标志
  7. HANDLE hTemplateFile // 模板文件的句柄
  8. );
复制代码
CreateFile 这个函数用处很多,这里我 们用它“打开”设备驱动程序,得到设备的句柄。操作完成后用 CloseHandle 关闭 设备句柄。

与普通文件名有所不同,设备驱动的“文件名”形式固定为“\\.\DeviceName”(注意在 C 程序中该字符串写法为“\\\\.\\DeviceName”),DeviceName 必须与设备驱动程序内规定的设备名称一致。

一般地,调用CreateFile 获得设备句柄时,访问方式参数设置为0或GENERIC_READ|GENERIC_WRITE,共享方式参数设置为

FILE_SHARE_READ|FILE_SHARE_WRITE,创建方式参数设置为 OPEN_EXISTING,其它参数 设置为 0 或 NULL。


签到天数: 12 天

发表于 2023-9-22 12:26:29 | 显示全部楼层   湖北省武汉市
感谢分享
回复 支持 反对

使用道具 举报

签到天数: 4 天

发表于 2020-5-12 13:11:45 | 显示全部楼层   吉林省长春市
确实很有用,能实现很多功能
回复 支持 反对

使用道具 举报

结帖率:89% (8/9)
发表于 2013-2-17 01:36:24 | 显示全部楼层   河南省信阳市
沙发沙发  虽然看不懂 嘿嘿
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 致发广告者

发布主题 收藏帖子 返回列表

sitemap| 易语言源码| 易语言教程| 易语言论坛| 易语言模块| 手机版| 广告投放| 精易论坛
拒绝任何人以任何形式在本论坛发表与中华人民共和国法律相抵触的言论,本站内容均为会员发表,并不代表精易立场!
论坛帖子内容仅用于技术交流学习和研究的目的,严禁用于非法目的,否则造成一切后果自负!如帖子内容侵害到你的权益,请联系我们!
防范网络诈骗,远离网络犯罪 违法和不良信息举报电话0663-3422125,QQ: 793400750,邮箱:wp@125.la
Powered by Discuz! X3.4 揭阳市揭东区精易科技有限公司 ( 粤ICP备12094385号-1) 粤公网安备 44522102000125 增值电信业务经营许可证 粤B2-20192173

快速回复 返回顶部 返回列表