Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Загрузка и выгрузка драйвера.  (Прочитано 21062 раз)
0 Пользователей и 6 Гостей смотрят эту тему.
iilisav
Участник

ru
Offline Offline

« : 04-11-2008 15:16 » 

Может кто-нибудь может подсказать, как написать на си прогу, чтобы можно было загружать и выгружать в Xp драйвер указывая путь к нему. Смотрел https://club.shelek.ru/viewart.php?id=76, но там судя по всему не хватает #include "LoadDRV.h" или я просто не смог собрать-)
Заранее спасибо.
Записан
Ochkarik
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #1 : 04-11-2008 15:25 » 

...
потерто (ошибся я)))
...


PS посмотрите и попробуйте собрать С:\DDK\DDK3790.1830\src\general\ioctl\
ЗЗЫ
Цитата
но там судя по всему не хватает #include "LoadDRV.h"
Цитата
...
И содержимое h-файла этого приложения:
Код:
#define FIRST_IOCTL_INDEX  0x800
#define FILE_DEVICE_myDrv  0x00008000                                       
#define TEST_SMTH   CTL_CODE(FILE_DEVICE_myDrv, 0x800 + 101, METHOD_BUFFERED,FILE_ANY_ACCESS)

Цитата
или я просто не смог собрать-)
Да-да
« Последнее редактирование: 04-11-2008 16:30 от Ochkarik » Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
iilisav
Участник

ru
Offline Offline

« Ответ #2 : 04-11-2008 15:55 » 

А у меня нет папки src почему-то-( И кажется вы не правильно меня поняли-) Я хочу загрузить сам драйвер в винду указав путь к .sys файлу самого драйвера. Ну как INSTDRV.EXE.
Записан
Ochkarik
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #3 : 04-11-2008 16:06 » 

нет папки - видимо DDK поставили без примеров. рекомендую переустановить, очень способствует)

есть два метода загрузки драйвера через CreateFile и через сервисы.
описано в статье Грома.
так же описано в примере на который я ссылаюсь)
« Последнее редактирование: 04-11-2008 16:29 от Ochkarik » Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
iilisav
Участник

ru
Offline Offline

« Ответ #4 : 04-11-2008 16:16 » 

А через CreateFile, это
Код:
 HANDLE hDevice;
  hDevice = CreateFile ("//./myDrv",
GENERIC_READ | GENERIC_WRITE,
0,//FILE_SHARE_READ,
NULL,
OPEN_EXISTING,
0,
NULL);
  sleep(10000);
  CloseHandle(hDevice);
так? Но не совсем понимаю как так можно загрузить, ведь я указываю ссылку на устройство(//./myDrv), которое у меня в дравйвере который я еще не загрузил??? Наверно я что-то не так понял-)
Записан
Ochkarik
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #5 : 04-11-2008 16:25 » 

iilisav,
эээ... виноват Краснею действительно... совсем зарапортовался)
 CreateFile - это тупо хендл открыть. уже загруженного драйвера
тогда через сервис...
Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
iilisav
Участник

ru
Offline Offline

« Ответ #6 : 04-11-2008 16:30 » new

А как через сервис?-) Заранее спасибо!
Записан
Ochkarik
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #7 : 04-11-2008 16:32 » 

блин, ну в статье же код приведен)

вот вам их DDK пример

* ddk_src_ioctl.rar (12.94 Кб - загружено 981 раз.)
Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
iilisav
Участник

ru
Offline Offline

« Ответ #8 : 04-11-2008 16:41 » 

спасибо еще раз большое!!!
Записан
iilisav
Участник

ru
Offline Offline

« Ответ #9 : 11-11-2008 15:57 » 

и снова я-) вот озадачился вопросом загрузки драйвера, сделал все прочитав https://club.shelek.ru/viewart.php?id=76. Все работает на УРА, создается сервис, драйвер загружается, но как выгрузить его обратно? Судя по всему в указанной статье только механизм его загрузки, если не я не прав поправьте пожалуйста! Заранее спасибо!
Записан
Ochkarik
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #10 : 11-11-2008 18:58 » 

Все  это описано в MSDN... там есть ВСЕ)
Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
iilisav
Участник

ru
Offline Offline

« Ответ #11 : 11-11-2008 20:55 » 

Не сомневаюсь! Не плохо было бы еще весь MSDN запомнить, тогда бы получал бы наверно пару миллионов долларов в месяц-) Не могу еще вот что понять: допустим я загрузил свой драйвер, почему после перезагрузки винды я не могу вызывать функции в нем, приходиться все время его снова инсталировать?
Записан
Ochkarik
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #12 : 12-11-2008 06:25 » 

