从Windows 向Linux 迁移设备控制应用程序
这个系统调用向指定设备发送控制代码和其他数据.相应设备驱动程序按照控制代码 dwIoControlCode 的指示工作.例如,使用IOCTL_DISK_GET_DRIVE_GEOMETRY 可以从物理驱动器获取结构参数(介质类型、柱面数、每柱面磁道数、每磁道扇区数等).可以在 MSDN 网站上找到所有控制代码定义、头文件和其他详细内容(参见 参考资料 获得相关链接). 拥有帝国一切,皆有可能。欢迎访问phome.net 是否需要输入/输出缓冲,以及它们结构和大小怎样,都取决于实际 ioctl 过程涉及的设备和操作,并由该调用指定的 dwIoControlCode 确定. 如果重叠操作的指针设为 NULL,那么 DeviceIoControl 将以阻塞(同步)方式工作.否则,它以异步方式工作.
Linux 函数 ioctl Linux 可以使用 ioctl — int ioctl(int fildes, int request, /* arg */ ...); — 向指定设备发送控制信息.第一个参数 fildes 是函数 open() 返回的文件描述符,用于指称具体设备. 与对应的系统调用 DeviceIOControl 不同,ioctl 的输入参数列表并不固定.它取决于 ioctl 进行何种请求,以及请求参数有何说明,正如 Windows 函数 DeviceIOControl 的参数 dwIoControlCode 一样.但是,迁移期间需要注意何时选择正确的请求参数, DeviceIOControl 的 dwIoControlCode 和 ioctl 的 request 具有不同的取值. dwIoControlCode 与 request 之间没有显式映射列表.通常可以在相关头文件中查找请求参数值的定义来选择参数值.所有控制代码的定义在 /usr/include/{asm,linux}/*.h 文件中. 参数 arg 为具体设备的运转提供详细的命令信息.arg 的数据类型取决于特定控制请求.这个参数可以用于发送详细命令和接收返回数据. 迁移示例 我们查看一个从 Windows 向 Linux 迁移的过程的示例.这个示例涉及从个人电脑主 IDE 硬盘驱动器读取 SMART 日志. 步骤 1. 识别设备类型 如前所述,Linux 的各个设备被当作文件.要描述设备在 Linux 上的文件名.只有使用这个文件名,才能获取设备控制需要的设备句柄. 在这个示例中,对象是 IDE 硬盘驱动器.Linux 将其描述为 /dev/hda、/dev/hdb 等.本例将要迁移的硬盘设备路径名是 \\.\PhysicalDrive0./dev/hda 是该设备对应的 Linux 文件名. 步骤 2. 改变包含头文件 将 #include 头文件改为 Linux 形式(参见表 3): 表 3. #include 头文件
windows.h 包含打开和关闭设备的函数(CreateFile 和 CloseHandle).相应地,在 Linux 中用于 open() 和 close() 的函数应当包含头文件 sys/types.h、sys/stat.h 和 fcntl.h. Windows 的 devioctl.h 用于函数 DeviceIoControl,我们将其改为 sys/ioctl.h 以确保该函数 ioctl 能够工作. ntddscsi.h(它是来自 DDK 的头文件)定义了一组用于设备控制的控制代码.本例只处理 IDE 硬盘驱动器,只需将 linux/hdreg.h 添加到 Linux 程序. 对于其他情况,应当确保包含所有头文件(它们带有所需的控制代码的定义).例如,如果访问 CD-ROM 而非硬盘驱动器,那么应当包含 linux/cdrom.h. 步骤 3. 改正函数和参数 现在我们详细查看代码.清单 4 显示命令的详细信息. 清单 4. 命令详解
|
|||||||||
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |