Показать полную графическую версию : отключение устройств
подскажите пожалуйста, каким методом можно решить такую задачу : написать программу которая отключала бы USB, Сd-Rom и Floppy. (т.е. отключение флопика, дисковода и портов USB). меня интересует алгоритм написания данной программы.
мои идеи изменять параметры реестра которые отвечают за отключение устройств в диспетчере устройств.
DillerInc
25-06-2007, 22:52
chek
Я думаю,что надо смотреть в сторону функции DeviceIoControl и её разнообразных IOCTL-кодов.Данная функция является в некотором роде посредником между пользовательскими программи и драйверами режима ядра.В частности имеется ввиду драйвер того же CD-ROM'а.
В общем,смотри тут (http://forum.oszone.net/showthread.php?t=52470) и потом вперёд на MSDN.
chek
В ресурс-ките есть утилита DevCon (http://support.microsoft.com/kb/311272/), которая в числе прочего может отключать/включать устройства... а в DDK есть ее исходник, если есть желание поковырять то вот он: http://forum.oszone.net/attachment.php?attachmentid=4080
ADD: по поводу ключей реестра вот линк на ADM-файл политики который включает/выключает соответствующие драйверы установкой параметра "Start"=4 , но применение требует перезагрузки: http://support.microsoft.com/kb/555324/en-us
HKLM\SYSTEM\CurrentControlSet\Services\UsbStor
HKLM\SYSTEM\CurrentControlSet\Services\Cdrom
HKLM\SYSTEM\CurrentControlSet\Services\Flpydisk
amel27
большое спасибо.
а вы можете написать часть программы на си билдере которая бы и изменяла этот параметр реестр при нажатии на кнопку??
chek
к сожалению нет - я не программер.. Гугль в помощь ;)
amel27
ну и на том спасибо, будем искать...
DillerInc
28-06-2007, 15:27
chek
Что искать-то??Вы программист или нет...или,по-крайней мере,хотите им стать...?
Вот основной кусок кода на ассемблере.Думаю,суть сможете уловить:
.data
szRegCdromPath db "SYSTEM\CurrentControlSet\Services\Cdrom",0
szStartParam db "Start",0
.code
; ################## start ##########################
start proc
LOCAL hKey:HANDLE
LOCAL QueryData:DWORD
LOCAL WriteData:DWORD
LOCAL cbData:DWORD
LOCAL acBuffer[64]:CHAR
; /* Открываем нужный ключ реестра */
lea eax, hKey
push eax
push KEY_ALL_ACCESS
push 0
push offset szRegCdromPath
push HKEY_LOCAL_MACHINE
call RegOpenKeyEx
test eax, eax ; ERROR_SUCCESS == 0
jnz @@failed_open_reg
; /* Мы хотим считать четыре байта (DWORD) */
mov cbData, sizeof DWORD
; /* Проверяем оригинальный параметр и его значение (опционально) */
lea eax, cbData
push eax
lea eax, QueryData
push eax
push NULL
push NULL
push offset szStartParam
push hKey
call RegQueryValueEx
test eax, eax
jnz @@failed_query_reg
cmp cbData, sizeof DWORD
jnz @@failed_query_reg
; /* Заносим в буфер значение 0х4 */
mov WriteData, SERVICE_DISABLED
; /* Устанавливаем новое значение параметра "Start" */
push cbData
lea eax, WriteData
push eax
push REG_DWORD
push 0
push offset szStartParam
push hKey
call RegSetValueEx
test eax, eax
jnz @@failed_set_reg
...
Дело в том,что тот же драйвер cdrom.sys представляется в системе как сервис.Ключ реестра "Cdrom" содержит необходимую информацию,требуемую для нормальной работы этого драйвера.
Параметр этого ключа,называемый "Start",характеризует то,как этот драйвер запускается.В данном случае нас интересуют два значения:
SERVICE_SYSTEM_START
0x00000001
Запускается при на ранних стадиях инициализации системы(значение по-умолчанию)
SERVICE_DISABLED
0x00000004
Отключение сервиса.Драйвер не может быть запущен.
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.