Форум программистов, компьютерный форум, киберфорум
Программирование драйверов
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/6: Рейтинг темы: голосов - 6, средняя оценка - 4.67
6 / 5 / 1
Регистрация: 29.12.2014
Сообщений: 177

Загрузка WDM драйвера windows

17.03.2022, 15:01. Показов 1470. Ответов 2
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день я использую DDK 7600.16385.1 и VS 2010
Я начал изучать тему программирования драйверов и нашел на просторах интернета вот такие примеры которые попытался повторить для себя. Драйвер который выводит в дебаг сообщения и программа загрузки.
не удается из программы загрузить этот драйвер. Error Create Servis а код ошибки 00154AC0 Я начал изучать поврос почему и первое что привело к другому результату это запуск от имени администратора, но ошибка осталась правда уже с другим кодом 00155fd0.
Начал изучать вопрос и оказалось WDM драйвера запускаются как то иначе. Пока на этот вопрос не знаю ответа и задаю его вам.
Из ходя из гугла я вычитал что установка идет через inf файл но увы если кликнуть по этому файлу в папке проекта драйвер не появляться в устройствах.
Что я делаю не так ?




Программа загрузки:
Кликните здесь для просмотра всего текста
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
// testing.cpp: определяет точку входа для консольного приложения.
//
#include "stdafx.h"
#include <windows.h>
#include <iostream>
#include <conio.h>
  
using namespace std;
void ErrorView();
 
int _tmain(int argc, _TCHAR* argv[])
{
    cout<<" ------------------- "<<endl;cout<<"| Loader is running |"<<endl;cout<<" ------------------- "<<endl;
        SC_HANDLE sch = OpenSCManager(NULL,NULL,SC_MANAGER_ALL_ACCESS);  
        if(sch)
        {
                SC_HANDLE schService = CreateService(sch,L"lptstepper",
L"lptstepper",SERVICE_ALL_ACCESS,
SERVICE_KERNEL_DRIVER,SERVICE_DEMAND_START,SERVICE_ERROR_NORMAL,
L"D:\\lptstepper\\lptstepper\\lptstepper\\lptstepper.sys",NULL,NULL,NULL,NULL,NULL);
                if(schService) 
                {
                        if(StartService(schService,NULL,NULL))
                        {HANDLE hHandl = CreateFile(L"\\\\.\\testdriver0",GENERIC_READ|GENERIC_WRITE,
FILE_SHARE_READ|FILE_SHARE_WRITE,
NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
                                if(hHandl != INVALID_HANDLE_VALUE)
                                {
                                        DWORD dwReturnBytes;
                                        if(!DeviceIoControl(hHandl,NULL,/*(*/NULL,NULL,/*)(*/NULL,NULL/*)*/,&dwReturnBytes,NULL))
{cout<<"Error ControlService..."<<endl;ErrorView();}
  
                                        /**/if(CloseHandle(hHandl))
{cout<<"CloseHandle - status ok"<<endl;}else{cout<<"Error CloseHandle..."<<endl;ErrorView();}/**/
                                        SERVICE_STATUS ServiceStatus;
                                        /**/if(ControlService(schService,SERVICE_CONTROL_STOP,&ServiceStatus))
{cout<<"ControlService - status ok"<<endl;}else{cout<<"Error ControlService..."<<endl;ErrorView();}/**/
                                        /**/if(DeleteService(schService))
{cout<<"DeleteService - status ok"<<endl;}else{cout<<"Error DeleteService..."<<endl;ErrorView();}/**/
                                        /**/if(CloseServiceHandle(schService))
{cout<<"CloseServiceHandle - status ok"<<endl;}else{cout<<"Error CloseServiceHandle..."<<endl;ErrorView();}/**/
                                        /**/if(CloseServiceHandle(sch))
{cout<<"CloseServiceHandle - status ok"<<endl;}else{cout<<"Error CloseServiceHandle..."<<endl;ErrorView();}/**/
  
                                }else{cout<<"Error CreateFile..."<<endl;ErrorView();}
                        }else{cout<<"Error StartService..."<<endl;ErrorView();}
                }else{cout<<"Error CreateService..."<<endl;ErrorView();}
        }else{cout<<"Error OpenSCManager..."<<endl;ErrorView();}
         
        cout<<" ------------------- "<<endl;
cout<<"| Loader is stopped |"<<endl;
cout<<" ------------------- "<<endl;
        cout<<"Press any key to continue"<<endl;
        while(!getch());
    return 0;
}
 
void ErrorView()/*Функция вывода сообщений об ошибках...*/
{
        LPVOID lpMsgBuf;FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER|
FORMAT_MESSAGE_FROM_SYSTEM|FORMAT_MESSAGE_IGNORE_INSERTS,
NULL,GetLastError(),
    MAKELANGID(LANG_NEUTRAL,SUBLANG_DEFAULT),(LPTSTR)&lpMsgBuf,0,NULL);
CharToOem((LPTSTR)lpMsgBuf,(LPSTR)lpMsgBuf);
        cout<<(LPCTSTR)lpMsgBuf<<endl;
        LocalFree(lpMsgBuf);
}


