Сбой драйвера USB_MASS_STORAGE после изменения скриптом vb ключа USBSTOR - PullRequest
1 голос
/ 31 марта 2011

У меня есть этот сценарий, написанный мной.По сути, мне нужен был скрипт, который «разблокирует» фронтальный usb только для конкретного устройства.Ситуация такова, что у нас есть рабочая станция с ключом реестра USBSTOR \ Start, установленным в 4 (отключено), поэтому передний USB недоступен без дополнительной работы нашего ИТ-отдела - таким образом мы контролируем, кто может получить доступ к usb

Но сотрудники должны использовать камеру, чтобы делать снимки для особых нужд и отправлять их через почтовые клиенты. Итак, мы хотим автоматизировать фазу «блокировка / разблокировка».

USB разблокируется, когда устройствопроценты вставляются, он остается «разблокированным», пока устройство находится в режиме usb, а после того, как устройство отключено, скрипт снова «блокирует» usb.

Я решил использовать .vbs. Скрипт работает какЯ ожидал, но после фазы «блокировки» драйвер USB_MASS_STORAGE аварийно завершает работу. Я должен удалить его и перезапустить Windows, чтобы драйвер был перезагружен и снова работал правильно. После того, как я несколько раз запустил скрипт, значение реестра вUSBSTOR \ Start не влияет на usb, т.е. usb разблокирован, даже если есть 4. Если я изменю значение с 4 на3 сбой драйвера.

Я ищу несколько советов.

Вот код для сценария usbstor.vbs.Я использовал много комментариев, некоторые из них объясняют довольно очевидные вещи, но я решил так.

' Script for access to Front Usb (a.k.a USB MASS STORAGE)
' The usb is locked by default(the value in Registry Key USBSTOR/Start is 4 - disable).It is enabled(the value in Registry Key USBSTOR/Start is 3 - enable) when the device of interest is put into front usb.
' The usb is in  "enable" state ,while the device is into it. After it is removed,the Registry Key USBSTOR/Start value is set to 4(disable).
' The device is recognized by hardware id ,which is known in advance by searching USBSTOR,when the device is inserted. This script is for pc,where what we want is access to front usb only for spcecific device(a camera in our case).
' For everything else the usb should be disabled.The script is loaded in RAM and if the while loop condition isn't change to false,we must kill the process within TaskManager 
' The CPU time is high > 98 while the script runs.I came to this solution for my problem,but any ideas for improvements or for different logic are highly welcomed.

Option Explicit On

Dim Shell,Start,Hwid,Enum_0,Enum_1,Count,Flag_0,Flag_1,Check_0,Check_1   'Dimension of varables we are going to use in the script.

Set Shell = CreateObject("WScript.Shell")   'Create an object to work with Windows Registry.

'Start =  Shell.RegRead("HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\USBSTOR\Start")  'Save the value of the registry key into Start variable

Hwid = "USB\Vid_0930&Pid_6545\001D92A866B8B8B1934703FE"  'hardawre id of device of interest.We get it from the registry and the script scan for this id.It is constant string

Count = 1  'Initialize the Count variable with value of 1.We use it as a condition in endless while() loop.It makes script run in real-time,so it can scan uninterupted for changes in the registry

QueryEnum0 ' The subroutines QueryEnum0 and QueryEnum1.The id is either in USBSTOR\Enum\0 or in USBSTOR\Enum\1 .That is for sure. 
QueryEnum1 ' Declaration before definition - not exactly explanation.

'The purpose of these two subroutines is: create an object everytime the sub is called ,thus read the value in Enum\0 or in Enum\1 constantly as "scanning"
'Probably not so elegant solution to somebody,but actually it works.

Sub QueryEnum0 ' Enter the sub

     Dim Flag_Enum_0,Shell ' Declare local variables.They will be created each time the sub is invoked.
     Set Shell = CreateObject("WScript.Shell")    'Create an object to work wirh registry any time the sub is called

     On Error Resume Next 'Error handling
        Flag_Enum_0 = Shell.RegRead("HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\USBSTOR\Enum\0")  'Try to read reg value into Flag_Enum_0. The purpose 

     On Error GoTo 0

     Flag_0 = Flag_Enum_0 'Assign the value to variable Flag_0,outside of sub.The memory for Flag_0 is set once and lasts while the script runs.
End Sub



' Same as QueryEnum0

Sub QueryEnum1

     Dim Flag_Enum_1,Shell
     Set Shell = CreateObject("WScript.Shell")

     On Error Resume Next
        Flag_Enum_1 = Shell.RegRead("HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\USBSTOR\Enum\1")
     On Error GoTo 0
     Flag_1 = Flag_Enum_1

End Sub


Do While Count = 1 'Real-time loop,the code within while is running while count is equal to 1. The script is loaded in memory constanlty.

  On Error Resume Next 

     Enum_0 = Shell.RegRead("HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\USBSTOR\Enum\0") ' Try to read hardware id if it is in Enum\0

  On Error GoTo 0 '


  On Error Resume Next 

     Enum_1 = Shell.RegRead("HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\USBSTOR\Enum\1") 'Try to read hardware id if it is in Enum\1

  On Error GoTo 0





  If StrComp(Hwid,Enum_0) <> 0 And StrComp(Hwid,Enum_1) <> 0  Then 'Check if both reg keys are empty

   MsgBox "There is no device in the front usb.Please put the device or see the connection"



  ElseIf StrComp(Hwid,Enum_0) = 0 Then 'If the hardware id is in Enum\0,thus assigned to Enum_0

      Shell.RegWrite "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\USBSTOR\Start",3 'Enable the usb by "unlock" it



        On Error Resume Next
          QueryEnum0 'Invoke sub QueryEnum0.If the id we looking for is in Enum\0,we know that it is assigned to Flag_0 also
          Check_0 = Flag_0 'Use another variable to copy value from Flag_0.                                                                                               
        On Error GoTo 0

         If StrComp(Hwid,Check_0) = 0 Then 'Compare the constant Hwid with the value in Check_0,test for id
            Msgbox "Check_0 still holds the hardware id" 'Some messages to inform us whats happening
         else    
            MsgBox "Check_0 does not contain the hardware id anymore"
            Shell.RegWrite "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\USBSTOR\Start",4 'Disable the front usb
            Count = 2 'End the while loop,count is 2,so the condition is false .The loop breaks.
         End If



  ElseIf StrComp(Hwid,Enum_1) = 0 Then 'If the hardware is in Enum\1....same as above mentioned

      Shell.RegWrite "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\USBSTOR\Start",3 



        On Error Resume Next

        QueryEnum1  
        Check_1 = Flag_1

        On Error GoTo 0

         If StrComp(Hwid,Check_1) = 0 Then
            MsgBox "Check_1 still holds the hardware id"
            MsgBox Check_1
         else

            MsgBox "Check_0 does not contain the hardware id anymore"
            Shell.RegWrite "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\USBSTOR\Start",4
            Count = 2

         End If


  End If

Loop   




' Useful information for me 

'HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\USBSTOR -> value name -> Start ,value data = 3(enable) = 4(disable)

 'HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\USBSTOR\Enum -> value name -> 1 or 0 ,value data we look for is -> USB\Vid_04da&Pid_2372\5&2f621ee5&0&8
   ' USB\Vid_04da&Pid_2372\5&2f621ee5&0&8 - camera id in our case

   ' fantom value - USB\Vid_03f0&Pid_032a\000000000Q912WFBSI1c - name: 0 ,type: REG_SZ,in the key Enum.This is another hardware id,which is strange somehow,because I do not have any device
   ' inserted in my usb.However,I take this value into account,thus use both keys 0 and 1 within Enum to scan for the id I need.

1 Ответ

0 голосов
/ 02 марта 2015

Согласно документации Microsoft, данные в дереве реестра CurrentControlSet используются во время запуска и инициализации драйвера.

Также в Windows 7 и более поздних версиях любые изменения HKEY_LOCAL_MACHINE должны вноситься утилитой, выполняющей обязанности администратора.,В противном случае изменения будут внесены в клон пользователя HKEY_LOCAL_MACHINE, и изменения коснутся только пользователя, под учетной записью которого была запущена утилита.

См. HKLM \ SYSTEM \ CurrentControlSet \ Services Registry Tree , которыйсостояния

"Драйвер может хранить глобальные определяемые драйвером данные под своим ключом в дереве сервисов. Информация, хранящаяся под этим ключом, доступна драйверу во время его инициализации."

Все, что я до сих пор нашел в отношении дополнительной безопасности для USB-накопителей путем установки этого значения, указывает на то, что это делается один раз в качестве меры предосторожности.Таким образом, может показаться, что описанный вами подход не является возможным решением.

Также может быть проблема начального состояния в том, что до тех пор, пока USB-накопитель не будет подключен, драйвер устройства не будет полностью инициализирован, следовательно,эти данные, возможно, еще не были доступны.Чтение также предполагает, что это будет зависеть от того, было ли устройство ранее успешно подключено, создавая необходимые данные реестра и инициализируя драйвер или нет.

Я думаю, что можно с уверенностью сказать, что изменение значения реестрана лету таким способом не было замысла для драйверов USB для Windows.

См. также эту страницу Статья 103000 базы знаний Майкрософт, Записи подраздела CurrentControlSet \ Services для получения подробной информации о данных в этомЗапись в реестре.В этой статье говорится следующее о значениях ключевых слов Start.

0x3 (загрузка по требованию) Доступно независимо от типа, но не будет запущено, пока пользователь не запустит его (например, с помощьюзначок «Устройства» на панели управления).

0x4 (отключено) НЕ ЗАПУСКАЕТСЯ В ЛЮБЫХ УСЛОВИЯХ.

См. также следующие сообщения stackoverflow.

C # Отключить / включить порты USB

Включить и отключить порт USB

Функция Win32 API для программного включения / отключения устройства

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...