Что нового

Блокировка подключаемых устройств

joiner

Модератор
Локальный модератор
Сообщения
3 009
Репутация
502
нашел на oszone функцию по блокировке папок и файлов.
хочу использовать его для блокировки подключаемых устройств usb
блокирует одно устройство, которое подключено, а если подключаю другое, то не блокирует. хочется добиться, чтобы при запуске кода любое подключаемое usb в любом количестве блокировалось.
Код:
$var = DriveGetDrive( "REMOVABLE" )

While 1
If NOT @error Then

    For $i = 1 to $var[0]
 $hFile = _CreateFile($var[$i])
Next
EndIf

WEnd
If $hFile = -1 Then Exit MsgBox(16, "Error", "Unable to open file")
Func _CreateFile($var)
    Local Const $GENERIC_READ  = 0x80000000
    Local Const $GENERIC_WRITE = 0x40000000

    Local Const $FILE_FLAG_BACKUP_SEMANTICS = 0x02000000
    Local Const $OPEN_EXISTING = 3

    $var = "\\.\" & $var

    Local $aRet = DllCall("kernel32.dll", "hwnd", "CreateFile", _
                                          "str", $var, _
                                          "int", BitOR($GENERIC_READ, $GENERIC_WRITE), _
                                          "int", 0, _
                                          "ptr", 0, _
                                          "int", $OPEN_EXISTING, _
                                          "int", $FILE_FLAG_BACKUP_SEMANTICS, _
                                          "int", 0)
    Return $aRet[0]
EndFunc

блокирует если на момент запуска была подключена флешка. и все..что нужно изменить?
 

ZanMax

Тестер
Сообщения
120
Репутация
5
Самого интересует даный вопрос.
Но у меня еще один вопрос :
Как можно запретить все устройства кроме 1,2,3
Я знаю что флешки можно както идентифицировать.
Спасибо.
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5 379
Репутация
2 702
Александр сказал(а):
...хочется добиться, чтобы при запуске кода любое подключаемое usb в любом количестве блокировалось.
Вот первая часть скрипта, вторую напишу потом (если будет время). :smile:

Код:
#Include <WinAPIEx.au3>

Global Const $WM_DEVICECHANGE = 0x0219

Global Const $DBT_DEVICEARRIVAL = 0x00008000
Global Const $DBT_DEVICEREMOVECOMPLETE = 0x00008004
Global Const $DBT_DEVTYP_VOLUME = 0x00000002

Global $DevList = _GetDevList()

GUICreate('')
GUIRegisterMsg($WM_DEVICECHANGE, '_WM_DEVICECHANGE')
;GUISetState()

Do
Until GUIGetMsg() = -3

Func _WM_DEVICECHANGE($hWnd, $iMsg, $wParam, $lParam)
    Switch $wParam
        Case $DBT_DEVICEARRIVAL, $DBT_DEVICEREMOVECOMPLETE

            Local $NewList = _GetDevList()

            Switch $wParam
                Case $DBT_DEVICEARRIVAL

                    Local $tDEV_BROADCAST_VOLUME = DllStructCreate('int Size;int DeviceType;int Reserved;int UnitMask;ushort Flags', $lParam)

                    If DllStructGetData($tDEV_BROADCAST_VOLUME, 'DeviceType') = $DBT_DEVTYP_VOLUME Then
                        $Drive = _ArrayDiff($DevList, $NewList) & ':'
                        Switch _WinAPI_GetDriveBusType($Drive)
                            Case $DRIVE_BUS_TYPE_USB
                                ConsoleWrite('USB drive (' & StringUpper($Drive) & ') detected.' & @CR)

                                ; Здесь блокируем USB устройство

                        EndSwitch
                    EndIf
            EndSwitch
            $DevList = $NewList
    EndSwitch
    Return 0
EndFunc   ;==>_WM_DEVICECHANGE

Func _ArrayDiff(ByRef $ArrayMin, ByRef $ArrayMax)

    Local $Dup

    For $i = $ArrayMax[0] To 1 Step -1
        $Dup = 1
        For $j = $ArrayMin[0] To 1 Step -1
            If $ArrayMax[$i] = $ArrayMin[$j] Then
                $Dup = 0
                ExitLoop
            EndIf
        Next
        If $Dup Then
            Return $ArrayMax[$i]
        EndIf
    Next
    Return 0
EndFunc   ;==>_ArrayDiff

