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

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

ru
Offline Offline

« : 10-11-2008 16:21 » 

С выходом Vistы, всеми фибрами души, пытался оттянуть переход с ХР на нее, но не прошло и двух лет, а заставляют  Жаль Жаль Жаль ...
Взял я свой драйвер, для работы с 1394, написанный под DDK2003 и DriverStudio, инстальнул под vistой, и он сходу заработал... Не понял
Отсюда вопрос, в чем отличие между Vista и XP, в плане создания драйвера?....
Записан
Ochkarik
Модератор

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

« Ответ #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 уже хоть раз наконец!  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
Модератор

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

« Ответ #3 : 18-12-2008 19:44 » 

по умолчанию вывод дебаговых сообщений в висте отключен. включается через реестр. найдете  - поиском по форуму.
то что написано на дельфи - я ржал) проще reg файл в две строчки написать)
или zWLoadDriver - что за функция - не понял... где она сама? это и была динамическая загрузка?
пример загрузки в статье Грома на сайте - в дельфи перевести, проблем быть не должно,
утилиты для динамической загрузки - ссылка в соседнем посте .
DDK2600 - не уверен, версия 3700 - подходит точно.

PS WDF (KMDF) - это просто прослойка. структура драйвера там насколько я понял - та же, WDM. просто они ее скрыли от глаз долой.
« Последнее редактирование: 18-12-2008 19:48 от Ochkarik » Записан

RTFM уже хоть раз наконец!  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
Модератор

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

« Ответ #5 : 19-12-2008 17:42 » 

через рег файл - это плохой вариант) с перезагрузкой.
а насчет смысла использовать недокументированные функции вместо нормального API - не понимаю я этого...)
Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
always66
Гость
« Ответ #6 : 19-12-2008 19:06 » 

А что есть нормальное АПИ?? какая мне нужно гарантированный запуск драйвера ведь он драйвер защиты и не будет лишним использование недокументированной функции как дополнительное средство защиты, а то захутчит его 3 программка... про которой я писал в другой теме...

В XP все работает и это пример часто встречающийся и люди знающие рекомендуют его...
В Vista удалось запустить, запись в реест + сервис
Записан
Ochkarik
Модератор

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

« Ответ #7 : 19-12-2008 21:22 » 

забыл про специфику) тогда да)
Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
good3p
Интересующийся

by
Offline 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
Молодой специалист

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

« Ответ #10 : 05-05-2010 15:12 » 

Я тоже не понял. Как это так нету scm'а? Вот сижу на 7ке, всё есть
Записан
good3p
Интересующийся

by
Offline Offline

« Ответ #11 : 06-05-2010 08:55 » 

у меня null возвращается при попытке получить указатель на scm. (тот же код работает в XP) вообще синтаксис изначально взять со статей с хакера. тут не нащел такого. может плохо искал. поделитесь плз ссылочкой на ресурс по загрузке дровы через scm.
Записан
Ochkarik
Модератор

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

« Ответ #12 : 06-05-2010 16:36 » 

https://club.shelek.ru/viewart.php?id=76
не пойдет?)
Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
good3p
Интересующийся

by
Offline Offline

« Ответ #13 : 11-05-2010 08:38 » 

спасибо, посмотрю...
Записан
good3p
Интересующийся

by
Offline Offline

« Ответ #14 : 11-05-2010 08:43 » new

подскажите еще тогда какие отладочные аппликухи под вистой запускаются?
хотя бы аналог devicetree.exe. спасибо!
Записан
Ochkarik
Модератор

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

« Ответ #15 : 11-05-2010 11:15 » 

а сам devicetree.exe на висте не идет?
Записан

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

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

« Ответ #16 : 11-05-2010 11:43 » 

на 7ке идет, значит и на висте идет
Записан
Ochkarik
Модератор

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

« Ответ #17 : 11-05-2010 15:45 » 

ну не скажи. у меня и на XP он иногда глючил и систему ронял... редко правда)
Записан

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

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

« Ответ #18 : 11-05-2010 16:09 » 

у меня тоже. надо просто последнюю версию качать Улыбаюсь
Записан
Ochkarik
Модератор

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

« Ответ #19 : 11-05-2010 17:17 » 

может быть... я из DDK 3790 брал. в 6001-ом его уже не было
Записан

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

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

« Ответ #20 : 11-05-2010 19:48 » 

точно говорю. я на 7ке тоже из IFS 2003 запустил его. Врубил перечисление PNP и система рухнула. Скачал самый последний, запустил, всё ОК. Кстати WinObjEx от Four-F у меня на 7ке тоже падает, а жаль, он в тыщу раз информативнее чем сисинтернеловский. Но тут уж ничего не поделаешь, новее версии не нашел  Жаль
Записан
good3p
Интересующийся

by
Offline 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
Интересующийся

by
Offline Offline

« Ответ #22 : 12-05-2010 21:38 » 

в общем немножко соврал. start - 2 - работает. 0 и 1 нет.
просто работая через SCM, создается start 3. почему именно 3?

как сделать чтобы при установке через SCM создавалась ветка с параметром 2?

суть в том что я хочу чтобы моим приложением драйвер запускался сразу же (поэтому юзаю SCM).
и потом после всех перезагрузок запускался уже сам (реестр).

а сейчас выходит мне надо отдельно править или добавлять ветку, чтобы он запускался автозапуском...так как SCM устанавливает параметр start = 3.

спасибо за отзывы. так сложно вспоминать эти все драйвер-мудрости спустя несколько лет =)
Записан
Ochkarik
Модератор

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

« Ответ #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 уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
good3p
Интересующийся

by
Offline 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
Модератор

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

« Ответ #25 : 13-05-2010 18:37 » 

SERVICE_SYSTEM_START - если мне не изменяет память, для каких то специфических случаев... там что то с очередностью загрузки компонентов ядра было связано, во время запуска  системы. точнее уже не вспомню)
« Последнее редактирование: 13-05-2010 18:38 от Ochkarik » Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
Ochkarik
Модератор

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

« Ответ #26 : 13-05-2010 19:55 » 

честно говоря прописывать драйвер программно, через функции реестра... как-то странно)
есть же API, специальное? CreateService() - почему бы не воспользоваться? я ж специально ссылку выше на MSDN дал)
для запуска из кода приложения - делайте CreateService() вместо RegCreateKeyEx(). так правильнее)

ImagePath - тип должен быть REG_EXPAND_SZ
« Последнее редактирование: 13-05-2010 20:01 от Ochkarik » Записан

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

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

« Ответ #27 : 13-05-2010 20:14 » 

честно говоря прописывать драйвер программно, через функции реестра... как-то странно)

Ну если не использовать слово "неадекватность", то можно и так сказать.

Про SERVICE_SYSTEM_START всё верно. Сначала грузится базовый комплект дров (SERVICE_BOOT_START), а потом уже те, которые SERVICE_SYSTEM_START
Записан
good3p
Интересующийся

by
Offline 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-систем без прав администратора в реестр ничего не пропишешь, можно только читать.
Записан
Страниц: [1] 2  Все   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines