折腾过Windows To Go、或者想在SD卡上装个系统的人,八成都被同一个问题恶心过:明明SD卡插进读卡器、接上电脑,Windows却死活把它识别成“可移动设备”。可移动就可移动吧,但它带来的限制实在太气人——不能BitLocker加密、磁盘管理里只能看不能动、很多磁盘工具直接拒绝操作,甚至连系统安装程序都不让你把引导写在上面。今天要聊的cfadisk,就是专门解决这件事的一把老钥匙:它能让Windows把SD卡当成固定硬盘来对待。这套方案不是新鲜发明,而是Windows Driver Kit里一个经典示例驱动的变体应用,但至今依然是折腾U盘、SD卡、移动硬盘最干净利落的办法之一,值得一步不少地整理清楚。
1. 为什么要折腾:SD卡被识别成“可移动设备”到底少了什么
1.1 可移动设备带来的实际限制
先看最直接的痛点。当SD卡通过USB读卡器接入Windows,系统默认会把它归为USB大容量存储设备,磁盘类型显示为“可移动”。这个标签不只是图标长得不一样,它直接决定了一堆功能能不能用:
- BitLocker驱动器加密不可用。Windows默认不允许对可移动设备启用BitLocker,就算手动打开“允许对可移动数据驱动器使用BitLocker”组策略,实际体验也很别扭,远不如固定硬盘原生支持来得顺手。
- 磁盘管理功能受限。对可移动设备,Windows自带的磁盘管理工具很多操作是灰色的,比如无法删除卷、无法扩展卷、无法顺利设置活动分区。想调整分区结构,得靠第三方工具,而且第三方工具也可能因为设备被识别为“可移动”而改变行为。
- 部分软件拒绝写入引导记录。装Windows、部署PE、写UEFI引导的时候,很多工具会检查目标磁盘是否可移动。SD卡在这种状态下经常被判定为“不支持的介质”,导致部署失败。
- 写缓存策略不同。可移动设备默认倾向于使用“快速删除”策略,也就是关闭写入缓存,大文件写入时性能有明显下降。固定磁盘则可以启用更好的写入缓存策略,对持续读写更友好。
说实话,对于普通用户来说,SD卡当移动U盘存点照片、传传文档,可移动识别反而更安全。但对于需要在SD卡上跑系统、做嵌入式部署、或者长期挂机当数据盘的人来说,“可移动”这个标签就是一道无形的墙。cfadisk解决的就是把这道墙拆掉。
1.2 Windows是怎么判断设备“可移动”还是“固定”的
这里有必要稍微讲一下原理,否则后面操作时遇到问题会一头雾水。
SD卡本身走的是SD物理层协议,通过SD模式或SPI模式与主机通信。但SD卡插到USB读卡器里,情况就不一样了——读卡器内部相当于一个桥接芯片,把SD卡的协议封装成USB Mass Storage协议,也就是用CBW/CSW命令块来模拟SCSI磁盘命令。Windows看到的不是“SD卡”,而是“USB存储设备”。
那Windows怎么知道眼前这个设备是可移动还是固定磁盘?关键就在USB Mass Storage设备返回的SCSI Inquiry数据里有一个RMB位(Removable Media Bit)。如果这个位是1,Windows就把它当成可移动设备;如果为0,就当成固定磁盘。大多数SD读卡器在固件里都会把RMB位置为1,因为从硬件设计上,卡确实是可以随时拔换的。
这个RMB位最终会被驱动层读取并传给Windows存储栈。正常情况下,Windows用系统的Usbstor.sys加Disk.sys这套驱动来管理USB存储设备,Usbstor.sys会如实上报RMB标志。cfadisk的思路很干脆:不改变任何硬件,而是用另一个驱动替换默认绑定,在驱动层把设备伪装成一个没有RMB标志的固定磁盘。Windows上层看到的就是本地磁盘,于是所有固定磁盘权限全部放开。
1.3 烧录Ubuntu系统、Windows To Go等场景为什么会被影响
提到SD卡,现在最热门的玩法之一就是往卡里烧录Ubuntu或者其他Linux发行版,用在树莓派、ARM开发板、迷你主机上。很多人烧录完镜像之后,喜欢把卡插回电脑调整分区、扩容根分区,或者做备份镜像。这时候Windows如果还把这卡当“可移动设备”,麻烦就来了:
- 烧录工具(如Rufus、balenaEtcher)写入时没问题,但烧完想用Windows自带的磁盘管理调整分区,可移动设备状态下操作受限。
- 想把整张SD卡做成一个可启动的Windows To Go工作盘,官方工具和第三方工具都要求目标磁盘是固定硬盘,否则直接拒绝。
- 用DISM命令往SD卡里释放Windows镜像时,某些模式会校验磁盘类型,可移动介质会比固定磁盘多出不少限制。
- 从SD卡启动Windows系统后,系统内的一些服务、驱动安装逻辑也可能因为“检测到可移动介质”而触发额外策略,导致某些软件装不上或跑不起来。
我见过不少人在这些场景下绕来绕去,又是换工具、又是手动改注册表,费了半天劲,其实最底层的解法就是把设备类型改成固定磁盘。cfadisk就是从根上解决这件事。
2. cfadisk是什么:原理与方案选型
2.1 cfadisk的出身与基本机制
cfadisk这个名字看起来挺硬核,其实它是Windows Driver Kit(WDK)里自带的一个示例驱动,主要用于演示如何编写一个磁盘类驱动。在WDK源码目录里,你可以找到cfadisk的源码和编译好的驱动文件,包含cfadisk.sys和cfadisk.inf。
它的核心机制可以这样理解:正常情况下,Windows通过“USB大容量存储设备的驱动程序”来管理SD读卡器,这套驱动会把SD卡标记为可移动设备。cfadisk则是一个磁盘类驱动,通过INF文件把硬件ID绑定到cfadisk.sys上。一旦驱动替换成功,cfadisk.sys会向Windows报告这个设备是固定磁盘,而不是可移动设备。
等等,一个示例驱动为什么值得用来做这件事?妙就妙在它本身就是微软官方签名的驱动。WDK编译出来的cfadisk.sys带有微软的签名,在64位Windows上不会被强制签名策略拦死。这意味着不需要进入测试模式、不需要禁用驱动签名,理论上就能完成加载。当然,实际安装时因为INF文件被修改过,会牵扯到CAT签名匹配的问题,这点后面我会单独说。
2.2 和其他方案比,为什么cfadisk更靠谱
市场上还有其他方案,但操作下来各有各的坑。我整理了一个对比,方便你判断为什么最终选cfadisk:
| 方案 | 原理 | 优点 | 缺点 |
|---|---|---|---|
| cfadisk驱动替换 | 用微软签名磁盘驱动替换USBSTOR | 微软官方驱动、兼容性好、不影响系统其它设备 | 需要改INF、偶尔被Windows Update覆盖 |
| 修改注册表把设备标记为固定磁盘 | 手动改USBSTOR的注册表属性 | 不需要额外驱动 | 系统仍在用Usbstor,注册表改法因设备驱动栈而异,稳定性差 |
| 第三方工具(如RMPrepUSB) | 借助工具写入特殊引导/驱动 | 操作傻瓜化 | 工具时有更新,第三方驱动签名安全性存疑,不适合天天跑关键任务 |
| 硬件级固定 | 换用一个把RMB位清0的读卡器 | 完全不依赖软件 | 读卡器难找、又是一笔开销,且不同主控差异大 |
从我实际体验来说,cfadisk是最接近“官方原生能力”的路线。它不是注入式破解,不Hook任何东西,更像是在系统驱动注册表里换了个替身。替身本身是微软自己的,所以稳定性有基础保障。第三方工具虽然快,但很难确定它到底改了什么,对长期使用的环境来说不够放心。
2.3 用它之前要接受的限制
cfadisk也不是万能神药,有几个限制必须先讲清楚,免得你折腾半天期待落空:
- 它改变的是Windows对设备的识别,不会提升SD卡本身的物理速度。如果卡本身是普通A1等级的TF卡,那读写照样是那个水平,别指望识别成固定硬盘后速度飞起。
- 换读卡器、换电脑,驱动绑定可能失效。cfadisk的INF里写的硬件ID是和读卡器芯片绑定的,不是和SD卡本身绑定的。不同电脑、不同读卡器都可能有不同VID/PID,需要重新匹配和安装。
- Windows大版本更新后,驱动可能被系统默认驱动覆盖。尤其是Windows Update推送了新的存储类驱动,可能会把cfadisk的绑定冲掉,你需要重新安装一次。
- 一旦把SD卡识别为固定磁盘,系统不会再把它视为“安全删除硬件”设备。这听上去似乎是好事,但也意味着热插拔时丢数据的风险窗口变大,务必在物理移除前确保没有写入操作。
这些限制都不是劝退理由,但清楚它们之后,你才能在使用时不踩无谓的坑,也才知道出了问题时该往哪个方向排查。
3. 手把手把SD卡变成固定磁盘
3.1 准备材料与驱动文件获取
需要准备的东西不多:
- 一台64位Windows电脑(Win10/Win11均可,Win7也支持);
- 一个USB SD读卡器,建议是常见主控(Realtek、Genesys Logic、JMicron等),因为改INF时更好匹配硬件ID;
- 一张SD卡,容量不限,但如果你打算长期当固定硬盘用,建议至少U3或A2等级,质量别太差;
- 一个干净的cfadisk驱动包。
驱动文件怎么拿?最正规的途径是安装Windows Driver Kit(WDK)。从微软官网下载WDK安装包,装完后去源码目录找cfadisk,一般路径类似:
C:\Program Files (x86)\Windows Kits\10\Src\storage\cfadisk里面会有源代码和已经编译好的驱动。如果你不想装整个WDK,也可以从装了WDK的同事电脑上拷贝,或者在一些技术社区里找别人整理好的cfadisk包。不过下载第三方打包的驱动时务必小心,建议核对文件签名是否属于微软,确认无误再使用。注意,修改INF之后,自带的CAT签名文件是匹配不上的,所以在系统层面会走“未验证发布者”的流程,这本身并不代表驱动有问题,但拿到手上的文件必须确保来源可靠。
3.2 拿到SD卡准确的硬件ID
这一步是整个操作里最容易出错的地方。把读卡器插上电脑,插好SD卡,按下面步骤操作:
- 按 Win+X,打开“设备管理器”;
- 展开“磁盘驱动器”,找到代表你的SD卡读卡器的那一项(通常带有SD、MMC、Reader字样,也有可能直接显示SD卡容量);
- 右键 → “属性” → “详细信息”选项卡;
- “属性”下拉框选择“硬件ID”,记下所有值。
典型的结果长这样:
USB\VID_0BDA&PID_0328&REV_0100 USB\VID_0BDA&PID_0328其中VID_0BDA表示设备厂商ID,PID_0328表示产品ID。这些十六进制值就是后面匹配驱动的关键。如果设备是内置读卡器(比如笔记本自带的SD插槽),硬件ID可能长这样:
SCSI\DiskSD_32GB____0123456789ABCDEF SCSI\DiskSD_32GB不管哪种格式,建议把“硬件ID”列表里每一行都复制出来存到记事本里备用。后面改INF时会用到最精简的ID。
3.3 修改cfadisk.inf的正确姿势
用记事本(右键 → 以管理员身份运行)打开cfadisk.inf。WDK原始版本的内容会比较复杂,不同版本结构略有差异,但核心需要关注的是硬件ID映射部分。以下是一个典型结构:
[Version] Signature = "$Windows NT$" Class = DiskDrive ClassGuid = {4d36e967-e325-11ce-bfc1-08002be10318} Provider = %ProviderName% DriverVer = 06/21/2006,6.1.7600.16385 CatalogFile = cfadisk.cat [Manufacturer] %ProviderName% = cfadisk,NTamd64 [cfadisk.NTamd64] ; 这个部分就是硬件ID匹配表 ; 原始样例设备ID,必须替换成你自己的设备ID %cfadisk_devdesc% = cfadisk_device.NT,USB\VID_058F&PID_6387实际操作时,你需要把形如
%cfadisk_devdesc% = cfadisk_device.NT,硬件ID这一行的硬件ID替换成你在设备管理器里看到的ID。比如你的读卡器显示为USB\VID_0BDA&PID_0328,那就可以改成:
%cfadisk_devdesc% = cfadisk_device.NT,USB\VID_0BDA&PID_0328如果有多个硬件ID变体,可以写多行,例如:
%cfadisk_devdesc% = cfadisk_device.NT,USB\VID_0BDA&PID_0328 %cfadisk_devdesc% = cfadisk_device.NT,SCSI\DiskSD_32GB保存文件时注意编码。INF文件的[Strings]段通常定义了描述字符串,如果你看到非英文字符有乱码风险,建议整体保持ANSI编码或UTF-8 with BOM,别用UTF-8无BOM随便存,否则系统可能读错。改完先不要急着关闭记事本,确认每一行末尾没有多余空格,硬件ID之间没有拼错字符。
3.4 安装驱动的两种方法和验证
驱动INF改好后,有两种安装方式,我都试过,任选一种即可。
方法一:右键INF直接安装
在资源管理器里找到改好的cfadisk.inf,右键 → “安装”。系统可能会弹“Windows无法验证此驱动程序软件的发布者”——这是因为CAT签名文件与修改后的INF不匹配。此时选择“仍要安装此驱动程序软件”,等待提示安装完成。如果没有出现任何提示,说明安装静默成功了。
方法二:设备管理器手动更新驱动
这是更推荐的路径,因为它能直观看到驱动是否成功替换:
- 打开设备管理器,找到SD卡读卡器设备;
- 右键 → “更新驱动程序”;
- 选择“浏览我的电脑以查找驱动程序”;
- 选择“让我从计算机上的可用驱动程序列表中选取”;
- 点击“从磁盘安装”,浏览到cfadisk.inf所在文件夹,选择该INF;
- 列表里会出现cfadisk相关驱动,选中并下一步,系统会提示替换现有驱动,确认即可。
安装完成后,强烈建议把读卡器拔掉重插一次,或者重启一次电脑。然后打开“此电脑”,你应该能看到SD卡的分区图标不再是“可移动磁盘”那种样式。再按 Win+X → “磁盘管理”,找到对应磁盘,显示类型为“基本”,设备状态正常,就说明变身成功了。
验证是否真正生效,还可以看一点:系统托盘里的“安全删除硬件并弹出媒体”图标是否消失。如果cfadisk成功接管,这个图标通常会消失,因为Windows已经认为这是一个固定磁盘。如果还在,那说明驱动栈没有完全替换,需要回头检查INF匹配是否正确。
4. 常见问题与避坑实录
4.1 驱动签名导致的安装失败
这是最常遇到的坑。64位Windows默认只加载有有效签名的驱动程序,cfadisk.sys虽然是微软签名的,但改过INF后,对应的CAT文件内容哈希不一致,系统不再承认它的签名有效性。此时你可能遇到以下情况:
- 右键INF安装时直接提示“安装失败,第三方INF不包含数字签名信息”;
- 设备管理器更新驱动时提示“拒绝安装,驱动没有经过签名”。
解决办法有几种,按推荐顺序:
- 临时禁用驱动强制签名:按住Shift重启电脑,进入“疑难解答 → 高级选项 → 启动设置 → 重启”,开机菜单里按数字7进入“禁用驱动程序强制签名”模式,然后在这个模式下安装驱动。安装完成后可以正常重启,驱动能保留。
- 开启测试签名模式:以管理员身份运行CMD,执行
bcdedit /set testsigning on,重启后系统进入测试模式,可以安装未签名或签名不一致的驱动。用完之后执行bcdedit /set testsigning off并重启恢复。 - 如果只是提示“无法验证发布者”,直接选“始终安装此驱动程序软件”,多数情况下可以完成安装。
这里要提醒一句:测试签名模式会降低系统安全性,不建议长期开启,折腾完驱动就关掉。
4.2 拔插后打回原形
有些人安装成功,用了几天,某次拔插SD卡后发现设备又变回“可移动”。原因大概率是两个:
- Windows Update自动更新了存储驱动。系统在线更新时可能重新安装了Usbstor或磁盘驱动,把cfadisk的绑定覆盖掉。解决办法是重新安装一次cfadisk,并在设备管理器 → 设备属性里查看是否有回滚驱动的选项;如果不想再被覆盖,可以在“Windows更新设置”里暂停驱动更新,或者用组策略关闭设备安装设置中的自动更新驱动。
- 换了一个SD卡槽。同一台电脑可能有前后面板两个USB口,但驱动绑定一般不随端口变化;但如果你的“硬件ID”中有端口标识(比如
USB\VID_xxxx&PID_xxxx\6&12345&0&1),系统可能对不同端口生成不同设备实例。所以尽量固定同一个USB口使用,或者在INF里把不带端口尾缀的基础ID写全。
4.3 多读卡器和多卡共用一套inf
cfadisk的绑定对象是读卡器芯片,不是SD卡本身。也就是说,如果你的读卡器是同一型号、同一主控,插不同的SD卡都会被识别成固定磁盘。但如果你有两台不同品牌读卡器,每个读卡器的VID/PID不同,那你就需要把两个读卡器的硬件ID都写进同一个INF文件的对应位置,再安装一次。
同理,笔记本内置SD读卡器和外接USB读卡器的ID一般不一样。例如内置读卡器可能是SCSI\DiskSD_32GB,外接的是USB\VID_0BDA&PID_0328,这种情况下就把这两类ID都加进匹配列表,保证切换使用时不会被系统踢回可移动设备状态。
4.4 对性能与SD卡寿命的真实影响
把SD卡变成固定磁盘后,系统会把它当作本地磁盘,自然会对它启用更激进的写缓存策略。这意味着两次写回之间的延迟更小,持续写入的体验会好一些。但要留意,固定磁盘在Windows里默认不会像可移动设备那样频繁刷写缓存,如果你直接拔卡,缓存里的数据可能来不及落盘,导致分区损坏或数据丢失。
所以我的建议是:如果你把这个SD卡当固定硬盘用,拔卡前要么正常弹出,要么确认没有任何读写进程,要么用带写保护开关的高品质SD卡。另外,SD卡的磨损均衡和坏块管理是由卡内主控自己完成的,Windows优化驱动器里的“碎片整理”对这种介质基本没有正收益,反而不建议频繁执行。卡本身寿命取决于写入量和卡的质量,识别成固定磁盘不会缩短寿命,但如果你拿它跑数据库、做系统盘,那写入压力确实会比当U盘用大得多,建议选择TLC以上级别、带A2标识的卡。
5. 扩展玩法与个人经验
5.1 U盘、移动硬盘同样适用
这套方法不只是SD卡能用。USB闪存盘如果被系统识别为可移动磁盘,同样可以用cfadisk改造。操作流程完全一样,只是硬件ID要换成U盘的VID/PID,例如常见的USB\VID_0781&PID_5581(SanDisk主控)等。
很多老牌U盘量产工具也有类似功能,能做“本地磁盘”模式,但量产操作复杂且容易损坏U盘。相比之下,cfadisk是纯驱动层面,不改固件,风险小很多。我给一个朋友改过一个32GB U盘,配合Rufus做Windows安装盘,整个流程顺很多,传统启动兼容性也比可移动磁盘状态更好。
5.2 配合Windows To Go和系统维护
想真正在SD卡或U盘里跑一个完整Windows系统,固定磁盘识别是必要条件之一。Windows To Go官方对USB设备有要求,就是固定磁盘优先;可移动磁盘虽然能跑,但性能和兼容性都明显差一截。把SD卡用cfadisk识别成固定磁盘后,再用DISM或第三方工具写入Windows镜像,启动成功率确实高了不少。
我已经拿一张64GB的高性能SD卡做过Windows 10 LTSC系统盘,配合USB 3.0读卡器,日常办公、上网、跑一些绿色软件都不卡。外出的时候插到别的电脑上开机,从启动按下电源键到进入桌面大概40秒上下,作为出差临时系统完全够用。
5.3 一些安全建议
最后聊聊安全。cfadisk毕竟是一个需要替换系统驱动的操作,我的建议是:
- 折腾前先把SD卡上的重要数据备份出来,安装驱动过程中某些异常操作可能导致分区信息被重置;
- 不要从来源不明的网站下载所谓“cfadisk一键补丁”,宁可自己装WDK拿原始文件,安全比省事重要;
- 如果只是临时需要固定磁盘识别(比如烧录镜像),用完可以卸载驱动,设备管理器中右键设备 → 删除设备,并把INF文件移走,系统就会恢复默认的Usbstor绑定;
- 不要同时让多个盘一起做固定磁盘改造,先拿一张不重要的SD卡练手,熟悉流程后再应用到主力设备。
实际上,我最初接触cfadisk是为了解决一块旧平板的内存不够问题,想在TF卡里跑点便携软件。第一次改INF就把写反了设备ID,安装后系统提示“指定位置不包含有关硬件的信息”,排查了一会儿才发现是VID和PID顺序颠倒了。后来我把全部硬件ID变体都写进去,一次成功。从那之后,这套方法就成了我的保留技能。如果你也想突破SD卡当固定硬盘这个限制,耐心按照上面的步骤来,遇到问题多看一眼硬件ID和签名提示,基本能顺利搞定。