С Новым годом! Форум программистов, компьютерный форум, киберфорум
Программирование драйверов
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.87/15: Рейтинг темы: голосов - 15, средняя оценка - 4.87
1 / 1 / 0
Регистрация: 04.09.2011
Сообщений: 40
1

Драйвер не загружается

14.05.2013, 10:55. Показов 2973. Ответов 19
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте, я пишу программу, которая загружает драйвер в память и запускает его. Сама программа написана на C#, драйвер на C++, использую Visual Studio 2012.

Но драйвер не хочет запускаться, он загружается, создаётся сервис, но вот при запуске выдаёт ошибку 129 (ERROR_CHILD_NOT_COMPLETE — The %1 application cannot be run in Win32 mode), тестировал на примере драйвер фильтора файловой системы и примере шпиона с MSDN (http://code.msdn.microsoft.com... m-97844844). Не могу понять из-за чего.

Вот код программы
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
private void LoadDriverButton_Click(object sender, EventArgs e)
        {
            if (!doDriverLoad)
            {
                if (File.Exists(driverPath))
                {
                    try
                    {
                        DriverLoader.InstallAndStart(driverName, driverName, driverPath);
                    }
                    catch (Exception ex)
                    {
                        MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
                        // выполняется эта ветка
                    }
                }
                else
                {
                    MessageBox.Show("Driver file not found", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
                }
            }
            else
            {
                MessageBox.Show("Logging already started","Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }
Код загрузчика
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
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
    public static class DriverLoader
    {
        private const int STANDARD_RIGHTS_REQUIRED = 0xF0000;
        private const int SERVICE_WIN32_OWN_PROCESS = 0x00000010;
 
        [StructLayout(LayoutKind.Sequential)]
        private class SERVICE_STATUS
        {
            public int dwServiceType = 0;
            public ServiceState dwCurrentState = 0;
            public int dwControlsAccepted = 0;
            public int dwWin32ExitCode = 0;
            public int dwServiceSpecificExitCode = 0;
            public int dwCheckPoint = 0;
            public int dwWaitHint = 0;
        }
 
        [DllImport("advapi32.dll", EntryPoint = "OpenSCManagerW", ExactSpelling = true, CharSet = CharSet.Unicode,             SetLastError = true)]
        static extern IntPtr OpenSCManager(string machineName, string databaseName, ScmAccessRights dwDesiredAccess);
        
        [DllImport("advapi32.dll", SetLastError = true, CharSet = CharSet.Auto)]
        static extern IntPtr OpenService(IntPtr hSCManager, string lpServiceName, ServiceAccessRights dwDesiredAccess);
        
        [DllImport("advapi32.dll", SetLastError = true, CharSet = CharSet.Auto)]
        private static extern IntPtr CreateService(IntPtr hSCManager, string lpServiceName, string lpDisplayName, ServiceAccessRights dwDesiredAccess, int dwServiceType, ServiceBootFlag dwStartType, ServiceError dwErrorControl, string lpBinaryPathName, string lpLoadOrderGroup, IntPtr lpdwTagId, string lpDependencies, string lp, string lpPassword);
        
        [DllImport("advapi32.dll", SetLastError = true)]
        [return: MarshalAs(UnmanagedType.Bool)]
        static extern bool CloseServiceHandle(IntPtr hSCObject);
        
        [DllImport("advapi32.dll")]
        private static extern int QueryServiceStatus(IntPtr hService, SERVICE_STATUS lpServiceStatus);
        
        [DllImport("advapi32.dll", SetLastError = true)]
        [return: MarshalAs(UnmanagedType.Bool)]
        private static extern bool DeleteService(IntPtr hService);
        
        [DllImport("advapi32.dll")]
        private static extern int ControlService(IntPtr hService, ServiceControl dwControl, SERVICE_STATUS lpServiceStatus);
        
        [DllImport("advapi32.dll", SetLastError = true)]
        private static extern int StartService(IntPtr hService, int dwNumServiceArgs, int lpServiceArgVectors);
 
        public static void InstallAndStart(string serviceName, string displayName, string fileName)
        {
            IntPtr scm = OpenSCManager(ScmAccessRights.AllAccess);
            try
            {
                IntPtr service = OpenService(scm, serviceName, ServiceAccessRights.AllAccess);
                if (service == IntPtr.Zero)
                {
                    service = CreateService(scm, serviceName, displayName, ServiceAccessRights.AllAccess,
                        SERVICE_WIN32_OWN_PROCESS, ServiceBootFlag.AutoStart, ServiceError.Normal, fileName,
                        null, IntPtr.Zero, null, null, null);
                }
                if (service == IntPtr.Zero)
                    throw new ApplicationException("Failed to install service.");
                try
                {
                    StartService(service);
                }
                finally
                {
                    CloseServiceHandle(service);
                }
            }
            finally
            {
                CloseServiceHandle(scm);
            }
        }
 
        public static bool ServiceIsInstalled(string serviceName)
        {
            IntPtr scm = OpenSCManager(ScmAccessRights.Connect);
            try
            {
                IntPtr service = OpenService(scm, serviceName, ServiceAccessRights.QueryStatus);
                if (service == IntPtr.Zero)
                    return false;
                CloseServiceHandle(service);
                return true;
            }
            finally
            {
                CloseServiceHandle(scm);
            }
        }
 
        public static void StartService(string serviceName)
        {
            IntPtr scm = OpenSCManager(ScmAccessRights.Connect);
            try
            {
                IntPtr service = OpenService(scm, serviceName, ServiceAccessRights.QueryStatus | ServiceAccessRights.Start);
                if (service == IntPtr.Zero)
                    throw new ApplicationException("Could not open service.");
                try
                {
                    StartService(service);
                }
                finally
                {
                    CloseServiceHandle(service);
                }
            }
            finally
            {
                CloseServiceHandle(scm);
            }
        }
 
        public static void StopService(string serviceName)
        {
            IntPtr scm = OpenSCManager(ScmAccessRights.Connect);
            try
            {
                IntPtr service = OpenService(scm, serviceName, ServiceAccessRights.QueryStatus | ServiceAccessRights.Stop);
                if (service == IntPtr.Zero)
                    throw new ApplicationException("Could not open service.");
                try
                {
                    StopService(service);
                }
                finally
                {
                    CloseServiceHandle(service);
                }
            }
            finally
            {
                CloseServiceHandle(scm);
            }
        }
 
        private static void StartService(IntPtr service)
        {
            SERVICE_STATUS status = new SERVICE_STATUS();
            StartService(service, 0, 0);
            var changedStatus = WaitForServiceStatus(service, ServiceState.StartPending, ServiceState.Running);
            if (!changedStatus)
                throw new ApplicationException("Unable to start service. Error code = " + Marshal.GetLastWin32Error());
        }
 
        private static void StopService(IntPtr service)
        {
            SERVICE_STATUS status = new SERVICE_STATUS();
            ControlService(service, ServiceControl.Stop, status);
            var changedStatus = WaitForServiceStatus(service, ServiceState.StopPending, ServiceState.Stopped);
            if (!changedStatus)
                throw new ApplicationException("Unable to stop service");
        }
 
        public static ServiceState GetServiceStatus(string serviceName)
        {
            IntPtr scm = OpenSCManager(ScmAccessRights.Connect);
            try
            {
                IntPtr service = OpenService(scm, serviceName, ServiceAccessRights.QueryStatus);
                if (service == IntPtr.Zero)
                    return ServiceState.NotFound;
                try
                {
                    return GetServiceStatus(service);
                }
                finally
                {
                    CloseServiceHandle(service);
                }
            }
            finally
            {
                CloseServiceHandle(scm);
            }
        }
 
        private static ServiceState GetServiceStatus(IntPtr service)
        {
            SERVICE_STATUS status = new SERVICE_STATUS();
            if (QueryServiceStatus(service, status) == 0)
                throw new ApplicationException("Failed to query service status.");
            return status.dwCurrentState;
        }
 
        private static bool WaitForServiceStatus(IntPtr service, ServiceState waitStatus, ServiceState desiredStatus)
        {
            SERVICE_STATUS status = new SERVICE_STATUS();
            QueryServiceStatus(service, status);
            if (status.dwCurrentState == desiredStatus) return true;
            int dwStartTickCount = Environment.TickCount;
            int dwOldCheckPoint = status.dwCheckPoint;
            while (status.dwCurrentState == waitStatus)
            {   int dwWaitTime = status.dwWaitHint / 10;
                if (dwWaitTime < 1000) dwWaitTime = 1000;
                else if (dwWaitTime > 10000) dwWaitTime = 10000;
                Thread.Sleep(dwWaitTime);
                if (QueryServiceStatus(service, status) == 0) break;
                if (status.dwCheckPoint > dwOldCheckPoint)
                {
                    dwStartTickCount = Environment.TickCount;
                    dwOldCheckPoint = status.dwCheckPoint;
                }
                else
                {
                    if (Environment.TickCount - dwStartTickCount > status.dwWaitHint)
                    {
                        break;
                    }
                }
            }
            return (status.dwCurrentState == desiredStatus);
        }
        
        public static void Uninstall(string serviceName)
        {
            IntPtr scm = OpenSCManager(ScmAccessRights.AllAccess);
            try
            {
                IntPtr service = OpenService(scm, serviceName, ServiceAccessRights.AllAccess);
                if (service == IntPtr.Zero)
                    throw new ApplicationException("Service not installed.");
                try
                {
                    StopService(service);
                    if (!DeleteService(service))
                        throw new ApplicationException("Could not delete service " + Marshal.GetLastWin32Error());
                }
                finally
                {
                    CloseServiceHandle(service);
                }
            }
            finally
            {
                CloseServiceHandle(scm);
            }
        }
 
        private static IntPtr OpenSCManager(ScmAccessRights rights)
        {
            IntPtr scm = OpenSCManager(null, null, rights);
            if (scm == IntPtr.Zero)
                throw new ApplicationException("Could not connect to service control manager.");
            return scm;
        }
    }
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
14.05.2013, 10:55
Ответы с готовыми решениями:

Не загружается драйвер
Собственно проблема в том не загружается драйвер по DebugView ошибка &quot; should close osc &quot; У...

Зачем нужен драйвер и как написать простейший драйвер
Хотя в интернете и есть на русском языке некоторые обяснения что такое драйвер для его...

p4s800-mx se. Загружается, почти сразу выключается и загружается нормально.
доброе утро!подскажите если несложно суть проблемы в следующем: привкл компа снача происходит...

Скачал драйвер для ATI и при загрузке пишет не найден драйвер
Скачал драйвер для ATI и при загрузке пишет ненайден драйвер поиска,что делать7

19
Ушел с форума
Эксперт С++
16478 / 7441 / 1187
Регистрация: 02.05.2013
Сообщений: 11,617
Записей в блоге: 1
14.05.2013, 11:22 2
C#
1
2
3
service = CreateService(scm, serviceName, displayName, ServiceAccessRights.AllAccess,
    SERVICE_WIN32_OWN_PROCESS, ServiceBootFlag.AutoStart, ServiceError.Normal, fileName,
    null, IntPtr.Zero, null, null, null);
Для начала замените SERVICE_WIN32_OWN_PROCESS на SERVICE_KERNEL_DRIVER или
SERVICE_FILE_SYSTEM_DRIVER.
1
1 / 1 / 0
Регистрация: 04.09.2011
Сообщений: 40
14.05.2013, 18:11  [ТС] 3
Попробовал. Никакой разницы.
0
Ушел с форума
Эксперт С++
16478 / 7441 / 1187
Регистрация: 02.05.2013
Сообщений: 11,617
Записей в блоге: 1
14.05.2013, 18:50 4
Какой код ошибки на этот раз ? Тот же самый ?
Файл драйвера скопирован с drivers\system32 ?
Система, случайно, не 64-битная ?
Что, если попробовать установить драйвер через sc.exe - он тоже не будет запускаться ?
0
1 / 1 / 0
Регистрация: 04.09.2011
Сообщений: 40
14.05.2013, 19:41  [ТС] 5
Попробовал с другими драйверами, а также с sc, результат один и тот же - 129. Но при запуске с помощью sc или моей программой другой службы всё работает. То есть дело в драйвере, но что именно нужно сделать, чтобы он запускался?
0
Ушел с форума
Эксперт С++
16478 / 7441 / 1187
Регистрация: 02.05.2013
Сообщений: 11,617
Записей в блоге: 1
14.05.2013, 21:39 6
Попробуйте двигаться маленькими шажками.
Сначала соберите и попробуйте запустить с помощью sc.exe простейший драйвер,
состоящий из одной пустой функции DriverEntry, которая возвращает статус успех.
Если получится - можно использовать код примера. Потом, если все в порядке,
написать свой инсталлятор.
0
1 / 1 / 0
Регистрация: 04.09.2011
Сообщений: 40
14.05.2013, 22:05  [ТС] 7
Такая мысль уже посещала, но я ни разу не писал драйверы, надеялся схалтурить, а нет, придётся писать с нуля.
0
Ушел с форума
Эксперт С++
16478 / 7441 / 1187
Регистрация: 02.05.2013
Сообщений: 11,617
Записей в блоге: 1
14.05.2013, 23:02 8
Хотите научиться писать драйверы ?
Ставьте Windows Driver Kit 7600.1, изучайте документацию и примеры.
Вот здесь я публиковал ссылки на некоторую литературу по драйверам и
системному программированию.

А все эти Visual Studio 2012, визарды и т.п. только развращают.
0
1 / 1 / 0
Регистрация: 04.09.2011
Сообщений: 40
17.05.2013, 22:00  [ТС] 9
Всё равно не работает, хоть убейся. Пробовал написать свой драйвер таже ошибка. Гуглил нашёл, что причиной ошибки может быть, то, что конфигурационные файлы не расшифровались, отключил подпись всё равно.
0
Ушел с форума
Эксперт С++
16478 / 7441 / 1187
Регистрация: 02.05.2013
Сообщений: 11,617
Записей в блоге: 1
17.05.2013, 23:51 10
Очень трудно делать первые шаги в таком деле, как программирование драйверов.
Особенно если сразу пытаться объять необъятное. Малейшая проблема - и все,
стоп, не знаем где искать причину и с какой стороны подступиться.

А решение простое - вернуться к основам. Попробуйте для начала написать
простейший драйвер из одной функции, которая ничего не делает, а просто
возвращает код успеха. Потом скомпилировать этот драйвер, установить его с
помощью sc.exe и запустить. Вот с таких вещей нужно начинать.

Кстати, а где код Вашего драйвера ?
Ну или сам файл выложите, интересно же, почему и вправду он не запускается...
0
1 / 1 / 0
Регистрация: 04.09.2011
Сообщений: 40
24.05.2013, 20:35  [ТС] 11
Извиняюсь, что так долго не выходил на связь, лабы замучали. Код драйвера не выкладываю, потому что перепробовал уже десяток точно вариантов, а ему всё равно, правда ошибка поменялась на 2, то есть файл не найден, при этом служба не находится только во время попытки запуска, при удалении она, как по волшебству появляется. Может быть вы поделитесь каким-небудь простеньким проектом, а то у самого ничего не получается.
0
Ушел с форума
Эксперт С++
16478 / 7441 / 1187
Регистрация: 02.05.2013
Сообщений: 11,617
Записей в блоге: 1
24.05.2013, 21:30 12
Какая операционная система ? 32 или 64 бита ?
0
1 / 1 / 0
Регистрация: 04.09.2011
Сообщений: 40
24.05.2013, 22:36  [ТС] 13
32 бита
0
Ушел с форума
Эксперт С++
16478 / 7441 / 1187
Регистрация: 02.05.2013
Сообщений: 11,617
Записей в блоге: 1
24.05.2013, 22:40 14
А сам файл драйвера можете показать ?
0
1 / 1 / 0
Регистрация: 04.09.2011
Сообщений: 40
25.05.2013, 00:10  [ТС] 15
Если брать самый простенький

Заголовочный файл KernelDriver.h
C
1
2
3
4
5
#include <fltKernel.h>
#include <dontuse.h>
#include <suppress.h>
 
DRIVER_INITIALIZE DriverEntry;
Файл реализации
C
1
2
3
4
5
6
7
8
9
10
11
#include <KernelDriver.h>
 
NTSTATUS DriverEntry( IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING RegistryPath )
{
    NTSTATUS status = STATUS_SUCCESS;
    
    UNREFERENCED_PARAMETER(DriverObject);
    UNREFERENCED_PARAMETER(RegistryPath);
    DbgPrint("MiniFilter: Filter was started and configured.");
    return status;
}
0
Ушел с форума
Эксперт С++
16478 / 7441 / 1187
Регистрация: 02.05.2013
Сообщений: 11,617
Записей в блоге: 1
25.05.2013, 09:51 16
Цитата Сообщение от VaeVictis Посмотреть сообщение
ошибка поменялась на 2, то есть файл не найден, при этом служба не находится только во время попытки запуска, при удалении она, как по волшебству появляется.
Похоже, что драйвер отсутствует в папке запуска.
0
1 / 1 / 0
Регистрация: 04.09.2011
Сообщений: 40
25.05.2013, 13:42  [ТС] 17
Если драйвер отсутствовал, как произошло создание службы? А она создаётся, она отображается в диспетчере задач, к ней применимы вызовы sc query и sc delete, а вот на старт ругается.
0
Ушел с форума
Эксперт С++
16478 / 7441 / 1187
Регистрация: 02.05.2013
Сообщений: 11,617
Записей в блоге: 1
25.05.2013, 15:14 18
Цитата Сообщение от VaeVictis Посмотреть сообщение
Если драйвер отсутствовал, как произошло создание службы?
Так и произошло. CreateService не обязана проверять физическое присутствие файла.
Вы проверили, что файл драйвера действительно существует в том месте, откуда он
зарегистрирован на запуск ? "Файл не найден" - это ведь очень недвусмысленное сообщение.
0
1 / 1 / 0
Регистрация: 04.09.2011
Сообщений: 40
26.05.2013, 15:11  [ТС] 19
Запускал я прямо из папки с драйвером и просто прописал его имя (файл там был), поидее должно было найти.
0
Ушел с форума
Эксперт С++
16478 / 7441 / 1187
Регистрация: 02.05.2013
Сообщений: 11,617
Записей в блоге: 1
26.05.2013, 15:17 20
Попробуйте сделать вот что.

1) Скопировать файл драйвера (sys) в папку, откуда он будет запускаться.
Например, C:\MyDriver\mydriver.sys. Вообще, стандартная локация для
драйверов - это C:\Windows\system32\drivers.

2) Зарегистрировать драйвер в системе с помощью встроенной утилиты sc.
Например:
C
1
sc.exe create mydriver binPath= C:\MyDriver\mydriver.sys type= kernel start= demand error= normal
Обратите внимание здесь на пробелы между знаком "=" и значением параметра.
Это особенность sc.exe.

3) Запустить драйвер с помощью команды net start.
Например, "net start mydriver".
0
26.05.2013, 15:17
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
26.05.2013, 15:17
Помогаю со студенческими работами здесь

Не загружается система после экрана "Добро пожаловать", а иногда и загружается
Вообщем...Целая история.Еще более 3 недель назад началась такая проблема так же внезапно,как и...

Драйвер монитора, действительно ли драйвер?
Давно оспариваю такой вопрос - диск прилагаемый к монитору, в котором есть профиль цветовой, и...

Загружается либо один файл, либо не загружается вообще ничего
Ребят, вот такая штука, не могу разобраться почему не работает, файлы выберает, пишет &quot;выбрано...

Не загружается ОС
Помогите братцы! Не понимаю чего случилось на ноуте. Выключил, отключил от питания. Протер...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru