iilisav
Участник
Offline
|
|
« : 04-11-2008 15:16 » |
|
Может кто-нибудь может подсказать, как написать на си прогу, чтобы можно было загружать и выгружать в Xp драйвер указывая путь к нему. Смотрел https://club.shelek.ru/viewart.php?id=76, но там судя по всему не хватает #include "LoadDRV.h" или я просто не смог собрать-) Заранее спасибо.
|
|
|
Записан
|
|
|
|
Ochkarik
|
|
« Ответ #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 уже хоть раз наконец! :[ ну или хотя бы STFW...
|
|
|
iilisav
Участник
Offline
|
|
« Ответ #2 : 04-11-2008 15:55 » |
|
А у меня нет папки src почему-то-( И кажется вы не правильно меня поняли-) Я хочу загрузить сам драйвер в винду указав путь к .sys файлу самого драйвера. Ну как INSTDRV.EXE.
|
|
|
Записан
|
|
|
|
Ochkarik
|
|
« Ответ #3 : 04-11-2008 16:06 » |
|
нет папки - видимо DDK поставили без примеров. рекомендую переустановить, очень способствует)
есть два метода загрузки драйвера через CreateFile и через сервисы. описано в статье Грома. так же описано в примере на который я ссылаюсь)
|
|
« Последнее редактирование: 04-11-2008 16:29 от Ochkarik »
|
Записан
|
RTFM уже хоть раз наконец! :[ ну или хотя бы STFW...
|
|
|
iilisav
Участник
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
|
|
« Ответ #5 : 04-11-2008 16:25 » |
|
iilisav, эээ... виноват действительно... совсем зарапортовался) CreateFile - это тупо хендл открыть. уже загруженного драйвера тогда через сервис...
|
|
|
Записан
|
RTFM уже хоть раз наконец! :[ ну или хотя бы STFW...
|
|
|
iilisav
Участник
Offline
|
|
« Ответ #6 : 04-11-2008 16:30 » |
|
А как через сервис?-) Заранее спасибо!
|
|
|
Записан
|
|
|
|
Ochkarik
|
|
« Ответ #7 : 04-11-2008 16:32 » |
|
блин, ну в статье же код приведен)
вот вам их DDK пример
|
|
|
Записан
|
RTFM уже хоть раз наконец! :[ ну или хотя бы STFW...
|
|
|
iilisav
Участник
Offline
|
|
« Ответ #8 : 04-11-2008 16:41 » |
|
спасибо еще раз большое!!!
|
|
|
Записан
|
|
|
|
iilisav
Участник
Offline
|
|
« Ответ #9 : 11-11-2008 15:57 » |
|
и снова я-) вот озадачился вопросом загрузки драйвера, сделал все прочитав https://club.shelek.ru/viewart.php?id=76. Все работает на УРА, создается сервис, драйвер загружается, но как выгрузить его обратно? Судя по всему в указанной статье только механизм его загрузки, если не я не прав поправьте пожалуйста! Заранее спасибо!
|
|
|
Записан
|
|
|
|
Ochkarik
|
|
« Ответ #10 : 11-11-2008 18:58 » |
|
Все это описано в MSDN... там есть ВСЕ)
|
|
|
Записан
|
RTFM уже хоть раз наконец! :[ ну или хотя бы STFW...
|
|
|
iilisav
Участник
Offline
|
|
« Ответ #11 : 11-11-2008 20:55 » |
|
Не сомневаюсь! Не плохо было бы еще весь MSDN запомнить, тогда бы получал бы наверно пару миллионов долларов в месяц-) Не могу еще вот что понять: допустим я загрузил свой драйвер, почему после перезагрузки винды я не могу вызывать функции в нем, приходиться все время его снова инсталировать?
|
|
|
Записан
|
|
|
|
Ochkarik
|
|
« Ответ #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 уже хоть раз наконец! :[ ну или хотя бы STFW...
|
|
|
iilisav
Участник
Offline
|
|
« Ответ #13 : 13-11-2008 10:25 » |
|
каюсь-)))) никак не могу заставить себя не лениться!!! Спасибо за помощь! Думал что это делается как-то еще сложнее-)
|
|
|
Записан
|
|
|
|
Ochkarik
|
|
« Ответ #14 : 13-11-2008 17:53 » |
|
все делается только так
|
|
|
Записан
|
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
Специалист
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
Специалист
Offline
|
|
« Ответ #18 : 28-01-2009 03:34 » |
|
Demon103, вообще не понимаю... Я делаю тоже самое, только в С++ и для другого имени. hDevice = CreateFile ("\\\\.\\Е:", CloseHandle( hDevice);
И все OK. Один открылся, один закрылся. А в твоем примере вообще хэндл открывается для файла с таким именем? А так, для разнообразия, вирусов нет? Очень похоже, особенно если два открытия и закрытия одного файла в одном месте добавляют 2 хэндла... Тут на кэш не спишешь... К тому же и файл должен быть не найден, тупо кто-то реагирует на вызов NtCreateFile...
|
|
|
Записан
|
while (8==8)
|
|
|
Ochkarik
|
|
« Ответ #19 : 28-01-2009 19:10 » |
|
хм. а Task Manager показывает открытые хендлы?) а вобще должен закрываться. хотя бы исходя из названия функции CloseHandle)))) уточните чем смотрите.
|
|
|
Записан
|
RTFM уже хоть раз наконец! :[ ну или хотя бы STFW...
|
|
|
sss
Специалист
Offline
|
|
« Ответ #20 : 29-01-2009 02:13 » |
|
Ochkarik, Task Manager показывает только количество открытых хендлов (Вид->Выбрать столбцы) .
|
|
|
Записан
|
while (8==8)
|
|
|
|