Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2004.08.22;
Скачать: [xml.tar.bz2];

Вниз

Можно ли на Дельфи написать драйвер мыши ?   Найти похожие ветки 

 
Алекс А   (2004-06-30 07:09) [0]

У меня мышь с 5 кнопками, но чтобы работали две дополнительные, которые сбоку, требуется загружать какую то кривую программу от Genius, которая часто зависает, поэтому я ею не пользуюсь.
Может есть какие готовые драйверы на Дельфи, чтобы мне только вписать туда свои две кнопки и пользоваться ?


 
Digitman ©   (2004-06-30 10:13) [1]


> Можно ли на Дельфи написать драйвер мыши ?


от начала до конца (т.е. не пользуя иное ПО) нельзя
без DDK и ассемблера не обойтись


 
Игорь Шевченко ©   (2004-06-30 10:19) [2]


> Можно ли на Дельфи написать драйвер мыши


Нельзя


 
noname ©   (2004-06-30 11:32) [3]

Можно, но с асмом =)


 
SammIk ©   (2004-06-30 11:35) [4]

Конечно можно, можно все!!!
Но не всегда(
Раньше на паскале писали дрова, у меня даже гдето исходник
лежит.
Но на делфи драивер, написать!?!?
Это пыхтеть и пыхтеть надо!!! И ддк врятли поможет.
Но я думаю у тебя все получится, когда напишешь покажи всем.


 
Игорь Шевченко ©   (2004-06-30 11:37) [5]

noname ©   (30.06.04 11:32)


> Можно, но с асмом =)


Примеры драйвера на Delphi (хоть с асмом, хоть с чем) в студию


 
SammIk ©   (2004-06-30 11:40) [6]

Точно, я их сопру и получу нобелевскую премию "За преврощение в жизнь сказки".


 
Andrey   (2004-06-30 12:17) [7]

Может не в тему.
У меня 5 кнопок дрова A4Tech работает как часы...
Хотя может и интересней "изобрести велосипед"


 
noname ©   (2004-06-30 13:56) [8]

А в чём проблема-то?
На C - Шрайбер. А что можно на C, то можно и на Delphi.
У меня на компе есть статья про написание драйвера на Delphi.


 
Anatoly Podgoretsky ©   (2004-06-30 14:05) [9]

noname ©   (30.06.04 13:56) [8]
У тебя на "компе"  обманка!!!


 
Игорь Шевченко ©   (2004-06-30 14:06) [10]


> А что можно на C, то можно и на Delphi.


Бред. Драйвер нельзя. Почитай того же Шрайбера повнимательнее.


 
inic ©   (2004-06-30 14:08) [11]

VXD-дрова точно нельзя, хотя бы потому, что это LE формат, а компилятор Delphi их делать не умеет (как и TASM кстати). А вот sys-дрова имеют формат PE. Поэтому возможно, что их-то сделать на делфях можно (с портированием некоторых инклудов из ддк в паскаль), но не проверял...


 
Игорь Шевченко ©   (2004-06-30 14:15) [12]


> А вот sys-дрова имеют формат PE. Поэтому возможно, что их-то
> сделать на делфях можно (с портированием некоторых инклудов
> из ддк в паскаль), но не проверял...


И не проверяй.

ЛЮБОЕ приложение Delphi импортирует функции из DLL пользовательского режима (kernel32, user32, etc). В драйвере эти DLL недоступны по определению.


 
noname ©   (2004-06-30 15:50) [13]

Общая информация

Компиляция данного примера возможна только с Delphi 3. Delphi 2 не был опробован в связи с его отсутствием, объектные фалы созданные Delphi 4 отвергаются Microsoft® Linker 5.12.8181 как файлы неизвестного формата.

При написании данного материала были использованы Microsoft® Macro Assembler ver. 6.11d и Microsoft® Incremental Linker ver. 5.12.8181 из поставки Windows 98DDK
Введение

VxD драйвера делятся два типа:

