Как написать свой драйвер для мыши

0 / 0 / 0

Регистрация: 21.02.2013

Сообщений: 31

1

Написать драйвер для мышки

05.05.2013, 17:10. Показов 18401. Ответов 25


помогите написать драйвер мыши!!

__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь



0



Клюг

7673 / 3188 / 382

Регистрация: 03.05.2011

Сообщений: 8,380

05.05.2013, 19:30

2



0



Ушел с форума

Эксперт С++

16456 / 7420 / 1186

Регистрация: 02.05.2013

Сообщений: 11,617

Записей в блоге: 1

06.05.2013, 12:32

3

Поможем, если напишете, какой конкретно драйвер нужен и для чего.



0



0 / 0 / 0

Регистрация: 21.02.2013

Сообщений: 31

07.05.2013, 15:29

 [ТС]

4

надо чтобы был
какойто курсорчик(можно
просто точка), и она двигалась
по экрану за мышью.



0



Ушел с форума

Эксперт С++

16456 / 7420 / 1186

Регистрация: 02.05.2013

Сообщений: 11,617

Записей в блоге: 1

07.05.2013, 15:40

5

А хоть какой-то опыт написания драйверов есть ?
Документацию на MSDN по драйверам читали ?



0



Модератор

Эксперт по электронике

8773 / 6561 / 889

Регистрация: 14.02.2011

Сообщений: 23,018

07.05.2013, 15:43

6

Цитата
Сообщение от kingdeisco
Посмотреть сообщение

надо чтобы был
какойто курсорчик(можно
просто точка), и она двигалась
по экрану за мышью.

А система какая?
А мышь как подключается? УСБ КОМ ПСпополам



0



0 / 0 / 0

Регистрация: 21.02.2013

Сообщений: 31

07.05.2013, 15:58

 [ТС]

7

опыта нет. Мишь usb!



0



Ушел с форума

Эксперт С++

16456 / 7420 / 1186

Регистрация: 02.05.2013

Сообщений: 11,617

Записей в блоге: 1

07.05.2013, 16:13

8

Вот в этой теме я выкладывал список полезной литературы по системному
программированию и драйверам: RtlInitAnsiString — inBuf равняется ?
Когда освоитесь, можете попробовать собрать пример драйвера для мыши из сэмплов WDK.
Основная документация по разработке устройств ввода находится здесь:
http://msdn.microsoft.com/en-u… s.85).aspx



0



1 / 1 / 0

Регистрация: 08.09.2013

Сообщений: 9

08.09.2013, 00:51

9

Убежденный,
Приветствую системных программистов! Есть странный вопрос. )) Мне надо бы мышку обуздать и заставить ее работать в несвойственном режиме. Например, надо чтобы мышка возвращала свои координаты в таблицу при ее перемещении на несколько метров. Хотя бы на 1 метр. И при этом желательно, чтобы курсор перемещался только в пределах экрана. Хотя это может и не так существенно… Задача очень творческая, признаюсь сразу. Имеет отношение к образованию. Если заинтересуетесь опишу подробнее.



0



Модератор

Эксперт по электронике

8773 / 6561 / 889

Регистрация: 14.02.2011

Сообщений: 23,018

08.09.2013, 00:57

10

Цитата
Сообщение от Вячеслав Гр
Посмотреть сообщение

Например, надо чтобы мышка возвращала свои координаты в таблицу при ее перемещении на несколько метров. Хотя бы на 1 метр.

интересно у тебя провода хватит
да и какой дурак так далеко мышку будет катать
в принципе ничего сложного, только ты вот ОСь забыл указать



0



637 / 415 / 27

Регистрация: 03.11.2009

Сообщений: 1,855

08.09.2013, 01:18

11

Цитата
Сообщение от Вячеслав Гр
Посмотреть сообщение

надо чтобы мышка возвращала свои координаты в таблицу при ее перемещении на несколько метров.

почитайте устройство мышки, она никак не сможет вернуть вам метры



0



Модератор

Эксперт по электронике

8773 / 6561 / 889

Регистрация: 14.02.2011

Сообщений: 23,018

08.09.2013, 01:22

12

Цитата
Сообщение от t1m0n
Посмотреть сообщение

почитайте устройство мышки, она никак не сможет вернуть вам метры

а что она возвращает? миллиметры?
мышь возвращает относительные данные, устройство сдвинулось на столько то, суммируй и получишь хоть миллиметры хоть колометры



0



1 / 1 / 0

Регистрация: 08.09.2013

Сообщений: 9

08.09.2013, 08:22

13

Цитата
Сообщение от ValeryS
Посмотреть сообщение

