суббота, 27 декабря 2008 г.

My Firefox Extensions

Как почитатель комфортного минимализма (только что придумал термин :) ) люблю использовать возможности расширения предоставляемые программами, при этом совершенно не приемлю всякие там супермегапаки, содержащие в себе много ненужного.

Гораздо интереснее настроить такие вещи как браузер или, к примеру, миранда самому.
Вот Firefox. Сразу после инсталяции добавляю в него набор extensions делающие его, с моей точки зрения, чрезвычайно приятным:

FlashGot - позволяет скачивать файлы, фильмы, галереи.
Download Master - удобней чем FlashGot для скачивания файлов, но намного лучше выключить родную безобразную интеграция от Download Master и использовать связку FlashGot->Download Master
NoScript - позволяет блокировать скрипты на веб ресурсах. Чрезвычайно полезно с точки зрения секьюрности, не так ли ?
Extended Statusbar - показывает всякую полезненькую информацию вроде скорости загрузки страницы, загруженное количество и т.п..
Tab Kit - табы в фаервоксе становятся ещё приятнее: разноцветненькие, в несколько рядов, можно закрывать все табы и справа и слева.
Adblock Plus - скажем нет рекламе.
HttpFox - недавно открыл для себя. Порой интересно глянуть что там у нас бегает по хттп.

Похоже это все установленные у меня расширение для лиса, если понравится ещё что то - непременно занесу в список )

четверг, 18 декабря 2008 г.

Инжект loopback пакетов в WFP

Тут возникла задача генерировать входящие TCP пакеты. Для этого имеет смысл использовать FwpsInjectTransportReceiveAsync0, при этом NET_BUFFER должен указывать на IP заголовок.

И вот я все бился в тщетных попытках так же заинжектить и loopback пакеты.
Но делается несколько иначе, а именно с использованием FwpsInjectNetworkSendAsync0 (ключевое слово send :) )

понедельник, 1 декабря 2008 г.

Установка TDI устройств-фильтров вне DriverEntry

Как известно, самый удобный сценарий для установки TDI фильтра это загрузка драйвера в группе "TDI" и навешивание устройства при загрузке.
В этом случае наш фильтр будет на месте до создания каких либо соединений с протоколом.

Но что если мы хотим загрузиться раньше tcpip, и, при этом, не пропустить момент создания соединений с протоколом?

Тут нам поможет TdiRegisterPnPHandlers. Причем стоит использовать не BindingHandler callback ( ибо когда он вызывается с параметром TDI_PNP_OP_PROVIDERREADY, коварный system уже успевает создать соединение), а ClientPnPAddNetAddress.
Скажем, для tcpip можно смело навешивать фильтр на устройства при добавлении первого IP адреса.

вторник, 16 сентября 2008 г.

Условная компиляция драйверов

Возникла задача линковать драйвер с разными сборками библиотеки в зависимости от целевой системы и типа сборки. Вопрос был решен добавлением в source файл следующего содержания:


!if !defined(DDK_TARGET_OS) || "$(DDK_TARGET_OS)"=="WinLH"

C_DEFINES=$(C_DEFINES) -DNDIS60=1

!if "$(DDKBUILDENV)" != "chk"

! if $(386)
TARGETLIBS=$(TARGETLIBS) #path
! else
TARGETLIBS=$(TARGETLIBS) #path
! endif

!else

! if $(386)
TARGETLIBS=$(TARGETLIBS) #path
! else
TARGETLIBS=$(TARGETLIBS) #path
! endif

!endif

!else

C_DEFINES=$(C_DEFINES) -DNDIS40=1

!if "$(DDKBUILDENV)" != "chk"

! if $(386)
TARGETLIBS=$(TARGETLIBS) #path
! else
TARGETLIBS=$(TARGETLIBS) #path
! endif

!else

! if $(386)
TARGETLIBS=$(TARGETLIBS) #path
! else
TARGETLIBS=$(TARGETLIBS) #path
! endif

!endif

!endif


Удобная всё же штука, make файлы )

суббота, 13 сентября 2008 г.

WLK и NDIS IM Logo Testing

Пребываючи в умиленном настроении и чудном здравии, улучшаемом последние пол часа отечественным оболонем, подумалось мне рассказать о выпавшем давеча "счастье" столкнуться с тестированием своих любимейших драйверочков при помощи чуднАго Windows Logo Kit 1.1 - 1.2 (пока этой ерундой занимался уже даже версия поменялась).

Сразу оговорюсь что тестирование NDIS LWF это вообще иной разговор, поэтому только пару слов об Intermediate NDIS drivers.

Признаться удивление постигло меня, когда не нашел я описание сего процесса в хелпе WLK. Хммм. Ну что ж. На тот момент это был уже мой далеко не первый опыт использования этого милого продукта с характером, поэтому быстро бросил удивляться и полез в уже ставший таки родным Гугел-Мугел (кстати, думаю никогда в жизни я столько не гуглил, до встречи с ЛогоКитом). Не то что бы он завалил меня результатами, но на ресурсе http://ndis.blogspot.com/ встретилось упоминание что Miscrosoft забило на тестирование NDIS IM драйвером и теперь они рассматриваються как Unclassified.

Как мило, наиболее распространненый на сегодняшний день тип сетевых драйверов оказывается уже канул в лету, и Miscrosoft уже совершенно не заботиться об качестве сиих от сторонних производителей. Я в шоке!

Ну да ладно, баба з возу - кобыла в курсе дела. Чем меньше тестов, тем проще их пройти.... Да? .... Фиг там...

Погнали. Набор типичных тестов в submission а ля PnP tests, Stress I/O, Sleep etc. Отлично, спустя неколько часиков имеем результат, 2 fails:
1. INF test
2. Plug And Play test

INF test - уже давно нагуглил, это проблема WLK, которая почему то не исправляется, но если применить последние фильтры с errata, то в репорте всё видется как ОК ю а зе бест и всё такое.

Plug And Play test - прополоскал мне моск основательно. Нашел человека, искавшего безуспешно ответ на сей вопрос и наследившего по всему интернету. Тот оказался добрым человеком и с удовольствием поделился советами по апдейту до последней версии, установки последних фиксов, фильтров. Что ни у него ни у меня ни к чему не привело.

К счастью, отыскалась переписка между PCAUSA и благодарным клиентом, которому всё никак не удавалось пройти всю эту верификацию. Причина оказалась в некорекной обработке unnamed devices. Другими словами снова баг WLK, фикситься приложением к репорту инфы "эй парни это Ваш баг, этот тест не считается".

В итоге имеем на 6 не самых актуальных тестов верификации качества сторонних драйверов, 2 нерабочих. Вот потом и жалуйтесь что подавлающее количество крешей происходит изза 3rd party drivers.

Я понимаю WLK - продукт гигантский, и, наверняка, не самый приоритетный и парни, скорее всего, не справляются с верификацией программы для верификации :) . Но ё-моё, это мягко говоря, самое сырое что я видел от этой компании, всё же было бы неплохо уделить ему больше внимания.

От так от. Может будет время и настроение, я немного раскажу о приключениях WLK с LWF и немного их похвалю :).

пятница, 12 сентября 2008 г.

Мультиплатформенная установка NDIS драйверов из MSI (Wix)

Установка NDIS драйверов это вообще отдельная песня. Microsoft предлагает нам использовать для этого INetCfg API и приводит примеры его использование в WDK, но, к сожалению, ни сервис менеджер, ни инсталяторы, ни даже Driver Install Framework не умеют устанавливать NDIS драйвера. Правда, если погуглить, то можно найти информацию о том, что версия difx 1.x это делать умела, и в 2.х сохранилась недокументированная возможность, но она ведь недокументирована, а в нашем деле это жирный минус.

Итак что мы имеем:
1. Недокументированная возможность Difx.
2. Samples из DDK, использующие INetCfg (snetcfg и bindview).
3. Поделки использующие INetCfg наподобие моей.

В общем весь фокус этой несложной поделки в одалживании кода работы с INetCfg (да не шарахнет молнией меня Microsoft, все права сохранены) небольшого редактирования под свои нужды (наверное таки шарахнет) и оформления в виде dllки для MSI.

В итоге очень удобно получилось ибо теперь:
1. Можно устанавливать и удалять NDIS IM и NDIS LWF из MSI.
2. Делать это и под x86 и под x64 из под одного и того же MSIника.

P.S. Кстати прикрутил туда возможность установки и обычных драйверов. Знаю что не комильфо, но очень уж понравилась мне мысль использовать один и тот же MSI для разных платформ.

Пример использования это счастья (ставим passthru) здесь.

вторник, 15 июля 2008 г.

VirtualPC

В поисках возможной замены проприетарной VMWare уже довольно давно нашел для себя VirtualPC. В общем то, учитывая её бесплатность, это совершенно потрясающая утилита от Microsoft для создания виртуальных машин в Windows среде.

Тем более она обладает некоторыми очень даже приятными особенности:
1. Просто отлично работает с WinDbg.
2. Размер (30 MB).
3. Виртуализация.
4. Поддержка всех Windows (в т.ч. и x64) в качестве хостов.
5. Бесплатность.

Но, отдельно следует выделить её самые заметные (по крайней мере для меня) недостатки:
1. Отсутствие поддержки гостевых 64битных систем.
2. Отсутствие snapshots.
3. Необходимость дополнительной настройки "продвинутых" сетевых схем.

К сожалению с 64битными системами проблема нерешаема, остается только надеяться что парни из Microsoft в будущем добавят эту возможность.

А вот отсутствие snapshots можно частично компенсировать копируя руками виртуальные диски или с помощью "Settings -> Undo Disks -> Enable undo disks". Если включена эта опция, то при завершении работы с VirtualPC будет задан вопрос сохранить ли изменения или нет.