Статические Загружаются в память при загрузке операционной системы и присутствуют в памяти постоянно
Динамические Загружаются в память при первом обращении к драйверу и могут быть выгружены при закрытии последнего дескриптора VxD.

Практически возможно создание драйвера поддерживающего оба типа загрузки.

Нам необходим динамически загружаемый VxD драйвер (далее "VxD") т.к. такой драйвер можно будет без перезагрузки Windows загружать из Win32® приложений используя процедуру CreateFile().

Когда Win32 приложение открывает дескриптор для VxD, виртуальное устройство VWIN32 используя сервис LoadDevice загружает VxD-драйвер в память и посылает информационное сообщение W32_DEVICEIOCONTROL загруженному VxD.

Таким образом для построения VxD необходимо обрабатывать как минимум три системных сообщения:
SYS_DYNAMIC_DEVICE_INIT
SYS_DYNAMIC_DEVICE_EXIT
W32_DEVICEIOCONTROL.

Собщение SYS_DYNAMIC_DEVICE_INIT посылается при попытке динамической загрузки VxD, SYS_DYNAMIC_DEVICE_EXIT посылается при попытке динамической выгрузке. Из обработчиков сообщений для подтверждения успеха необходимо вернуть VXD_SUCCESS в регистре AX
Сообщение W32_DEVICEIOCONTROL имеет следующие значения для параметра dwService

DIOC_OPEN - посылается посылается при открытии дескриптора VxD функцией CreateFile() только после SYS_DYNAMIC_DEVICE_INIT. В случае успеха необходимо вернуть NO_ERROR (0);
DIOC_CLOSEHANDLE - посылается при закрытии дескриптора VxD функцией API CloseHandle() и только перед SYS_DYNAMIC_DEVICE_EXIT
(Значение > 0) - Номер функции, заданный в параметре dwIoControlCode при обращении к VxD функцией API DeviceIoControl
Загрузочный модуль (vxdmain.asm)
При обращении к процедурам находящимся в модулях Delphi надо учесть для fastcall-процедур к имени добавляется в начале символ "@"

...
extrn SysDynamicDeviceInit :PROC
extrn SysDynamicDeviceExit :PROC
extrn W32DeviceIoControl   :PROC
...
Control_0proc
cmpeax, SYS_DYNAMIC_DEVICE_INIT
jnzshort chkSysDynExit
callSysDynamicDeviceInit
cmpeax, 1
retn
;-------------

chkSysDynExit:
cmpeax, SYS_DYNAMIC_DEVICE_EXIT
jnzshort chkDevIOCtl
callSysDynamicDeviceExit
cmpeax, 1
retn
;-------------
chkDevIOCtl:
cmpeax, W32_DEVICEIOCONTROL
jnzshort loc_ret
pushesi
pushedx
pushebx
pushecx
callW32DeviceIoControl
cmpeax, 1
retn
;-------------
loc_ret:
clc
retn

Control_0endp
...

Delphi создает код для инициализации/деинициализации модулей, обращаясь к внешним процедурам HandleFinaly и initialization даже если блоки initilization и finalization в модуле отсутствуют. Создадим пустую "заглушку" для этих процедур и объявим их доступными для внешних модулей.

...
   Public  @@HandleFinally
   Public  @initialization
...
@@HandleFinally:
@initialization:
ret
...
end.
Процедурный модуль (vxdProcs.pas)

procedure ShellMessage(Handle, Flags : integer; const Message, Caption : PChar;
  Callback, ReferenceData : pointer); stdcall; assembler;
asm
 movebx, Handle// virtual machine handle
 moveax, Flags// message box flags
 movecx, Message// address of message text
 movedi, Caption// address of caption text
 movesi, Callback// address of callback
 movedx, ReferenceData// reference data for callback

 int20H// VxDCall
 dd 170004h// Shell_Message
end;

const
 Copyright : PChar = "(c) 1999 Emil Biserov, " +
                     "fatty777@mail.ru, http://dinfo.da.ru";

