Blog. Just Blog

Получение списка установленных программ

Версия для печати Добавить в Избранное Отправить на E-Mail | Категория: Образ мышления: Assembler | Автор: ManHunter
Как получить перечень установленных в системе программ? Наиболее правильный способ - это обработка списка зарегистрированных инсталляций в реестре. Список инсталляций представляет собой пачку ключей в HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall, в каждом из которых содержится набор параметров с описанием установленной программы. Тут есть имя программы и название ее разработчика, ссылки на деинсталлятор, на папку, куда она была установлена, на ее иконку, дата установки и т.п. Каких-то второстепенных параметров может и не быть, но основные всегда присутствуют.

Список установленных программ
Список установленных программ

Надо понимать, что список включает в себя не все программы, имеющиеся в системе, а только те, которые были нормально установлены и зарегистрированы. Всякие портативные программы и программы с нестандартной установкой, естественно, в этот список не попадут.

Подготавливаем все необходимые данные. Это наименование ключа реестра и список параметров, значения которых надо будет получить.
  1. szKey    db 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall',0
  2. szParam1 db 'DisplayName',0
  3. szParam2 db 'DisplayVersion',0
  4. szParam3 db 'InstallLocation',0
  5. szParam4 db 'InstallLocationEx',0
  6. szParam5 db 'UninstallString',0
  7. slash    db '\',0
  8.  
  9. ERROR_FILE_NOT_FOUND = 2
Ну и сам код. Тут ничего сложного, обычная работа с реестром. Открыли родительский ключ, перебрали по очереди все его вложенные ключи, в каждом из вложенных ключей запросили значения параметров.
  1.         ; Открыть ключ реестра
  2.         invoke  RegOpenKeyEx,HKEY_LOCAL_MACHINE,szKey,0,\
  3.                 KEY_ENUMERATE_SUB_KEYS,hkResult
  4.  
  5.         ; Получить список ключей реестра
  6.         mov     [index],0
  7. loc_enum_keys:
  8.         mov     [tmp],200h
  9.         invoke  RegEnumKeyEx,[hkResult],[index],szName,tmp,NULL,NULL,NULL,NULL
  10.         or      eax,eax
  11.         ; Вложенных ключей больше нет
  12.         jnz     loc_done
  13.  
  14.         ; Сформировать строку вложенного ключа
  15.         invoke  lstrcpy,buff,szKey
  16.         invoke  lstrcat,buff,slash
  17.         invoke  lstrcat,buff,szName
  18.  
  19.         ; Открыть ключ реестра
  20.         invoke  RegOpenKeyEx,HKEY_LOCAL_MACHINE,buff,0,KEY_QUERY_VALUE,hkSub
  21.         or      eax,eax
  22.         jnz     loc_next
  23.  
  24.         ; DisplayName
  25.         mov     [tmp],200h
  26.         invoke  RegQueryValueEx,[hkSub],szParam1,0,lpdwDisp,szName,tmp
  27.         cmp     eax,ERROR_FILE_NOT_FOUND
  28.         je      loc_close
  29.         ; szName -> название программы
  30.  
  31.         ; DisplayVersion
  32.         mov     [tmp],200h
  33.         invoke  RegQueryValueEx,[hkSub],szParam2,0,lpdwDisp,szVer,tmp
  34.         cmp     eax,ERROR_FILE_NOT_FOUND
  35.         je      @f
  36.         ; szVer -> версия программы
  37. @@:
  38.         ; InstallLocation
  39.         mov     [tmp],200h
  40.         invoke  RegQueryValueEx,[hkSub],szParam3,0,lpdwDisp,szPath,tmp
  41.         cmp     eax,ERROR_FILE_NOT_FOUND
  42.         je      @f
  43.         cmp     byte [szPath],0
  44.         je      @f
  45.         ; szPath -> путь установки
  46.         jmp     loc_1
  47. @@:
  48.         ; InstallLocationEx
  49.         mov     [tmp],200h
  50.         invoke  RegQueryValueEx,[hkSub],szParam4,0,lpdwDisp,szPath,tmp
  51.         cmp     eax,ERROR_FILE_NOT_FOUND
  52.         je      @f
  53.         cmp     byte [szPath],0
  54.         je      @f
  55.         ; szPath -> путь установки
  56. @@:
  57.  
  58. loc_1:
  59.         ; UninstallString
  60.         mov     [tmp],200h
  61.         invoke  RegQueryValueEx,[hkSub],szParam5,0,lpdwDisp,szPath,tmp
  62.         cmp     eax,ERROR_FILE_NOT_FOUND
  63.         je      @f
  64.         ; szPath -> строка деинсталляции
  65. @@:
  66.  
  67. loc_close:
  68.         ; Закрыть ключ реестра
  69.         invoke  RegCloseKey,[hkSub]
  70. loc_next:
  71.         ; Следующий ключ
  72.         inc     [index]
  73.         jmp     loc_enum_keys
  74. loc_done:
  75.         ; Закрыть ключ реестра
  76.         invoke  RegCloseKey,[hkResult]
Как я и говорил, некоторые параметры считаются необязательными и могут отсутствовать или иметь пустое значение. Например, путь установки программы может быть записан в параметре InstallLocation или InstallLocationEx, а может и вообще отсутствовать.

Хозяйке на заметку. Дата установки из ветки реестра с записями о деинсталляции (параметр InstallDate), в принципе, может быть использована для реализации триала шароварных программ. Немного из другой сказочки, но на всякой случай это тоже стоит упомянуть.

В приложении пример программы с исходным текстом, которая записывает в файл list.txt список установленных приложений с их названиями и версиями, путями установки и строками вызова деинсталлятора.

Пример программы с исходным текстом (FASM)Пример программы с исходным текстом (FASM)

Uninstall.List.Demo.zip (2,264 bytes)


Поделиться ссылкой ВКонтакте
Просмотров: 1396 | Комментариев: 1

Внимание! Статья опубликована больше года назад, информация могла устареть!

Комментарии

Отзывы посетителей сайта о статье
==DJ==[ZLO] (03.11.2021 в 11:02):
В десятке, если приложения установлены из магазина они в этот список не попадают. Впрочем, это совсем другая история...

Добавить комментарий

Заполните форму для добавления комментария
Имя*:
Текст комментария (не более 2000 символов)*:

*Все поля обязательны для заполнения.
Комментарии, содержащие рекламу, ненормативную лексику, оскорбления и т.п., а также флуд и сообщения не по теме, будут удаляться. Нарушителям может быть заблокирован доступ к сайту.
Наверх
Powered by PCL's Speckled Band Engine 0.2 RC3
© ManHunter / PCL, 2008-2024
При использовании материалов ссылка на сайт обязательна
Время генерации: 0.08 сек. / MySQL: 2 (0.0048 сек.) / Память: 4.5 Mb
Наверх