获取 Assembly 中的当前工作目录

Getting the current working directory in Assembly

我正在使用 Flat Assembler 编写汇编代码,它会从 .ini 文件中读取一个值,为了做到这一点,我正在尝试调用内核 32.dll GetPrivateProfileInt 函数。

只有一个问题:为了正确读取文件,我需要将 .ini 的完整路径作为参数传递给此函数。我试图将 '.\config.ini' 作为参数传递,我也尝试使用 MAX_PATH/rb MAX_PATH 来获取完整的工作目录(有时在 FASM 中有效),但是那也不管用...

如果有人能帮助我,我将不胜感激!

这是我当前的代码:

[...]

invoke GetPrivateProfileInt,.secname,.keyname,-1,.inifile

cmp eax,1
je .start

invoke   MessageBoxA,0,.inifile,.secname,MB_ICONERROR

 [...]

.inifile: db '.\config.ini',0
.secname: db 'config',0
.keyname: db 'advanced',0

(注意:这个消息框代码只是我为了知道该函数是否真的从 config.ini 读取值而包含的内容)

以及我正在尝试读取的 .ini 文件:

[config]
advanced=1

再一次,如果有人能帮助我,我将不胜感激!

实际上,MSDN 中描述了此行为。

lpFileName [in]

The name of the initialization file. If this parameter does not contain a full path to the file, the system searches for the file in the Windows directory.

如果您想使用当前工作目录(并不总是可执行文件所在的目录),请使用 GetCurrentDirectory API 获取当前工作目录,然后附加此字符串后的配置文件。

但通常你想从放置可执行文件的目录读取配置文件。

在这些情况下,我使用如下内容:

.aminitwindow:
; Create string with the filename of the INI file.

        lea     ebx, [.str]
        invoke  GetModuleFileNameA, NULL, ebx, 512
        mov     ecx, eax

.findloop:
        dec     eax
        js      .notfound

        cmp     byte [ebx+eax], '.'
        je      .found
        jmp     .findloop

.notfound:
        mov     eax, ecx
.found:
        mov     dword [ebx+eax], '.cfg'
        mov     byte [ebx+eax+4], 0

        lea     esi, [eax+16]

这里我构造了配置文件的名字,只是简单地改变了可执行文件的扩展名(从.exe到.cfg)。如果您想使用不同的名称,只需扫描回第一个“\”字符,然后添加您的配置文件的整个文件名。