Проблеми с инсталирането на VxD драйвер и как да ги разрешите

Бележки от първо лице за ИТ, новини и технологично остаряване.

Блог → Проблеми с инсталирането на VxD драйвери и как да ги разрешите

Първо, нека разберем какво е VxD. Това са драйвери на Windows на системно ниво (т.е. на ниво системно ядро), които се изпълняват в пръстена с нулева защита в защитения режим и имат всички възможни и немислими привилегии (по-специално правото на достъп до устройства на физическо ниво ). Много хора се интересуват как да създадат и заредят такъв драйвер с помощта на „стандартни инструменти“. Е, те попитаха - ние отговаряме! В този пост ще засегна проблемите с инсталирането, зареждането, регистрирането на VxD драйвера в системата и някои слабо документирани проблеми при тяхното изпълнение.

На първо място, инструментариумът. Най-малко се нуждаем от Microsoft Driver Development Kit (DDK). Той включва набор от заглавни файлове (* .h), библиотеки за импортиране на системен модул (* .lib), изходен код за примери, помощни файлове и няколко специализирани помощни програми. Освен това се нуждаете от компилатор на C от пакета Microsoft Visual C/C ++. Разбира се, никой не си прави труда да използва компилатори от други производители, но след това ще трябва да създадете * .lib файлове сами и да страдате дълго време, така че * .h DDK файловете да бъдат преведени без проклятие.

Откъде да започнем? Трябва да прочетете документацията от DDK и накратко да разберете как работи ядрото на Windows като цяло и драйверите (VxD) по-специално. И така, VxD са разделени на два основни класа: статично натоварени (статично зареждане) и динамично (динамично зареждане). Основната им разлика е, че статично заредените драйвери се четат в RAM при стартиране на системата и остават в нея, докато Windows бъде изключен (във всеки случай не знам как да принудя такива VxD да бъдат разтоварени). Динамично заредените драйвери се четат в RAM при нужда и при желание могат да бъдат премахнати от там.

Сега нека се занимаем с класификацията на устройствата. Те могат да бъдат Plug and Play (PnP) и др. наследство ("наследство" от по-ранни версии). PnP устройствата автоматично се разпознават и конфигурират от операционната система при свързване, докато старите устройства трябва да се инсталират и конфигурират ръчно. PnP устройствата са всички USB и SCSI устройства, модеми, мишки, стандартни COM и LPT портове, както и почти всички съвременни ISA и PCI карти. Е, всичко останало, което не може автоматично да бъде открито и конфигурирано от Windows, принадлежи на стари устройства (нестандартни COM портове и хардуер, прикрепен към тях, стари ISA карти, външно оборудване, което не поддържа спецификацията PnP, както и драйвери, които го правят) не работи директно с физическо оборудване, например - TCP/IP стек).

Е, една последна бележка относно VxD класификацията: Win9x дефинира три типа функционални драйвери: товарачи, изброители и самите драйвери. Устройството за зареждане е почти винаги статичен VxD, целта му е ясно от името, той зарежда драйвери от посочения тип. Обикновено програмистът няма нужда да пише свой собствен буутлоудър, можете да използвате един от стандартните (* IOS - за драйвери на файловата система, * VCOMM - за серийни и паралелни портове, * CONFIGMG - за PnP устройства).

Enumerator е нещо, което постоянно се намира в паметта и търси дали се е появило ново PnP устройство, което му е известно. Или е отишло някъде, което е съществувало преди. В тези ситуации изброяващият (чрез * CONFIGMG - който е и конфигуратор на PnP устройство) зарежда или разтоварва съответния драйвер на устройството. Драйвер на устройство - VxD, който участва пряко в поддръжката на оборудването. Драйверът на устройството може да бъде или статичен, или динамичен (в последния случай той се зарежда при поискване от изброител, приложна програма или друг VxD).

Можете да разберете останалата част от теорията сами, като прочетете документацията от DDK. Така че нека се захващаме с практиката! Малко вероятно е да се наложи да напишете драйвер за устройство, вмъкнато в стандартен ISA или PCI слот на компютър - обикновено такива карти се поддържат от производителите на хардуер на доста прилично ниво. Най-вероятно ще се докопате до нещо, свързано към COM или LPT порт и освен това не поддържа спецификацията PnP. Следователно основната задача ще бъде:
- писане на процедура за правилната инсталация на драйвера, с „менюта“ и „да се види в диспечера на устройствата“;
- определяне на всички COM и LPT портове, налични в системата (защо обърквате потребителя с ненужни въпроси при инсталиране на драйвера?);
- правилно определяне на присъствието на вашето устройство на посочения порт (представете си колко е страхотно, ако в момента на анкетиране на портовете мишката е напълно покрита или принтерът спре да печата);
- правилно улавяне и освобождаване на ресурси, необходими за функционирането на вашето устройство.

Първа стъпка е инсталирането на драйвера. Както вече разбрахме, драйверите могат да бъдат статични и динамични. За да заредите статични драйвери, те могат да бъдат записани в раздела [386Enh] на файла SYSTEM.INI. Но този метод е остарял и всъщност е оставен само за съвместимост със стари версии на Windows (единственото изключение са драйверите, които трябва да бъдат заредени, преди процесорът да бъде поставен в защитен режим на работа - например за достъп до реалния режим Функции на BIOS). Вторият (предпочитан) начин е записването на информация в системния регистър, в клона HKEY_LOCAL_MACHINE \ System \ CurrentControlSet \ Services \ VxD \ DEVICE_NAME, където стойността на DEVICE_NAME може да бъде произволна (по ваш вкус). Този клон трябва да съдържа променлива от тип REG_SZ на име StaticVxD и със стойност, съдържаща името на вашия VxD драйвер. Ако файлът се намира в директорията% SystemRoot% \ SYSTEM, тогава може да се посочи само името му, в противен случай не забравяйте да посочите пълния път. Освен това в същата нишка трябва да създадете начална променлива от тип REG_BINARY със стойност, равна на 0. По принцип променливата Start е предназначена само за съвместимост с следващите версии на Windows.