注册表与盘符(转victor888文章 )

标签: c++获取盘符   c#获取盘符  
转自: http://blog.csdn.net/loulou_ff/article/details/3769479

写点东西,把这阶段的研究内容记录下来,同时也给研究相关内容的同志提供参考,免得走弯路。

  先说几句实话,在网上我所搜索到的有用的东西,基本都是外国鬼子搞的,不得不佩服他们,在技术内容探讨上,外国人非常的深入,而且论坛没有垃圾回帖,这和我们这里是截然不同的。说差距,主要是在原始基础创新层面。我搞的那个调整盘符的批处理,只有MSFN的JACLAZ(他也是MSFN,BOOT-LAND,911CD的版主)同我讨论的最深入。
不多说了,进入正题。

  为什么要从注册表来研究磁盘与盘符?很简单,操作注册表速度最快,这不同于使用工具软件从低层进行查询,其实老九PECMD的SHOW命令就是低层操作,操作复杂,因为我看了123MM的代码。

  在做这个批处理前,我坚信,注册表记录了一切,不再需要工具软件去查找,事实就是这样。

一、都有什么类型的磁盘
  这是首先要清楚的概念,分清了类别,我们才能去寻找相应的盘符。不用多说,按物理类别来分可分为磁性盘(如硬盘、软盘、磁带机),压缩盘(CD/DVD),闪存盘(U盘),ZIP盘(基本淘汰)等;从接口分类,可分为IDE/SATA/SCSI/USB等类型;WINDOWS分类为本地磁盘(也叫固定磁盘fixed),可移动磁盘(removable,如U盘,光盘,软盘,ZIP盘等)两大类。对于光盘,不管什么类型,什么接口,一律为CDROM/DVDROM,而本地磁盘,包括内置硬盘,也包括USB移动硬盘或量产为USB HDD的闪存盘,可移动盘,如我们买的U盘一般都是可移动类型。

二、注册表中哪个位置准确记录了可擦写磁盘的名称、类型与数量?
  HKLM/SYSTEM/CurrentControlSet/Services/Disk/Enum
这里面的键名为0,1,2...即是磁盘在系统中的序号,COUNT名为磁盘总数。如我的系统有相应的值有IDE/,USBTOR/等待,相应的还有SCSI/,即代表了类型为IDE的硬盘,SCSI盘(固定或可移动),USB盘(固定或可移动)。

  如果你去除了一个盘,那么,这里的键名马上会减少一个,假设有3个磁盘,你去除了中间的1,那么原来的2值也不会变成1,因此,在选择硬盘号时,要注意,虽然只有2个盘了,但也不是连续编号的。

  硬盘序号,是选择其对应盘符的基础。

三、注册表中哪个位置记录了磁盘的装入点mount point和盘符?
  只有:HKLM/SYSTEM/MountedDevices
  这个位置最重要,一切盘符与类型信息都在这里,接下来会分别解读。

四、如何找到一个本地磁盘(或固定磁盘)所包含的分区与盘符?
  一句话,通过disk signature,可以翻译为硬盘标记,这个东西是从WINNT 3.5开始WINDOWS为磁盘所建立的位于主启动分区MBR中的唯一标记,一般没有重复的。它是一个16进制4 bytes的数值。

  比如disk signature 为A8 E1 B9 D2,则我们可以在HKLM/SYSTEM/MountedDevices项里面找值为D2 B9 E1 A8开头的项名为/DosDevices/后面的盘符,通过这个值,还可以得到这样就得到其对应的开头为/??/volume装入点,在这项下disk signature是反序的。

  那么,我们如何得到disk signature呢?

  通过搜索A8E1B9D2,会找到这样一个项:
  HKEY_LOCAL_MACHINE/HARDWARE/DESCRIPTION/System/MultifunctionAdapter/9/DiskController/0/DiskPeripheral/0
(不同的电脑,上述项中红色的数字可能不同),项下有一个名为Identifier的值为"00c72b95-A8E1B9D2-A",如果系统只有一块硬盘的话,那么,可以肯定,这个A8E1B9D2就是disk signature。反过来,也就是说,只要我们找到这个值,就可以找到其盘符及装入点。

  那么,如果有几块FIXED 盘,到底哪个signature对应哪块盘呢?

