CSIDL FOLDERID_ProgramFilesX86 equ 0x002a насколько я понял https://docs.microsoft.com/en-us/windows/win32/shell/csidl --- Сообщение объединено, 14 янв 2021 --- я не понял это что такое?
ага нашел вижу https://docs.microsoft.com/en-us/windows/win32/shell/knownfolderid --- Сообщение объединено, 14 янв 2021 --- Спасибо что помогаете мне! Со Старым Новым Годом Вас! --- Сообщение объединено, 14 янв 2021 --- Спасибо! С праздником!
Hacker, очевидно же, что константа эта неправильная. Надо , как у меня в примере, это раз. Почему передаю адрес - так хочет функция, как и буфер. Не просто буфер, а указатель на него. Почему бы не написать на языке Си, зачем именно Асм, еще и 64 битный, если так туго идет? --- Сообщение объединено, 14 янв 2021 --- Hacker, вот спецом для вас, х64 версия без макросов. Собирается без проблем масмом от Хатча. Код (ASM): include \masm32\include64\masm64rt.inc .data FOLDERID_ProgramFilesX86 dd 07C5A40EFh dw 0A0FBh dw 04BFCh db 087h, 04Ah, 0C0h, 0F2h, 0E0h, 0B9h, 0FAh, 08Eh dll_name db "Shell32.dll",0 api_name db "SHGetKnownFolderPath",0 .data? pfunc dq ? pbuf dq ? .code main proc ; масм автоматически тут создает пролог, sup rsp не надо (в насм мб и надо) lea rcx,dll_name ;первый параметр - имя дллки call LoadLibraryA ;вызов функции cmp eax,0 ;если нет такой длл jz @end ;выходим с программы lea rdx,api_name ;второй параметр - имя апи функции mov rcx,rax ;первый параметр - модуль в памяти, он у нас был в rax (вернулся с LdrLib) call GetProcAddress ;вызов функции cmp eax,0 ;не нашли jz @end ;так выходим, надо бы еще закрыть хендл длл, но кому оно надо mov pfunc,rax ;адрес функции будет здесь xor rax,rax ;получаем 0, для оптимизации lea r9,pbuf ;ссылка на буфер mov r8,rax ;параметр - 0 mov rdx,rax ;параметр - 0 lea rcx,offset FOLDERID_ProgramFilesX86 ;ссылка на GUID call pfunc ;вызов функции ... в pbuf будет ссылка на строку @end: ;тут очистка , обработка ошибок. ret
Господи какая хрень. Не ужели нельзя просто вот так. func_name(param1, ¶m2, ^param3, "С днём рождения тебя!") Что такое &, получить адрес. Что такое ^, преобразовать real4 в real8. Так же строка помещается в .const, и даётся на неё указатель. Вот как так. Всё это возможно в UASM, и FASM тоже можно наверное сделать. ассемблер всё сам сделает, как надо, согласно прототипу функции.
Intro, UASM да, крутой асм. ну видимо человек хочет научится писать на чистом коде, хз.. Так то понятно, что можно упростить хотя бы до invoke
Intro, > Господи какая хрень. Дело не в символах и скрипте. Они кодят в своём мире, когда апп отваливается это приводит к реальности, системным вопросам. Если кодер не способен отладить свой же код, то какой это кодер. Это задроты которые изучили синтаксис примитивных скриптовых яп, зачем такое я не понимаю. ТС решил использовать архитектурный язык, без знания архитектуры и системы. И что же он так напишет.. будут вопросы по msgbox и всё равно оно отвалится на фаулте. Просто иначе не может быть.
Всё работает спасибо. Вопрос такой почему не получается строки в буфере сложить? Вот код: Код (ASM): global start NULL equ 0 KEY_ALL_ACCESS equ 0x0000F003F HKEY_CURRENT_USER equ 0x80000001 extern SHGetKnownFolderPath extern lstrcatA extern DeleteFileA extern RegOpenKeyExA extern RegDeleteKeyA extern RegCloseKey extern MessageBoxA extern ExitProcess section .data BUFFER db 260 dup (?) pBuf resq 1 hKey resq 1 FOLDERID_ProgramFilesX86 dd 0x7C5A40EF dw 0xA0FB dw 0x4BFC db 0x87,0x4A,0xC0,0xF2,0xE0,0xB9,0xFA,0x8E xchat db '\xchat\inst.conf',0 RegistryKey db '\Software\XChat\',0 installed db 'installed',0 MessBox db 'XChat Trial Reset',0 section .code start: sub rsp,40 mov r9 , pBuf mov r8 , NULL mov rdx , NULL mov rcx , FOLDERID_ProgramFilesX86 call SHGetKnownFolderPath mov rdx , [pBuf] lea rcx , BUFFER call lstrcatA mov rdx , xchat lea rcx , BUFFER call lstrcatA mov rcx , BUFFER call DeleteFileA mov qword [rsp+20h] , hKey mov r9 , KEY_ALL_ACCESS mov r8 , NULL mov rdx , RegistryKey mov rcx , HKEY_CURRENT_USER call RegOpenKeyExA mov [hKey] , rax mov rdx , installed mov rcx , rax call RegDeleteKeyA mov rcx , hKey call RegCloseKey mov r9 , 0x30 mov r8 , NULL mov rdx , MessBox mov rcx , NULL call MessageBoxA mov rcx , rax call ExitProcess получается что-то типа "C\\xchat\\inst.conf" в буфере после второго lstrcatA , и не удаляется ключ реестра но об этом потом как разберусь с файлом.
во-первых, потому что Код (ASM): mov rdx , xchat lea rcx , BUFFER тут надо наоборот, xchat занести через lea, а rcx mov. а во-вторых, строка program files возвращается в юникоде, там нужен lstrcatW Си компилятор бы тут подсказал
lstrcatW - Warning Do not use. Consider using StringCchCat instead. See Security Considerations. У меня вопрос. В чем разница межу адресом, буфера допустим. и смещением mov rcx , trial.402000 и lea rcx , qword ptr ds:[402000] Понимаю получается разный код но работает и так и так, нужно внимательней читать описание в MSDN для функции а вообще использовать смещение? --- Сообщение объединено, 15 янв 2021 --- Может мне стоит использовать обычные функции без всяких окончаний типs A\W\Ex\N Потому что там ремарка такая Код (Text): The winbase.h header defines lstrcat as an alias which automatically selects the ANSI or Unicode version of this function based on the definition of the UNICODE preprocessor constant. Mixing usage of the encoding-neutral alias with code that not encoding-neutral can lead to mismatches that result in compilation or runtime errors. For more information, see Conventions for Function Prototypes. --- Сообщение объединено, 15 янв 2021 --- тоесть написано что ANSI or Unicode выбирается автоматически
Hacker, там не просто буфер (точнее, указатель на буфер, ибо адрес буфера передается), там указатель на указатель на начало буфера, или как то так. Я уже сам запутался с этим кодом. Нет. Нужно всегда указывать. А окончание Ex тут вообще ни к селу, ни к городу, это расширенные апи. ну а если не выберется? Будет опять драма на форуме и поиски неясно чего в отладчике? Зачем вот усложнять себе жизнь, не пойму.
StringCchCat Ой простите... не могу найти библиотеку которая использует эту функцию. Написано просто что определяется в strsafe.h Requirements REQUIREMENTS Minimum supported clientWindows XP with SP2 [desktop apps | UWP apps]Minimum supported serverWindows Server 2003 with SP1 [desktop apps | UWP apps]Target PlatformWindowsHeaderstrsafe.h --- Сообщение объединено, 15 янв 2021 --- Указатель на указатель и как мне быть то как скопировать эту строку в другой буфер? --- Сообщение объединено, 15 янв 2021 --- Хочу сказать вам всем огромное спасибо! Я многому научился, заметил что-то новое в ходе обсуждения этой темы.
Есть ещё одна фича, которая позволяет правильность кода. Декомпилируем Hex-Ray IDA Pro, и если код нормальный, то Си вариант тоже должен быть нормальный. Можете проверить мои проекты.
Код (ASM): mov r9 , pBuf mov r8 , NULL mov rdx , NULL mov rcx , FOLDERID_ProgramFilesX86 call SHGetKnownFolderPath mov rdx , [pBuf] mov rcx , BUFFER call lstrcatW mov rdx , xchat lea rcx , BUFFER call lstrcatA После вызова lstrcatW путь записывается в буфер но после каждого символа нуль, наверное потому что Unicode. После вызова второй lstrcatA буфер переписывается хотя должен в него дописывать. Во первых мне кажется нельзя так делать записывать в буфер в разных кодировках. Но если вызывать две функции lstrcatW то получается вот что после вызова второй: В буфер дописывается как надо но без нулей после каждого символа и не видит нуль в конце строки xchat db '\xchat\inst.conf',0 --- Сообщение объединено, 17 янв 2021 --- Ну да он его переписывает с первого нуля
Так вам SHGetKnownFolderPath возвращает юникод строку завершенную нулем, затем вы зачем-то ее добавляете в другой пустой буффер (хотя можно было бы использовать этот же буффер), а после добавляете аски строку к юникод строке, через функцию которая принимает аски строки. Естественно там все неверно воспринимается. Поэтому либо храните xchar как юникод строку, либо конвертируйте ее. Но вопрос зачем это писать на асме остается открытым.
Hacker, если только латинские буквы, цифры и знаки препинания тогда либо так Код (ASM): Hello db 'h',0,'e',0,'l',0,'l',0,'o',0,' ',0,'w',0,'o',0,'r',0,'l',0,'d',0,'!',0,0,0 либо так Код (ASM): Hello dw 'h','e','l','l','o',' ','w','o','r','l','d','!',0 через хекс будешь строку иероглифов подключать