IP Config собственными руками
Xakep, номер #045, стр. 045-060-1 Horrific aka Фленов Михаил smirnandr@mail.ru www.cydsoft.com/vr-online Ты, наверно, помнишь такую прекрасную утилиту Winipcfg.exe, которая преследовала нас на протяжении всего существования линейки Win9x. Лично мне эта утилита очень нравилась, и, судя по вопросам в Hack-FAQ, тебе тоже. Я регулярно слышу слова мата в сторону Билла за то, что в WinNT (Win2000, XP) нет такой тулзы, и теперь получение информации о конфигурации IP немного неудобное. Ну ничего, сегодня мы это дело начнем исправлять. Еще немного Intro Чтобы получить информацию, которую нам показывала утилита winipcfg, для Delphi нужно иметь дополнительные заголовочные файлы: IpExport.pas, IpHlpApi.pas, IpIfConst.pas, IpRtrMib.pas и IpTypes.pas. Для любителей С++ подобные заголовочные файлы можно найти в спецсетевом SDK, который легко найти на сайте Microsoft. Ну а для Delphi ты сможешь найти эти файлы вместе с исходником на моем сайте после выхода журнала в свет или найти на диске ][ (только для обладателей журнала с диском). Эти файлы нужно скопировать в поддиректорию lib директории, где у тебя установлен Delphi. Или можно поместить эти файлы прямо в ту же диру, где будут исходники программы, главное, чтобы Delphi их нашел. Готовность №1 Итак, будем считать, что файлы ты нашел и засунул их в... Ну, в общем, с местом расположения ты тоже должен был уже определиться. Запускай Delphi и создавай новый проект. Сразу же перейди в код и добавь в раздел uses имена следующих модулей: IpHlpApi, IpTypes, IpIfConst. Готово? Ну тогда давай дизайнить форму: Немного слов о дизайне. По всей форме у меня растянут компонент PageControl. На нем я создал две закладки: IP Config и Ethernet info. Сегодня мы научимся получать всю информацию, которая расположена на первой закладке, а вторую оставим на следующий раз. Теперь создай обработчик события OnChange для компонента PageControl1. Когда юзер будет менять закладку, мы должны будем обновлять информацию о конфигурации протокола IP. Так как мы будем сегодня кодить только первую закладку, то напиши в этом обработчике следующий код: if PageControl1.ActivePageIndex=0 then GetIPInfo; Если сейчас выделена первая закладка, то вызвать процедуру GetIPInfo. Все, подготовка закончена, переходим к самому шкодингу этой загадочной процедуры GetIPInfo; Шкодинг Добавь в разделе private нашей формы следующее: private procedure GetIPInfo; Это я объявил эту злосчастную процедуру. Теперь нажми сочетания пимпочек Ctrl+Shift+C, и Delphi подготовит для тебя заготовку для новой процедуры: procedure TSystemInfoForm.GetAdapterInfo; begin end; Внутренность процедуры будем рассматривать кратко (только самое необходимое), а более подробно сможешь узнать из исходника. Err:=GetNetworkParams(nil, FixedInfoSize); if (Err<>0) and (Err<>ERROR_BUFFER_OVERFLOW) then begin HostNameLabel.Caption:='Error'; exit; end; pFixedInfo:=PFIXED_INFO(GlobalAlloc(GPTR, FixedInfoSize)); GetNetworkParams(pFixedInfo, FixedInfoSize); Первое, что надо вызвать, - функцию GetNetworkParams с двумя параметрами. Первый нужно установить в nil, а второй - это переменная, куда будет записан размер необходимой памяти для получения полной информации. Результат выполнения функции я записываю в переменную Err, чтобы потом проверить на ошибки. Если эта переменная не равна 0 и не равна константе ERROR_BUFFER_OVERFLOW, то точно была какая-то ошибка и надо вывести об этом сообщение и выйти из процедуры. |