五、Disk signature与磁盘的对应
  在正常的WINDOWS下面,这个问题好解决,在PE下就是不行,因此PE下面必须先得到disk signature或使用低层的diskpart命令。

  WINDOWS下,注意这个设备类别项HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Enum/STORAGE/Volume,所有的连接过的固定磁盘的signature都记录在这里而且不能删除,举例:这是一个子项,1&30a96598&0&SignatureA8E1B9D2Offset7E00LengthXXXXXXXX
红字部分是子signature,后面的Offset7E00是该磁盘的起始分区标志,LengthXXXXXXXX是指分区的大小,当然,这里我们不需要知道它。那么,到底如何确定signature所对应的磁盘号啊,别急,看这个子项下面的driver的键值,{71A27CDD-812A-11D0-BEC7-08002BE2092F}/0022,粉色字部分,最后这个是驱动程序的序号,号越大,代表盘符越靠后。
  明白了吗?

  总结一下,WINDOWS下获取一个固定磁盘盘符的方法:
1. 获取磁盘signature
  在HKEY_LOCAL_MACHINE/HARDWARE/DESCRIPTION/System/MultifunctionAdapter/9/DiskController/0/DiskPeripheral/0(不同的电脑,上述项中红色的数字可能不同),项下有一个名为Identifier的键,找到两个"-"中间的部分即为disk signature值,如"00c72b95-A8E1B9D2-A"。

2. 根据signature找到对应的磁盘序号
  根据signature,找到这里HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Enum/STORAGE/Volume/1&30a96598&0&SignatureA8E1B9D2Offset7E00LengthXXXXXXXX
  并由此得到这个项下driver的值的后4位,比较大小排序,小的为第一磁盘,其对应的磁盘序号为HKLM/SYSTEM/CurrentControlSet/Services/Disk/Enum下的0键,以此类推。

  遗憾的是PE下,没有这个driver键,因此不能来推断磁盘顺序,只好使用其它工具。

3. 根据signature获取盘符
  将signature反序排列,在HKLM/SYSTEM/MountedDevices项里面找值为以反序排列数字开头的项名为/DosDevices/后面的盘符和相应的装入点。

  这里就有一个问题,假设一个盘有3个分区,对应3个盘符,如何确定其盘符顺序?请看-

六、固定磁盘盘符的顺序
  通过观察发现,同一磁盘的装入点在HKLM/SYSTEM/MountedDevices项下是连续排列的,存在2种可能,即升序或降序,但可以肯定的是起始分区的值,里面包含7E的,注意观察其值除了前面为反序的disk signature外,剩余的就是007e000000,有了它我们就可以正确排序盘符了。
  这里不得不指出,目前只有网友“穿云鹤”键的顺序不是上述2种情况之一,我不知道这是不是搞乱了注册表所致,如果是这样,我前面用的MBRFIX及以007E000000来获得盘符的批处理,就没有问题,反之就可能有问题。
  当然,如果你发现了更好的PE和WINDOWS下都正确的识别磁盘顺序的方式,一定要通知我,一万个感谢,那将是网友的福音。
  说到这里固定磁盘的盘符获得方法说完了,再说说如何获得可移动磁盘的盘符吧。

七、获取可移动盘盘符
1. 正向获取
  由HKLM/SYSTEM/CurrentControlSet/Services/Disk/Enum,USBTOR/开始的值“/”最后的部分,如USBSTOR/Disk&Ven_Yan&Prod_Do&Rev_1.00/6&99c7d70&0,由红色字部分,在这里:HKLM/SYSTEM/CurrentControlSet/Enum/USBSTOR/Disk&Ven_Yan&Prod_Do&Rev_1.00/6&99c7d70&0找到名为ParenIdPrefix的值,如7&cfa80fe&0。
  这里7&cfa80fe&0,就是我们要的,根据它,我们就能找到盘符。OK,将其转换为16进制,再在HKLM/SYSTEM/MountedDevices找这个包含16进制的值的键,OK,盘符和装入点都找到了。
  JACLAZ就是这么做,哈哈,他的16进制转换批处理,好像没有CN-DOS的HAT的强。
  当然,这里我仅举了U盘的情况,其实光盘也一样的,请读者自行查找。
2.反向获取
  这是我的做法,一下子就可以得到U盘、光盘和软盘的盘符。
  双击HKLM/SYSTEM/MountedDevices项里,值以5c003f003f005c00开始的行,先说说它是什么?双击一下键名,你会发现原来它是哈哈发现了什么,原来它对应的字符就是“/.?.?./.”,里面还有什么,有CDROM字样,有REMOVABLE字样,有FLOPPY字样,见下图1:
图1 可移动盘符键值示例

  这就是我们要的磁盘类型啊,我们取几个相应的16进制的数就够了,怎样,盘符和类型都得到了吧,简单吧。如我取的:

QUOTE:

if /i !tpcode! equ 00470045004E set flpdrv=!flpdrv! %%a
      if /i !tpcode! equ 004300640052 set dvddrv=!dvddrv! %%a
      if /i !tpcode! equ 00520065006D set remdrv=!remdrv! %%a

  上面第一行,如果存在G.E.N,则是软盘;
  第二行,如果存在C.d.R,则是光盘;
  第三行,如果存在R.e.M,则是U盘。

  要注意的是,对于可移动U盘,在VISTA下是以5f003f00(十进制为"_.?.")开始的,这是U盘的唯一标志。

  至此主要的东西都说完了,要想调整盘符,还有必要的东西要说:

八、获取所有盘符
  在WINDOWS下,fsutil和wmic命令都可以,但因前者XP和VISTA下的不一样,转换有点麻烦,因此使用了后者,所有盘符,不论是虚拟还是非虚拟的,都可以得到。

  PE下,如果使用wmic是不行的,因为没有wmi服务,顺序说一下wmic是个强大的命令行工具,可以查询修改有关电脑的几乎所有信息,硬件信息,软件信息,磁盘信息都可以,但这不是我们要讨论的,JACLAZ在搞。

  那怎么办呢?注册表给我们提供了,在这里:HKCU/Software/Microsoft/Windows/CurrentVersion/Explorer/MountPoints2/这里全是盘符。说到这儿,有人会问,为什么WINDOWS下不这样做啊,嘿嘿,不一样啊,WINDOWS下记载了所有曾经出现过的盘符,不管现在有没有,但PE不一样,刚启动的PE,注册表所记载的所有盘符都是存在的。

九、获取有装入点的盘符
  也有人说了,为什么不从HKLM/SYSTEM/MountedDevices获得?这里不可信的,因此所有插过的磁盘的盘符和装入点都记载在这里了,什么可信?mountvol,这个家伙的除了获取装入点,还可以更改盘符,正是我们所需要的。

十、获取没有有装入点的盘符(虚拟盘符)
  想到了吗?八-九=十。
  需要强烈注意的是,这里所批的虚拟盘符,是指一切没有装载点的盘符,差不多所有的虚拟软件虚拟出的盘符都没有装入点,如SUBST, NET USE, IMDISK, RAMDISK以及虚拟光驱等等,但有一个虚拟光驱软件例外,就是DAEMON TOOLS。它有装载点,这也应该能更改盘符,但请有条件者测试。

十一、USB固定磁盘的盘符也是通过disk signature一步步获取的吗?
  这个,我走了一个捷径,即排除了所有的可移动盘和内置硬盘的盘符,剩余的就是USB固定磁盘的盘符,再根据反向signature,即HKLM/SYSTEM/MountedDevices里开头8个字符是一样的就是同一个磁盘的来判断,非常的简单,在此要感谢cn-dos的HAT,是批给出了同类情况批处理的最简单的语句。

十二、说一说固定盘符的原理
  wxb在这里http://bbs.wuyou.com/viewthread.php?tid=130120&extra=page%3D1公布了固定U盘和移动硬盘盘符的方法,我们来分析一下其原理,用他的话是这样说的:

QUOTE:

每个U盘都应该对应唯一的一个设备模型,这个设备模型对应唯一的设备范例ID,把设备范例ID和你的U盘盘符对应起来了。

  这里的设备范例ID,确切的说,是HKLM/SYSTEM/MountedDevices里的键值,为什么是不变的呢?这个固定盘符的方法有不足之处吗?

  我们先从U盘的键值还说吧,如图1:

  这个值分为3部分,即类型描述部分,是固定的,红色框中特征部分,本人分析是与U盘VERDER和PRODUDCER及VID&PID所综合获取的,只要U盘的这些字串不变,则这个特征部分就不变,还有一个就是DeviceClass ID,在WINDOWS下,这个值是固定的。这样3部分加起来也是固定的,因此,不管在什么WIN系统下,其盘符都可以固定。它的不足之处就在于,如果U盘VERDER和PRODUDCER及VID&PID发生变化或U盘容量发生变化,则很有可能会使键值发生变化,指定盘符将不在发生作用。其实大家再来看这3部分的组合,这不就是这个注册表项里面的红色部分吗:HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Control/DeviceClasses/{53f5630d-b6bf-11d0-94f2-00a0c91efb8b}/##?#STORAGE#RemovableMedia#7&55f17fc&0&RM#{53f5630d-b6bf-11d0-94f2-00a0c91efb8b},这样,我们对这个值有了深入的了解。

  同理,我们是不是也可以固定光盘的盘符吗?是的一样的。

  对于固定磁盘的盘符,如USB硬盘或USB HDD盘,情况更简单,看下图2:
