Добрый вечер. Пытаюсь добавить свою DLL в AppInit_DLL, набросал следующий код: Код (Text): .data szDLLBootPath db "HKEY_LOCAL_MACHINE\Software\\Windows NT\CurrentVersion\Windows",0 szAppInitsDLL db "AppInit_DLLs", 0 szLoadingsDLL db "DLL.dll", 0 .data? lpBufer1 db 256 dup(?) .code main proc LOCAL phkResult:DWORD LOCAL hKey : DWORD ;Open key HKEY_LOCAL_MACHINE\Software\\Windows NT\CurrentVersion\Windows invoke RegOpenKeyEx, HKEY_LOCAL_MACHINE, addr szDLLBootPath, NULL, KEY_SET_VALUE, addr phkResult mov hKey, eax .if eax!=ERROR_SUCCESS mov eax, ERROR_SUCCESS ret .endif ;Defines DLL path invoke GetModuleFileName, addr szLoadingsDLL, addr lpBufer1, sizeof lpBufer1 ;Write path to AppInits_DLL invoke RegSetValueEx, hKey, addr szAppInitsDLL, NULL, REG_SZ, addr lpBufer1, sizeof lpBufer1 .if eax!=ERROR_SUCCESS mov eax, ERROR_SUCCESS ret .endif ;Close key invoke RegCloseKey, hKey main endp подскажите что я делаю не правильно
HKEY_LOCAL_MACHINE\Software\\Windows NT\CurrentVersion\Windows вот в этой строке ошибка и возврат из процедуры должен быть, тоже ошибка
Код (Text): .data szDLLBootPath db "Software\Microsoft\Windows NT\CurrentVersion\Windows",0 szAppInitsDLL db "AppInit_DLLs", 0 szLoadingsDLL db "DLL.dll", 0 .data? lpBufer1 db 256 dup(?) .code main proc LOCAL phkResult:DWORD LOCAL hKey : DWORD ;Open key HKEY_LOCAL_MACHINE\Software\\Windows NT\CurrentVersion\Windows invoke RegOpenKeyEx, HKEY_LOCAL_MACHINE, addr szDLLBootPath, NULL, KEY_SET_VALUE, addr phkResult mov hKey, eax .if eax!=ERROR_SUCCESS mov eax, ERROR_SUCCESS ret .endif ;Defines DLL path invoke GetModuleFileName, addr szLoadingsDLL, addr lpBufer1, sizeof lpBufer1 ;Write path to AppInits_DLL invoke RegSetValueEx, hKey, addr szAppInitsDLL, NULL, REG_SZ, addr lpBufer1, sizeof lpBufer1 .if eax!=ERROR_SUCCESS mov eax, ERROR_SUCCESS ret .endif ;Close key invoke RegCloseKey, hKey ret main endp Спасибо, убрал HKEY_LOCAL_MACHINE. Успешно доходит до RegSetValueEx но при вызове не получается создать такой параметр, быть может я не правильно вызываю саму функцию
да действительно неверно, ты пытаешься запихнуть туда весь буфер lpBufer1, а надо только то что вернула GetModuleFileName
Код (Text): invoke GetModuleFileName, addr szLoadingsDLL, addr lpBufer1, sizeof lpBufer1 после вызова возвращается 0 - ошибка, не пойму почему.
Смотрю в книгу - вижу фигу) спасибо Velheart defaultplayer она возвращает буфер его и передаю в RegSetValueEx. Все таки как записать путь своей библиотеки DLL.dll в AppInit_DLLs.
прежде чем вызывать RegSetValueEx, вычисли длину строки в буфере, которую туда положила GetModuleFileName, сделать это можно функций strlen, она возвращает длину строки без нуль терминатора, а потом уже это число передавай в RegSetValueEx
тут я немного сбрехал, в мсдн написано что если тип ключа REG_SZ, REG_EXPAND_SZ, or REG_MULTI_SZ то надо передавать размер строки + нуль терминатор, тоесть strlen вернет число, прибавь к нему 1 и передавай в RegSetValueEx
Код (Text): invoke GetModuleHandle, addr szLoadingsDLL invoke GetModuleFileName, eax, addr lpBufer1, sizeof lpBufer1 .if eax==0 xor eax,eax ret .endif invoke lstrlen, addr lpBufer1 mov ebx, eax inc ebx ;ADD invoke RegSetValueEx, hKey, addr szAppInitsDLL, NULL, REG_SZ, addr lpBufer1, ebx .if eax!=ERROR_SUCCESS invoke RegCloseKey, hKey mov eax, ERROR_SUCCESS ret .endif Опять что-то не правильно делаю, но не пойму что
ну мы с тобой тут напрограммировали , ну ниче будем учится, я вот смотрю в твой код и думаю это весь или нет, библиотека которую ты хочешь в реестр запихнуть небось в папке грузом валяется?? а мы GetModuleFileName вызываем . Если просто лежит в папке с exe файлом, то наверно нужно получить текущую директорию с помощью GetCurrentDirectory и объединить ее с именем библиотеки, а потом уже эту строку пихать в RegSetValueEx, ну и размер строки незабудь
Код (Text): .data szDLLBootPath db "Software\Microsoft\Windows NT\CurrentVersion\Windows",0 szAppInitsDLL db "AppInit_DLLs", 0 szLoadingsDLL db "\DLL.dll", 0 .data? lpBufer1 db 256 dup(?) .code start: main proc LOCAL phkResult:DWORD invoke RegOpenKeyEx, HKEY_LOCAL_MACHINE, addr szDLLBootPath, NULL, KEY_SET_VALUE, addr phkResult cmp eax, ERROR_SUCCESS jne return invoke GetCurrentDirectory, sizeof lpBufer1, offset lpBufer1 ; функция возвращает путь без слэша \ в конце ; поэтому слэш добавим в начало строки с именем библиотеки invoke lstrcat, offset lpBufer1, offset szLoadingsDLL ; здесь объединяем все это invoke lstrlen, offset lpBufer1 ; вычисляет длину без нуля inc eax ; добавляем нуль invoke RegSetValueEx, phkResult, offset szAppInitsDLL, NULL, REG_SZ, offset lpBufer1, eax invoke RegCloseKey, phkResult return: ret main endp сейчас я вызывал GetCurrentDirectory потому что библиотека лежит в каталоге с exe файлом, если нужно свой путь, то запиши его статически в программу.
GetCurrentDirectory - далеко не лучшее решение, если нам надо определить папку, из которой запущен процесс. Логичнее было бы вызвать GetModuleFileName, передав 0 в качестве первого параметра. А к возвращённой строке уже добавлять имя длл-ки.
да, действительно, конечно же так лучше, спасибо, просто топикстартер запутал меня с GetModuleFileName, а я его, и так непонятно что накодили add: ан нет, GetModuleFileName с нулем в качестве первого параметра, возвращает путь вместе с именем экзешника, что неудобно, хотя конечно GetCurrentDirectory не лучшее решение так как может использоваться SetCurrentDirectory, но в данном случае думаю пойдет
defaultplayer мои благодарности тебе все работает, только странно почему нужно увеличивать на еденицу полученную длину, ткните носом где об этом написано в MSDN может не дочитал. TheGrow
из МСДН про последний параметр RegSetValueEx: "If the data is of type REG_SZ, REG_EXPAND_SZ, or REG_MULTI_SZ, cbData must include the size of the terminating null character or characters" переводится приблизительно так, - если тип строковый, то размер должен включать нуль терминатор, а lstrlen возвращает длину без него