Код драйвера
Кликните здесь для просмотра всего текста
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
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
#include "stdafx.h"
 
/*
    lptstepper - Main file
    This file contains a very simple implementation of a WDM driver. Note that it does not support all
    WDM functionality, or any functionality sufficient for practical use. The only thing this driver does
    perfectly, is loading and unloading.
 
    To install the driver, go to Control Panel -> Add Hardware Wizard, then select "Add a new hardware device".
    Select "manually select from list", choose device category, press "Have Disk" and enter the path to your
    INF file.
    Note that not all device types (specified as Class in INF file) can be installed that way.
 
    To start/stop this driver, use Windows Device Manager (enable/disable device command).
 
    If you want to speed up your driver development, it is recommended to see the BazisLib library, that
    contains convenient classes for standard device types, as well as a more powerful version of the driver
    wizard. To get information about BazisLib, see its website:
        http://bazislib.sysprogs.org/
*/
 
void lptstepperUnload(IN PDRIVER_OBJECT DriverObject);
NTSTATUS lptstepperCreateClose(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp);
NTSTATUS lptstepperDefaultHandler(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp);
NTSTATUS lptstepperAddDevice(IN PDRIVER_OBJECT  DriverObject, IN PDEVICE_OBJECT  PhysicalDeviceObject);
NTSTATUS lptstepperPnP(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp);
NTSTATUS lptstepperControl(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp);
 
typedef struct _deviceExtension
{
    PDEVICE_OBJECT DeviceObject;
    PDEVICE_OBJECT TargetDeviceObject;
    PDEVICE_OBJECT PhysicalDeviceObject;
    UNICODE_STRING DeviceInterface;
} lptstepper_DEVICE_EXTENSION, *Plptstepper_DEVICE_EXTENSION;
 
// {b11cc18c-3ca7-4424-a6c9-f6f9289b1302}
static const GUID GUID_lptstepperInterface = {0xB11CC18C, 0x3ca7, 0x4424, {0xa6, 0xc9, 0xf6, 0xf9, 0x28, 0x9b, 0x13, 0x2 } };
 
#ifdef __cplusplus
extern "C" NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING  RegistryPath);
#endif
 
NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING  RegistryPath)
{
 
    NTSTATUS status;
    PDEVICE_OBJECT DeviceObject;
    UNICODE_STRING devName;
    UNICODE_STRING devLink;
 
    unsigned i;
 
    DbgPrint("Hello from lptstepper!\n");
    DbgPrint("Start for\n");
    for (i = 0; i <= IRP_MJ_MAXIMUM_FUNCTION; i++)
    {
            
        DriverObject->MajorFunction[i] = lptstepperDefaultHandler;
    
        }
    
    DbgPrint("end for\n");
    DriverObject->MajorFunction[IRP_MJ_CREATE] = lptstepperCreateClose;
    DriverObject->MajorFunction[IRP_MJ_CLOSE] = lptstepperCreateClose;
    DriverObject->MajorFunction[IRP_MJ_PNP] = lptstepperPnP;
    DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL]=lptstepperControl;
 
    DriverObject->DriverUnload = lptstepperUnload;
    DriverObject->DriverStartIo = NULL;
    DriverObject->DriverExtension->AddDevice = lptstepperAddDevice;
    RtlInitUnicodeString(&devName,L"\\Device\\lptstepper");
    status = IoCreateDevice(DriverObject,sizeof(PDEVICE_OBJECT),&devName,FILE_DEVICE_UNKNOWN,0,FALSE,&DeviceObject);
    if(!NT_SUCCESS(status)) return status;
    RtlInitUnicodeString(&devLink,L"\\??\\lptstepper");
    status =IoCreateSymbolicLink(&devLink,&devName);
    DbgPrint("function\n");
    //WRITE_PORT_USHORT((PUSHORT)888,(USHORT)1);
    return STATUS_SUCCESS;
}
 