MSDN (равно как и DDK) не надо наизусть учить.
надо учится искать в них то что вас интересует)))
открываем упомянутый пример и смотрим функции используемые для запуска драйвера как сервиса:
Код:
	if(OpenManager()) 
{
if(drvCreateService(name))
{
if(drvStartService(name))
смотрим первую функцию - OpenSCManager() - более менее понятно.
вторая drvCreateService()  -вызывает CreateService(), ищем ее в MSDN:
Код:
SC_HANDLE CreateService(
  SC_HANDLE hSCManager,
  LPCTSTR lpServiceName,
  LPCTSTR lpDisplayName,
  DWORD dwDesiredAccess,
  DWORD dwServiceType,
  DWORD dwStartType,
  DWORD dwErrorControl,
  LPCTSTR lpBinaryPathName,
  LPCTSTR lpLoadOrderGroup,
  LPDWORD lpdwTagId,
  LPCTSTR lpDependencies,
  LPCTSTR lpServiceStartName,
  LPCTSTR lpPassword
);
читаем описание... и что мы видим?
вызов у нас такой:
Код:
CreateService(hSCManager,pDrvName,pDrvName,SERVICE_ALL_ACCESS,    SERVICE_KERNEL_DRIVER,SERVICE_DEMAND_START,SERVICE_ERROR_NORMAL,awPath,NULL,NULL,NULL,NULL,NULL);
поле dwStartType - Service start options. This parameter can be one of the following values. Value Meaning:
SERVICE_AUTO_START       A service started automatically by the service control manager during system startup.
SERVICE_BOOT_START       A device driver started by the system loader. This value is valid only for driver services.
SERVICE_DEMAND_START A service started by the service control manager when a process calls the StartService function.
SERVICE_DISABLED             A service that cannot be started. Attempts to start the service result in the error code RROR_SERVICE_DISABLED. 
SERVICE_SYSTEM_START  A device driver started by the IoInitSystem function. This value is valid only for driver services.
и так далее в том же ключе... в чем проблемма то?  Что, съел?
а если вы даже этого не сделали - то пардон, вы просто ленивы А черт его знает...
« Последнее редактирование: 12-11-2008 06:31 от Ochkarik » Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
iilisav
Участник

ru
Offline Offline

« Ответ #13 : 13-11-2008 10:25 » 

каюсь-)))) никак не могу заставить себя не лениться!!! Спасибо за помощь! Думал что это делается как-то еще сложнее-)
Записан
Ochkarik
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #14 : 13-11-2008 17:53 » 

все делается только так Класс!
Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
Demon103
Гость
« Ответ #15 : 26-01-2009 13:30 » 

всем привет!

прочитал у вас такой код:

HANDLE hDevice;
  hDevice = CreateFile ("//./myDrv",
         GENERIC_READ | GENERIC_WRITE,
         0,//FILE_SHARE_READ,
         NULL,
         OPEN_EXISTING,
         0,
         NULL);
  sleep(10000);
  CloseHandle(hDevice);

и у меня к вам такой вопрос.. если обращаться к приводу, т.е "//./Е:" , и если посмотреть в Task Manager, то создаётся два хэндла.

при вызове CloseHandle(hDevice);  hDevice успешно освобождается, но второй хэндл так и висит...((

если обращаться к приводу много раз, это "клонирование" не есть гуд!.. помогите решить этот вопрос, заранее благодарен.
Записан
sss
Специалист

ru
Offline Offline

« Ответ #16 : 27-01-2009 05:30 » 

Demon103, а при вызове

Код:
HANDLE hDevice;
  hDevice = CreateFile ("//./myDrv",

  CloseHandle(hDevice);

  hDevice = CreateFile ("//./myDrv",

  CloseHandle(hDevice);


Сколько хэндлов останется незакрытыми?

А если так
Код:
 /*
  HANDLE hDevice;
  hDevice = CreateFile ("//./myDrv",

  CloseHandle(hDevice);
*/


Просто попасть в эту ветку программы не выполняя код?

А что делает myDrv в обработчике IRP_MJ_CREATE ?
« Последнее редактирование: 27-01-2009 05:33 от sss » Записан

while (8==8)
Demon103
Гость
« Ответ #17 : 27-01-2009 07:58 » 

SSS, внимательней пжлста!!!

Во-первых, я обращаюсь к приводу "//./Е:"
Во-вторых, если делать так

HANDLE hDevice;
 hDevice = CreateFile ("//./Е:",

CloseHandle(hDevice);

hDevice = CreateFile ("//./Е:",

 CloseHandle(hDevice);

то будет два незакрытых хэндла....

как мне найти неизвестные хэндлы и закрыть их???
Записан
sss
Специалист

ru
Offline Offline

« Ответ #18 : 28-01-2009 03:34 » 

Demon103, вообще не понимаю...

Я делаю тоже самое, только в С++ и для другого имени.

Код:
  hDevice = CreateFile ("\\\\.\\Е:",
  CloseHandle( hDevice);

И все OK. Один открылся, один закрылся.  А в твоем примере вообще хэндл открывается для файла с таким именем?

А так, для разнообразия, вирусов нет? Очень похоже, особенно если два открытия и закрытия одного файла в одном месте добавляют 2 хэндла... Тут на кэш не спишешь... К тому же и файл должен быть не найден, тупо кто-то реагирует на вызов NtCreateFile...

Записан

while (8==8)
Ochkarik
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #19 : 28-01-2009 19:10 » 

хм. а Task Manager показывает открытые хендлы?)
 а вобще должен закрываться. хотя бы исходя из названия функции CloseHandle))))
уточните чем смотрите.
Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
sss
Специалист

ru
Offline Offline

« Ответ #20 : 29-01-2009 02:13 » 

Ochkarik, Task Manager показывает только количество открытых хендлов (Вид->Выбрать столбцы) .
Записан

while (8==8)
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines