PDA

Просмотр полной версии : Завершение процесса по описанию


Zo_Om4eG
10.03.2013, 16:47
Возможно ли найти название процесса по его описанию? Если возможно, подкиньте, пожалуйста, пример. Нужно найти название и завершить с помощью уже имеющейся функции.

[Ссылки могут видеть только зарегистрированные и активированные пользователи]

VeTaL_UA
10.03.2013, 21:29
Давать готовый код - не интересно. Подскажу лучше. Для начала тебе нужно вызвать функцию GetFileVersionInfo ([Ссылки могут видеть только зарегистрированные и активированные пользователи]) или же GetFileVersionInfoEx ([Ссылки могут видеть только зарегистрированные и активированные пользователи](v=vs.85).aspx), тут всё зависит от степени извращённости :D Для того, чтобы вызвать эту функцию, тебе нужно получить размер этой самой VersionInfo. Делается это функциями GetFileVersionInfoSize ([Ссылки могут видеть только зарегистрированные и активированные пользователи]) или GetFileVersionInfoSizeEx ([Ссылки могут видеть только зарегистрированные и активированные пользователи](v=vs.85).aspx) соответственно. Естественно, нужно каждый раз проверять сработала ли функция нормально, ну с этим уж думаю сам разберёшься, там условие в зависимости от типа возвращаемого функцией значения. Далее, чтобы получить саму VersionInfo надо вызвать функцию VerQueryValue ([Ссылки могут видеть только зарегистрированные и активированные пользователи]). Тебе нужно прочесть блок StringFileInfo ([Ссылки могут видеть только зарегистрированные и активированные пользователи](v=vs.85).aspx), но чтобы его прочесть надо сначала прочесть блок VarFileInfo ([Ссылки могут видеть только зарегистрированные и активированные пользователи](v=vs.85).aspx), достав от туда langID и charsetID (Оба можешь типизировать, как hex (%x) с точностью 4, ну это если ты функцию Format будешь использовать). Предыдущая реплика сложна в понимании, по этому кусочек кода:
VerQueryValue(buf,'\VarFileInfo\Translation\',p,l) ;
Где buf - значение, полученное функцией GetFileVersionInfo или GetFileVersionInfoEx, p - нетипизированный указатель, l - значение, полученное функцией GetFileVersionInfoSize или GetFileVersionInfoSizeEx. Естественно, к вышеприведённому коду тоже не помешает прицепить условие проверки правильности выполнения функции. Ну и после этого p нужно типизировать, как именно я дал подсказку выше.
Далее уже типизированное значение подставляешь в VerQueryValue для считки полей StringFileInfo. Пример:
VerQueryValue(buf,PChar('\StringFileInfo\'+lg+'\Fi leDescription'),p,l);
s:=PChar(p);
В примере считывается поле FileDescription, lg - прежде типизированные langID и charsetID, s - строка.
Ну вот в s ты и получишь описание процесса. При желании можешь все поля блока считать. И да, чуть не забыл, проверку на правильность выполнения функции прицепить не мешало бы. Ну так вроде всё. Надеюсь, чего-то поймёшь :)

Добавлено через 19 минут
Ну я надеюсь, что то, что всё вышеописанное надо завернуть в функцию, которая будет принимать путь к файлу и отдавать описание, ты догадаешься. Путь к файлу можно выцепить из снапшота модулей процесса. Ну а дальше всё просто же.

Zo_Om4eG
10.03.2013, 21:50
VeTaL_UA, Немного не понимаю... Как я буду вызывать GetFileVersionInfo, если FileName мне неизвестен?

VeTaL_UA
10.03.2013, 22:49
Как я буду вызывать GetFileVersionInfo, если FileName мне неизвестен?
Ну так перебери в цикле по снапшоту все процессы, по другому никак.

Zo_Om4eG
11.03.2013, 09:19
VeTaL_UA, Разобрался, спасибо, в будущем буду знать в какую сторону копать по процессам и информации о файлах.

VeTaL_UA
11.03.2013, 14:57
VeTaL_UA, Разобрался, спасибо, в будущем буду знать в какую сторону копать по процессам и информации о файлах.
Да не за что, приятно помогать человеку, желающему самому разобраться, а не юзать готовый код :)