12.07.2015 Views

Февраль

Февраль

Февраль

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

codingGetConnectionselseGetExConnections;end;Функция AllocateAndGetTcpExTableFromStack документирована и очень подробно.Нужно только уметь искатьЗагрузка функцийМы объявили переменные, через которые будемобращаться к системным функциям, но всеони являются указателями и на данном этапеуказывают в никуда. Теперь в них необходимозаписать соответствующие адреса. В прошлыйраз для этого мы создавали функциюLoadAPIHelpAPI. Давай расширим ее и добавимследующие строки:@AllocateAndGetTcpExTableFromStack:=GetProcAddress (HIpHlpApi, 'AllocЛистинг 2function TForm1.ProcessPidToName(hProcess: THandle; ProcID: DWORD):String;varprocEntry: TPROCESSENTRY32;ProcessName: String;beginprocEntry.dwSize:=sizeof (procEntry);ProcessName:='???';if (Process32First (hProcess,procEntry)) then begin repeat/ / Если текущий процесс равен искомому,то возвращаем его имяif (procEntry. th32ProcessID =ProcId) then beginProcessName:=procEntry.szExeFile;Result:=ProcessName;exit; end;until (not Process32Next (hProcess,&procEntry));end;Result:=ProcessName;end;xàêåð 02 /98/ 07/ateAndGetTcpExTableFromStack');@AllocateAndGetUdpExTableFromStack:=GetProcAddress (HIpHlpApi, 'AllocateAndGetUdpExTableFromStack');@CreateToolhelp32Snapshot:=GetProcAddress (GetModuleHandle('kernel32.dll'), 'CreateToolhelp32Snapshot');@Process32First:= GetProcAddress(GetModuleHandle ('kernel32.dll'),'Process32First');@Process32Next:= GetProcAddress(GetModuleHandle ('kernel32.dll'),'Process32Next');Теперь, после загрузки, каждая переменнаяукажет на соответствующую функцию в системе.Если какая‐то функция не будет найдена, тосоответствующая переменная будет равна нулю.Эту особенность мы используем для того, чтобыопределить, поддерживает ли ОС новые функцииили необходимо применить универсальныйкод, который мы рассматривали в прошлый раз.РеализацияВот мы и подошли к самому интересному — реализацииуниверсального примера. В нашемстаром коде по событию OnShow вызываласьфункция GetConnections, в которой и происходилоопределение состояний портов. Улучшимпример, поставив условие вместо безусловноговызова:procedure TForm1.FormShow (Sender:TObject);beginif @AllocateAndGetTcpExTableFromStack=nil thenЕсли указатель AllocateAndGetTcpExTableFromStack равен нулю, значит, соответствующейфункции нет в системе и нужно вызыватьGetConnections.Если он не равен нулю, то функция найденав системе и можно использовать расширенныефункции, которые мы рассмотрелисегодня. Полный код содержится в функцииGetExConnections, которую мы поместилив листинге 1.Логика GetExConnections практически не изменилась,по сравнению с ранее написаннойGetConnections.Мы точно так же получаем таблицу состоянийи выводим ее содержимое, просто пользуясьпри этом другими API- функциями.Единственное, что заслуживает отдельноговнимания, — это вызов функцииProcessPidToName, которая должна переводитьидентификатор процесса в удобочитаемоеимя. Эту функцию с подробнейшими комментариямиты можешь увидеть в листинге 2.ИтогПрограмма готова. На DVD ты найдешь полноценнуюпрограммку, которая определяет портыи делает это универсально.Если система поддерживает расширенныефункции, то она использует их и отображаетимена процессов. Если нет, то ничего страшного,никакой ошибки не произойдет — прогапросто воспользуется старыми функциямии отобразит все то же самое, исключая имяпроцесса.Как видишь, все гениальное — в простотеи умении искать нужные функции. Можешьулучшить этот пример, чтобы он обновлялтаблицу по таймеру и подсвечивал записи,состояние портов которых изменилось, илиновые записи в таблице. Можно добавитьвозможность уничтожения выделенногопроцесса, ведь соответствующий идентификатормы научились определять. Тольконе забывай, что при использовании старыхфункций процесс не определен. Кстати, написанныйпример получает только состояниеIP-портов старой версии, а реализациюсостояния IPv6 легко организовать простымизменением последнего флага при вызовефункций AllocateAndGetTcpExTableFromStackи AllocateAndGetUdpExTableFromStack.На этом спешу откланяться. До новых встреч! z125

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!