VxD драйвера

Низкоуровневое программирование портов, микроконтроллеров и т.д.

Модератор: Andy

Aleksandr
Сообщения: 8
Зарегистрирован: 25 мар 2004, 12:23
Откуда: Ekaterinburg

Подскажите как правильно работать с динамическим драйвером VxD?
Как обрабатывать прерывания в VxD драйверах?
И как направить поток данных от драйвера на своё приложение?
AS
Andy
Сообщения: 238
Зарегистрирован: 17 фев 2004, 08:15
Откуда: Минск

Aleksandr, можно долго и упорно это дело расписывать, но нет времени и необходимости.

В разделе полезные ссылки есть линк на великолепный сайт Iczelion'а - http://win32asm.cjb.net/. Там смотрите раздел Туториалы. Сайт на фреймах - так что точную ссылку дать не могу. Так вот в этом разделе есть все что нужно про VxD. Лучше и подробнее нигде не найдете, честное благородное слово.

ЗЫ. Лично если мне что-то надо сделать - я первым делом частенько туду заглядываю, и Вам рекомендую %)
*provided AS IS
Aleksandr
Сообщения: 8
Зарегистрирован: 25 мар 2004, 12:23
Откуда: Ekaterinburg

Большое спасибо за Ваш совет. Я напсал свой VxD пользуясь DDK 98 там в hellpe подробно описано как создавать свои драйвера и перенаправлять прерывания. Но возник другой вопрос как загрузить VxD (динамический). Пробовал пример на делфи загрузчка он неработает. Пишет что типа INVALID_HANDLE_VALUE кода деляю CreateFile хотя пример каторый в инете ходит вполне работоспособный. Помогите загрузить ЭТОТ ..... драйвер?
Ps под ...... я имел VxD (только ничего пошлого)
AS
Andy
Сообщения: 238
Зарегистрирован: 17 фев 2004, 08:15
Откуда: Минск

Пишет что типа INVALID_HANDLE_VALUE кода деляю CreateFile
Хм... А GetLastError() какой код возвращает?

Формат пути должен быть такой: \\.\имя_файла.vxd. К примеру:

Код: Выделить всё

    szVxDName db "\\.\MyDriver.vxd",",0 ; где-то в .data. MyDriver.vxd тут в текущем каталоге
    ....
   ; в .code
    invoke CreateFile, offset szVxDName,0,0,0,0, FILE_FLAG_DELETE_ON_CLOSE,0 (для masm32)
Проверьте GetLastError() - может путь с ошибкой.
*provided AS IS
Aleksandr
Сообщения: 8
Зарегистрирован: 25 мар 2004, 12:23
Откуда: Ekaterinburg

Andy я делаю все как вы пишите но GetLastError возвращает INVALID_HANDLE_VALUE или -1 или 0xFFFFFFFFh как вам угодно (в бинаре не буду писать слишком долго) а что касается пути он у меня лежит где и ExEшник и путь я задаю как вы пишите Мне кажется это либо в драйвере либо делфи глючит. Главное инициализация дравера проходит а вот хендел получить не могу Хендел нужен для DeviceIoControl чтобы посылать и передовать данные. Может надо что то в драйвере добавить?
Andy
Сообщения: 238
Зарегистрирован: 17 фев 2004, 08:15
Откуда: Минск

Aleksandr, я что-то не понял какая функция возвращает INVALID_HANDLE_VALUE... GetLastError не возвращает INVALID_HANDLE_VALUE, а возвращает расширенный код ошибки, текст которой можно получить передав этот код в программу типа MS Error Lookup из Visual Studio. INVALID_HANDLE_VALUE может вернуть CreateFile, потом надо сразу вызвать функцию GetLastError() и получить код ошибки. INVALID_HANDLE_VALUE - мало что дает.
*provided AS IS
Andy
Сообщения: 238
Зарегистрирован: 17 фев 2004, 08:15
Откуда: Минск

Да вот еще важный вопрос - в какой операционке происходит действо?
*provided AS IS
Aleksandr
Сообщения: 8
Зарегистрирован: 25 мар 2004, 12:23
Откуда: Ekaterinburg

Andy прости меня за мою безграмотность на счет GetLastError. Я устранил ошибку с CreateFile она заключалась в драйвере. Там обрабатывалось сообщение Sys_Dinamic_Device_Init, InitDrV1 и из-за него CreateFile выдавал ошибку как только я убрал этот обработчик всё сразу заработало.Но как теперь инициализировать драйвер ведь в этом обработчике было перенаправление прерывания и начальные установки портов.Все это безобразие елается в WinME.
Andy
Сообщения: 238
Зарегистрирован: 17 фев 2004, 08:15
Откуда: Минск

Sys_Dinamic_Device_Init
Опечатка? Sys_Dy(!)namic_Device_Init !?

Инициализировать драйвер именно в обработчике Sys_Dynamic_Device_Init и надо. Где-то там видимо ошибка в коде обработчика, надо искать - другого пути не дано :)

А Sys_Dynamic_Device_Exit нормально обрабатывается?
*provided AS IS
Aleksandr
Сообщения: 8
Зарегистрирован: 25 мар 2004, 12:23
Откуда: Ekaterinburg

Обработчик Sys_Dynamic_Device_Exit обрабатывается нормально.
А вот обработчик Sys_Dynamic_Device_Init
BeginProc InitDrV1
push EAX ;сохраняем регистры которми
push EBX ;пользуемся
push ECX
push EDX
push ESI
xor EAX,EAX ;Обнуляим их
xor EBX,EBX
xor ECX,ECX
xor EDX,EDX
xor ESI,ESI
VMMCall Disable_VM_Ints ;Запрещаем прерывания
VMMCall Get_Cur_VM_Handle ;Получаем Хендел VM
mov EAX,0007h ;Указываем линию IRQ 7
VxDCall VPICD_Convert_IRQ_To_Int;Получаем вектор для IRQ 7
mov IntIRQ,EAX ;Сохраняем его
VMMCall Get_PM_Int_Vector ;Получаем адрес обработчика
mov OldSegment,CX ;Сохраняем его
mov OldOffset,EDX
mov ESI,offset32 MainInt ;Указываем свой обработчик
mov EDX,DWORD PTR IntIRQ ;загружаем вектор
VMMCall Allocate_PM_Call_Back ;обьявляем точку входа обработчика
xchg EDX,EAX ;получаем адрес своего обработчика
mov ECX,EDX
shr ECX,10h
movzx EDX,DX
VMMCall Set_PM_Int_Vector ;Устанавливаем вектор на свой обработчик
mov DX,077Ah
mov AL,00110100b ;конфигурачия LPT порта
out DX,AL
mov DX,037Ah
mov AL,00011100b
out DX,AL
mov DX,0378h
mov AL,00000000b
out DX,AL
VMMCall Enable_VM_Ints ;разрешаем прерывания
pop ESI
pop EDX
pop ECX ;востанавливаем регистры
pop EBX
pop EAX
mov EAX,1 ;возвращаем VXD_SUCCESS
ret
EndProc InitDrV1
Ответить