首页 > 解决方案 > 在 Windows 3.1 WinAPI 中如何锁定文件?

问题描述

我试图在 DosBox 中运行的 Windows 3.1 中运行 Visual Basic 4(16 位)。但是它无法启动并出现错误:

必须安装 SHARE.exe 才能运行 Visual Basic

一些旧的 MS-DOS 应用程序只是检查 EXE 的存在以及它是否存在于 autoexec.bat 中,但在这种情况下 EXE 存在,但错误仍然发生。

在 Windows 7 32 位上运行并使用附加到 NTVDM.exe 的调试器,我发现使用了以下过程:

  1. 使用GetTempFilename创建临时文件
  2. 调用LockFile API
  3. 调用UnlockFile API

当我在 LockFile API 返回时设置断点并伪造一个失败(返回 false)在 Windows 7 上,我收到相同的错误消息“必须安装 SHARE.exe 才能运行 Visual Basic”

但是在 VB.exe 中我找不到对 LOCKFILE API 的任何引用,所以我怀疑 NTVDM.exe 正在以某种方式翻译它。

在 VB.exe 的导入表中似乎可能相关的 API 是:

我正在尝试弄清楚锁定/解锁文件测试是如何完成的,以便我可以尝试在 DosBox 中进行修复并创建自己的测试程序以在 C 或 VB 中复制。

标签: winapidosboxwindows-3.1

解决方案


必须安装 SHARE.exe 才能运行 Visual Basic

SHARE.EXE 用作终止和保持常驻程序。所以它的存在是不够的。它必须运行,才能连接到系统并拦截一些请求。

SHARE.EXE 拦截 DOS 中断 (0x21) 和 DOS 多路复用中断 (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
返回:AX 错误代码,如果 CF 是设置为 CY

此函数锁定对由 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
返回:AX 错误代码,如果 CF 是设置为 CY

此功能解锁对先前锁定的文件区域的访问...


您还可以检查主要标记为内部的 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/中继/共享/share.c

如果您打算将此功能带到 Dos Box,查看 vDos 源代码可能会有所帮助

https://sourceforge.net/projects/vdos/files/Version%202015.04.10/


但是在 VB.exe 中我找不到任何对 LOCKFILE API 的引用

我不确定LockFileWin16中是否存在(可能不存在),但有可能通过DOS中断直接调用共享API。

我怀疑 NTVDM.exe 正在以某种方式翻译它

我不确定,但我会假设它拦截 DOS 中断并使用 Win32 API 调用来模拟所需的行为。

我正在尝试弄清楚锁定/解锁文件测试是如何完成的,以便我可以尝试在 DosBox 中进行修复并创建自己的测试程序以在 C 或 VB 中复制

我会尝试在 DOS Box 中记录 INT 21h 和 INT 2Fh 调用。


推荐阅读