图2 固定磁盘第一分区键值

  共分2部分,第1部分为反向disk signature,第2部分是第1分区标志7e00,这两部分都是固定的,加起来也是固定的。同上这第两部分的加分不也是这个项:HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Control/DeviceClasses/{53f5630d-b6bf-11d0-94f2-00a0c91efb8b}/##?#STORAGE#Volume#1&30a96598&0&Signature5E0A5E0AOffset7E00Length273898200#{53f5630d-b6bf-11d0-94f2-00a0c91efb8b}的红色字部分吗?由此可见,对于PE在第一分区的盘符,也是可以固定的。同理,其它分区的盘符也是可以固定的(有什么意义呢?),但是这个限制条件就多了,为什么说多了呢?因为,只要你一改变磁盘分区,其大小就要变化,这样OFFSET值就要变,这一变,键值就变了,你就固定不了盘符了,如下图3:
图3 磁盘其它分区键值

  同理,这也是这项红色字的反向内容:HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Control/DeviceClasses/{53f5630d-b6bf-11d0-94f2-00a0c91efb8b}/##?#STORAGE#Volume#1&30a96598&0&Signature5E0A5E0AOffset2738A7E00Length3EC8D0400#{53f5630d-b6bf-11d0-94f2-00a0c91efb8b}。

  综上,再推而广之,我们是不是可以固定所有盘的盘符呢?是的,可以的。

  但这样的方法有一个前提,这个盘符不能是系统盘符,RAMXP可以,因为其盘符就是X,如果是USB盘或光盘上直接运行的非RAM版PE,这个系统盘符,你是动不了的,这也是这种固定盘符方法的缺陷。

  说到这里,本人想起了JACLAZ等人搞的USB_MULTIBOOT_10,里面用到了migrate.inf来固定U盘盘符,原理与wxb的方式基本一致的,但难易程序不同,前者自动化程度高。

  最后,再总结一下HKLM/SYSTEM/MountedDevices里的内容:
  1. 这里面只存在形如/??/Volume{xxxxx...}字样的键和/DosDevices/X:字样的键,后者为盘符项,前者为盘符的装入点,二者的键值是一样的,因此,只要我们有了一个键名,就能得到另外一个键名。

  2. 键值存在三种,一种是以5c003fcc开头的(VISTA下以U盘以5f003f00开头),这代表着是可移动设备,包括(U盘、光盘、软盘[也应该包括SCSI移动盘]);另一种是以反向disk signature值开头的,代表着固定设备,其中固定设备的第1分区所对应的键值,在反向8个disk signature后面都是接着007e00000000,这是第一分区的特征值,对于非第一分区外的,除了8个反向字符后面的值,其反向值,是该分区的offset,即表示分区大小;第三种,就是其它了,这个东西好像没有规律,如果RAMXP所虚拟出的X盘,在我的电脑里显示光盘,但确是可写的。在注册表里只有/DosDevices/X:键和值,却没有对应的装入点,MOUNTVOL也显示不出其装入点,这可能是RAMXP固有的磁盘类型。此外,穿云鹤的USBCDROM也有类似的情况,说不清楚。

  本文可能有错误及不足之处,请及时告诉俺。

------------------------------------------------------------------

其实七、获取可移动盘盘符  是不准确的

注册表与盘符(转victor888文章 )相关推荐

  1. 分区助手迁移系统盘到固态,注册表调盘符后出现黑屏问题的解决方案

    更新个可能的简单解决方案,就是原先调盘符后再看注册表编辑器,不是会出现个X盘嘛,直接再给这个X改名改成随便一个和原来所有盘都不一样的,然后再重启,有概率可以修复. 注:本方案为最终傻瓜方案,实属无奈之 ...

  2. 注册表usbstor删除不了_彻底清除注册表U盘与USB使用记录技巧

    相信很多用户会在电脑上使用U盘或其他USB外接设备,为了保护自己的使用隐私,也会有很多用户会清理掉USB端口使用记录,但是极少部分用户不清楚U盘在电脑上使用之后,电脑的注册表中也会留下使用记录,下面豆 ...

  3. WINDOWS是如何在注册表里记录盘符分配的

    作者:张宇,北亚硬盘数据恢复中心,转载请联系作者,如果实在不想联系作者,至少请保留版权,谢谢. windows在加载一个之前从未加载过的分区时,首先要将这个分区的设备序号信息记录在注册表里,如果对这个 ...

  4. 教你隐藏盘符,把你的小姐姐藏起来

    上次一个朋友告诉我,他无意中把一台硬盘里有小姐姐爱薇的笔记本借给了小姨子.从此,小姨子看他的眼神都充满了警惕,大有一言不合就拔刀相向的感觉,两人见面经常相当尴尬. 我之所以说这件事除了要告诉大家,个人 ...

  5. revit卸载/完美解决安装失败/如何彻底卸载清除干净revit各种残留注册表和文件的方法

    revit卸载/完美解决安装失败/如何彻底卸载清除干净revit各种残留注册表和文件的方法 参考文章: (1)revit卸载/完美解决安装失败/如何彻底卸载清除干净revit各种残留注册表和文件的方法 ...

  6. MAYA卸载/完美解决安装失败/如何彻底卸载清除干净MAYA各种残留注册表和文件的方法

    MAYA卸载/完美解决安装失败/如何彻底卸载清除干净MAYA各种残留注册表和文件的方法 参考文章: (1)MAYA卸载/完美解决安装失败/如何彻底卸载清除干净MAYA各种残留注册表和文件的方法 (2) ...

  7. Windows - 通过注册表编辑器来删除多余盘符

    Windows+R 打开运行窗口,输入 regedit ,进入注册表编辑器 删除百度云管家盘符 HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\Curren ...

  8. 服务器隐藏盘符如何显示,Windows10系统如何使用注册表隐藏磁盘盘符?

    Windows10系统如何使用注册表隐藏磁盘盘符?如果你有一些文件不想被他人看到,那么你可以将放置文件的磁盘隐藏起来,这样别人就无法进入你的私密磁盘了.想要隐藏磁盘盘符其实很简单,使用注册表即可轻松实 ...

  9. 光驱盘符消失之由于其配置信息(注册表中的)不完整或已损坏的解决办法

    使用台式机光驱想拷点东西,放入光盘后发现光驱盘符不见了.查看设备管理器时发现光驱项有黄色感叹号,设备状态显示: "由于其配置信息(注册表中的)不完整或已损坏,Windows 无法启动这个硬件 ...

最新文章

  1. 解读金山网盾3.5 0day漏洞免疫技术
  2. Winform中实现执行cmd命令的工具类
  3. 【机器视觉】 fuzzy_measure_pos算子
  4. 上传图片截图预览控件不显示cropper.js 跨域问题
  5. C注释   转换为   C++注释
  6. 【Spring第七篇】Java配置类:JavaConfig
  7. java中的设计模式
  8. 190413每日一句
  9. android singleInstance 和 singleTask 的区别
  10. Idea导入项目及相关环境配置
  11. java导出excel搜索下拉框,SXSSFWorkbook导出Excel并带下拉菜单
  12. ip pssql 登录写法_plsql 连接远程服务器数据库无法登录
  13. 上海住房公积金的提取条件
  14. python — numpy计算矩阵特征值,特征向量
  15. Joel Spolsky给计算机专业学生的七个建议
  16. 直播前、直播中、直播后...直播带货技巧大盘点
  17. 祝福大家劳动节节日快乐
  18. 解决uni-app微信小程序底部input输入框,键盘弹起时页面整体上移问题
  19. airpods版本号_airpods蓝牙版本是多少,苹果AirPods正式版使用评测
  20. 虚拟机安装windows10

热门文章

  1. 拆机详解2:比Macintosh还早?苹果Lisa拆解
  2. GitHub页面接管并利用
  3. 弱网测试学习记录(1)
  4. log4j日志文件默认存放路径
  5. javapdf转换成html,java pdf转换为html代码
  6. 走进Prime Time系列 - PT的Timing exception 03
  7. 【LeetCode】1905-统计子岛屿
  8. 寻找怪数:有一种奇怪的自然数,它的比其本身小的所有因子之和等于它本身,例如:6=1+2+3,其中1、2、3都是6的因子,编程找出整数N之内的所有怪数。
  9. 股票入门基础知识|游资或者庄股出货的结构形态
  10. 情感天地——《不能牵手就握手吧》