Second Life虚拟软盘驱动器

曾几何时在虚拟机中拥有Windows的旧版本,而且我不得不使用软盘在主机和这些虚拟机之间传输文件,因为共享文件夹支持仅在Windows for Workgroups中出现



通过软盘传输文件既缓慢又嘈杂,当我找到Virtual Floppy Drive驱动程序时,我欣喜若狂,该驱动程序使您可以创建“虚拟软盘驱动器”并将其照常连接到VM。不幸的是,作者对他的项目的兴趣在2005年消失了,在2010年,他的网站和电子邮件不再存在。从那时起,Windows世界发生了许多变化:



  • 64位OS被广泛使用,不可能将2005年编译的32位驱动程序加载到其中。
  • 从Vista SP1开始的Windows开始要求数字签名或繁琐的操作,这些操作要求系统重新启动才能加载驱动程序。
  • 自动转换后,现代版本的Visual Studio中不会构建用Visual C ++ 6编写的项目。


在2011年,ReactOS开发人员邮件列表已经讨论过,为一个废弃的项目提供支持。但是未经作者本人的同意,这是不可能发生的,到那时作者还没有出现生命迹象。同时,某个Andriy G. Tereshchenko创建了一个非官方的镜像vfd.sourceforge.net,其中包含失踪作者网站的副本。SourceForge那里仍然有2005版,并且仍然有抱怨说该版本不能在Windows 7+中运行。



我想继续在github.com/tyomitch/vfd上开发VFD 即使您对VFD本身无动于衷,我的故事也可以帮助您“复兴” Windows下的其他废弃项目。



汇编



Visual Studio 2019同意开放vfd.dsw其组成项目并将其转换为现代格式; 但是转换不完整,因此转换后的项目拒绝编译。



我发现以下问题:



  • 消息编译器(mc $(InputName)调用转换不正确-而不是mc %(Filename)在VS2019中进行mc %(FullPath)为MC($(InputName).h$(InputName).rc生成的文件名完全不转换;在VS2019中,它们应该看起来像%(Filename).h%(Filename).rc
  • 为资源编译器($(IntDir)\$(InputName).res)生成的文件名也未转换;在VS2019中它们应该看起来像$(IntDir)\%(Filename).res
  • <TargetName>需要从default($(ProjectName)更改vfd为projectvfdlibvfdwinproject vfdwin,否则他们会尝试建立lib.dllgui.exe
  • 要在不使用zlib的情况下编译VFD,您不仅需要添加定义VFD_NO_ZLIB,还需要删除该#include "zlib.h"#ifndef VFD_NO_ZLIB控件。欲去除需要zlibstat.lib<AdditionalDependencies>


这些修复之后,是32位版本vfd.dllvfdwin.exe但是要构建64位版本,您需要做更多的工作。



适应x64



首先,代码本身与x64不兼容,您需要替换
  • DlgProcBOOL全部的返回类型INT_PTR;
  • 所有呼叫GetWindowLong(GWL_USERDATA)GetWindowLongPtr(GWLP_USERDATA),并且是同类SetWindowLongDWL_MSGRESULTDWL_USER


其次,它不用于转换项目的设置中$(Platform),因为在VC6时可能只有一个平台。因此32位和64位文件尝试收集在同一目录中。为了自己的品种,必须在被修正$(IntDir)<AssemblerListingLocation><PrecompiledHeaderOutputFile><ObjectFileName><ProgramDataBaseFileName><OutputFile>对于链接器,请修复为$(TargetPath); 并删除无用的<AdditionalLibraryDirectories>,手动在项目之间添加依赖项,然后<PostBuildEvent>手动将编译后的文件复制到目标目录。



第三,它vfdwin积极地拒绝尝试在64位Windows上运行以及试图在Windows 95/98 / Me上运行。要停止此操作,您需要删除该功能VfdIsValidPlatform()及其所有引用。



驱动下载



我手头没有Windows DDK,因此我选择了vfd.sys由某个critical0编译的64位DDK,并询问达特赖登以“中国古代方式”签名。如果vfdwin以管理员权限启动,此驱动程序将加载并成功运行为了使这种情况始终发生,您需要添加其链接选项<UACExecutionLevel>RequireAdministrator



另一个发烧友Igor Levicki专门撰写了整个博客文章,以vfd.sys针对x64进行编译,并声称他的版本 vfd.sys比Critical0好。但是它是用自制证书签名的,没有其他手势就不会加载。除了自制证书外,雄心勃勃的伊戈尔·莱维奇(Igor Levicki)在驱动程序文件中还提到了自己和他的博客。关键不是那样胡扯。



使用



除了上述变化,我刚刚更换了早已过世的URL在关于窗口github.com/tyomitch/vfd,并固定在外壳一个错误,只在调试编译是明显的:函数VfdGetLocalLink传递一个类型参数CHAR,以isalpha()和转储上线_ASSERTE(c >= -1 && c <= 255);标准库。最近的habrapost中所述,该行为isalpha()未定义为负数,但CHAR在Windows中仅对其进行了签名。从在编译过程中发出141条警告的事实来看,代码中仍可能存在许多此类错误。所以我的自由之夜与我有关系。



准备好的二进制文件位于github.com/tyomitch/vfd/tree/master/x64/Debug中



All Articles