之前的帖子见 https://www.v2ex.com/t/217087
因为以前没接触过驱动编程,看样子如果我写的话有些人也信不过,正巧有个轮子,我就直接用轮子了。
用的是dokany,功能类似于 FUSE 但是是在 Windows 上。就是装了它的驱动之后,如果我在用户态实现文件系统各个操作相关接口,然后再调用 dokany 就可以创建出一个相应的盘。
文件系统部分还是基于 GRUB 源码做的,项目地址: https://github.com/Archstacker/GRUB 。目前的关键功能都已实现,可以对文件、目录进行打开、复制操作。关键代码见grub-mount-win.c。目前最新版下载及说明见此。
不过现在存在的最大的问题是程序还不太稳定,用 Windows 自带的资源管理器打开,尤其是某个操作还没完成就进行下一个操作的话,经常会出现程序崩溃、目录打开后没东西(刷新后就好了)、文件有可能打不开(多次打开的话有可能出现), 建议使用第三方资源管理器打开或是压缩软件来浏览,或者直接使用各种终端命令 。
经过我几天的调试,发现问题在于 GRUB 是单线程的,而我写好接口之后 dokany 是以多线程调用的,尤其是 Windows 默认的资源管理器会同时开启超多线程,导致出现问题的情况大大增加。
GRUB 其中一处多线程有可能产生冲突的地方我已经修好了。但是现在最棘手的就是 GRUB 中使用全局变量grub_errno 来记录上次错误的错误号。但是在多线程的情况下有可能出现错误号被另一个线程冲掉了的情况。现在的各种问题应该都是这个原因。
这个问题应该来说比较好修,只需要保证在这个程序中调用的所有函数,错误号都通过返回值返回或是进行相关检测好了,感觉这就算是个体力活。不过由于我这两周把大量时间都花在这个上面,堆了好多事要做,接下来一段时间会比较忙,没有功夫做这件事情。不知道有没有人有兴趣把这个坑填上?感觉虽然需求量比较少,但还是有一定意义的。
最后再强调一下,现在程序会出现一些问题,不过那都是在使用 Windows 自带资源管理器的情况下碰到的。我使用第三方工具查看的话还没遇到过问题,足够日常使用,希望大家能帮忙测试。
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.