Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 23.06.2011, 12:40   #1
Sam Gold
Форумчанин
 
Аватар для Sam Gold
 
Регистрация: 26.03.2010
Сообщений: 538
По умолчанию Открытие драйвера

Доброго времени суток. Возникла следующая проблема: при попытке открытия драйвера
Код:
hDriver = CreateFile("\\\\.\\KBDRIVER", GENERIC_READ | GENERIC_WRITE,
                  0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL );
hDriver всегда INVALID_HANDLE_VALUE.
Инсталляцию драйвера делаю с помощью reg-файла

Код:
REGEDIT4

[HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\KBDRIVER]

"ErrorControl" = dword:00000001

"Type" = dword:00000001

"Start" = dword:00000002

"ImagePath" = "C:\Windows\System32\drivers\KBDRIVER.sys"
Подскажите пожалуйста, как решить данную проблему.
Единственный способ стать умнее - играть с более умным противником.
Sam Gold вне форума Ответить с цитированием
Старый 23.06.2011, 12:51   #2
f.hump
C/C++, Asm
Участник клуба
 
Аватар для f.hump
 
Регистрация: 02.03.2010
Сообщений: 1,323
По умолчанию

и что тут удивительного, это ж kernel mode драйвер, загружается в ядро и естественно ни какой user mode к нему доступа не получит.
Хотите использовать фунционал драйвера, есть DeviceIoControl.
f.hump вне форума Ответить с цитированием
Старый 23.06.2011, 13:02   #3
Sam Gold
Форумчанин
 
Аватар для Sam Gold
 
Регистрация: 26.03.2010
Сообщений: 538
По умолчанию

А как мне его хэндл получить тогда?
В описании DeviceIoControl() тоже сказано, что хэндл получать надо с помощью CreateFile() - как я и делаю.
Цитата:
To retrieve a device handle, use the CreateFile function.
Единственный способ стать умнее - играть с более умным противником.
Sam Gold вне форума Ответить с цитированием
Старый 23.06.2011, 13:13   #4
f.hump
C/C++, Asm
Участник клуба
 
Аватар для f.hump
 
Регистрация: 02.03.2010
Сообщений: 1,323
По умолчанию

правильно, нужно получить хендл устройства (не драйвера). Для этого нужно знать имя устройства (уверены что система назвала устройство "\\\\.\\KBDRIVER"?). Чтобы узнать имя устройства можно воспользоваться SetupDiXxx.

кстати, только сейчас обратил внимание, что значит:
Цитата:
Инсталляцию драйвера делаю с помощью reg-файла
Это что и все? А кто регистрирует ID устройств, которые поддерживает драйвер, или интерфейс, который предоставляет драйвер? Где inf???

Последний раз редактировалось Stilet; 27.06.2011 в 13:00.
f.hump вне форума Ответить с цитированием
Старый 24.06.2011, 10:59   #5
Sam Gold
Форумчанин
 
Аватар для Sam Gold
 
Регистрация: 26.03.2010
Сообщений: 538
По умолчанию

Цитата:
А кто регистрирует ID устройств, которые поддерживает драйвер, или интерфейс, который предоставляет драйвер? Где inf???
Хм, я думал что установка драйвера возможна и без inf-файла, только с внесением записей в реестр.
Если использовать inf-файл то как назначать например GUID и т.д.
P.S. драйвер осуществляет перехват функции.
Единственный способ стать умнее - играть с более умным противником.
Sam Gold вне форума Ответить с цитированием
Старый 24.06.2011, 11:48   #6
f.hump
C/C++, Asm
Участник клуба
 
Аватар для f.hump
 
Регистрация: 02.03.2010
Сообщений: 1,323
По умолчанию

http://msdn.microsoft.com/en-us/libr...(v=VS.85).aspx

PS.2.PS. Просто интересно для чего такой драйвер? Чью функцию он перехватывает? Событий для которых драйвер может предложить свой обработчик не так уж и много, что это за событие которое позволяет ему перехватывать функцию?

Последний раз редактировалось f.hump; 24.06.2011 в 14:38.
f.hump вне форума Ответить с цитированием
Старый 24.06.2011, 18:49   #7
Sam Gold
Форумчанин
 
Аватар для Sam Gold
 
Регистрация: 26.03.2010
Сообщений: 538
По умолчанию

Спасибо за ссылку.
Цитата:
Чью функцию он перехватывает?
NtQuerySystemInformation
Попробовал использовать SCM, однако при
Код:
SCManag = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
возникает ERROR_ACCESS_DENIED, но если запустить прогу от имени администратора, то этой ошибки не возникает. Подскажите как получить необходимый для совершения данной операции приоритет.
Единственный способ стать умнее - играть с более умным противником.
Sam Gold вне форума Ответить с цитированием
Старый 25.06.2011, 13:01   #8
f.hump
C/C++, Asm
Участник клуба
 
Аватар для f.hump
 
Регистрация: 02.03.2010
Сообщений: 1,323
По умолчанию

а... скрыть чего-то от кого-то.

на счет OpenSCManager вы и сами ответили - нужен админ.

Ну или, чтоб поизвращенней, два сервиса, которые радостно стартануться в сессии 0, и один из них прикроет второй от чужих глаз.
f.hump вне форума Ответить с цитированием
Старый 25.06.2011, 13:14   #9
Sam Gold
Форумчанин
 
Аватар для Sam Gold
 
Регистрация: 26.03.2010
Сообщений: 538
По умолчанию

Цитата:
на счет OpenSCManager вы и сами ответили - нужен админ.
А как программно получить права админа?
Единственный способ стать умнее - играть с более умным противником.
Sam Gold вне форума Ответить с цитированием
Старый 25.06.2011, 13:42   #10
f.hump
C/C++, Asm
Участник клуба
 
Аватар для f.hump
 
Регистрация: 02.03.2010
Сообщений: 1,323
По умолчанию

программно никак. юзер не может промоутить себя сам до админа.
но есть в винде такая интересная вещь как сессия 0, в ней работают системные сервисы, драйвера и т.п. Из нее можно получить доступ почти ко всему. Так что, как вариант можно написать user mode драйвер или быть может сервис (но похоже, что сервис в вашей ситуации не выбор), установить его, и система загрузит его в сессию 0. А самое важное здесь, собственно за что я люблю user mode драйвера, это то что могу пользоваться WinApi (за исключением функций, которые относятся к (G)UI). и еще если я по непонятным причинам налажал при написании user mode драйвера он не убъет систему как kernel mode, а просто перезапустится. это была информация к размышлению.

Все сказанное выше остается верным.
Но, скажем если речь идет о запуске приложения в Viste/W7 в сессии админа с включенным UAC, можно добавить trustInfo manifest.

Последний раз редактировалось Stilet; 27.06.2011 в 13:01.
f.hump вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
CppWEbBrowser. Запрет на открытие нового окна, и открытие его в том же окне Askar_g Общие вопросы C/C++ 4 25.06.2011 20:00
драйвера technik_312 Помощь студентам 2 10.01.2010 15:57
блочные драйвера valys361 Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 0 03.06.2009 22:55
Ошибка драйвера Dimoney Общие вопросы Delphi 8 28.05.2008 11:26
как перехватить открытие чужого приложенияпытаюсь перехватить открытие любого приложе rpy3uH Win Api 2 02.12.2006 12:12