интересно у тебя провода хватит
да и какой дурак так далеко мышку будет катать
в принципе ничего сложного, только ты вот ОСь забыл указать

ХР самая обычная. Мышка при этом будет выполнять роль учебного прибора, а не обычной мышки.. я надеюсь, что мне удастся довести это до конца и что я не ошибаюсь…



0



Клюг

7673 / 3188 / 382

Регистрация: 03.05.2011

Сообщений: 8,380

08.09.2013, 08:48

14

В DriverStudio есть примеры и вообще много вкусняшек.

Код

http://exelab.ru/download.php?action=get&n=NTc1



0



Ушел с форума

Эксперт С++

16456 / 7420 / 1186

Регистрация: 02.05.2013

Сообщений: 11,617

Записей в блоге: 1

08.09.2013, 09:32

15

Цитата
Сообщение от Вячеслав Гр
Посмотреть сообщение

Мне надо бы мышку обуздать и заставить ее работать в несвойственном режиме. Например, надо чтобы мышка возвращала свои координаты в таблицу при ее перемещении на несколько метров. Хотя бы на 1 метр. И при этом желательно, чтобы курсор перемещался только в пределах экрана. Хотя это может и не так существенно…

Повесить фильтр над драйвером класса мыши (mouclass.sys) и обрабатывать результаты
запросов IRP_MJ_READ, отсылая их своему приложению в user mode. Кода там — несколько
сотен строк от силы, а с использованием KMDF еще меньше будет. Делов-то



0



1 / 1 / 0

Регистрация: 08.09.2013

Сообщений: 9

08.09.2013, 11:20

16

Цитата
Сообщение от t1m0n
Посмотреть сообщение

почитайте устройство мышки, она никак не сможет вернуть вам метры

В каком смысле «не сможет вернуть метры»? У меня уже есть программка, которая это делает при перемещении мышки на 40-50 см и при этом курсор перемещается в пределах экрана. Но ее автор пропал, а там надо еще поработать…

Добавлено через 2 минуты

Цитата
Сообщение от Charles Kludge
Посмотреть сообщение

В DriverStudio есть примеры и вообще много вкусняшек.

Код

http://exelab.ru/download.php?action=get&n=NTc1

Дело в том, что я совсем не программист…
Я учитель физики, которому кажется, что он заметил что-то интересное..



0



Ушел с форума

Эксперт С++

16456 / 7420 / 1186

Регистрация: 02.05.2013

Сообщений: 11,617

Записей в блоге: 1

08.09.2013, 11:21

17

Мышь не работает с физическими единицами измерения длины, она
возвращает свой пробег в неких «motion points» — единицы движения.
Поэтому пробег мыши и пробег курсора на экране не относятся друг к
другу как 1:1 — это регулируется настройками.



1



1 / 1 / 0

Регистрация: 08.09.2013

Сообщений: 9

08.09.2013, 11:25

18

Цитата
Сообщение от Убежденный
Посмотреть сообщение

Повесить фильтр над драйвером класса мыши (mouclass.sys) и обрабатывать результаты
запросов IRP_MJ_READ, отсылая их своему приложению в user mode. Кода там — несколько
сотен строк от силы, а с использованием KMDF еще меньше будет. Делов-то

«Делов-то» Тем более интересно. Не согласились бы Вы пообщаться более подробно и длительно?

Добавлено через 3 минуты

Цитата
Сообщение от Убежденный
Посмотреть сообщение

Мышь не работает с физическими единицами измерения длины, она
возвращает свой пробег в неких «motion points» — единицы движения.
Поэтому пробег мыши и пробег курсора на экране не относятся друг к
другу как 1:1 — это регулируется настройками.

Вот консультации на эту тему мне и нужны для того, чтобы сделать (в случае успеха) обучение некоторых разделов школьной физики легким и интересным.. Требованиями к точность воспроизведения координат возможно можно немного пожертвовать…



0



Ушел с форума

Эксперт С++

16456 / 7420 / 1186

Регистрация: 02.05.2013

Сообщений: 11,617

Записей в блоге: 1

08.09.2013, 11:34

19

Ок, задавайте конкретные вопросы. Форум ведь для того и нужен.



1



1 / 1 / 0

Регистрация: 08.09.2013

Сообщений: 9

08.09.2013, 11:40

20

Цитата
Сообщение от Убежденный
Посмотреть сообщение

Ок, задавайте конкретные вопросы. Форум ведь для того и нужен.

Но вопросов много, появляются они постепенно и они будут от «чайника».. Скорее всего здесь предстоит немало работы после того, как будет показано, что это в принципе реально..



0



Урок 3. Сборка и запуск драйвера

