zloi7777
Постоялец
Offline
|
|
« : 10-11-2008 16:21 » |
|
С выходом Vistы, всеми фибрами души, пытался оттянуть переход с ХР на нее, но не прошло и двух лет, а заставляют ... Взял я свой драйвер, для работы с 1394, написанный под DDK2003 и DriverStudio, инстальнул под vistой, и он сходу заработал... Отсюда вопрос, в чем отличие между Vista и XP, в плане создания драйвера?....
|
|
|
Записан
|
|
|
|
Ochkarik
|
|
« Ответ #1 : 10-11-2008 16:29 » |
|
)))))))))))))))))))))))))) забавно) тоже взял СВОЙ драйвер для работы с 1394 написанный там же и поставил) не помню с какой сборкой DDK. ...а заработал он после того как я вспомнил что права доступа аппликухе администраторские надо дать)) но это я минут за пять сообразил. подчти не отличается. я так понял ядро они с 2000 особо сильно не трогали. ЗЫ да, они там WDF типа анонсировали... но это к ядру отношения не имеет. просто прослойка дополнительная. PPS https://forum.shelek.ru/index.php/topic,15008.0.html
|
|
« Последнее редактирование: 10-11-2008 16:41 от Ochkarik »
|
Записан
|
RTFM уже хоть раз наконец! :[ ну или хотя бы STFW...
|
|
|
always66
Гость
|
|
« Ответ #2 : 18-12-2008 17:44 » |
|
Подскажите писал драйвер под XP запускаеться без проблем DDK2600 под вистой не запускаеться??? Попробовал собрать WDK6001 но появился ряд ошибок, прежде чем исправить решил попробовать откомпилить шаблон Driver Load - Driver Unload под WDK и запустить его через zwLoadDriver но и тут промах в DebugView молчек??? через KmdManager получилось загрузить драйвер, но мне нужен динамический способ загрузки и выгрузки на лету... а в KMD реализация вроде не та сразу выложу исходники Но имхо это шаблоны... в Загрузка на Delphi 2009 Procedure TmyThread.InstallDriver(); const Driver: pwidechar = '\registry\machine\system\CurrentControlSet\Services\***'; DrvFile: PAnsiChar = '***.sys'; var Key, Key2: HKEY; Pth: PAnsiChar; dType: dword; Image: array [0..MAX_PATH] of AnsiChar; ImageFile: TUnicodeString; begin lstrcpyA(@Image, PAnsiChar('\??\')); GetFullPathNameA(DrvFile, MAX_PATH, PAnsiChar(dword(@Image) + 4), Pth); dType := 1; RegOpenKeyA(HKEY_LOCAL_MACHINE, 'system\CurrentControlSet\Services', Key); RegCreateKeyA(Key, '***', Key2); RegSetValueExA(Key2, 'ImagePath', 0, REG_SZ, @Image, lstrlenA(@Image)); RegSetValueExA(Key2, 'Type', 0, REG_DWORD, @dType, SizeOf(dword)); RegCloseKey(Key2); RegCloseKey(Key); RtlInitUnicodeString(@ImageFile, Driver); zWLoadDriver(@ImageFile); end; Драйвер Cи #include <ntddk.h> #define DEBUG #ifdef DEBUG #define DPRINT DbgPrint #else #define DPRINT #endif
VOID DriverUnload(IN PDRIVER_OBJECT DriverObject)
{ DbgPrint("Driver unloaded"); return; }
NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject,
IN PUNICODE_STRING RegistryPath) { DbgPrint("Driver loaded"); return STATUS_SUCCESS; } Может есть какие альтернативы zwLoadDriver?
|
|
|
Записан
|
|
|
|
Ochkarik
|
|
« Ответ #3 : 18-12-2008 19:44 » |
|
по умолчанию вывод дебаговых сообщений в висте отключен. включается через реестр. найдете - поиском по форуму. то что написано на дельфи - я ржал) проще reg файл в две строчки написать) или zWLoadDriver - что за функция - не понял... где она сама? это и была динамическая загрузка? пример загрузки в статье Грома на сайте - в дельфи перевести, проблем быть не должно, утилиты для динамической загрузки - ссылка в соседнем посте . DDK2600 - не уверен, версия 3700 - подходит точно.
PS WDF (KMDF) - это просто прослойка. структура драйвера там насколько я понял - та же, WDM. просто они ее скрыли от глаз долой.
|
|
« Последнее редактирование: 18-12-2008 19:48 от Ochkarik »
|
Записан
|
RTFM уже хоть раз наконец! :[ ну или хотя бы STFW...
|
|
|
always66
Гость
|
|
« Ответ #4 : 19-12-2008 15:32 » |
|
1. По умолчанию вывод дебаговых сообщений в висте отключен KMD Man загружает и дебаг сообщение приходит, хотя он может и включает вывод их... спс 2. zwLoadDriver это то через че можно загрузить драйвер и так же выгрузить при чем это не документированная функция ntdll.dll просто читал на статью про драйвера на дотфиксе и там именно этот способ упомянут, статья обнарудована на васме вроде была... Проще рег файл? а поточнее... Основываясь на этих данных немного был невнимателен и сделал не правильный вывод... Драйвер - очень удобный способ выхода в нулевое кольцо, но возникает вопрос - как загрузить драйвер. Для этого можно использовать два способа: использовать вполне документированный API SCM (Service Control Manager) или прописывать драйвер в реестре вручную и загружать его с помощью недокументированной Native API функции ZwLoadDriver. Первый способ очень прост и хорошо документирован, он подходит для постоянной установки драйверов. Второй же способ позволяет создать в реестре минимум необходимых записей, запустить драйвер, и тут же удалить его раздел из реестра. Это позволяет запускать драйвер быстро и незаметно и подходит для маленьких программ не требующих установки, но требующих запуска своего драйвера.
|
|
|
Записан
|
|
|
|
Ochkarik
|
|
« Ответ #5 : 19-12-2008 17:42 » |
|
через рег файл - это плохой вариант) с перезагрузкой. а насчет смысла использовать недокументированные функции вместо нормального API - не понимаю я этого...)
|
|
|
Записан
|
RTFM уже хоть раз наконец! :[ ну или хотя бы STFW...
|
|
|
always66
Гость
|
|
« Ответ #6 : 19-12-2008 19:06 » |
|
А что есть нормальное АПИ?? какая мне нужно гарантированный запуск драйвера ведь он драйвер защиты и не будет лишним использование недокументированной функции как дополнительное средство защиты, а то захутчит его 3 программка... про которой я писал в другой теме...
В XP все работает и это пример часто встречающийся и люди знающие рекомендуют его... В Vista удалось запустить, запись в реест + сервис
|
|
|
Записан
|
|
|
|
Ochkarik
|
|
« Ответ #7 : 19-12-2008 21:22 » |
|
забыл про специфику) тогда да)
|
|
|
Записан
|
RTFM уже хоть раз наконец! :[ ну или хотя бы STFW...
|
|
|
good3p
Интересующийся
Offline
|
|
« Ответ #8 : 05-05-2010 13:54 » |
|
в 7ке (полагаю что и висте тоже) нету SCM-а. А я именно так загружал свой драйвер под XP. (кстати драйвер сторонним приложением загружается без проблем). Так вот как быть? Они вообще SCM убрали, или заменили чем-то? в общем как загрузить программно дрову в висте\7ке ?
спасибо
|
|
|
Записан
|
|
|
|
zubr
Гость
|
|
« Ответ #9 : 05-05-2010 14:27 » |
|
в 7ке (полагаю что и висте тоже) нету SCM-а. А я именно так загружал свой драйвер под XP. (кстати драйвер сторонним приложением загружается без проблем). Так вот как быть? Они вообще SCM убрали, или заменили чем-то? в общем как загрузить программно дрову в висте\7ке ?
спасибо
Это что то новое. А как же тогда сервисы в 7ке запускаются? Или сервисов там тоже нет? С помощью SCM запускаются драйвера в висте, 7ке, x86 и x64. Причем прога, запускающая драйвер x64 может быть и 32-битная. Запускать надо от имени администратора. В x64 надо отключать проверку подписи драйвера.
|
|
|
Записан
|
|
|
|
resource
Молодой специалист
Offline
Пол:
|
|
« Ответ #10 : 05-05-2010 15:12 » |
|
Я тоже не понял. Как это так нету scm'а? Вот сижу на 7ке, всё есть
|
|
|
Записан
|
|
|
|
good3p
Интересующийся
Offline
|
|
« Ответ #11 : 06-05-2010 08:55 » |
|
у меня null возвращается при попытке получить указатель на scm. (тот же код работает в XP) вообще синтаксис изначально взять со статей с хакера. тут не нащел такого. может плохо искал. поделитесь плз ссылочкой на ресурс по загрузке дровы через scm.
|
|
|
Записан
|
|
|
|
Ochkarik
|
|
« Ответ #12 : 06-05-2010 16:36 » |
|
|
|
|
Записан
|
RTFM уже хоть раз наконец! :[ ну или хотя бы STFW...
|
|
|
good3p
Интересующийся
Offline
|
|
« Ответ #13 : 11-05-2010 08:38 » |
|
спасибо, посмотрю...
|
|
|
Записан
|
|
|
|
good3p
Интересующийся
Offline
|
|
« Ответ #14 : 11-05-2010 08:43 » |
|
подскажите еще тогда какие отладочные аппликухи под вистой запускаются? хотя бы аналог devicetree.exe. спасибо!
|
|
|
Записан
|
|
|
|
Ochkarik
|
|
« Ответ #15 : 11-05-2010 11:15 » |
|
а сам devicetree.exe на висте не идет?
|
|
|
Записан
|
RTFM уже хоть раз наконец! :[ ну или хотя бы STFW...
|
|
|
resource
Молодой специалист
Offline
Пол:
|
|
« Ответ #16 : 11-05-2010 11:43 » |
|
на 7ке идет, значит и на висте идет
|
|
|
Записан
|
|
|
|
Ochkarik
|
|
« Ответ #17 : 11-05-2010 15:45 » |
|
ну не скажи. у меня и на XP он иногда глючил и систему ронял... редко правда)
|
|
|
Записан
|
RTFM уже хоть раз наконец! :[ ну или хотя бы STFW...
|
|
|
resource
Молодой специалист
Offline
Пол:
|
|
« Ответ #18 : 11-05-2010 16:09 » |
|
у меня тоже. надо просто последнюю версию качать
|
|
|
Записан
|
|
|
|
Ochkarik
|
|
« Ответ #19 : 11-05-2010 17:17 » |
|
может быть... я из DDK 3790 брал. в 6001-ом его уже не было
|
|
|
Записан
|
RTFM уже хоть раз наконец! :[ ну или хотя бы STFW...
|
|
|
resource
Молодой специалист
Offline
Пол:
|
|
« Ответ #20 : 11-05-2010 19:48 » |
|
точно говорю. я на 7ке тоже из IFS 2003 запустил его. Врубил перечисление PNP и система рухнула. Скачал самый последний, запустил, всё ОК. Кстати WinObjEx от Four-F у меня на 7ке тоже падает, а жаль, он в тыщу раз информативнее чем сисинтернеловский. Но тут уж ничего не поделаешь, новее версии не нашел
|
|
|
Записан
|
|
|
|
good3p
Интересующийся
Offline
|
|
« Ответ #21 : 12-05-2010 21:10 » |
|
в общем devicetree.exe у меня просто был старый. скачал новый - ок. чтобы работал SCM, надо запускать от администратора. теперь все работает, что в XP, то и работает в 7ке.
теперь другой вопрос. у меня ни в XP ни в 7ке не работает загрузка драйвера при запуске компа. пробую через реестр по такому шаблону, но драйвер не запускается. что я делаю не так? надо чтобы он после установки сам запускался без моего приложения... (вариант помещения моего загрузчика в автозапуск работает, но хотелось бы уже без него) спасибо.
[HKEY_LOCAL_MACHINE\System\ CurrentControlSet\Services\Primer] "ErrorControl"=dword:00000001 "Type" =dword:00000001 "Start" =dword:00000002 "ImagePath" ="\\SystemRoot\\System32\\Drivers\Primer.sys"
|
|
|
Записан
|
|
|
|
good3p
Интересующийся
Offline
|
|
« Ответ #22 : 12-05-2010 21:38 » |
|
в общем немножко соврал. start - 2 - работает. 0 и 1 нет. просто работая через SCM, создается start 3. почему именно 3?
как сделать чтобы при установке через SCM создавалась ветка с параметром 2?
суть в том что я хочу чтобы моим приложением драйвер запускался сразу же (поэтому юзаю SCM). и потом после всех перезагрузок запускался уже сам (реестр).
а сейчас выходит мне надо отдельно править или добавлять ветку, чтобы он запускался автозапуском...так как SCM устанавливает параметр start = 3.
спасибо за отзывы. так сложно вспоминать эти все драйвер-мудрости спустя несколько лет =)
|
|
|
Записан
|
|
|
|
Ochkarik
|
|
« Ответ #23 : 13-05-2010 14:11 » |
|
http://msdn.microsoft.com/en-us/library/ms682450(VS.85).aspx #define SERVICE_BOOT_START 0x00000000 //A device driver started by the system loader. This value is valid only for driver services. #define SERVICE_SYSTEM_START 0x00000001 //A device driver started by the IoInitSystem function. This value is valid only for driver services. #define SERVICE_AUTO_START 0x00000002 //A service started automatically by the service control manager during system startup #define SERVICE_DEMAND_START 0x00000003 //A service started by the service control manager when a process calls the StartService function. #define SERVICE_DISABLED 0x00000004
|
|
« Последнее редактирование: 13-05-2010 18:50 от Ochkarik »
|
Записан
|
RTFM уже хоть раз наконец! :[ ну или хотя бы STFW...
|
|
|
good3p
Интересующийся
Offline
|
|
« Ответ #24 : 13-05-2010 16:10 » |
|
вопрос такой - если делаю через рег файл - то запускается
REGEDIT4 [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\mydriver1] "ErrorControl"=dword:00000001 "Type" =dword:00000001 "Start" =dword:00000002 "ImagePath" ="system32\\DRIVERS\\drv.sys"
если делаю из кода - то не запускается. причем в реестре после выполнения и того и другого все то же самое, но результат разный (и после безуспешной попытки появляется флаг INITSTARTFAILED 1 в ветке, созданной из кода...
TCHAR *sKey = TEXT("SYSTEM\\CurrentControlSet\\Services\\mydriver2"); LONG rc=RegCreateKeyEx(HKEY_LOCAL_MACHINE,sKey,0,_TEXT(""), REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS,NULL,&hKeyResult, &dwDisposition); DWORD sVal1 = 1; RegSetValueEx(hKeyResult, LPCWSTR(TEXT("ErrorControl")), NULL, REG_DWORD, (BYTE*)&sVal1, sizeof(DWORD)); DWORD sVal2 = 2; RegSetValueEx(hKeyResult, LPCWSTR(TEXT("Start")), NULL, REG_DWORD, (BYTE*)&sVal2, sizeof(DWORD)); DWORD sVal3 = 1; RegSetValueEx(hKeyResult, LPCWSTR(TEXT("Type")), NULL, REG_DWORD, (BYTE*)&sVal3, sizeof(DWORD)); TCHAR *sVal4=_TEXT("system32\\DRIVERS\\drv.sys"); RegSetValueEx(hKeyResult, LPCWSTR(TEXT("ImagePath")), NULL, REG_SZ, (BYTE*)sVal4, 100); RegCloseKey(hKeyResult);
|
|
« Последнее редактирование: 13-05-2010 19:41 от good3p »
|
Записан
|
|
|
|
Ochkarik
|
|
« Ответ #25 : 13-05-2010 18:37 » |
|
SERVICE_SYSTEM_START - если мне не изменяет память, для каких то специфических случаев... там что то с очередностью загрузки компонентов ядра было связано, во время запуска системы. точнее уже не вспомню)
|
|
« Последнее редактирование: 13-05-2010 18:38 от Ochkarik »
|
Записан
|
RTFM уже хоть раз наконец! :[ ну или хотя бы STFW...
|
|
|
Ochkarik
|
|
« Ответ #26 : 13-05-2010 19:55 » |
|
честно говоря прописывать драйвер программно, через функции реестра... как-то странно) есть же API, специальное? CreateService() - почему бы не воспользоваться? я ж специально ссылку выше на MSDN дал) для запуска из кода приложения - делайте CreateService() вместо RegCreateKeyEx(). так правильнее)
ImagePath - тип должен быть REG_EXPAND_SZ
|
|
« Последнее редактирование: 13-05-2010 20:01 от Ochkarik »
|
Записан
|
RTFM уже хоть раз наконец! :[ ну или хотя бы STFW...
|
|
|
resource
Молодой специалист
Offline
Пол:
|
|
« Ответ #27 : 13-05-2010 20:14 » |
|
честно говоря прописывать драйвер программно, через функции реестра... как-то странно)
Ну если не использовать слово "неадекватность", то можно и так сказать. Про SERVICE_SYSTEM_START всё верно. Сначала грузится базовый комплект дров (SERVICE_BOOT_START), а потом уже те, которые SERVICE_SYSTEM_START
|
|
|
Записан
|
|
|
|
good3p
Интересующийся
Offline
|
|
« Ответ #28 : 13-05-2010 20:52 » |
|
я CreateService юзал с SERVICE_DEMAND_START, поэтому не грузился. а через реестр я хотел сделать, так как подумал, что не надо права администратора (как на SCM), оказалось ошибся, они везде надо в 7ке. поэтому буду юзать CreateService - все ок работает. спасибо за помощь!
и на последок - как получить в самом драйвере системную дату (хотя бы просто имя ф-ии)?
пока тока это нащел, еще не проверял... VOID NdisGetCurrentSystemTime( IN PLARGE_INTEGER pSystemTime );
|
|
« Последнее редактирование: 13-05-2010 21:11 от good3p »
|
Записан
|
|
|
|
zubr
Гость
|
|
« Ответ #29 : 14-05-2010 03:50 » |
|
я CreateService юзал с SERVICE_DEMAND_START, поэтому не грузился. а через реестр я хотел сделать, так как подумал, что не надо права администратора (как на SCM), оказалось ошибся, они везде надо в 7ке. поэтому буду юзать CreateService - все ок работает. спасибо за помощь! Для всех NT-систем без прав администратора в реестр ничего не пропишешь, можно только читать.
|
|
|
Записан
|
|
|
|
|