在Windows 3.1 WinAPI中如何锁定文件?

时间:2019-07-14 14:40:43

标签: winapi dosbox windows-3.1

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

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

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

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

  1. 使用GetTempFilename
  2. 创建了一个Temp文件。
  3. 调用LockFile API
  4. 调用UnlockFile API

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

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

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

  • 内核!OPENFILE
  • 内核!_LWRITE
  • 内核!_LREAD
  • 内核!_LOPEN
  • 内核!_LLSEEK
  • 内核!_LCREAT
  • 内核!_LCLOSE
  • OLE2!OLELOCKRUNNING
  • 内核!锁定资源
  • 内核!锁定段

我正在尝试确定锁定/解锁文件测试的完成方式,因此我可以尝试在DosBox中进行补救,并创建自己的测试程序以在C或VB中复制。

1 个答案:

答案 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调用。