VC下获取各个驱动器路径,分类及其获取其信息的资料整理.doc_第1页
VC下获取各个驱动器路径,分类及其获取其信息的资料整理.doc_第2页
VC下获取各个驱动器路径,分类及其获取其信息的资料整理.doc_第3页
VC下获取各个驱动器路径,分类及其获取其信息的资料整理.doc_第4页
VC下获取各个驱动器路径,分类及其获取其信息的资料整理.doc_第5页
已阅读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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论