Форум программистов, компьютерный форум, киберфорум
Программирование драйверов
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.77/13: Рейтинг темы: голосов - 13, средняя оценка - 4.77
11 / 10 / 7
Регистрация: 07.05.2013
Сообщений: 248

Драйвер-передатчик с циклич опросом

24.01.2016, 10:48. Показов 2568. Ответов 2
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте. Мне нужен экспресс-курс в программирование драйверов

Задание:
Драйвер-передатчик последовательного порта с циклическим опросом состояния в режиме пользователя, взаимодействие c программой через API WriteFile.

Описание:
На базе примера “portio” WDK (winddk\src\general\portio).
Драйвер:
1) Драйвер устанавливает параметры порта: скорость, режим обмена с помощью обработчика EvtDeviceAdd.
3) Драйвер получает блок данных (обработчик EvtIoWrite) и проверяет готовность регистра передатчика.
* В случае успеха байт записывается в регистр и запрос завершается с количеством записанных байт=1.
* В случае отсутствия готовности запрос завершается с количеством записанных байт=0.

Программа:
2) Программа в режиме пользователя передает байт данных драйверу при помощи API WriteFile.
4) Программа пользователя передает строку данных, передавая каждый байт строки вплоть до успешного завершения.



Подскажите пожалуйста. как описывается EvtIoWrite и EvtDeviceAdd?

программирую драйвер на WinXP

На данный момент есть проблема с пониманием

В программе:
1)Я думаю разбить массив данных пользователя на N частей и каждую часть передавать через WriteFile(), предварительно записав данные в массив с названием "байт" (допустим 8)
2)В программе-приемнике считать этот массив с помощью ReadFile()

! Как будет организовываться передача каждой части в таком случае (1)?

Собственно проблемы:
Драйвер:
1) Как описать EvtDeviceAdd так, чтобы можно было установить скорость?
2) Как описывается EvtIoWrite?
! Программа должна отправлять несколько БАЙТ данных, где это лучше делать в программе или же в драйвере. (ну т.е. передать через WriteFile весь пользовательский массив передать через writefile, а уже в драйвере делить его на части и передавать на COM-порт?

Добавлено через 27 минут
СРОЧНО. Помогите пожалуйста
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
24.01.2016, 10:48
Ответы с готовыми решениями:

Траблы с опросом
Делаю опрос на делфи 7. Делаю, по примеру. Код примера - вложение (code.zip) Я убрал(вроде) шифровку файла. но что то не...

Составить программу циклич.перестановки
Составить программу циклической перестановки элементов одномерного массива a , при которой1 i-ый элемент становится i+1-м, а последний...

Циклич. группа на примере подстановок
Добрый вечер форумчане. Кто нибудь может представить циклическую группу на примере подстановок.

2
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
24.01.2016, 15:21
Цитата Сообщение от wolf1396 Посмотреть сообщение
Мне нужен экспресс-курс в программирование драйверов
То же самое, что экспресс-курс по нейрохирургии.
Обучающий урок на youtube и т.п., через два часа сможешь оперировать, ага.


Цитата Сообщение от wolf1396 Посмотреть сообщение
Подскажите пожалуйста. как описывается EvtIoWrite и EvtDeviceAdd?
Вся информация есть в MSDN:

EvtIoWrite function
https://msdn.microsoft.com/en-... s.85).aspx

EvtDriverDeviceAdd function
https://msdn.microsoft.com/en-... s.85).aspx

Цитата Сообщение от wolf1396 Посмотреть сообщение
СРОЧНО.
Срочность и разработка драйверов с нуля - вещи несовместные.
Загляни вот сюда, может, что-нибудь полезное найдешь:
Документация и загрузки для разработчика драйверов
0
11 / 10 / 7
Регистрация: 07.05.2013
Сообщений: 248
24.01.2016, 19:33  [ТС]
Был пример на базе портио из ВинДДК

драйвер я вроде написал, надо только прогу

В презентации с теорией был слайд с
CreateFile
SetCommConfig
WriteFile
CloseHandle

но вот чет пробелемы возникли
Пример:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
/*++
 
Copyright (c) 1990-2000 Microsoft Corporation, All Rights Reserved
 
Module Name:
 
    gpdwrite.c
 
Abstract:
 
    Write a byte to an port using the genport driver.
 
Environment:
 
    User mode
 
--*/
 
#include <windows.h>
#include <stddef.h>
#include <stdio.h>
#include <stdlib.h>
#include <winioctl.h>
#include "gpioctl.h"        // This defines the IOCTL constants.
#include <dontuse.h>
 
VOID __cdecl
main(
    __in ULONG argc,
    __in_ecount(argc) PCHAR argv[]
    )
{
 
    // The following is returned by IOCTL.  It is true if the write succeeds.
    BOOL    IoctlResult;
 
    // The following parameters are used in the IOCTL call
    HANDLE              hndFile;        // Handle to device, obtain from CreateFile
    GENPORT_WRITE_INPUT InputBuffer;    // Input buffer for DeviceIoControl
    LONG                IoctlCode;
    ULONG               DataValue;
    ULONG               DataLength;
    ULONG               ReturnedLength; // Number of bytes returned in output buffer
 
 
    if (argc < 4)
    {
        printf("GpdWrite -b|-w|-d <Port#> <Value>\n\n");
        printf("        The byte (-b), word (-w), or doubleword (-d) specified\n");
        printf("        as value is written to the given port.  Ports are numbered\n");
        printf("        as 0, 1, ... relative to the base port assinged to the driver\n");
        printf("        by the PNP manager according to the driver preferences\n");
        printf("        in the INF file. All numbers are printed in hex.\n");
        exit(1);
    }
 
 
    hndFile = CreateFile(
                    "\\\\.\\GpdDev",           // Open the Device "file"
                    GENERIC_WRITE,
                    FILE_SHARE_WRITE,
                    NULL,
                    OPEN_EXISTING,
                    0,
                    NULL);
 
    if (hndFile == INVALID_HANDLE_VALUE)        // Was the device opened?
    {
        printf("Unable to open the device.\n");
        exit(1);
    }
 
    if (sscanf_s(argv[2], "%x", &InputBuffer.PortNumber) == 0) { // Get the port number
        printf("sscanf_s failed\n");
        exit(1);
    }
 
    if (sscanf_s(argv[3], "%x", &DataValue) == 0) { // Get the data to be written.
        printf("sscanf_s failed\n");
        exit(1);
    }
 
    switch (argv[1][1])
    {
        case 'b':
            IoctlCode = IOCTL_GPD_WRITE_PORT_UCHAR;
            InputBuffer.CharData = (UCHAR)DataValue;
            DataLength = offsetof(GENPORT_WRITE_INPUT, CharData) +
                         sizeof(InputBuffer.CharData);
            break;
 
        case 'w':
            IoctlCode = IOCTL_GPD_WRITE_PORT_USHORT;
            InputBuffer.ShortData = (USHORT)DataValue;
            DataLength = offsetof(GENPORT_WRITE_INPUT, ShortData) +
                         sizeof(InputBuffer.ShortData);
            break;
 
        case 'd':
            IoctlCode = IOCTL_GPD_WRITE_PORT_ULONG;
            InputBuffer.LongData = (ULONG)DataValue;
            DataLength = offsetof(GENPORT_WRITE_INPUT, LongData) +
                         sizeof(InputBuffer.LongData);
            break;
       default:
            printf("Wrong command line argument %c\n", argv[1][1]);
            exit(1);
 
    }
 
    IoctlResult = DeviceIoControl(
                        hndFile,                // Handle to device
                        IoctlCode,              // IO Control code for Write
                        &InputBuffer,           // Buffer to driver.  Holds port & data.
                        DataLength,             // Length of buffer in bytes.
                        NULL,                   // Buffer from driver.   Not used.
                        0,                      // Length of buffer in bytes.
                        &ReturnedLength,        // Bytes placed in outbuf.  Should be 0.
                        NULL                    // NULL means wait till I/O completes.
                        );
 
 
    if (IoctlResult)                            // Did the IOCTL succeed?
    {
        printf(
            "Wrote data %x to port %x\n", DataValue,
            InputBuffer.PortNumber);
    }
    else
    {
        printf(
            "Ioctl failed with code %ld\n", GetLastError() );
    }
 
 
    if (!CloseHandle(hndFile))                  // Close the Device "file".
    {
        printf("Failed to close device.\n");
    }
 
    exit(0);
}
Добавлено через 5 минут
как передать через WriteFile массив данных?
Мне известно:
C++
1
2
WriteFile("заголовок файла - адрес ком-порта", "буфер, который нужно передать", "размер буфера",
"кол-во принятых байтов", NULL);
работа с файлом прошла норм, с портом возникли траблы, тут есть какой-то DeviceIoControl, который должен заставить драйвер что-то делать, как раз тут и имеется проблема.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
24.01.2016, 19:33
Помогаю со студенческими работами здесь

Помогите новичку разобраться с опросом кнопок
Динный код не работает на железе и в протеусе. В симуляторе AVR Studyo работает отлично. Суть: В бесконечном цикле идёт слежение за...

Приложение работает с ПЛК и занимается его опросом раз в секунду (периодические зависания)
Доброго времени суток))) (Извините если не в той теме) Какое это приятное чувство когда наконец дописал довольно большой (по моим...

Передатчик
Здравствуйте. Если кто может помочь, объясните пожалуйста как построить передатчик с коллекторной системой модуляции. Это задание в...

FM передатчик
Вот схема передатчика с использованием КТ3107Б скажите пожалуйста каким транзистором можно заменить КТ3107Б Используемые детали: R1 -...

FM передатчик
Решил сделать FM передатчик на 10,7 мгц - промежуточная частота многих приемников, чтобы принимали все приемники независимо от настройки. ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru