signature=8e285fe2217d0f93a8da5e33788a5742,[转]注册表与盘符的对应关系

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

一、都有什么类型的磁盘

这是首先要清楚的概念,分清了类别,我们才能去寻找相应的盘符。不用多说,按物理类别来分可分为磁性盘(如硬盘、软盘、磁带机),压缩盘(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

这里的键名只有两种,一种是以类似"\??\Volume{07c229a8-4b84-11de-8e8d-00e04c3e821b}"开头的,{}中的部分即分区的ID,它是调整盘符的基础,是不变的。另一种就是我们的盘符形式的了,如A: C:等等。

仔细观察会发现每种键名的键值都会在另外一种键的键值中找,这个值是唯一的,具体内容是什么,请看接下来的图形及最后的总结。

这个位置最重要,一切盘符与类型信息都在这里,接下来会详细解读。

四、如何找到一个本地磁盘(或固定磁盘)所包含的分区与盘符?一句话,通过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命令,但一般的PE都没有为DISKPART安装相应的服务。

WINDOWS下,注意这个设备类别项HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\STORAGE\Volume,所有的连接过的固定磁盘的signature都记录在这里而且不能删除,举例:这是一个子项,1&30a96598&0&SignatureA8E1B9D2Offset7E00LengthXXXXXXXX

红字部分是子signature,后面的Offset7E00是该磁盘的偏移值也是起始分区标志,LengthXXXXXXXX是指分区的大小,当然,这里我们不需要知道它。那么,到底如何确定signature所对应的磁盘号啊,盘符顺序是根据如上volume项下的分区的offset值来确定,分区从前至后,offset值从小到大,因此,盘符分区offset值的顺序,是决定盘符顺序的依据。

明白了吗?

总结一下,WINDOWS下获取一个固定磁盘盘符的方法:

1. 获取磁盘signature

在HKEY_LOCAL_MACHINE\HARDWARE\DESCRIPTION\System\MultifunctionAdapter\9\DiskController\0\DiskPeripheral\0(不同的电脑,上述项中红色的数字可能不同),项下有一个名为Identifier的键,找到两个"-"中间的部分即为disk signature值,如"00c72b95-A8E1B9D2-A"。

注:signature也可以通过mfbfix软件或windows自带的diskpart获得,具体用法见本人的批处理源代码。

2. 根据signature找到对应的磁盘序号

根据signature,找到这里HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\STORAGE\Volume\1&30a96598&0&SignatureA8E1B9D2Offset7E00LengthXXXXXXXX

根据offset值从小到大的顺序来确定盘符的顺序!

3. 根据signature获取盘符

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

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

六、固定磁盘盘符的顺序根据磁盘分区的offset值从小到大排序,即可得到正确的盘符顺序。在HKLM\SYSTEM\MountedDevices项下将offset值反序即可得到对应分区的ID值,同时也就获得了该分区的盘符。

说到这里固定磁盘的盘符获得方法说完了,再说说如何获得可移动磁盘的盘符吧。

七、获取可移动盘盘符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 可移动盘符键值示例

20081205_b17102776245c67cc669LuwgHH0h3PQD.jpg

这就是我们要的磁盘类型啊,我们取几个相应的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,是他给出了同类情况批处理的最简单的语句。这里也涉及一个盘符顺序的问题,我们可以不用像硬盘那样通过offset值来获取,为什么呢?因为USB硬盘,只要你一插上,WINDOWS给分区的盘符都是连续的,在注册表中volume id值也是连续分布的。十二、说一说固定盘符的原理

QUOTE:

每个U盘都应该对应唯一的一个设备模型,这个设备模型对应唯一的设备范例ID,把设备范例ID和你的U盘盘符对应起来了。这里的设备范例ID,确切的说,是HKLM\SYSTEM\MountedDevices里的键值,为什么是不变的呢?这个固定盘符的方法有不足之处吗?我们先从U盘的键值还说吧,如图1:

20081205_b17102776245c67cc669LuwgHH0h3PQD.jpg这个值分为3部分,即类型描述部分,是固定的,红色框中特征部分,最近证实,本人分析的正确的,此红色部分是系统根据U盘的VID&PID所综合获取的,(获取原理已经由中国高手root60931在这儿:http://bbs.driverdevelop.com/htm_data/16/0508/96099.html揭示了)只要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 固定磁盘第一分区键值

20081205_26b021273d42ee8fa2a7K7tGIQbaZlE4.jpg共分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 磁盘其它分区键值

20081205_f1fd50eee5d725553bd1pdzlzRC9beTG.jpg同理,这也是这项红色字的反向内容: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,这个系统盘符,你是动不了的,这也是这种固定盘符方法的缺陷。最后,再总结一下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也有类似的情况

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
用python写一个函数读取二进制文件,二进制文件第一行是版本信息 等号左边是描述,右边是值 后面的头信息以{开始,最后一个}结束 注意头信息里面也有{} 头信息里面的参数都是等号左边是描述,右边是值,值的最后以;结束 头信息的参数可多可少 下面是文件头信息示例 vbf_version = 2.6; header { // Created by VbfSign build: 2017/12/12 on 2020/10/19 9:54 sw_part_number = "8891903679"; sw_version = "A"; sw_part_type = SBL; data_format_identifier = 0x10; ecu_address = 0x1A31; file_checksum = 0x0D81F89D; call = 0x1FFF8004; verification_block_start = 0x20000800; verification_block_length = 0x00000054; verification_block_root_hash = 0x3C440B332BE20F05B9C108F347658FBEBEAA4B3E0D655CAEE76AE210E93E828A; sw_signature_dev = 0x8A97CF400B82AB1B0D82C26976CB26F7AE6B34A87E56675D39E52B9C811F1AB9C040B52FA925BB60E981F388A748F0E09B20D2CBEF7A9A49119EC68C1EFE83BD0EA34B0FDE59F16B8533FEE72219D698C898F4D9EB40B9FCE42C73C028519D1767C11AEEBF0FE746B2F8AB601DA7E3686E4B46AC05851FCDD7A55CBF5F72DA826B0152640514F87CE905362CBFA7F19FE04CAA84A2882E20592E2000D576F629A1B05A207FB59DDC6E8DD10154F148AACA7CBBD5E978BF9E67EDC1ADD186E098A81FEF3C657D2AEFC083F25D307DE00715AB8B2C78CDB23CD13B3DAD9110333ADAB672F1EC6B6D5CFCAF04FC71490A54ECE1745E46D4AB3A9D1E0BA0CACE0B92; sw_signature = 0x12FBA8C1BCB608E5ADC31E1AC73292E5EB7DE42813F6F403DE17A1436766A43BBB78387019BBAF910B86F98214278093889EBB8E9CCC24C4A659F6C5FA3C9F1B794C88544C36235739686474454253AFD99020193B86EBD6FB6CD190B723ECF73CAA3C35F65C82A9E0BEFC94711FBBAD428DD77276B2933508A086720B934EA0691A49D0510C1F107448BCF3FA9378057628280A0E49FE3F196F925E31D1234ECF759911F05274DC6291FF5AFF2EF6CB7039062314559F799D1CB5E82902D10B20755E45F23F397EA335098A8E87002D681D8A400E4AC56CEBC9E2BBA9023B311361A5432A321CB588C1BF691898DA6486A3088E5AD93A3A1DB99461E5A75825; }
最新发布
06-04
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值