С "продвинутыми" сетевыми схемами всё вообще решается в пару кликов. Дело в том что по умолчанию VirtualPC не создает никаких дополнительных адаптеров на хостовой машине и, если нужно сделать "прямое соединение" между хостовой и гостевой ОС, нужно самому позаботиться об их установке.

Установка дополнительных Loopback Adapters на хостовой машине:
1. "Start -> Settings -> Control Panel -> Add Hardware".
2. Запустится мастер установки нового оборудования. После непродолжительных поисков он спросит установлен ли уже девайс. Выбираем: "Yes, I have already connected the hardware". Next.
3. После "Add a new hardware device". Next.
4. После "Install hardware that I manually select from a list (Advanced)". Next.
5. После Выбираем в списке "Network Adapters". Next.
7. Manufacturer: "Microsoft", Network Adapter: "Microsoft Loopback Adapter". Next.

Всё. Теперь единственное что осталось, так это связать созданую сетевую карту с картой виртуальной машины:
VirtualPC->Settings->Networking->Adapter1->Microsoft Loopback Adapter.

Похоже получилось замечательное соединение, закрытое от других сетей. :)

пятница, 15 февраля 2008 г.

PE Kernel Loader

На днях баловался с загрузчиком для ОС. Требованиями были минимум выполняемых действий (остальное должно выполняться уже в ядре) и удобный и готовый к страничной адресации формат загружаемого ядра.
После некоторых размышлений пришел к такому варианту:
1. в первичном загрузчике считываем в память вторичный загрузчик и ядро. Прыгаем во вторичный загрузчик;
2. по адресу 2k (0x800) размещаем GDT;
3. переходим в защищенный режим (куда уж без него то :) );
4. загружаем PE ядро. Прыгаем в него.

Довольно удачный компромис, на мой взгляд. И загрузчик получился довольно простой и ядро я теперь могу писать в любимой Visual Studio, как почти обычное 32бит приложение.
Недостатки компилятора от Майкрософт для такого рода занятий это уже вопрос второй ;)

Основной код:

include 'struct.inc'
include 'pe.inc'
include 'boot.inc'

PAGE_SIZE = 0x1000
GDT_OFFSET = 0x800

; Global Descriptor Table
GDT:
dd 0,0
db 0FFh, 0FFh, 00h, 00h, 00h, 10011010b, 11001111b, 00 ; code
db 0FFh, 0FFh, 00h, 00h, 00h, 10010010b, 11001111b, 00 ; data
GDT_size equ $-GDT
GDTR dw GDT_size-1
dd GDT_OFFSET

loader_entry:
; open address line A20
in al, 92h
or al, 2
out 92h, al

; copy GDT to the 2nd kb RAM
; это удобно, поскольку в первых 2к расположим IDT
mov cx, GDT_size
mov di, GDT_OFFSET
mov si, GDT
rep movsb
lgdt fword [GDTR]

; disable all ints
; в том числе и немаскируемые
cli
in al, 70h
or al, 80h
out 70h, al

; jump to PM
mov eax, cr0
or al, 1
mov cr0, eax

; load new selector to the CS
jmp 00001000b:.protected_entry
use32
.protected_entry:
; init selectors
mov ax,00010000b
mov ds, ax
mov es, ax
mov ss, ax

;
; simple PE loader for loading PE kernel.
;
mov ebx, kernel_image

cmp word [ebx + IMAGE_DOS_HEADER.e_magic], IMAGE_DOS_SIGNATURE
jne .image_error
add ebx, [ebx + IMAGE_DOS_HEADER.e_lfanew]

cmp dword [ebx + IMAGE_NT_HEADERS.Signature], IMAGE_NT_SIGNATURE
jne .image_error

mov dx, [ebx + IMAGE_NT_HEADERS.FileHeader.NumberOfSections]
mov eax, ebx ; PE header
add ebx, sizeof.IMAGE_NT_HEADERS

cld
@@:
mov ecx, [ebx + IMAGE_SECTION_HEADER.SizeOfRawData]

mov esi, [ebx + IMAGE_SECTION_HEADER.PointerToRawData]
add esi, kernel_image

mov edi, [ebx + IMAGE_SECTION_HEADER.VirtualAddress]
add edi, [eax + IMAGE_NT_HEADERS.OptionalHeader.ImageBase] ; ImageBase

rep movsb

add ebx, sizeof.IMAGE_SECTION_HEADER
dec dx
jnz @b

mov ebx, [eax + IMAGE_NT_HEADERS.OptionalHeader.ImageBase]
add ebx, [eax + IMAGE_NT_HEADERS.OptionalHeader.AddressOfEntryPoint]
jmp ebx ; Jump to kernel entry point

.image_error:
jmp $

kernel_image:
; вот это собственно наше ядро
file 'kernel.exe'

Хороший пример кода fasm для перевода в PM и обработки прерываний сделал и описал Great на wasm.ru.
Пример похожего решения, но для gcc и nasm можно найти на классном сайте lowlevel.ru