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

在Windows 3.1 WinAPI中如何锁定文件?,winapi,dosbox,windows-3.1,Winapi,Dosbox,Windows 3.1,我试图在DosBox中运行Windows3.1中的VisualBasic4(16位)。但是,它未能启动,出现错误: 必须安装SHARE.exe才能运行Visual Basic 一些旧的MS-DOS应用程序只是检查EXE是否存在以及它是否存在于autoexec.bat中,但在这种情况下,EXE存在,但错误仍然发生 在Windows 7 32位上运行并使用附加到NTVDM.exe的调试器时,我发现使用了以下进程: 临时文件是用 调用API 调用API 当我在LockFile API返回时设置断点并在

我试图在DosBox中运行Windows3.1中的VisualBasic4(16位)。但是,它未能启动,出现错误:

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

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

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

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

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

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

    • 内核!开放文件
    • 内核_LWRITE
    • 内核_笨蛋
    • 内核_洛本
    • 内核_利泽克
    • 内核_创造
    • 内核_洛斯
    • OLE2!油锁运行
    • 内核!锁资源
    • 内核!锁段
    我正试图弄清楚锁/解锁文件测试是如何完成的,这样我就可以尝试在DosBox中进行修正,并创建自己的测试程序,以便在C或VB中进行复制

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

    SHARE.EXE作为终止和驻留程序工作。因此,仅仅存在是不够的。它必须运行,才能连接到系统并拦截一些请求

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

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


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

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

    解除锁定文件5c01h
    期望:
    AX 5c01H
    BX文件句柄
    CX:DX文件距文件开头的偏移量(CX*65536)+DX
    SI:DI要锁定的区域的字节长度(SI*65536)+DI
    返回:如果CF设置为CY,则返回AX错误代码

    此函数用于解锁对先前锁定的文件区域的访问


    您还可以检查主要标记为内部的5dh函数

    在免费DOS中实现:


    参见DosLockUnlock功能

    如果您计划将此功能带到Dos框中,查看vDos源代码可能会有所帮助


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

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

    我怀疑NTVDM.exe不知怎么翻译了它

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

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

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