function SysDynamicDeviceInit : INTEGER;
begin
 ShellMessage(0, $10, Copyright, "SysDynInit: Hello from Delphi VxD !!!", nil, nil);
 Result := VXD_SUCCESS;
end;

function SysDynamicDeviceExit : INTEGER;
begin
 ShellMessage(0, $10, Copyright, "SysDynDevExit: Bye from Delphi VxD !!!", nil, nil);
 Result := VXD_SUCCESS;
end;

function W32DeviceIoControl(dwService : INTEGER;
                           dwDDB : INTEGER;
                           hDevice : INTEGER;
                           lpDIOCParms : pointer) : INTEGER;
begin
 ShellMessage(0, $10, Copyright, "W32DevIOCtl", nil, nil);

 if (dwService = DIOC_OPEN) then
 begin
     Result := NO_ERROR;
 end
 else if (dwService = DIOC_CLOSEHANDLE) then
 begin
     Result := VXD_SUCCESS;
 end
 else if (dwService > MAX_PASVXD_W32_API) then
 begin
     Result := ERROR_NOT_SUPPORTED;
 end
   else
 begin
     Result := VXD_SUCCESS;
 end;
end;
Инструмент для загрузки/выгрузки VxD

Представляет из себя простую форму с двумя кнопками. Приведу лишь методы для открытия и закрытия VxD драйвера.

const
VxDName = "\\.\DELPHIIO.VXD";

...

function TVxDTestForm.OpenVxDDriver: boolean;
begin
HVxDHandle := CreateFile(VxDName,0,0,nil,0,FILE_FLAG_DELETE_ON_CLOSE,0);
Result := HVxDHandle <> INVALID_HANDLE_VALUE;
end;

procedure TVxDTestForm.CloseVxDDriver;
begin
if HVxDHandle <> INVALID_HANDLE_VALUE then begin
  CloseHandle(HVxDHandle);
  HVxDHandle := INVALID_HANDLE_VALUE;
end;
end;

Выгрузку неиспользуемого модуля можно производить автоматически, указав в параметрах CreateFile(,,,,,FILE_FLAG_DELETE_ON_CLOSE,). В данном случае система при каждом открытии дескриптора к VxD будет увеличивать внутренний счетчик использования на 1 и вычитать 1 при закрытии дескриптора. При значении счетчика равном нулю VxD будет автоматически выгружен.
Выводы

Драйвера на Delphi писать можно. Но вот только стоит ли?
Использование VxD имеет смысл только для использования Windows 3.1 и Windows 95. Да и доступ к аппаратным ресурсам в них гораздо прозрачнее чем Windows NT/2000. Windows 98, Windows NT и Windows2000 поддерживают новую модель драйверов WDM 1.0/2.0, использующую формат PE (Portable Executable) и (предположительно) проблем будет меньше, чем с VxD и его LE (Linear Executable) форматом драйверов.


 
Игорь Шевченко ©   (2004-06-30 15:57) [14]

noname ©   (30.06.04 15:50)

Это единственная сказка, которую все читают :))


 
Алекс А   (2004-07-10 05:02) [15]

В общем жаль ...



Страницы: 1 вся ветка

Форум: "WinAPI";
Текущий архив: 2004.08.22;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.51 MB
Время: 0.032 c
6-1087810555
atruhin
2004-06-21 13:35
2004.08.22
Ошибка при закрытии сокета


4-1089368759
pavel_guzhanov
2004-07-09 14:25
2004.08.22
Чтение данных из компорта


1-1091795561
Konoko
2004-08-06 16:32
2004.08.22
Как отцентрировать текст в ячейках StringGrid?


1-1091623105
cvg
2004-08-04 16:38
2004.08.22
Длина массива записей -- как???


1-1091691282
СержК
2004-08-05 11:34
2004.08.22
Можно ли вставить в свой проект фрагмент кода на VB





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский