winapi - 在 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 的调试器,我发现使用了以下过程:
- 使用GetTempFilename创建临时文件
- 调用LockFile API
- 调用UnlockFile API
当我在 LockFile API 返回时设置断点并伪造一个失败(返回 false)在 Windows 7 上,我收到相同的错误消息“必须安装 SHARE.exe 才能运行 Visual Basic”
但是在 VB.exe 中我找不到对 LOCKFILE API 的任何引用,所以我怀疑 NTVDM.exe 正在以某种方式翻译它。
在 VB.exe 的导入表中似乎可能相关的 API 是:
- 内核!打开文件
- 内核!_LWRITE
- 内核!_LREAD
- 内核!_LOPEN
- 内核!_LLSEEK
- 内核!_LCREAT
- 内核!_LCLOSE
- OLE2!OLELOCKRUNNING
- 内核!LOCKRESOURCE
- 内核!LOCKSEGMENT
我正在尝试弄清楚锁定/解锁文件测试是如何完成的,以便我可以尝试在 DosBox 中进行修复并创建自己的测试程序以在 C 或 VB 中复制。
解决方案
必须安装 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 的引用
我不确定LockFile
Win16中是否存在(可能不存在),但有可能通过DOS中断直接调用共享API。
我怀疑 NTVDM.exe 正在以某种方式翻译它
我不确定,但我会假设它拦截 DOS 中断并使用 Win32 API 调用来模拟所需的行为。
我正在尝试弄清楚锁定/解锁文件测试是如何完成的,以便我可以尝试在 DosBox 中进行修复并创建自己的测试程序以在 C 或 VB 中复制
我会尝试在 DOS Box 中记录 INT 21h 和 INT 2Fh 调用。
推荐阅读
- javascript - 如何使用 laravel 在 vue js 的另一个组件中添加 header.vue 和 footer.vue?
- ruby-on-rails - 在开发服务器上找不到 wkhtmltopdf-binary
- kotlin - 将两张地图合二为一
- arrays - SwiftUI 核心数据附加数组返回空
- azure-active-directory - office 365 为用户分配组
- javascript - react-select:如何解决“警告:道具`id`不匹配”
- python - 数据着色器为每个日期更改颜色
- python - 使用 moviepy Python 裁剪音频
- python-3.x - 带有机器学习的 OCR
- express - 504 网关超时 nginx、nodejs