精华内容
下载资源
问答
  • 如何给U盘或移动硬盘分配固定盘符

    千次阅读 2020-08-21 19:59:15
    U盘或移动硬盘分配固定盘符 有时候希望自己的U盘或移动硬盘插入自己电脑时,具有固定盘符,这样在插入多个U盘或硬盘时就容易区分各盘符对应哪个设备。 win+r,调出运行框,输入cmd,启动命令行窗口。 在打开的...

    给U盘或移动硬盘分配固定盘符

    有时候希望自己的U盘或移动硬盘插入自己电脑时,具有固定盘符,这样在插入多个U盘或硬盘时就容易区分各盘符对应哪个设备。

    1. win+r,调出运行框,输入cmd,启动命令行窗口。
    2. 在打开的命令提示符窗口中,输入命令diskpart,然后按下回车键,这时就进入了磁盘管理命令模式。
    3. 输入命令list volume,然后按下回车键。这时列出了此时电脑上所有的分区,并且有每个分区有相应的数字编号。
    4. 找到U盘或移动硬盘分区所对应的数字编号,以分区对应的数字编号为6举例。我们输入命令select volume 6,按下回车运行该命令,这时就会提示卷6是所选卷。
    5. 接下来我们固定U盘或移动硬盘的盘符,只需要输入命令 assign letter=Z。其中Z是要固定的盘符,按下回车键即可。

    此时,再进入资源管理器就发现盘符已经变为我们指定的Z。并且以后再插入时也仍是Z盘符。

    注意

    如果在插入U盘或移动硬盘前,电脑上已经存在指定的盘符,则以上指定失效。因此建议将盘符指定靠后的位置,如X、Y、Z这些很大程度上不会被占用的盘符。
    E、F、G、H等在加载的分区较多或接多个U盘、硬盘时容易出现占用。

    展开全文
  • 用于固定移动硬盘U盘 盘符
  • 固定U盘盘符原理

    千次阅读 2017-06-15 20:06:52
    此次更新了固定U盘盘符原理部分。 ==== 内置硬盘盘符顺序更新,修正错误部分。 盘符调整批处理在这里下载:http://bbs.wuyou.com/viewthread.php?tid=132985&extra=page%3D1 ====  写点东西,把这阶段的研究...

    此次更新了固定U盘盘符原理部分。
    ====
    内置硬盘盘符顺序更新,修正错误部分。
    盘符调整批处理在这里下载:http://bbs.wuyou.com/viewthread.php?tid=132985&extra=page%3D1
    ====
      写点东西,把这阶段的研究内容记录下来,同时也给研究相关内容的同志提供参考,免得走弯路。

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

      为什么要从注册表来研究磁盘与盘符?很简单,操作注册表速度最快,这不同于使用工具软件从低层进行查询,其实老九PECMDSHOW命令就是低层操作,操作复杂,因为我看了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
          这里的键名只有两种,一种是以类似"\??\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就是disksignature。反过来,也就是说,只要我们找到这个值,就可以找到其盘符及装入点。

      那么,如果有几块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\EnumUSBTOR\开始的值“\”最后的部分,如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-DOSHAT的强。
      当然,这里我仅举了U盘的情况,其实光盘也一样的,请读者自行查找。
    2.反向获取
      这是我的做法,一下子就可以得到U盘、光盘和软盘的盘符。
      双击HKLM\SYSTEM\MountedDevices项里,值以5c003f003f005c00开始的行,先说说它是什么?双击一下键名,你会发现原来它是哈哈发现了什么,原来它对应的字符就是“\.?.?.\.”,里面还有什么,有CDROM字样,有REMOVABLE字样,有FLOPPY字样,见下图1
    1 可移动盘符键值示例

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

    QUOTE:


          if /i !tpcode! equ 00470045004Eset 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下,fsutilwmic命令都可以,但因前者XPVISTA下的不一样,转换有点麻烦,因此使用了后者,所有盘符,不论是虚拟还是非虚拟的,都可以得到。

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

    十二、说一说固定盘符的原理
    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盘的VID&PID所综合获取的,(获取原理已经由中国高手root60931在这儿:http://bbs.driverdevelop.com/htm_data/16/0508/96099.html揭示了)只要U盘的这些字串不变,则这个特征部分就不变,还有一个就是DeviceClassID,在WINDOWS下,这个值是固定的。这样3部分加起来也是固定的,因此,不管在什么WIN系统下,其盘符都可以固定。它的不足之处就在于,如果UVERDERPRODUDCERVID&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盘或光盘上直接运行的非RAMPE,这个系统盘符,你是动不了的,这也是这种固定盘符方法的缺陷。

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

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

      如发现本文错误或不足之处,请及时告诉俺。

    展开全文
  • 此工具使用AU3脚本编译,全部功能有:禁用U盘、禁用盘符、禁用注册表,所有功能都在于注册表。
  • 如何固定U盘盘符

    千次阅读 2017-03-27 17:39:47
    我们重装系统进入WinPE系统时,在不同的电脑里U盘盘符是不同的,有的电脑U盘盘符为C盘,这给我们装系统带来很大的不方便,因此,固定U盘盘符是必要的。现在为大家介绍固定U盘盘符的两个方法,前提是WinPE系统...
    我们重装系统进入WinPE系统时,在不同的电脑里U盘的盘符是不同的,有的电脑U盘盘符为C盘,这给我们装系统带来很大的不方便,因此,固定U盘的盘符是必要的。现在为大家介绍固定U盘盘符的两个方法,前提是WinPE系统启动后能识别你的U盘,如果WinPE下的磁盘盘符系统启动后无法识别你的U盘,可以在INI文件中用SHOW命令给U盘分配盘符。 
    

    方法一:

    1、在U盘的某个位置放置一个INI文件,暂取名为"ChangeUSB.INI",放在U盘的根目录,INI文件只需要两行(红色为注释):SUBJ %CurDrv% //删除原有的U盘的盘符SHOW R:1,U         //给U盘新分配盘符为U:

    2、在WinPE的内核配置文件中加一行LOAD命令,这行LOAD命令建议放在修正USB驱动之后,通过LOAD命令的前导符"\"自动加载U盘中的"ChangeUSB.INI"文件。

    3、本方法适用于WinPE系统启动后能识别U盘的情况,如果WinPE系统启动后不能识别你的U盘,可以用PECMD.EXE的SHOW命令给U盘分配盘符。

    4、如果你的U盘已有INI文件,可以把这两行合并到已有的INI文件中。

    方法二:

    利用INIT命令的U参数。

    1、给WinPE的内核配置文件PECMD.INI的INIT命令加上U参数;

    2、在执行INIT命令后的适当位置加入以下两行代码(红色为注释):

    TEAM SUBJ %USB%|SHOW R:1,U //删除原有U盘的盘符,并重新分配盘符为UTEAM ENVI $USB=U:|ENVI $USB1=U: //重新设置与U盘盘符相关的两个环境变量

    3、方法二的原理与方法一是一致的,优点是不用在U盘上放置INI文件,得到的结果也与方法一相同。

    展开全文
  • //删除U盘 private bool RemoveUsbDevice(string drvID) { //设备驱动的设备路径形式固定为"\\.\\DeviceName",如"\\.\I" string fileName = @"\\.\" + drvID.Remove(2); IntPtr handle = CreateFile(fileName,...
    private List<string> _serialNumber = new List<string>();
     private void matchDriveLetterWithSerial()
            {
                string[] diskArray;
                string driveNumber;
                var searcher = new ManagementObjectSearcher("SELECT * FROM Win32_LogicalDiskToPartition");
                foreach (ManagementObject item in searcher.Get())
                {
                    string _driveletter = getValueInQuotes(item["Dependent"].ToString());               
                    diskArray = getValueInQuotes(item["Antecedent"].ToString()).Split(',');
                    driveNumber = diskArray[0].Remove(0, 6).Trim();
                    var disks = new ManagementObjectSearcher("SELECT * FROM Win32_DiskDrive");
                    foreach (ManagementObject disk in disks.Get())
                    {
                        if (disk["Name"].ToString() == ("\\\\.\\PHYSICALDRIVE" + driveNumber) &&
                            disk["interfaceType"].ToString() =="USB")
                        {
                            _serialNumber.Add(parseSerialFromDeviceID(disk["PNPDeviceID"].ToString()));
                            Console.Write(disk["SerialNumber"].ToString());
                            Console.Write(_driveletter);                       
                        }
                    }
                }
            }
    
            private static string getValueInQuotes(string invalue)
            {
                var posFoundStart = invalue.IndexOf("\"");
                var posFoundEnd = invalue.IndexOf("\"", posFoundStart + 1);
                string posValue = invalue.Substring(posFoundStart + 1, posFoundEnd - (posFoundStart + 1));
                return posValue;
            }
            
            private static string parseSerialFromDeviceID(string deviceid)
            {
                var splitDeviceId = deviceid.Split('\\');
                var arrayLen = splitDeviceId.Length - 1;
                var serialArray = splitDeviceId[arrayLen].Split('&');
                var serial = serialArray[0];
                return serial;
            }
    
            [DllImport("kernel32.dll",SetLastError = true,CharSet = CharSet.Auto)]
            private static extern IntPtr CreateFile(
                string lpFileName,
                uint dwDesireAccess,
                uint dwShareMode,
                IntPtr SecurityAttributes,
                uint dwCreateionDisposition,
                uint dwFlagsAndAttributes,
                IntPtr hTemplateFile
                );
            [DllImport("kernel32.dll")]
            private static extern int GetVolumeInformation(
                string lpRootPathName,
                string lpVolumeNameBuffer,
                int nVolumeNameSize,
                ref int lpVolumeSerialNumber,
                int lpMaximumComponentLength,
                int lpFileSystemFlags,
                string lpFileSystemNameBuffer,
                int nFileSystemNameSize
                );
            [DllImport("kernel32.dll", ExactSpelling = true, SetLastError = true, CharSet = CharSet.Auto)]
            private static extern bool DeviceIoControl(
                IntPtr hDevice,
                uint dwIoControlCode,
                IntPtr lpInBuffer,
                uint nInBufferSize,
                IntPtr lpOutBuffer,
                uint nOutBufferSize,
                out uint lpBytesReturned,
                IntPtr lpOverlapped
                );
    
            [DllImport("CfgMgr32.dll", SetLastError = true)]
            private static extern int CM_Enable_DevNode(ref IntPtr hDevice, int ulFlags);
            [DllImport("CfgMgr32.dll", SetLastError = true)]
            private static extern int CM_Disable_DevNode(ref IntPtr hDevice,int ulFlags);
            
            public const uint GENERIC_READ = 0x80000000;
            public const int GENERIC_WRITE = 0x40000000;
            public const int FILE_SHARE_READ = 0x1;
            public const int FILE_SHARE_WRITE = 0x2;
            public const int IOCTL_STORAGE_EJECT_MEDIA = 0x2d4808;
            //删除U盘
            private bool RemoveUsbDevice(string drvID)
            {
                //设备驱动的设备路径形式固定为"\\.\\DeviceName",如"\\.\I"
                string fileName = @"\\.\" + drvID.Remove(2);
                IntPtr handle = CreateFile(fileName,GENERIC_READ|GENERIC_WRITE,FILE_SHARE_READ|FILE_SHARE_WRITE,IntPtr.Zero,0x03,0,IntPtr.Zero);
                uint byteReturned;
                bool result = DeviceIoControl(handle, IOCTL_STORAGE_EJECT_MEDIA, IntPtr.Zero, 0, IntPtr.Zero, 0, out byteReturned, IntPtr.Zero);
                return result;
            }
    
            //定义常量
            public const int WM_DEVICECHANGE = 0x219;
            public const int DBT_DEVICEARRIVAL = 0x8000;
            public const int DBT_CONFIGCHANGECANCELED = 0x0019;
            public const int DBT_CONFIGCHANGED = 0x0018;
            public const int DBT_CUSTOMEVENT = 0x8006;
            public const int DBT_DEVICEQUERYREMOVE = 0x8001;
            public const int DBT_DEVICEQUERYREMOVEFAILED = 0x8002;
            public const int DBT_DEVICEREMOVECOMPLETE = 0x8004;
            public const int DBT_DEVICEREMOVEPENDING = 0x8003;
            public const int DBT_DEVICETYPESPECIFIC = 0x8005;
            public const int DBT_DEVNODES_CHANGED = 0x0007;
            public const int DBT_QUERYCHANGECONFIG = 0x0017;
            public const int DBT_USERDEFINED = 0xFFFF;
    
            protected override void WndProc(ref Message m)
            {
                try
                {
                    if (m.Msg == WM_DEVICECHANGE)
                    {
                        switch (m.WParam.ToInt32())
                        {
                            case WM_DEVICECHANGE:
                                break;
                            case DBT_DEVICEARRIVAL:
                                DriveInfo[] s = DriveInfo.GetDrives();
                                foreach (DriveInfo drive in s)
                                {
                                    if (drive.DriveType == DriveType.Removable)
                                    {
                                        string tempSal = HDVal(drive.Name.ToString());
                                        this.richTextBox1.AppendText("U盘已插入,盘符是" + drive.Name.ToString() + " " + tempSal + "\r\n");
                                        if (checkBox1.Checked == true)
                                        {
                                            _serialNumber.Add(tempSal);
                                        }
                                        else
                                        {
                                            if (!_serialNumber.Exists(e => e==tempSal))
                                            {
                                                bool result = RemoveUsbDevice(drive.Name.ToString());
                                                if (result)
                                                {
                                                    //CM_Disable_DevNode(ref handle, 0x02);
                                                    //CM_Enable_DevNode(ref handle, 0);
                                                }
                                            }                                        
                                        }
                                        break;
                                    }
                                }
                                break;
                            case DBT_CONFIGCHANGECANCELED:
                                //MessageBox.Show("2");
                                break;
                            case DBT_CONFIGCHANGED:
                                //MessageBox.Show("3");
                                break;
                            case DBT_CUSTOMEVENT:
                                //MessageBox.Show("4");
                                break;
                            case DBT_DEVICEQUERYREMOVE:
                                //MessageBox.Show("5");
                                break;
                            case DBT_DEVICEQUERYREMOVEFAILED:
                                //MessageBox.Show("6");
                                break;
                            case DBT_DEVICEREMOVECOMPLETE:
                                this.richTextBox1.AppendText("U盘已卸载" + "\r\n");
                                break;
                            case DBT_DEVICEREMOVEPENDING:
                                //MessageBox.Show("7");
                                break;
                            case DBT_DEVICETYPESPECIFIC:
                                //MessageBox.Show("8");
                                break;
                            case DBT_DEVNODES_CHANGED:
                                //MessageBox.Show("9");
                                break;
                            case DBT_QUERYCHANGECONFIG:
                                //MessageBox.Show("10");
                                break;
                            case DBT_USERDEFINED:
                                //MessageBox.Show("11");
                                break;
                            default:
                                break;
                        }
                    }
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message);
                } 
                base.WndProc(ref m);
            }
    
    
            private string HDVal(string drvID)
            {
                const int MAX_FILENAME_LEN = 256;
                int retVal = 0;
                int a = 0;
                int b = 0;
                string str1 = null;
                string str2 = null;
                int i = GetVolumeInformation(
                drvID,
                str1,
                MAX_FILENAME_LEN,
                ref retVal,
                a,
                b,
                str2,
                MAX_FILENAME_LEN
                );
                return retVal.ToString();
            }

     

    展开全文
  • 最近遇到个问题,移动硬盘的盘符由原本的E盘符固定到了F盘符。其原因是之前使用了一个u盘u盘盘符E给占用了并且系统一直都没有释放。 为了不影响使用移动硬盘,需要把移动硬盘的盘符改到E。 1 打开计算机管理 ...
  • 根据指定盘符获取硬盘序列号

    千次阅读 2018-08-17 17:34:27
    在项目中遇到了一个需要根据指定的盘符获取对应的磁盘的序列号,开始在网上查找都没有这种案例,于是自己翻阅了资料总结了下面的方法获取指定盘符对应的磁盘的序列号 public static int GetHDSerial(string drive...
  • 手里有个移动硬盘,连接苹果系统可以正常使用,切换到 win10系统下却每次都要重新指定盘符才可以正常打开,连接后它不会自动分配盘符,并且手动分配盘符后再断开硬盘与电脑的连接,在我的电脑里仍然会显示前面指定的...
  • 固定U盘盘符!!!!!!!!!!!!!!11
  • 删除与恢复指定卷标的盘符

    千次阅读 2010-11-27 22:57:00
    当时没怎么深入思考,后来在网友的提示下,换了一种思路,将U盘盘符暂时删除,要用的时候在将其恢复,于是就照这个思路做下去,但是怎么做呢?Google了一下,发现前辈们对此已有研究,很是欣慰,根据网友的方法把这...
  • 软件介绍: 固定U盘盘符,并重新排列其他盘符Power by jianliulin FIXUSB [U]U:固定U盘的目标盘符,不可以设置为[A,B,C]
  • mac如何挂载移动硬盘、U盘

    千次阅读 2020-12-06 18:41:05
    默认情况下Mac OS对NTFS磁盘的挂载方式是只读(read-only)的,如何实现读写: ...a、插入U盘后,使用mount命令查看磁盘挂载情况,结果如下: /dev/disk2s1 on /Volumes/ESD-USB (ntfs, local, nodev,
  • 测试开发笔记

    万次阅读 多人点赞 2019-11-14 17:11:58
    测试开发笔记 第一章 测试基础 7 什么是软件测试: 7 ★软件测试的目的、意义:(怎么做好软件测试) 7 3.软件生命周期: 7 第二章 测试过程 8 1.测试模型 8 H模型: 8 V模型 9 2.内部测试 10 ...
  • 利用UDEV机制固定存储设备的名称

    千次阅读 2013-08-11 22:52:36
    如我们rhel6系统插入了一个u盘,自动识别为/dev/sdb,而我们希望将其固定为/dev/MyUsbDisk。 则我们可以使用udevadm info -a -n /dev/sdb获取到ATTRS{serial}=="AC681DEB"信息,书写如下规则即可。 KERNEL==...
  • android 修改系统显示u盘的名称

    千次阅读 2016-03-22 15:47:06
     //强制写入u盘名称 Log.e( TAG, "DEVICE_PROPERTY_DEVICE_FRIENDLY_NAME1 " + value1 );  int length1 = value1.length();  if (length1 > 255) {  length1 = 255;  }  value1.getChars(0, ...
  • PE系统启动后,在不同的机器里U盘盘符是不同的,因此,有很多人反馈说需要固定U盘盘符。只是到底要怎么做呢?系统吧现有两个方案都能起到固定U盘盘符的作用,前提是WinPE系统启动后能识别你的U盘,如果WinPE系统...
  • C#获取U盘序列号的方法

    千次阅读 2017-05-27 22:06:23
    本文实例讲述了C#获取U盘序列号的方法。分享给大家供大家参考。具体如下: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 ...
  • U盘杀毒后文件不见/找回

    千次阅读 2017-03-23 13:15:25
    U盘杀毒后文件不见问题描述 U盘的原本的文件和文件夹变成了快捷方式,且文件位置链接到了c盘关键位置。经过杀毒软件杀毒后,U盘内文件和文件夹全部消失或只剩下一个文件夹。在文件资源管理器(我的电脑)中,U盘盘...
  • QT:检测U盘插入和拔出(windows)

    千次阅读 2019-11-19 16:56:23
    qDebug()[i].filePath()固定驱动器:硬盘驱动器或闪存驱动器"; break; case 4: qDebug()[i].filePath()远程(网络)驱动器"; break; case 5: qDebug()[i].filePath()驱动器"; break; case 6: qDebug()[i]....
  • 注册表与盘符(转victor888文章 ) 标签: c++获取盘符 c#获取盘符  转自: http://blog.csdn.net/loulou_ff/article/details/3769479  写点东西,把这阶段的研究内容记录下来,同时也给研究...
  • 在格式化U盘的时候,会有一个U盘格式的选择,一般是两个,有的是三个,FAT32/exFAT/NTFS,那么这三个格式具体有什么区别呢?相信很多人都知道如果要拷贝超过4G大小的文件就得用NTFS格式,但其实他们之间的区别可不只...
  • U盘格式化工具.exe

    2015-02-28 10:06:21
    U没坏却无法再电脑显示盘符,强制格式化有奇效 U盘格式化工具是一款可以帮助用户格式化u盘的工具,使用非常方便,用户只需要格式化的u盘,然后点击“确定”即可。  u盘强制格式化工具 使用说明:  1、免格式化将...
  • // 固定硬盘驱动器 break; case DRIVE_REMOTE: // 网络驱动器 break; case DRIVE_CDROM: // 光盘驱动器 break; } pDriveStr += szDriveStr + 1; szDriveStr = strlen(pDriveStr);...
  •  //::AfxMessageBox("固定硬盘驱动器");  break;  case DRIVE_REMOTE:  //::AfxMessageBox("这是网络驱动器");  return;  case DRIVE_CDROM:  //::AfxMessageBox("这是光盘驱动器");  return; */
  • ATTO测试: ATTO磁盘基准测试是一款简单易用的磁盘传送速率检测工具,可以用来检测硬盘、U盘、存储卡及其它可移动磁盘的读取及写入速率,该软件使用了不同大小的数据测试包,数据包按0.5K, 1.0K, 2.0K直到到8192.0...
  • 当插入SD/TF卡之后就可以在电脑上看到U盘盘符和对应的总容量/剩余容量(注意图标是U盘盘符), 可以进行正常的读写操作.   所以可以看出来U盘读卡器其实SD/TF卡->U盘的转换实现, 也就是说这种U盘SD卡读卡设备...
  • 一键GHOST v2019.08.12优盘教程

    千次阅读 2019-12-19 15:35:33
     选择“U盘”,备份或恢复固定为“U盘”第一分区根目录下的c_pan.gho映像。  选择“移动硬盘”,备份或恢复固定为“移动硬盘”第二分区根目录下的c_pan.gho映像。  选择"备份"或"恢复"后,应该出现GHOST窗口:  小...
  • U盘病毒的攻防策略

    2018-03-21 20:43:14
    [摘要] 随着U盘 用户的增加,U盘渐渐成为主流的移动存储设备,针对U盘开发商的病毒应运而生,和U盘病毒作斗争就成为了广大用户的烦恼之一。就目前U盘病毒的表象和症状进行了分析,并提出了可行的解决办法。[关键词]...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,088
精华内容 435
关键字:

u盘固定盘符