Страница 1 из 2
VxD драйвера
Добавлено: 29 апр 2004, 14:24
Aleksandr
Подскажите как правильно работать с динамическим драйвером VxD?
Как обрабатывать прерывания в VxD драйверах?
И как направить поток данных от драйвера на своё приложение?
Добавлено: 01 май 2004, 12:00
Andy
Aleksandr, можно долго и упорно это дело расписывать, но нет времени и необходимости.
В разделе полезные ссылки есть линк на великолепный сайт Iczelion'а -
http://win32asm.cjb.net/. Там смотрите раздел Туториалы. Сайт на фреймах - так что точную ссылку дать не могу. Так вот в этом разделе есть все что нужно про VxD. Лучше и подробнее нигде не найдете, честное благородное слово.
ЗЫ. Лично если мне что-то надо сделать - я первым делом частенько туду заглядываю, и Вам рекомендую %)
Добавлено: 03 июн 2004, 14:11
Aleksandr
Большое спасибо за Ваш совет. Я напсал свой VxD пользуясь DDK 98 там в hellpe подробно описано как создавать свои драйвера и перенаправлять прерывания. Но возник другой вопрос как загрузить VxD (динамический). Пробовал пример на делфи загрузчка он неработает. Пишет что типа INVALID_HANDLE_VALUE кода деляю CreateFile хотя пример каторый в инете ходит вполне работоспособный. Помогите загрузить ЭТОТ ..... драйвер?
Ps под ...... я имел VxD (только ничего пошлого)
Добавлено: 03 июн 2004, 18:26
Andy
Пишет что типа 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() - может путь с ошибкой.
Добавлено: 04 июн 2004, 07:51
Aleksandr
Andy я делаю все как вы пишите но GetLastError возвращает INVALID_HANDLE_VALUE или -1 или 0xFFFFFFFFh как вам угодно (в бинаре не буду писать слишком долго) а что касается пути он у меня лежит где и ExEшник и путь я задаю как вы пишите Мне кажется это либо в драйвере либо делфи глючит. Главное инициализация дравера проходит а вот хендел получить не могу Хендел нужен для DeviceIoControl чтобы посылать и передовать данные. Может надо что то в драйвере добавить?
Добавлено: 04 июн 2004, 08:36
Andy
Aleksandr, я что-то не понял какая функция возвращает INVALID_HANDLE_VALUE... GetLastError не возвращает INVALID_HANDLE_VALUE, а возвращает расширенный код ошибки, текст которой можно получить передав этот код в программу типа MS Error Lookup из Visual Studio. INVALID_HANDLE_VALUE может вернуть CreateFile, потом надо сразу вызвать функцию GetLastError() и получить код ошибки. INVALID_HANDLE_VALUE - мало что дает.
Добавлено: 04 июн 2004, 08:59
Andy
Да вот еще важный вопрос - в какой операционке происходит действо?
Добавлено: 04 июн 2004, 09:23
Aleksandr
Andy прости меня за мою безграмотность на счет GetLastError. Я устранил ошибку с CreateFile она заключалась в драйвере. Там обрабатывалось сообщение Sys_Dinamic_Device_Init, InitDrV1 и из-за него CreateFile выдавал ошибку как только я убрал этот обработчик всё сразу заработало.Но как теперь инициализировать драйвер ведь в этом обработчике было перенаправление прерывания и начальные установки портов.Все это безобразие елается в WinME.
Добавлено: 04 июн 2004, 10:17
Andy
Sys_Dinamic_Device_Init
Опечатка? Sys_Dy(!)namic_Device_Init !?
Инициализировать драйвер именно в обработчике Sys_Dynamic_Device_Init и надо. Где-то там видимо ошибка в коде обработчика, надо искать - другого пути не дано
А Sys_Dynamic_Device_Exit нормально обрабатывается?
Добавлено: 04 июн 2004, 11:15
Aleksandr
Обработчик 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