In Windows 3.1 WinAPI 如何锁定文件?

In Windows 3.1 WinAPI How To Lock A File?

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

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

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

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

  1. 使用 GetTempFilename
  2. 创建了一个临时文件
  3. 致电LockFileAPI
  4. 致电UnlockFileAPI

当我在 return 的 LockFile API 设置断点并在 Windows 7 上伪造失败(returned false)时,我收到了相同的错误消息 "SHARE.exe must be installed in order to run Visual Basic"

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

似乎与 VB.exe 的导入 table 潜在相关的 API 是:

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

中复制

SHARE.exe must be installed in order to run Visual Basic

SHARE.EXE 用作终止和驻留程序类型。所以它的存在是不够的。必须是运行,挂接到系统并拦截一些请求。

SHARE.EXE拦截DOS中断(0x21)和DOS多路复用中断(0x2F)。

在 0x21 中断代码 0x5c 处理锁定和解锁文件


http://www.techhelpmanual.com/530-dos_fn_5c00h__lock_file_access.html

锁文件 5c00h
预计:
斧头 5c00H
BX 文件句柄
CX:DX 文件从文件开始的偏移量 (CX * 65536)+DX
SI:DI 要锁定的区域的字节长度 (SI * 65536)+DI
Returns:如果 CF 设置为 CY,则 AX 错误代码

此函数锁定对 BX 中文件句柄标识的文件区域的访问。从文件逻辑偏移量 CX:DX 开始延伸 SI:DI 长度的文件区域被锁定 ...

http://www.techhelpmanual.com/531-dos_fn_5c01h__unlock_file_access.html

解锁文件 5c01h
预计:
斧头 5c01H
BX 文件句柄
CX:DX 文件从文件开始的偏移量 (CX * 65536)+DX
SI:DI 要锁定的区域的字节长度 (SI * 65536)+DI
Returns:如果 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/


However within the VB.exe I can't find any reference to LOCKFILE API

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

I suspect NTVDM.exe is translating it somehow

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

I am trying to work out how the lock / unlock file test is done so I can try to remediate within DosBox and create my own test program to replicate in C or VB

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