曾几何时,我在虚拟机中拥有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为projectvfdlib和vfdwinprojectvfdwin,否则他们会尝试建立lib.dll和gui.exe。- 要在不使用zlib的情况下编译VFD,您不仅需要添加定义
VFD_NO_ZLIB,还需要删除该#include "zlib.h"子#ifndef VFD_NO_ZLIB控件。欲去除需要zlibstat.lib从<AdditionalDependencies>。
这些修复之后,是32位版本
vfd.dll和vfdwin.exe;但是要构建64位版本,您需要做更多的工作。
适应x64
首先,代码本身与x64不兼容,您需要替换
DlgProc从BOOL到全部的返回类型INT_PTR;- 所有呼叫
GetWindowLong(GWL_USERDATA)到GetWindowLongPtr(GWLP_USERDATA),并且是同类SetWindowLong和DWL_MSGRESULT和DWL_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中