Еще один, особый, вид программ – драйверы. В отличие от остальных – выполняются в особом режиме, где они имеют ряд возможностей, недоступных для обычных приложений Windows. Однако это осложняется тем, что в этом режиме практически отсутствуют средства для взаимодействия с пользователем. Для тестирования драйвера можно пользоваться функцией DbgPrint, выдающей отладочные сообщения отладчику. Но отладчика может не оказаться и этих сообщений никто в таком случае не увидит. Для обычного же взаимодействия с пользователем драйвер должен полагаться на прикладные приложения, обмениваясь с ними запросами ввода/вывода.

Сообщения, выдаваемые отладчику, проще всего увидеть при помощи программы DebugView, которую нужно запустить перед сеансом проверки.

Создание проекта будем вести следующим образом. Создаем папку DrvHello, где будем разрабатывать приложение-драйвер. Внутри нее создаем такие файлы:

• makefile

#
# DO NOT EDIT THIS FILE!!!  Edit .sources. if you want to add a new source
# file to this component.  This file merely indirects to the real make file
# that is shared by all the driver components of the Windows NT DDK
#

!INCLUDE $(NTMAKEENV)makefile.def

Над текстом этого файла не следует задумываться, он просто должен присутствовать в таком вот неизменном виде. Хотя в чужих проектах этого файла может и не быть, либо он будет работать другим образом. В общем, если он есть и содержит это содержимое – то все в порядке, если нет – необходимы дополнительные исследования.

• sources

TARGETNAME=drvhello
TARGETTYPE=DRIVER
TARGETPATH=obj
SOURCES=main.c

Задает параметры сборки. Здесь в параметре SOURCES необходимо перечислить через пробел все файлы с исходным кодом, которые нужно будет скомпилировать.

• main.c – это наш файл с исходным кодом. Может носить любое имя, их может быть много, а может быть очень много. Главное, не забыть их все перечислить в файле sources

#include "ntddk.h"

#pragma code_seg("INIT")
NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject,
    IN PUNICODE_STRING RegistryPath)
{
    DbgPrint("Hello, world!");			// Выдача отладочного сообщения
    return STATUS_DEVICE_CONFIGURATION_ERROR;	// Выдача ошибки заставит систему сразу же выгрузить драйвер
}
#pragma code_seg()

Основная функция у нас здесь носит название DriverEntry. Запускаться она будет при попытке загрузки драйвера. А чтобы сделать такую попытку – нужна программа-загрузчик, которую напишем чуть поздней.

Откомпилируем драйвер. Чтобы мы могли что-то увидеть в отладчике, драйвер должен быть собран в отладочном режиме. Напомню, что отладочный режим у программистов драйверов называется checked, а финальный — free (прикладные программисты так не заморачиваются и называют их debug и release соответственно). В этом режиме программный код не оптимизируется и исполняемый файл содержит много избыточной информации, совершенно не нужной для работы, но очень полезной при изучении того, что будет делать этот код.
Для сборки открываем меню Start, затем Programs/Windows Driver Kits/WDK <номер версии>/Build Environment/Windows Server 2003 (или Windows XP)/ x86 Checked Build Environment. Щелкаем и попадаем в консольное окно. Если FAR был добавлен в PATH, то можно набрать far и перейти в директорию проекта обычным способом, иначе туда придется добираться используя команду cd (и может быть смену диска). Когда добрались до папки DrvHello (там где лежат три файла, которые были созданы выше) – набираем команду nmake. Если сборка прошла без ошибок, то будет созданы директории objchk_wnet_x86/i386, а в ней уже можно обнаружить файл drvhello.sys. Это и есть наш собранный драйвер.

Теперь вернемся к загрузчику. Это у нас будет консольное приложение (см. главу 1). Имя я ему дал DrvHelloloader и разместил, как всегда, в c:Projects. Имя файла с исходным кодом такое же – main.c, содержимое:

#include <windows.h>
#include <shlwapi.h>
#pragma comment(lib, "shlwapi.lib") 

void main(int argc, char* argv[])
{
	char serviceName[] = "drvhello";
	char driverBinary[MAX_PATH] = "";
	SC_HANDLE hSc;
	SC_HANDLE hService;

	// Чтобы запустить драйвер, потребуется полный путь к нему
	// Предполагаем, что он лежит в той же папке, что и экзешник
	strcpy(driverBinary, argv[0]);			// argv[0] - здесь будет имя экзешника с полным путем
	PathRemoveFileSpec(driverBinary);		// Выкидываем имя экзешника, остается только путь к папке
	strcat(driverBinary, "\drvhello.sys");	// Добавляем имя драйвера.
					// Бэкслэш в строках Си надо удваивать, из-за его специального значения.

	hSc = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);	// Открываем SCM (Service Control Management)
								// Это такая штука, которая позволяет запускать драйверы
								// из пользовательского режима
	CreateService(hSc, serviceName, serviceName,
		SERVICE_ALL_ACCESS, SERVICE_KERNEL_DRIVER, SERVICE_DEMAND_START, SERVICE_ERROR_NORMAL,
		driverBinary, NULL, NULL, NULL, NULL, NULL);				// Загрузка в 3 этапа - создаем службу
	hService = OpenService(hSc, serviceName, SERVICE_ALL_ACCESS);	// Открываем ее
	StartService(hService, 0, NULL);	// И запускаем. Вообще-то было бы неплохо
						// еще и закрыть ее... Как нибудь потом.
}

Выбираем в меню cтудии – Build/Rebuild Solution. Произойдет пересборка проекта без запуска. В принципе, можно и запустить. Находим экзешник в папке проекта, докидываем в ту же папку drvhello.sys. Далее запускаем DebugView, включаем галочку Capture/Capture Kernel, как показано на рисунке:

Изображение
Рис. 3.1 – Настройка DebugView

Теперь запускаем программу. Если все прошло успешно – видим следующую картину:

Изображение
Рис. 3.2 – Проверка драйвера

Вот такой простой код позволяет уже очень много – работать на уровне ядра. Но следует помнить, что если допустить ошибку в прикладной программе – упадет она одна; если в драйвере – вся система. К примеру, если в код драйвера перед DbgPrint добавить строку:

int a = *((int *)0);

которая делает попытку прочесть содержимое памяти по нулевому адресу – то картинка будет уже иной:

Изображение
Рис. 3.3 – Попытка чтения из нулевого адреса

Если бы это был не драйвер, а просто программа пользовательского режима, то при выполнении этого кода она бы просто закрылась, выдав ошибку:

Изображение
Рис. 3.4 – Та же ошибка в программе пользовательского режима

Till now we have seen only static output on the black window in C/C++ without any peripheral device interaction(like mouse). Here static means that interaction with the output screen through the mouse to run a dynamic event or task. The goal will be to make the pointer of the mouse visible on our output screen, through which it can see any new event when the mouse is clicked on the same output window.

Requirement: Turbo C++ IDE or DOS BOX

Fundamental Knowledge: 
The idea is to tell a mouse to do anything on the output screen. In actual the communication with the mouse directly is not possible but through the driver provided. The idea is to use interrupts to get access to this driver. Each device provided by a computer has a unique port which is a hexadecimal value that is designed to be machine-independent enhancing the portability of the program. Mouse has port 0X33 attached to it. Use of address registers is also required to access these port. These are basically UNION of type REGS defined in “dos.h“. Use two registers to communicate to a device driver one for input and one for output and send value to device driver through the input register and receive information in it embedded in the output register. 

Now there are two ways to display mouse pointer on C/C++ screen. First is the non-graphic mode and the second is Graphic mode, Here we use graphic mode. To switch our output window in Graphic mode steps are listed below:
Enable Graphic mode: For enabling the graphics mode use initgraph() function which is used to initialize the graphics mode. This function is present in graphics.h header file.

Syntax of initgraph():  

void initgraph(int *gdriver, int *gmode, char *pathtodriver);

  • gdriver: It is an integer that specifies which graphics driver is to be used. Use DETECT it means compiler auto select the suitable driver according to requirement.
  • gmode: It is also an integer that specifies the initial graphics mode. when gdriver = DETECT In this case, initgraph() sets gmode to the highest resolution available for the detected driver.
  • pathtodriver: It denotes the directory path where initgraph must look for graphic drivers.

Program 1: 

C

#include <conio.h>

#include <graphics.h>

int main()

{

    int gdriver = DETECT, gmode, errorcode;

    initgraph(&gdriver, &gmode, "C:\TC\BGI");

    errorcode = graphresult();

    if (errorcode == grOk)

        printf("Graphics enabled: %sn",

               grapherrormsg(errorcode));

    else

        printf("Graphics error: %sn",

               grapherrormsg(errorcode));

    getch();

    closegraph();

    return 0;

}

C++

#include <bits/stdc++.h>

#include <conio.h>

#include <graphics.h>

int main()

{

    int gdriver = DETECT, gmode, errorcode;

    initgraph(&gdriver, &gmode, "C:\TC\BGI");

    errorcode = graphresult();

    if (errorcode == grOk)

        cout << "Graphics enabled: n"

             << grapherrormsg(errorcode);

    else

        cout << "Graphics error: n"

             << grapherrormsg(errorcode);

    getch();

    closegraph();

    return 0;

}

Output: 

