Информационный сайт

 

Реклама
bulletinsite.net -> Книги на сайте -> Программисту -> Агуров П.В. -> "Интерфейсы USB. Практика использования и программирования" -> 65

Интерфейсы USB. Практика использования и программирования - Агуров П.В.

Агуров П.В. Интерфейсы USB. Практика использования и программирования — СПб.: БХВ-Петербург, 2004. — 576 c.
ISBN 5-94157-202-6
Скачать (прямая ссылка): interface2004.djvu
Предыдущая << 1 .. 59 60 61 62 63 64 < 65 > 66 67 68 69 70 71 .. 166 >> Следующая

@Result, MAX_PATH) <> 0) then begin
StatusBar. Panels[0]. Text:= 'DOS-имя не определено';
Exit; End;
{Удаляем DOS-имя}
If not DefineDosDevice(
DDD_RAW_TARGET_PATH or DDD_REMOVE_DEFINITION or DDD_EXACT_MATCH__ON_REMOVE, PChar(DosDeviceName.Text), PChar(NtDeviceName. Text) ) then
StatusBar.Panels[0].Text:= 'Ошибка удаления имени'; end;
188
Часть III. Практика программирования
{Получение всех имен устройства}
procedure TForml.btnGetListClick(Sender: TObject);
var BufSize : Cardinal; P, PName : Pointer; SName : String;
begin
{Очищаем предьщущий список} LbNameliist. Items .Clear;
{Размер буфера} BufSize:= 10240;
{Распределяем память для буфера}
GetMem(P, BufSize);
{Запрашиваем список имей)
If QueryDosDevice(nil, Р, BufSize) <> 0 then begin {Цикл по всем именам...} PName:= Р;
While (True) do begin SName:= StrPas(PName); If SName = '' then Break; {Добавляем в список} lbNameList. 1 terns . Add (SName) ; {Переход к следующему устройству} {Сдвигаем указатель на следующую строку} PName:= Pointer(Longlnt(PName) + Length(SName)+1); End; End;
{Освобождаем буфер} FreeMem(P); end;
{Сортировка списка по двойному щелчку}
procedure TForml.IbNameListDblClick(Sender: TObject);
begin
lbNameList.Sorted:= True; lbNameList.Sorted:= False; end;
end.
гпава 9. Введение в WDM
189
Основное диалоговое окно нашей тестовой программы показано на рис. 9.4. Введем в верхнее окно строку COMl и нажмем кнопку Получить NT-имя.... В поле Nt-имя должна отобразиться строка, похожая на \Device\seriaio.
Теперь введем в поле DOS-имя какое-нибудь новое имя, например, MyDevice, и нажмем кнопку Добавить DOS-имя.... Результат мы можем увидеть, нажав кнопку Получить полный список DOS-имен или Получить NT-имя....
N T-имена устройств
DOS-имя:: jUSBWRQOT_HUВ «4M 9788ЬЄ7&0tt{MSaGeSS cm- 11 NT-имя: Ь Гі evic e \U S BPD 0^2
Получить NT-имя устройства по его DOS-имени
Добавить DOS-имя для NT-имени
Удалить DOS-имя
Получить полный список DOS-имен
SW«{a7c7a5b0-5af3-11 dl¦ 9ced-00a024bf0407}й{9ВЗЄ5890-185F-11DO-AI 95-0( -
sysaudio
UNC
USB8R00T HUB848<19788b67&O8{n8a0e88-c30c-Tld0-S815-0Oa0c906bed8}
USB«ROOT_HUB««2ae4G91 ШШ 8a0e88-c30c-11 dO-8815-00a0c90Gbed8} USBOR00T НиВШ32501а5ЭШ{ПBa0e88-c30c-11 dO-8815-00a0c90Gbed8} USBoROOT_HUB20o4M 1858842Ш{[18a0e88-c30c-11 dO-8815-00a0c906bed USBiMd 067b8<Pid 2303й5Ш483с91 W28{4d36e978-e325-11 ce-bld -08002 USBSVid 067t*Pid_2303tt5&38488c91 &0&2tt{86e0d1 еО-803Э-11 d0-9ce4-0800; USB8Vid_0G7tAPid_2303S5&38488c91 &0«,2й{а5асЬП 0-Є530-11 d2-901 l-00c04l_J VMnetUserif VMparportl
Рис. 9.4. Окно программы работы с именами устройств
В отличие от последовательных портов, имеющих привычные всем имена, USB-компоненты имеют имена, включающие GUTD, например, для имени
USB#ROOT_HUB#4&197 8 8b67&0#{fl8a0e8 8-c30c-lld0-8815-00a0c90-6bed8}
с помощью нашей программы мы получим NT-имя \Device\usBPDO-2. Для просмотра имен удобно пользоваться программой WinObj (см. разд. 19.4.1).
9.3. Основные процедуры драйвера WDM
Оговорим сразу, что мы рассматриваем именно драйверы модели WDM, а не драйверы Windows 98 или Windows NT. Это важно, т. к. драйверы WDM, с одной стороны, должны содержать дополнительные процедуры для под-
190
Часть III. Практика программирования
цержки PnP, а с другой, более логичны по структуре. Итак, в этом разделе мы перечислим основные процедуры драйвера WDM. Подробное описание процесса создания драйвера не входит в рамки это книги, поэтому мы ограничимся исключительно практическим интересом, а всех желающих отсыпаем к списку литературы [7, 8].
9.3.1. Процедура DriverEntry
Процедура DriverEntry является "точкой входа" драйвера. Заголовок этой процедуры показан в листинге 9.2.
-Листинг 9.2. Заголовок процедуры DriverEntry
її.............................................................................................................................................................................................'
NTSTATUS DriverEntry(
in PDRIVER_OBJECT pDriverObject,// Адрес объекта драйвера
in PUNICODE_STRING pRegistryPath // Путь в регистре к подразделу драйвера
)
Получив от диспетчера в/в указатель на структуру driverobject драйвер должен заполнить в ней следующие поля:
? pDriverObject->DriverStartIo — адрес Процедуры Startlo, Которая нє-
обходима для организации обработки очереди необработанных запросов;
? pDriverObject->DriverExtension->AddDevice — адрес Процедуры AddDevice,
которая будет вызываться при инициализации нового устройства;
? ПОЛЯ B массиве pDriverObj ect->Maj or Function [IRP_MJ_xxx ] — драйвер
должен регистрировать точки входа в, собственные рабочие процедуры (разбирается далее);
? pDriverObject-»DriverUnload — адрес процедуры Unload, которая будет
вызываться перед выгрузкой драйвера.
Пример регистрации рабочих процедур показан в листинге 9.3, а набор констант irp_mj_xxx из файла ntddk.h — в листинге 9.4.
Листинг 9.3. Пример регистрации рабочих процедур драйвера1
// пример из драйвера GivelOEx
DriverObject->MajorFunction [IRP_MJ_CREA'i;e] = GiveioCreateDispatch; DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = GiveioDeviceControl;
Предыдущая << 1 .. 59 60 61 62 63 64 < 65 > 66 67 68 69 70 71 .. 166 >> Следующая
Реклама
Авторские права © 2009 AdsNet. Все права защищены.
Rambler's Top100