我试图在DosBox中运行的Windows 3.1中运行Visual Basic 4(16位)。但是,它未能启动并显示错误:
必须安装SHARE.exe才能运行Visual Basic
某些旧的MS-DOS应用程序仅检查EXE的存在以及它是否存在于autoexec.bat中,但是在这种情况下EXE存在,但是错误仍然发生。
在32位Windows 7上运行并使用连接到NTVDM.exe的调试器,我发现使用了以下过程:
当我在LockFile API返回时设置一个断点并伪造了一件错误消息(返回false)时,在Windows 7上我收到了相同的错误消息“必须安装SHARE.exe才能运行Visual Basic”
但是在VB.exe中我找不到对LOCKFILE API的任何引用,因此我怀疑NTVDM.exe正在以某种方式对其进行翻译。
VB.exe导入表中似乎潜在相关的API是:
我正在尝试确定锁定/解锁文件测试的完成方式,因此我可以尝试在DosBox中进行补救,并创建自己的测试程序以在C或VB中复制。
答案 0 :(得分:2)
必须安装SHARE.exe才能运行Visual Basic
SHARE.EXE作为“终止并驻留”程序。因此,它的存在还不够。它必须运行才能挂接到系统并拦截一些请求。
SHARE.EXE拦截DOS Interupt(0x21)和DOS Multiplex中断(0x2F)。
在0x21中,中断代码0x5c处理文件的锁定和解锁
http://www.techhelpmanual.com/530-dos_fn_5c00h__lock_file_access.html
LockFile 5c00h
期望:
AX 5c00H
BX文件句柄
CX:DX文件从文件开头的偏移量(CX * 65536)+ DX
SI:DI要锁定的区域的字节长度(SI * 65536)+ DI
返回:如果CF设置为CY,则返回AX错误代码
此功能锁定对BX中文件句柄标识的文件区域的访问。从文件逻辑偏移CX:DX开始,扩展长度为SI:DI的文件区域被锁定...
http://www.techhelpmanual.com/531-dos_fn_5c01h__unlock_file_access.html
UnlockFile 5c01h
期望:
AX 5c01H
BX文件句柄
CX:DX文件从文件开头的偏移量(CX * 65536)+ DX
SI:DI要锁定的区域的字节长度(SI * 65536)+ DI
返回:如果CF设置为CY,则返回AX错误代码
此功能可解锁对文件先前锁定的区域的访问...
您还可以检查主要标记为内部的5dh功能。
在免费DOS中的实现:
https://sourceforge.net/p/freedos/svn/HEAD/tree/kernel/trunk/kernel/dosfns.c
请参阅DosLockUnlock函数
https://sourceforge.net/p/freedos/svn/HEAD/tree/kernel/trunk/share/share.c
如果您打算将此功能引入Dos Box,则查看vDos源代码可能会有所帮助
https://sourceforge.net/projects/vdos/files/Version%202015.04.10/
但是在VB.exe中我找不到对LOCKFILE API的任何引用
我不确定Win16中是否存在LockFile
(可能不存在),但是有可能通过DOS中断直接调用共享API。
我怀疑NTVDM.exe正在以某种方式对其进行翻译
我不确定,但是我认为它会拦截DOS中断并使用Win32 API调用来模拟所需的行为。
我正在尝试确定锁定/解锁文件测试的完成方式,因此我可以尝试在DosBox中进行补救,并创建自己的测试程序以在C或VB中复制
我会尝试在DOS Box中记录INT 21h和INT 2Fh调用。