Получить полный путь до appdata

Мне нужно узнать путь к папке %appdata%, и записать этот путь в регистр, и использовать данный регистр в коде.

Примерный мой код (использую winapi):

global start

extern SHGetSpecialFolderPathA ; https://docs.microsoft.com/en-us/windows/win32/api/shlobj_core/nf-shlobj_core-shgetspecialfolderpatha

section .data
    CSIDL_LOCAL_APPDATA equ 001ch

section .text
    start:
        push 0
        push CSIDL_LOCAL_APPDATA
        push 0
        push 0
        call [SHGetSpecialFolderPathA]

Ответы (1 шт):

Автор решения: insolor

Первое что нужно сделать - посмотреть документацию: SHGetSpecialFolderPathA function (shlobj_core.h). В документации написано, что в параметре pszPath нужно передать указатель на буфер (адрес буфера) размером минимум MAX_PATH символов, куда будет записан путь:

pszPath

Type: LPTSTR

A pointer to a null-terminated string that receives the drive and path of the specified folder. This buffer must be at least MAX_PATH characters in size.

global start

extern SHGetSpecialFolderPathA ; https://docs.microsoft.com/en-us/windows/win32/api/shlobj_core/nf-shlobj_core-shgetspecialfolderpatha

section .data
    CSIDL_LOCAL_APPDATA equ 001ch
    MAX_PATH equ 260
    buffer times MAX_PATH db 0

section .text
    start:
        push 0
        push CSIDL_LOCAL_APPDATA
        push buffer
        push 0
        call [SHGetSpecialFolderPathA]
        ; После выполнения в буфере buffer будет путь

Результат в отладчике:

Скриншот


Также в документации функция SHGetSpecialFolderPathA помечена как неподдерживаемая, вместо нее нужно использовать SHGetFolderPathA (которая тоже deprecated, вместо нее нужно использовать SHGetKnownFolderPath, но мне не удалось получить рабочий результат с помощью этой функции (aka. "ниасилил"), поэтому ниже пример с SHGetFolderPathA):

global start

extern SHGetFolderPathA

section .data
    CSIDL_LOCAL_APPDATA equ 001ch
    MAX_PATH equ 260
    buffer times MAX_PATH db 0

section .text
    start:
        push buffer
        push 0
        push 0
        push CSIDL_LOCAL_APPDATA
        push 0
        call [SHGetFolderPathA]
        ; После выполнения в буфере buffer будет путь
→ Ссылка