Prerequisite for Mouse Programming:

AX Register: The various mouse functions can be access using different values of AX input Register and passing those values to mouse port using an interrupt. Functions are listed below in the table: 

Here AX, BX, CX, and DX are members of UNION REGS.

Interrupt Service Description

0X33

OR

51

0

  • Reset mouse and get status.
  • Call with AX = 0
  • Returns AX = FFFFh , if mouse support is available, otherwise, returns Ax = 0.

1

  • Show mouse pointer.
  • Call with AX = 1.
  • Returns Nothing

2

  • Hide mouse pointer.
  • Call with AX = 2.
  • Returns Nothing.

3

  • Get mouse position and button status.
  • Call with AX = 3.
  • Returns BX = mouse button status.
  • BX Bit Significance:
    • 0 button not pressed
    • 1 left button is pressed
    • right button is pressed
    • 3 center button is pressed
    • CX = x coordinate
    • DX = y coordinate

4

  • Set mouse pointer position.
  • Call with AX = 4.
  • CX = x coordinate
  • DX = y coordinate
  • Returns Nothing.

7

  • Set horizontal limits for pointer.
  • Call with AX = 7.
  • CX = minimum x coordinate.
  • DX = maximum x coordinate.
  • Returns Nothing.

8

  • Set vertical limits for pointer.
  • Call with AX = 8.
  • CX = minimum y coordinate.
  • DX = maximum y coordinate.
  • Returns Nothing.

int86() function: The int86() is a C library function that facilitates access to bare bone DOS and BIOS service interrupts. It is a wrapper over inline assembly interrupt call. It takes CPU register values with object to a structure where member variables are equivalent to CPU registers. It takes three arguments. 

// Declaration syntax 
int int86(int intno, union REGS* inregs, union REGS* outregs);
// intno – Interrupt vector /service number 
// inregs – Input argument registers as REGS 
// outregs – Output argument registers as REGS 

Use Cases of Mouse Programming:

There are various use cases of the Mouse Programming that are listed below:

  1. Detecting Mouse
  2. Display mouse pointer in graphics mode
  3. Hide pointer
  4. Determine Current position
  5. Identified which mouse button is clicked
  6. Restrict mouse pointer
  7. Free hand drawing (Use of all function)

Program 2: 
Below is the program to check if a mouse driver is loaded or not:

C

#include <conio.h>

#include <dos.h>

#include <graphics.h>

#include <stdio.h>

union REGS in, out;

void detectMouse()

{

    in.x.ax = 0;

    int86(0X33, &in, &out);

    if (out.x.ax == 0)

        printf("nMouse Failed To Initialize");

    else

        printf("nMouse was Successfully Initialized");

}

int main()

{

    clrscr();

    int gdriver = DETECT, gmode;

    initgraph(&gdriver, &gmode, "c:tcbgi");

    detectMouse();

    getch();

    closegraph();

    return 0;

}

C++

#include <bits/stdc++.h>

#include <conio.h>

#include <dos.h>

#include <graphics.h>

#include <stdio.h>

union REGS in, out;

void detectMouse()

{

    in.x.ax = 0;

    int86(0X33, &in, &out);

    if (out.x.ax == 0)

        cout << "nMouse Failed To"

             << " Initialize";

    else

        cout << "nMouse was Successfully"

             << " Initialized";

}

int main()

{

    clrscr();

    int gdriver = DETECT, gmode;

    initgraph(&gdriver, &gmode, "c:tcbgi");

    detectMouse();

    getch();

    closegraph();

    return 0;

}

Output: 

Till now we have seen only static output on the black window in C/C++ without any peripheral device interaction(like mouse). Here static means that interaction with the output screen through the mouse to run a dynamic event or task. The goal will be to make the pointer of the mouse visible on our output screen, through which it can see any new event when the mouse is clicked on the same output window.

Requirement: Turbo C++ IDE or DOS BOX

Fundamental Knowledge: 
The idea is to tell a mouse to do anything on the output screen. In actual the communication with the mouse directly is not possible but through the driver provided. The idea is to use interrupts to get access to this driver. Each device provided by a computer has a unique port which is a hexadecimal value that is designed to be machine-independent enhancing the portability of the program. Mouse has port 0X33 attached to it. Use of address registers is also required to access these port. These are basically UNION of type REGS defined in “dos.h“. Use two registers to communicate to a device driver one for input and one for output and send value to device driver through the input register and receive information in it embedded in the output register. 

Now there are two ways to display mouse pointer on C/C++ screen. First is the non-graphic mode and the second is Graphic mode, Here we use graphic mode. To switch our output window in Graphic mode steps are listed below:
Enable Graphic mode: For enabling the graphics mode use initgraph() function which is used to initialize the graphics mode. This function is present in graphics.h header file.

