Добавление своей DLL в AppInit_DLL

Тема в разделе "WASM.BEGINNERS", создана пользователем TheGrow, 9 сен 2008.

  1. TheGrow

    TheGrow New Member

    Публикаций:
    0
    Регистрация:
    8 сен 2008
    Сообщения:
    35
    Добрый вечер.

    Пытаюсь добавить свою DLL в AppInit_DLL, набросал следующий код:


    Код (Text):
    1. .data
    2.     szDLLBootPath   db  "HKEY_LOCAL_MACHINE\Software\\Windows NT\CurrentVersion\Windows",0
    3.     szAppInitsDLL   db  "AppInit_DLLs", 0
    4.     szLoadingsDLL   db  "DLL.dll", 0
    5. .data?
    6.     lpBufer1    db  256 dup(?)
    7. .code
    8.  
    9. main proc
    10. LOCAL phkResult:DWORD
    11. LOCAL hKey    : DWORD
    12.    
    13.     ;Open key HKEY_LOCAL_MACHINE\Software\\Windows NT\CurrentVersion\Windows
    14.     invoke RegOpenKeyEx, HKEY_LOCAL_MACHINE, addr szDLLBootPath, NULL, KEY_SET_VALUE, addr phkResult
    15.     mov hKey, eax
    16.     .if eax!=ERROR_SUCCESS
    17.         mov eax, ERROR_SUCCESS
    18.         ret
    19.     .endif
    20.     ;Defines DLL path
    21.     invoke GetModuleFileName, addr szLoadingsDLL, addr lpBufer1, sizeof lpBufer1
    22.     ;Write path to AppInits_DLL
    23.     invoke RegSetValueEx, hKey, addr szAppInitsDLL, NULL, REG_SZ, addr lpBufer1, sizeof lpBufer1
    24.     .if eax!=ERROR_SUCCESS
    25.         mov eax, ERROR_SUCCESS
    26.         ret
    27.     .endif
    28.     ;Close key
    29.     invoke RegCloseKey, hKey
    30.    
    31. main endp
    подскажите что я делаю не правильно
     
  2. defaultplayer

    defaultplayer New Member

    Публикаций:
    0
    Регистрация:
    18 июн 2006
    Сообщения:
    214
    HKEY_LOCAL_MACHINE\Software\\Windows NT\CurrentVersion\Windows

    вот в этой строке ошибка

    и возврат из процедуры должен быть, тоже ошибка
     
  3. TheGrow

    TheGrow New Member

    Публикаций:
    0
    Регистрация:
    8 сен 2008
    Сообщения:
    35
    Код (Text):
    1. .data
    2.     szDLLBootPath   db  "Software\Microsoft\Windows NT\CurrentVersion\Windows",0
    3.     szAppInitsDLL   db  "AppInit_DLLs", 0
    4.     szLoadingsDLL   db  "DLL.dll", 0
    5. .data?
    6.     lpBufer1    db  256 dup(?)
    7. .code
    8.  
    9. main proc
    10. LOCAL phkResult:DWORD
    11. LOCAL hKey    : DWORD
    12.    
    13.     ;Open key HKEY_LOCAL_MACHINE\Software\\Windows NT\CurrentVersion\Windows
    14.     invoke RegOpenKeyEx, HKEY_LOCAL_MACHINE, addr szDLLBootPath, NULL, KEY_SET_VALUE, addr phkResult
    15.     mov hKey, eax
    16.     .if eax!=ERROR_SUCCESS
    17.         mov eax, ERROR_SUCCESS
    18.         ret
    19.     .endif
    20.     ;Defines DLL path
    21.     invoke GetModuleFileName, addr szLoadingsDLL, addr lpBufer1, sizeof lpBufer1
    22.     ;Write path to AppInits_DLL
    23.     invoke RegSetValueEx, hKey, addr szAppInitsDLL, NULL, REG_SZ, addr lpBufer1, sizeof lpBufer1
    24.     .if eax!=ERROR_SUCCESS
    25.         mov eax, ERROR_SUCCESS
    26.         ret
    27.     .endif
    28.     ;Close key
    29.     invoke RegCloseKey, hKey
    30.    
    31.     ret
    32. main endp
    Спасибо, убрал HKEY_LOCAL_MACHINE.
    Успешно доходит до RegSetValueEx но при вызове не получается создать такой параметр, быть может я не правильно вызываю саму функцию
     
  4. defaultplayer

    defaultplayer New Member

    Публикаций:
    0
    Регистрация:
    18 июн 2006
    Сообщения:
    214
    да действительно неверно, ты пытаешься запихнуть туда весь буфер lpBufer1, а надо только то что вернула GetModuleFileName
     
  5. TheGrow

    TheGrow New Member

    Публикаций:
    0
    Регистрация:
    8 сен 2008
    Сообщения:
    35
    Код (Text):
    1. invoke GetModuleFileName, addr szLoadingsDLL, addr lpBufer1, sizeof lpBufer1
    после вызова возвращается 0 - ошибка, не пойму почему.
     
  6. Velheart

    Velheart New Member

    Публикаций:
    0
    Регистрация:
    2 июн 2008
    Сообщения:
    526
    Потому, что первый параметр должен быть HMODULE =)
     
  7. TheGrow

    TheGrow New Member

    Публикаций:
    0
    Регистрация:
    8 сен 2008
    Сообщения:
    35
    Смотрю в книгу - вижу фигу) спасибо Velheart
     
  8. TheGrow

    TheGrow New Member

    Публикаций:
    0
    Регистрация:
    8 сен 2008
    Сообщения:
    35
    Смотрю в книгу - вижу фигу) спасибо Velheart
    defaultplayer она возвращает буфер его и передаю в RegSetValueEx.

    Все таки как записать путь своей библиотеки DLL.dll в AppInit_DLLs.
     
  9. defaultplayer

    defaultplayer New Member

    Публикаций:
    0
    Регистрация:
    18 июн 2006
    Сообщения:
    214
    прежде чем вызывать RegSetValueEx, вычисли длину строки в буфере, которую туда положила GetModuleFileName, сделать это можно функций strlen, она возвращает длину строки без нуль терминатора, а потом уже это число передавай в RegSetValueEx
     
  10. defaultplayer

    defaultplayer New Member

    Публикаций:
    0
    Регистрация:
    18 июн 2006
    Сообщения:
    214
    тут я немного сбрехал, в мсдн написано что если тип ключа REG_SZ, REG_EXPAND_SZ, or REG_MULTI_SZ то надо передавать размер строки + нуль терминатор, тоесть strlen вернет число, прибавь к нему 1 и передавай в RegSetValueEx
     
  11. TheGrow

    TheGrow New Member

    Публикаций:
    0
    Регистрация:
    8 сен 2008
    Сообщения:
    35
    Код (Text):
    1. invoke GetModuleHandle, addr szLoadingsDLL
    2.     invoke GetModuleFileName, eax, addr lpBufer1, sizeof lpBufer1
    3.     .if eax==0
    4.         xor eax,eax
    5.         ret
    6.     .endif
    7.     invoke lstrlen, addr lpBufer1
    8.     mov ebx, eax
    9.     inc ebx
    10.     ;ADD
    11.     invoke RegSetValueEx, hKey, addr szAppInitsDLL, NULL, REG_SZ, addr lpBufer1, ebx
    12.     .if eax!=ERROR_SUCCESS
    13.         invoke RegCloseKey, hKey
    14.         mov eax, ERROR_SUCCESS
    15.         ret
    16.     .endif
    Опять что-то не правильно делаю, но не пойму что
     
  12. defaultplayer

    defaultplayer New Member

    Публикаций:
    0
    Регистрация:
    18 июн 2006
    Сообщения:
    214
    ну мы с тобой тут напрограммировали :), ну ниче будем учится, я вот смотрю в твой код и думаю это весь или нет, библиотека которую ты хочешь в реестр запихнуть небось в папке грузом валяется?? а мы GetModuleFileName вызываем :). Если просто лежит в папке с exe файлом, то наверно нужно получить текущую директорию с помощью GetCurrentDirectory и объединить ее с именем библиотеки, а потом уже эту строку пихать в RegSetValueEx, ну и размер строки незабудь
     
  13. defaultplayer

    defaultplayer New Member

    Публикаций:
    0
    Регистрация:
    18 июн 2006
    Сообщения:
    214
    Код (Text):
    1. .data
    2.     szDLLBootPath   db  "Software\Microsoft\Windows NT\CurrentVersion\Windows",0
    3.     szAppInitsDLL   db  "AppInit_DLLs", 0
    4.     szLoadingsDLL   db  "\DLL.dll", 0
    5.  
    6. .data?
    7.     lpBufer1    db  256 dup(?)
    8.    
    9. .code
    10.  
    11. start:
    12.  
    13. main proc
    14.  
    15.     LOCAL phkResult:DWORD
    16.  
    17.     invoke RegOpenKeyEx, HKEY_LOCAL_MACHINE, addr szDLLBootPath, NULL, KEY_SET_VALUE, addr phkResult
    18.    
    19.     cmp eax, ERROR_SUCCESS
    20.     jne return
    21.    
    22.     invoke GetCurrentDirectory, sizeof lpBufer1, offset lpBufer1 ; функция возвращает путь без слэша \ в конце
    23.                                                                  ; поэтому слэш добавим в начало строки с именем библиотеки
    24.    
    25.     invoke lstrcat, offset lpBufer1, offset szLoadingsDLL ; здесь объединяем все это
    26.    
    27.     invoke lstrlen, offset lpBufer1  ; вычисляет длину без нуля
    28.    
    29.     inc eax ; добавляем нуль
    30.    
    31.     invoke RegSetValueEx, phkResult, offset szAppInitsDLL, NULL, REG_SZ, offset lpBufer1, eax
    32.    
    33.     invoke RegCloseKey, phkResult
    34.  
    35. return:
    36.    
    37.      ret
    38. main endp
    сейчас я вызывал GetCurrentDirectory потому что библиотека лежит в каталоге с exe файлом, если нужно свой путь, то запиши его статически в программу.
     
  14. G13

    G13 New Member

    Публикаций:
    0
    Регистрация:
    24 мар 2006
    Сообщения:
    499
    GetCurrentDirectory - далеко не лучшее решение, если нам надо определить папку, из которой запущен процесс. Логичнее было бы вызвать GetModuleFileName, передав 0 в качестве первого параметра. А к возвращённой строке уже добавлять имя длл-ки.
     
  15. defaultplayer

    defaultplayer New Member

    Публикаций:
    0
    Регистрация:
    18 июн 2006
    Сообщения:
    214
    да, действительно, конечно же так лучше, спасибо, просто топикстартер запутал меня с GetModuleFileName, а я его, и так непонятно что накодили :)

    add: ан нет, GetModuleFileName с нулем в качестве первого параметра, возвращает путь вместе с именем экзешника, что неудобно, хотя конечно GetCurrentDirectory не лучшее решение так как может использоваться SetCurrentDirectory, но в данном случае думаю пойдет
     
  16. TheGrow

    TheGrow New Member

    Публикаций:
    0
    Регистрация:
    8 сен 2008
    Сообщения:
    35
    defaultplayer мои благодарности тебе все работает, только странно почему нужно увеличивать на еденицу полученную длину, ткните носом где об этом написано в MSDN может не дочитал.

    TheGrow
     
  17. defaultplayer

    defaultplayer New Member

    Публикаций:
    0
    Регистрация:
    18 июн 2006
    Сообщения:
    214
    из МСДН про последний параметр 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 возвращает длину без него