Func _GetDevList()

    Local $Drv = DriveGetDrive('REMOVABLE')

    If Not IsArray($Drv) Then
        Dim $Drv[1] = [0]
    EndIf
    For $i = 1 To $Drv[0]
        $Drv[$i] = StringLeft($Drv[$i], 1)
    Next
    Return $Drv
EndFunc   ;==>_GetDevList


WinAPIEx.au3
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5 379
Репутация
2 702
Можно так.

Код:
#Include <WinAPIEx.au3>

Global Const $WM_DEVICECHANGE = 0x0219

Global Const $DBT_DEVICEARRIVAL = 0x00008000
Global Const $DBT_DEVICEREMOVECOMPLETE = 0x00008004
Global Const $DBT_DEVTYP_VOLUME = 0x00000002

Global $DevList = _GetDevList()

GUICreate('')
GUIRegisterMsg($WM_DEVICECHANGE, '_WM_DEVICECHANGE')
;GUISetState()

Do
Until GUIGetMsg() = -3

Func _WM_DEVICECHANGE($hWnd, $iMsg, $wParam, $lParam)
    Switch $wParam
        Case $DBT_DEVICEARRIVAL, $DBT_DEVICEREMOVECOMPLETE

            Local $NewList = _GetDevList()

            Switch $wParam
                Case $DBT_DEVICEARRIVAL

                    Local $tDEV_BROADCAST_VOLUME = DllStructCreate('int Size;int DeviceType;int Reserved;int UnitMask;ushort Flags', $lParam)

                    If DllStructGetData($tDEV_BROADCAST_VOLUME, 'DeviceType') = $DBT_DEVTYP_VOLUME Then
                        $Drive = _ArrayDiff($DevList, $NewList)
                        Switch _WinAPI_GetDriveBusType($Drive & ':')
                            Case $DRIVE_BUS_TYPE_USB
;                                ConsoleWrite('USB drive (' & StringUpper($Drive) & ':) detected.' & @CR)
                                DllCall(@ScriptDir & '\SRD.dll', 'str', 'SafeRemoveDrive', 'str', $Drive)
                        EndSwitch
                    EndIf
            EndSwitch
            $DevList = $NewList
    EndSwitch
    Return 0
EndFunc   ;==>_WM_DEVICECHANGE

Func _ArrayDiff(ByRef $ArrayMin, ByRef $ArrayMax)

    Local $Dup

    For $i = $ArrayMax[0] To 1 Step -1
        $Dup = 1
        For $j = $ArrayMin[0] To 1 Step -1
            If $ArrayMax[$i] = $ArrayMin[$j] Then
                $Dup = 0
                ExitLoop
            EndIf
        Next
        If $Dup Then
            Return $ArrayMax[$i]
        EndIf
    Next
    Return 0
EndFunc   ;==>_ArrayDiff

Func _GetDevList()

    Local $Drv = DriveGetDrive('REMOVABLE')

    If Not IsArray($Drv) Then
        Dim $Drv[1] = [0]
    EndIf
    For $i = 1 To $Drv[0]
        $Drv[$i] = StringLeft($Drv[$i], 1)
    Next
    Return $Drv
EndFunc   ;==>_GetDevList


SRD.dll - где нашел уже не помню.
WinAPIEx.au3
 

ZanMax

Тестер
Сообщения
120
Репутация
5
Нашел вот что в Диспетчере устройств :


Я так думаю для каждой флешки по другому будет ? или я не прав ?
Если да. То как взять даное значение ?
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5 379
Репутация
2 702
Кажется я его взял где-то на Ru-Board. :smile: Но возможно (?) его писал не Rasim.
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8 156
Репутация
2 329
Yashied [?]
Но возможно (?) его писал не Rasim.
Я почти уверен что Dll'ку не он писал, там авторство относится к самому проекту ;)
 

madmasles

Модератор
Глобальный модератор
Сообщения
7 790
Репутация
2 319
scenarist [?]
Вы б хоть проверяли сценарии,перед тем, как публиковать.
А Вы бы внимательнее читали описание перед использованием. :smile:
Расширение стандартной AutoIt библиотеки WinAPI.au3 (под спойлером) [?]
WinAPIEx.au3 теперь не включает в себя APIConstants.au3. Вы должны самостоятельно включить APIConstants.au3 в ваши скрипты с помощью "#Include", если хотите использовать объявленные в нем константы.
 
Верх