Syntax of initgraph():  

void initgraph(int *gdriver, int *gmode, char *pathtodriver);

  • gdriver: It is an integer that specifies which graphics driver is to be used. Use DETECT it means compiler auto select the suitable driver according to requirement.
  • gmode: It is also an integer that specifies the initial graphics mode. when gdriver = DETECT In this case, initgraph() sets gmode to the highest resolution available for the detected driver.
  • pathtodriver: It denotes the directory path where initgraph must look for graphic drivers.

Program 1: 

C

#include <conio.h>

#include <graphics.h>

int main()

{

    int gdriver = DETECT, gmode, errorcode;

    initgraph(&gdriver, &gmode, "C:\TC\BGI");

    errorcode = graphresult();

    if (errorcode == grOk)

        printf("Graphics enabled: %sn",

               grapherrormsg(errorcode));

    else

        printf("Graphics error: %sn",

               grapherrormsg(errorcode));

    getch();

    closegraph();

    return 0;

}

C++

#include <bits/stdc++.h>

#include <conio.h>

#include <graphics.h>

int main()

{

    int gdriver = DETECT, gmode, errorcode;

    initgraph(&gdriver, &gmode, "C:\TC\BGI");

    errorcode = graphresult();

    if (errorcode == grOk)

        cout << "Graphics enabled: n"

             << grapherrormsg(errorcode);

    else

        cout << "Graphics error: n"

             << grapherrormsg(errorcode);

    getch();

    closegraph();

    return 0;

}

Output: 

Prerequisite for Mouse Programming:

AX Register: The various mouse functions can be access using different values of AX input Register and passing those values to mouse port using an interrupt. Functions are listed below in the table: 

Here AX, BX, CX, and DX are members of UNION REGS.

Interrupt Service Description

0X33

OR

51

0

  • Reset mouse and get status.
  • Call with AX = 0
  • Returns AX = FFFFh , if mouse support is available, otherwise, returns Ax = 0.

1

  • Show mouse pointer.
  • Call with AX = 1.
  • Returns Nothing

2

  • Hide mouse pointer.
  • Call with AX = 2.
  • Returns Nothing.

3

  • Get mouse position and button status.
  • Call with AX = 3.
  • Returns BX = mouse button status.
  • BX Bit Significance:
    • 0 button not pressed
    • 1 left button is pressed
    • right button is pressed
    • 3 center button is pressed
    • CX = x coordinate
    • DX = y coordinate

4

  • Set mouse pointer position.
  • Call with AX = 4.
  • CX = x coordinate
  • DX = y coordinate
  • Returns Nothing.

7

  • Set horizontal limits for pointer.
  • Call with AX = 7.
  • CX = minimum x coordinate.
  • DX = maximum x coordinate.
  • Returns Nothing.

8

  • Set vertical limits for pointer.
  • Call with AX = 8.
  • CX = minimum y coordinate.
  • DX = maximum y coordinate.
  • Returns Nothing.

int86() function: The int86() is a C library function that facilitates access to bare bone DOS and BIOS service interrupts. It is a wrapper over inline assembly interrupt call. It takes CPU register values with object to a structure where member variables are equivalent to CPU registers. It takes three arguments. 

// Declaration syntax 
int int86(int intno, union REGS* inregs, union REGS* outregs);
// intno – Interrupt vector /service number 
// inregs – Input argument registers as REGS 
// outregs – Output argument registers as REGS 

Use Cases of Mouse Programming:

There are various use cases of the Mouse Programming that are listed below:

  1. Detecting Mouse
  2. Display mouse pointer in graphics mode
  3. Hide pointer
  4. Determine Current position
  5. Identified which mouse button is clicked
  6. Restrict mouse pointer
  7. Free hand drawing (Use of all function)

Program 2: 
Below is the program to check if a mouse driver is loaded or not:

C

#include <conio.h>

#include <dos.h>

#include <graphics.h>

#include <stdio.h>

union REGS in, out;

void detectMouse()

{

    in.x.ax = 0;

    int86(0X33, &in, &out);

    if (out.x.ax == 0)

        printf("nMouse Failed To Initialize");

    else

        printf("nMouse was Successfully Initialized");

}

int main()

{

    clrscr();

    int gdriver = DETECT, gmode;

    initgraph(&gdriver, &gmode, "c:tcbgi");

    detectMouse();

    getch();

    closegraph();

    return 0;

}

C++

#include <bits/stdc++.h>

#include <conio.h>

#include <dos.h>

#include <graphics.h>

#include <stdio.h>

union REGS in, out;

void detectMouse()

{

    in.x.ax = 0;

    int86(0X33, &in, &out);

    if (out.x.ax == 0)

        cout << "nMouse Failed To"

             << " Initialize";

    else

        cout << "nMouse was Successfully"

             << " Initialized";

}

int main()

{

    clrscr();

    int gdriver = DETECT, gmode;

    initgraph(&gdriver, &gmode, "c:tcbgi");

    detectMouse();

    getch();

    closegraph();

    return 0;

}

Output: 

Как написать драйвер для мышки? И где в ядре находится

Модератор: Модераторы разделов

Аватара пользователя

Portnov

Модератор
Сообщения: 1786
Статус: Матёрый линуксоид
ОС: Debian testing/unstable
Контактная информация:

Re: Как написать драйвер для мышки? И где в ядре находится

Сообщение

Portnov » 27.04.2009 09:57

1. Роберт Лав, ‘Разработка ядра Linux’; Он же, ‘Системное программирование для Linux’ (эти две есть по-русски). «Linux Device Drivers» (http://lwn.net/Kernel/LDD3/).
2. Для ps/2 — drivers/input/mouse/. Для usb, насколько я понял — drivers/hid/usbhid/.

Аватара пользователя

Denjs

Сообщения: 1685
ОС: SuSe 10.2

Re: Как написать драйвер для мышки? И где в ядре находится

Сообщение

Denjs » 27.04.2009 10:19

DaemonTux писал(а): ↑

27.04.2009 07:57

nofelet писал(а): ↑

27.04.2009 02:08

1. Как писать драйвера для линукс? С чего начать ? Литература?

2. В какой папке в ядре находится исходники дров для мышки ?

Для чего вам писать свой драйвер?

ну, например, мне не помешал-бы драйвер для «Genius NewSketch 1212 HR II» паншета )))
просто валяется без дела уже несколько лет, а выбрасывать жалко…

QDroid — Среда исполнения и фреймворк для QtScript.
OTPD — Открытые драйвера промышленных принтеров чеков и этикеток (кроссплатформенная подсистема печати).

Аватара пользователя

Stauffenberg

Сообщения: 2028
Статус: ☮ PEACE ☮
ОС: открытая и свободная

Re: Как написать драйвер для мышки? И где в ядре находится

Сообщение

Stauffenberg » 27.04.2009 12:46

nofelet писал(а): ↑

27.04.2009 02:08

1. Как писать драйвера для линукс? С чего начать ? Литература?

Я сейчас тоже решил поиграться с ядром. Но я пишу драйвер клавиатуры (: Могу посоветовать:
* http://kernelnewbies.org/
* Essential Linux Device Driver — в книге и основы работы мышек и примеры кода. Очень хорошая книга для тех, кто хочет научиться писать модули ядра (драйвера).

nofelet писал(а): ↑

27.04.2009 02:08

2. В какой папке в ядре находится исходники дров для мышки ?

/usr/src/linux/drivers/input/serio/i8042.c
драйвер контроллера i8042

Labor omnia vincit

«Debugging is twice as hard as writing the code in the first place.
Therefore, if you write the code as cleverly as possible, you are, by definition, not smart enough to debug it.” (Brian Kernighan)

Аватара пользователя

rza

Сообщения: 105
ОС: Linux Mint 11 Katya

Re: Как написать драйвер для мышки? И где в ядре находится

Сообщение

rza » 23.10.2010 00:41

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

 42 #define DRIVER_VERSION "v1.6"
 43 #define DRIVER_AUTHOR "Vojtech Pavlik <vojtech@ucw.cz>"
 44 #define DRIVER_DESC "USB HID Boot Protocol mouse driver"
 45 #define DRIVER_LICENSE "GPL"
 46
 47 MODULE_AUTHOR(DRIVER_AUTHOR);
 48 MODULE_DESCRIPTION(DRIVER_DESC);
 49 MODULE_LICENSE(DRIVER_LICENSE);
 50
 51 struct usb_mouse {
 52         char name[128];
 53         char phys[64];
 54         struct usb_device *usbdev;
 55         struct input_dev *dev;
 56         struct urb *irq;
 57
 58         signed char *data;
 59         dma_addr_t data_dma;
 60 };
 61
 62 static void usb_mouse_irq(struct urb *urb)
 63 {
 64         struct usb_mouse *mouse = urb->context;
 65         signed char *data = mouse->data;
 66         struct input_dev *dev = mouse->dev;
 67         int status;
 68
 69         switch (urb->status) {
 70         case 0:                 /* success */
 71                 break;
 72         case -ECONNRESET:       /* unlink */
 73         case -ENOENT:
 74         case -ESHUTDOWN:
 75                 return;
 76         /* -EPIPE:  should clear the halt */
 77         default:                /* error */
 78                 goto resubmit;
 79         }
 80
 81         input_report_key(dev, BTN_LEFT,   data[0] & 0x01);
 82         input_report_key(dev, BTN_RIGHT,  data[0] & 0x02);
 83         input_report_key(dev, BTN_MIDDLE, data[0] & 0x04);
 84         input_report_key(dev, BTN_SIDE,   data[0] & 0x08);
 85         input_report_key(dev, BTN_EXTRA,  data[0] & 0x10);
 86
 87         input_report_rel(dev, REL_X,     data[1]);
 88         input_report_rel(dev, REL_Y,     data[2]);
 89         input_report_rel(dev, REL_WHEEL, data[3]);
 90
 91         input_sync(dev);
 92 resubmit:
 93         status = usb_submit_urb (urb, GFP_ATOMIC);
 94         if (status)
 95                 err ("can't resubmit intr, %s-%s/input0, status %d",
 96                                 mouse->usbdev->bus->bus_name,
 97                                 mouse->usbdev->devpath, status);
 98 }
 99
260

usbmouse.c

подскажите пожалуйста как отсюда получить координаты курсора?
input_report_rel(dev, REL_X, data[1]);
input_report_rel(dev, REL_Y, data[2]);

Аватара пользователя

Helmik

Сообщения: 9
ОС: openSUSE
Контактная информация:

Re: Как написать драйвер для мышки? И где в ядре находится

Сообщение

Helmik » 23.01.2011 21:16

rza писал(а): ↑

23.10.2010 00:41

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

 42 #define DRIVER_VERSION "v1.6"
 43 #define DRIVER_AUTHOR "Vojtech Pavlik <vojtech@ucw.cz>"
 44 #define DRIVER_DESC "USB HID Boot Protocol mouse driver"
 45 #define DRIVER_LICENSE "GPL"
 46
 47 MODULE_AUTHOR(DRIVER_AUTHOR);
 48 MODULE_DESCRIPTION(DRIVER_DESC);
 49 MODULE_LICENSE(DRIVER_LICENSE);
 50
 51 struct usb_mouse {
 52         char name[128];
 53         char phys[64];
 54         struct usb_device *usbdev;
 55         struct input_dev *dev;
 56         struct urb *irq;
 57
 58         signed char *data;
 59         dma_addr_t data_dma;
 60 };
 61
 62 static void usb_mouse_irq(struct urb *urb)
 63 {
 64         struct usb_mouse *mouse = urb->context;
 65         signed char *data = mouse->data;
 66         struct input_dev *dev = mouse->dev;
 67         int status;
 68
 69         switch (urb->status) {
 70         case 0:                 /* success */
 71                 break;
 72         case -ECONNRESET:       /* unlink */
 73         case -ENOENT:
 74         case -ESHUTDOWN:
 75                 return;
 76         /* -EPIPE:  should clear the halt */
 77         default:                /* error */
 78                 goto resubmit;
 79         }
 80
 81         input_report_key(dev, BTN_LEFT,   data[0] & 0x01);
 82         input_report_key(dev, BTN_RIGHT,  data[0] & 0x02);
 83         input_report_key(dev, BTN_MIDDLE, data[0] & 0x04);
 84         input_report_key(dev, BTN_SIDE,   data[0] & 0x08);
 85         input_report_key(dev, BTN_EXTRA,  data[0] & 0x10);
 86
 87         input_report_rel(dev, REL_X,     data[1]);
 88         input_report_rel(dev, REL_Y,     data[2]);
 89         input_report_rel(dev, REL_WHEEL, data[3]);
 90
 91         input_sync(dev);
 92 resubmit:
 93         status = usb_submit_urb (urb, GFP_ATOMIC);
 94         if (status)
 95                 err ("can't resubmit intr, %s-%s/input0, status %d",
 96                                 mouse->usbdev->bus->bus_name,
 97                                 mouse->usbdev->devpath, status);
 98 }
 99
260

usbmouse.c

подскажите пожалуйста как отсюда получить координаты курсора?
input_report_rel(dev, REL_X, data[1]);
input_report_rel(dev, REL_Y, data[2]);

Смещение по оси X находится в data[1], по Y: в data[2].

Можете вставить printk(KERN_ALERT «(x: %i; y: %i)», data[1], data[2]); и посмотреть что будет.

To be a rock and not to roll.

Понравилась статья? Поделить с друзьями:
  • Как написать свой диспетчер задач
  • Как написать свой диалог
  • Как написать свой детектив
  • Как написать свой графический движок
  • Как написать свой грабер