void lptstepperUnload(IN PDRIVER_OBJECT DriverObject)
{
    DbgPrint("Goodbye from lptstepper!\n");
}
NTSTATUS lptstepperControl(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
{
    
    PIO_STACK_LOCATION IrpStack=IoGetCurrentIrpStackLocation(Irp);
    ULONG ControlCode = IrpStack->Parameters.DeviceIoControl.IoControlCode;
    DbgPrint("Control!\n", ControlCode);
    Irp->IoStatus.Status=STATUS_SUCCESS;
    Irp->IoStatus.Information=0;
    IoCompleteRequest(Irp,IO_NO_INCREMENT);
    return STATUS_SUCCESS;
}
NTSTATUS lptstepperCreateClose(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
{
        DbgPrint("lptstepperCreateClose\n");
    Irp->IoStatus.Status = STATUS_SUCCESS;
    Irp->IoStatus.Information = 0;
    IoCompleteRequest(Irp, IO_NO_INCREMENT);
    return STATUS_SUCCESS;
}
 
NTSTATUS lptstepperDefaultHandler(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
{
    DbgPrint("lptstepperDefaultHandler\n");
    Plptstepper_DEVICE_EXTENSION deviceExtension = NULL;
    
    IoSkipCurrentIrpStackLocation(Irp);
    deviceExtension = (Plptstepper_DEVICE_EXTENSION) DeviceObject->DeviceExtension;
    return IoCallDriver(deviceExtension->TargetDeviceObject, Irp);
}
 
NTSTATUS lptstepperAddDevice(IN PDRIVER_OBJECT  DriverObject, IN PDEVICE_OBJECT  PhysicalDeviceObject)
{
    DbgPrint("Adddevise\n");
    PDEVICE_OBJECT DeviceObject = NULL;
    Plptstepper_DEVICE_EXTENSION pExtension = NULL;
    NTSTATUS status;
    
    status = IoCreateDevice(DriverObject,
                            sizeof(lptstepper_DEVICE_EXTENSION),
                            NULL,
                            FILE_DEVICE_UNKNOWN,
                            0,
                            0,
                            &DeviceObject);
 
    if (!NT_SUCCESS(status))
        return status;
 
    pExtension = (Plptstepper_DEVICE_EXTENSION)DeviceObject->DeviceExtension;
 
    pExtension->DeviceObject = DeviceObject;
    pExtension->PhysicalDeviceObject = PhysicalDeviceObject;
    pExtension->TargetDeviceObject = IoAttachDeviceToDeviceStack(DeviceObject, PhysicalDeviceObject);
 
    status = IoRegisterDeviceInterface(PhysicalDeviceObject, &GUID_lptstepperInterface, NULL, &pExtension->DeviceInterface);
    ASSERT(NT_SUCCESS(status));
 
    DeviceObject->Flags &= ~DO_DEVICE_INITIALIZING;
    return STATUS_SUCCESS;
}
 
 
NTSTATUS lptstepperIrpCompletion(
                      IN PDEVICE_OBJECT DeviceObject,
                      IN PIRP Irp,
                      IN PVOID Context
                      )
{
    DbgPrint("IrpCompletion\n");
    PKEVENT Event = (PKEVENT) Context;
 
    UNREFERENCED_PARAMETER(DeviceObject);
    UNREFERENCED_PARAMETER(Irp);
 
    KeSetEvent(Event, IO_NO_INCREMENT, FALSE);
 
    return(STATUS_MORE_PROCESSING_REQUIRED);
}
 
NTSTATUS lptstepperForwardIrpSynchronous(
                              IN PDEVICE_OBJECT DeviceObject,
                              IN PIRP Irp
                              )
{
    DbgPrint("ForwardIrpSynchronous\n");
    Plptstepper_DEVICE_EXTENSION   deviceExtension;
    KEVENT event;
    NTSTATUS status;
 
    KeInitializeEvent(&event, NotificationEvent, FALSE);
    deviceExtension = (Plptstepper_DEVICE_EXTENSION) DeviceObject->DeviceExtension;
 
    IoCopyCurrentIrpStackLocationToNext(Irp);
 
    IoSetCompletionRoutine(Irp, lptstepperIrpCompletion, &event, TRUE, TRUE, TRUE);
 
    status = IoCallDriver(deviceExtension->TargetDeviceObject, Irp);
 
    if (status == STATUS_PENDING) {
        KeWaitForSingleObject(&event, Executive, KernelMode, FALSE, NULL);
        status = Irp->IoStatus.Status;
    }
    return status;
}
 
NTSTATUS lptstepperPnP(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
{
        DbgPrint("lptstepperPnP\n");
    PIO_STACK_LOCATION irpSp = IoGetCurrentIrpStackLocation(Irp);
    Plptstepper_DEVICE_EXTENSION pExt = ((Plptstepper_DEVICE_EXTENSION)DeviceObject->DeviceExtension);
    NTSTATUS status;
 
    ASSERT(pExt);
 
    switch (irpSp->MinorFunction)
    {
    case IRP_MN_START_DEVICE:
        IoSetDeviceInterfaceState(&pExt->DeviceInterface, TRUE);
        Irp->IoStatus.Status = STATUS_SUCCESS;
        IoCompleteRequest(Irp, IO_NO_INCREMENT);
        return STATUS_SUCCESS;
 
    case IRP_MN_QUERY_REMOVE_DEVICE:
        Irp->IoStatus.Status = STATUS_SUCCESS;
        IoCompleteRequest(Irp, IO_NO_INCREMENT);
        return STATUS_SUCCESS;
 
    case IRP_MN_REMOVE_DEVICE:
        IoSetDeviceInterfaceState(&pExt->DeviceInterface, FALSE);
        status = lptstepperForwardIrpSynchronous(DeviceObject, Irp);
        IoDetachDevice(pExt->TargetDeviceObject);
        IoDeleteDevice(pExt->DeviceObject);
        RtlFreeUnicodeString(&pExt->DeviceInterface);
        Irp->IoStatus.Status = STATUS_SUCCESS;
        IoCompleteRequest(Irp, IO_NO_INCREMENT);
        return STATUS_SUCCESS;
 
    case IRP_MN_QUERY_PNP_DEVICE_STATE:
        status = lptstepperForwardIrpSynchronous(DeviceObject, Irp);
        Irp->IoStatus.Information = 0;
        IoCompleteRequest(Irp, IO_NO_INCREMENT);
        return status;
    }
    return lptstepperDefaultHandler(DeviceObject, Irp);
}
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
17.03.2022, 15:01
Ответы с готовыми решениями:

Структура WDM драйвера и как работает ПК
Хочется представить хотя бы упрощенно общий принцип взаимодействия устройства с ПК. Мои рассуждения. Вот запускаем мы ПК. Счетчик команд...

Загрузка драйвера в windows 7 x64
WDK 7600.16385.1 test.c #include &lt;ntddk.h&gt; NTSTATUS DriverEntry(PDRIVER_OBJECT DriverObject, PUNICODE_STRING RegistryPath) ...

Загрузка драйвера
Добрый день !!! Надоело мне пользоваться KmdManager и захотелось сделать (возможно у кого то есть) программу для загрузки своего драйвера ,...

2
Эксперт Hardware
Эксперт Hardware
 Аватар для R71MT
6211 / 2445 / 403
Регистрация: 29.07.2014
Сообщений: 3,175
Записей в блоге: 4
18.03.2022, 13:21
Цитата Сообщение от Leitto Посмотреть сообщение
Что я делаю не так ?
На какой системе тестируете?
Если Win7+ х64, то там уже стоит "Device Guard" (защита устройств), и без танцев_с_бубном запустить драйвера не получиться - нужно их подписывать у MS. Читайте здесь в разделе драйверов первую-же закреплённую тему от Убежденный.

Если-же система х32, то возможно в функции CreateService() зарылась ошибка. Чтобы определить виновника, имеет смысл попробовать запустить дров штатной утилитой Win под названием SC (Service Control). Просто передайте ей в аргументе путь до своего драйвера, и она вернёт ошибки, или верные результаты. Вот пример получения времени в файл через сервис (сохранить как *.bat):

Bash
1
2
3
sc create CMDTestService binPath= "cmd /c date /T > D:\current_date.txt"
sc start  CMDTestService
sc delete CMDTestService
0
6 / 5 / 1
Регистрация: 29.12.2014
Сообщений: 177
20.03.2022, 19:07  [ТС]
R71MT,
Win xp 64 и win 10 64 win xp 32 на трех системах, а если отключить проверку цифровых подписей ?
В моем случае просто ссылку на драйвер и старт ?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
20.03.2022, 19:07
Помогаю со студенческими работами здесь

Не устанавливаются драйвера на WDM на видеокарту GeForce 8500 GT
Возникла проблема с видео ,хотел перегнать видео с камеры через Fire Wire подсоеденил камеру (тишина комп ее не видит)смотрю устройства...

Кто то писал WDM драйвера? Может дадите образец?
Я описание нашел http://src.fitkursk.ru/detail_book.asp?id=83, но оно ссылается на диск со всеми необходимыми примерами, и т.п. может,...

Драйвера для устройства Vinyl AC97 Codec Driver (WDM)
Народ помогите=( Установил 7. Всё хорошо, а звука нету=((( Нужны драйвера для устройства Vinyl AC97 Codec Driver (WDM) =(((( а они...

В режиме ядра из WDM драйвера не получается вызвать устаревшую функцию HAL
Мне нужно из WDM драйвера вызвать функцию HalGetInterrupt. Объявляю её как внешнюю extern 'C' ULONG HalGetInterruptVector(...); и...

Долгая загрузка Windows 10 (драйвера?)
Друзья, всем привет. Недавно появилась проблема долгой загрузки Windows 10. Загружается за 1:56 сек. Раньше загружалось быстро. Без...


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru