通过软盘传输文件既缓慢又嘈杂,当我找到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
和vfdwin
projectvfdwin
,否则他们会尝试建立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中