驱动器/分区和Windows API中唯一的驱动器ID

Drive/Partition and unique drive ID in Windows API

本文关键字:驱动器 唯一 ID Windows 分区 API      更新时间:2023-10-16

好吧,我想创建一个程序,它可以获取唯一的驱动器ID(序列号?),并将其放入数据库中,在那里它将ID与一些文件关联起来。如果我想在flashdrive(可以更改驱动器号)之类的东西上找到一个文件,我会附加flashdrive,我的程序会扫描它的唯一ID,根据stl::map之类的东西查找文件,并将唯一ID转换为驱动器号。

该程序还需要识别分区(显然),所以可能是设备上的uniqueid+partitionnumber。

关于我该怎么做,有什么想法吗?我正在查看EnumDisk的源代码(Windows代码示例),但附带的demo.exe似乎在Windows7下不起作用(据说它在没有从源代码重建的情况下是兼容的)。

有人接电话吗?

附言:我从ENumDisk.exe得到这个错误"CreateFile失败,错误为:5">

p.S.S.哦,我希望这个程序能够扫描来自其他文件系统的驱动器,并获得它们的序列号。我知道这是一个很高的要求,但这是我的最终目标。

你很幸运-Windows(特别是Mount Manager)只维护这样一个由唯一卷标识符组成的数据库。查看卷管理API

例如,您可以使用GetVolumeNameForVolumeMountPoint来获取给定装载点(包括驱动器号)的唯一标识符,甚至是可移动卷。或者,由于一个卷可以有多个装入点,因此可以使用FindFirst/NextVolumeMountpoint枚举给定卷id(GUID)的装入点。

玩得开心!

错误5被拒绝访问。这意味着您很可能以非管理员身份运行。如果你试图打开一个物理驱动器,你可以通过将"dwDesiredAccess"参数设置为0来逃脱惩罚。它可能会成功打开设备,但以后的操作可能会失败,这取决于您使用返回句柄的API函数。

关于获取分区信息,请参阅MSDN上的IOCTL_DISK_GET_DRIVE_LAYOUThttp://msdn.microsoft.com/en-us/library/windows/desktop/aa365173(v=vs.85).aspx和IOCTL_DISK_GET_PARTITION_INFOhttp://msdn.microsoft.com/en-us/library/windows/desktop/aa365179(v=vs.85).aspx

您将能够收集所有分区,即使是那些属于Windows无法识别的文件系统的分区。