开启辅助访问 切换到宽版

精易论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

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

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


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

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

查看: 2270|回复: 2
收起左侧

[图文教程] DeviceIoControl之:获取软盘/硬盘/光盘的参数

[复制链接]

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

在MSDN的那个demo中,将设备名换成“A:”取 A 盘参数,先用资源管理器读一下盘,再运行这个程序可以成功,但换一张盘后就失败;换成“CDROM0”

取CDROM参数,无论如何都不行。这个问题如何解决呢? 

A 取软盘参数是从软盘上读取格式化后的信息,也就是必须执行读操作,这一点与硬盘不同。将CreateFile中的访问方式改为GENERIC_READ就行了。

IOCTL_DISK_GET_DRIVE_GEOMETRY这个 I/O 控制码,对软盘和硬盘有效,但对一些可移动媒介如CD/DVD-ROM、TAPE等就不管用了。要取CDROM参数,还得另辟蹊径。IOCTL_STORAGE_GET_MEDIA_TYPES_EX能够帮我们解决问题。

Q 使用这些 I/O 控制码,需要什么样的输入输出数据格式呢?

A DeviceIoControl使用这两个控制码时,都不 需要输入数据。

IOCTL_DISK_GET_DRIVE_GEOMETRY直接输出一个 DISK_GEOMETRY结构:

  1. typedef struct _DISK_GEOMETRY {
  2.   LARGE_INTEGER Cylinders;  // 柱面数
  3.   MEDIA_TYPE MediaType;   // 介质类型
  4.   DWORD TracksPerCylinder;  // 每 柱面的磁道数
  5.   DWORD SectorsPerTrack;   // 每磁道的扇区数
  6.   DWORD BytesPerSector;   // 每扇区的字节数
  7. } DISK_GEOMETRY;
  8. IOCTL_STORAGE_GET_MEDIA_TYPES_EX 输出一个 GET_MEDIA_TYPES结构:
  9. typedef struct _GET_MEDIA_TYPES {
  10.   DWORD DeviceType;        // 设备类型
  11.   DWORD MediaInfoCount;      // 介质信息条数
  12.   DEVICE_MEDIA_INFO MediaInfo[1]; // 介质 信息
  13. } GET_MEDIA_TYPES;
  14. 让我们来看一下 DEVICE_MEDIA_INFO 结构的定义:
  15. typedef struct _DEVICE_MEDIA_INFO {
  16.   union {
  17.     struct {
  18.        LARGE_INTEGER Cylinders;    // 柱面数
  19.       STORAGE_MEDIA_TYPE MediaType;  // 介质类型
  20.       DWORD TracksPerCylinder;    // 每柱面的磁道数
  21.        DWORD SectorsPerTrack;     // 每磁道的扇区数
  22.       DWORD BytesPerSector;     // 每扇区的字节数
  23.       DWORD NumberMediaSides;     // 介质面数
  24.       DWORD MediaCharacteristics;  // 介质特性
  25.     } DiskInfo;      // 硬盘信息    struct {
  26.       LARGE_INTEGER Cylinders;     // 柱面数
  27.       STORAGE_MEDIA_TYPE MediaType; // 介质类型
  28.        DWORD TracksPerCylinder;    // 每柱面的磁道数
  29.       DWORD SectorsPerTrack;     // 每磁道的扇区数
  30.       DWORD BytesPerSector;      // 每扇区的字节数
  31.       DWORD NumberMediaSides;    // 介质面数
  32.        DWORD MediaCharacteristics;  // 介质特性
  33.     } RemovableDiskInfo;  // “可移动盘”信息
  34.     struct {
  35.       STORAGE_MEDIA_TYPE MediaType; // 介质类型
  36.       DWORD  MediaCharacteristics; // 介质特性
  37.        DWORD  CurrentBlockSize;   // 块的大小
  38.     } TapeInfo;      // 磁带信息
  39.   } DeviceSpecific;
  40. } DEVICE_MEDIA_INFO;
复制代码
其中 CD-ROM属于“ 可移动盘”的范围。请注意,GET_MEDIA_TYPES结构本身只定义了一条 DEVICE_MEDIA_INFO,额外 的DEVICE_MEDIA_INFO 需要紧接此结构的另外的空间。


结帖率:100% (1/1)
发表于 2021-6-20 02:48:57 | 显示全部楼层   西藏自治区林芝市
看了一下,没看完,也没有看懂,基本功不够,所以过来看热闹。。。
回复 支持 反对

使用道具 举报

结帖率:89% (8/9)
发表于 2013-2-17 01:37:01 | 显示全部楼层   河南省信阳市
嘿嘿   沙发都是我的
回复 支持 反对

使用道具 举报

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

本版积分规则 致发广告者

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

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

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