已阅读5页,还剩3页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1.获取所有的驱动器利用函数GetLogicalDriveStringsThe GetLogicalDriveStrings function fills a buffer with strings that specify valid drives in the system. DWORD GetLogicalDriveStrings( DWORD nBufferLength, / size of buffer LPTSTR lpBuffer / drive strings buffer);很简单的一个函数,msdn有详细的说明需要注意的一点是lpBuffer中最后获得的数据是这样c:d:,每两个路径之间都间隔一个 null-terminated,所以,如果你直接coutlpBuffer 的话,那么得到的是C:,很是令人郁闷,于是要想办法把这些路径一个一个取得所以,有了如下代码TCHAR szBuf100;memset(szBuf,0,100);DWORD len = GetLogicalDriveStrings(sizeof(szBuf)/sizeof(TCHAR),szBuf);for (TCHAR* s = szBuf; *s; s += _tcslen(s)+1) LPCTSTR sDrivePath = s; coutMediaType = (MEDIA_TYPE)pmt-MediaInfo0.DeviceSpecific.DiskInfo.MediaType; / pdg-Cylinders = pmt-MediaInfo0.DeviceSpecific.DiskInfo.Cylinders; / pdg-TracksPerCylinder = pmt-MediaInfo0.DeviceSpecific.DiskInfo.TracksPerCylinder; / . . :memcpy(pdg, pmt-MediaInfo, sizeof(DISK_GEOMETRY); delete pmt; / 关闭设备句柄 :CloseHandle(hDevice); return (bResult); 然后DISK_GEOMETRY dg;TCHAR szPath100 = _T(.);:_tcscat(szPath,sDrivePath);int nSize = :_tcslen(szPath);szPathnSize-1 = 0;BOOL bRetVal = GetDriveGeometryszPath,&dg);if(dg.MediaType = RemovableMedia) 这就是U盘这段代码,哇哦,好麻烦阿,好多看不懂,慢慢来先看DISK_GEOMETRY 这个结构体其中的MEDIA_TYPE是个枚举类型好多阿具体就不列出来了,可以到msdn上察看到所有的这里有一个很重要的函数,就是:DeviceIoControl,他可以获得很多属性第一个参数是一个handle,我们要打开一个handle调用:CreateFile,我晕,这不创建一个文件吗:)其实这个函数,并不象我们想像中的那样,只能创建一个传统意义上的文件哦这里我们用它“打开”设备驱动程序,得到设备的句柄。操作完成后用CloseHandle关闭设备句柄。这里有以下小小的变化,如果路径是选择的是驱动器,那么这个路径的格式是要.DeviceName比如.C:真够bt的,所以有了TCHAR szPath100 = _T(.);:_tcscat(szPath,sDrivePath);int nSize = :_tcslen(szPath);szPathnSize-1 = 0;这些代码把C: = .C:关于:DeviceIoControl这个函数的用法,我不多说了,可以参考/article/55/55510.shtm这个系列,我也是参考这个的 +当然,这段代码,关于区分软驱和U盘,还有好多可以值得商榷的地方,比如,有人提出,软驱么,都在A:的,比下路径不就得了,或者看大小1.44m另外,软驱和U盘区分了,那么如果usb口上插的是别的东西呢,如读卡器,摄像头,怎么区分呢?关于这个,确实还有很多值得我们去学习4.区分移动硬盘和硬盘我说了,移动硬盘也是DRIVE_FIXED ,真够bt的,这个没做过的话,很难想像的,太bt了那怎么区分用DeviceIoControl对卷下IOCTL_STORAGE_QUERY_PROPERTY进行获取信息取返回STORAGE_DEVICE_DESCRIPTOR结构里面的STORAGE_BUS_TYPE代码#include #include / IOCTL control code#define IOCTL_STORAGE_QUERY_PROPERTY CTL_CODE(IOCTL_STORAGE_BASE, 0x0500, METHOD_BUFFERED, FILE_ANY_ACCESS)typedef enum _STORAGE_PROPERTY_ID StorageDeviceProperty = 0, StorageAdapterProperty, StorageDeviceIdProperty STORAGE_PROPERTY_ID, *PSTORAGE_PROPERTY_ID;typedef enum _STORAGE_QUERY_TYPE PropertyStandardQuery = 0, PropertyExistsQuery, PropertyMaskQuery, PropertyQueryMaxDefined STORAGE_QUERY_TYPE, *PSTORAGE_QUERY_TYPE;typedef struct _STORAGE_PROPERTY_QUERY STORAGE_PROPERTY_ID PropertyId; STORAGE_QUERY_TYPE QueryType; UCHAR AdditionalParameters1; STORAGE_PROPERTY_QUERY, *PSTORAGE_PROPERTY_QUERY; typedef struct _STORAGE_DEVICE_DESCRIPTOR ULONG Version; ULONG Size; UCHAR DeviceType; UCHAR DeviceTypeModifier; BOOLEAN RemovableMedia; BOOLEAN CommandQueueing; ULONG VendorIdOffset; ULONG ProductIdOffset; ULONG ProductRevisionOffset; ULONG SerialNumberOffset; STORAGE_BUS_TYPE BusType; ULONG RawPropertiesLength; UCHAR RawDeviceProperties1; STORAGE_DEVICE_DESCRIPTOR, *PSTORAGE_DEVICE_DESCRIPTOR; HANDLE hDevice; / 设备句柄 BOOL bResult; / DeviceIoControl的返回结果 / 打开设备 hDevice = :CreateFile(szPath, / 文件名 GENERIC_READ, / 软驱需要读盘 FILE_SHARE_READ | FILE_SHARE_WRITE, / 共享方式 NULL, / 默认的安全描述符 OPEN_EXISTING, / 创建方式 0, / 不需设置文件属性 NULL); if (hDevice = INVALID_HANDLE_VALUE) return FALSE; STORAGE_PROPERTY_QUERY Query; / input param for query DWORD dwOutBytes; / IOCTL output length Query.PropertyId = StorageDeviceProperty; Query.QueryType = PropertyStandardQuery; STORAGE_DEVICE_DESCRIPTOR pDevDesc; pDevDesc.Size = sizeof(STORAGE_DEVICE_DESCRIPTOR); / 用 IOCTL_STORAGE_QUERY_PROPERTY bResult = :DeviceIoControl(hDevice, / device handle IOCTL_STORAGE_QUERY_PROPERTY, / info of device property &Query, sizeof(STORAGE_PROPERTY_QUERY), / input data buffer &pDevDesc, pDevDesc.Size, / output data buffer &dwOutBytes, / outs length (LPOVERLAPPED)NULL); UINT Type = pDevDesc.BusType;/ Unknown 0x00 / SCSI 0x01 / ATAPI 0x02 / ATA 0x03 / IEEE1394 0x04 / SSA(Serial storage architecture) 0x05 / Fibre Channel, 0x06 / USB, 0x07 / RAID, 0x08 这样,就能区分USB硬盘和普通硬盘了参考资料/w2k/usbdisks.asp文章写到这里,我又回过头去试了一下,在3.区分u盘和软驱的时候,说实话,那个办法我不是很满意,感觉有点小题大作了,搞得太复杂了,没办法,小弟实在是愚笨其实用方法四中的查询,应该也是可以区分的,因为u盘的BusT
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 初中九年级道德与法治教学设计:中考模拟卷精讲与二轮复习策略构建
- 七年级道德与法治上册提高防护能力教学设计
- 初中数学八年级《百分数在商品促销中的应用》教学设计
- 高中英语必修三Unit 4整合提升教学设计(译林版)
- 2026年四川泸州市中考第一次适应性模拟考试化学试题附答案
- 七年级数学《完全平方公式》教学设计(第2课时:结构化探究与深度应用)
- 高中化学必修第一册《物质的量》教学设计与核心素养落实研究
- 初中七年级地理《长江中下游平原》教学设计
- 高中信息技术Python程序设计中选择结构与循环结构结合应用教学设计
- 初中九年级物理《电压》培优教学设计
- 2026副主任医师副高-中医骨伤科学(副高)076历年题库含答案详解
- 2026年工伤保险条例解读课件(知识竞赛版)
- 2026苏教版小学六年级科学上册(全册)每课课时练习及答案
- GB/Z 195-2026人工智能工业智能体参考架构
- 工业园区钢结构架空管廊吊装专项施工方案
- 安全员A本延期考试题库2025版
- 2025年高级审计师考试模拟试题及答案
- 新版2026秋新教科版科学六年级上册实验报告(共17个实验可用来填实验报告单)合集
- 注册消防工程师继续教育2025年部分题目与答案(126题)
- 小微水体治理实施方案
- 2026年童年测试题加答案
评论
0/150
提交评论