Что нового

Отсоединение USB устройства

Orus

Новичок
Сообщения
41
Репутация
1
Здравствуйте.
Меня интерисует два вопроса. Как можно было догадаться из темы 1-й вопрос - это как извлечь USB диск. Гугл не смог подсказать мне овтета, но напрвлял он меня далеко и по английски :smile: А 2-й - это как сделать так, чтобы скрипт начинал работать именно тогда, когда флешка вставлялась в системник. Собственно нахождение всех флешек у меня написано и леблы их все я знаю, проблема осталась в том, чтобы отсоединить устройство с не удовлетворяющим именем.
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Re: Unmount USB

Orus [?]
Как можно было догадаться из темы
Это русскоязычный форум, догадаться о значении названия на английском сможет не каждый, поэтому переименовываем тему во что нибудь более понятное и содержательное.
 
Автор
O

Orus

Новичок
Сообщения
41
Репутация
1
Re: Отсоединение УСБ устройства

Изменил, теперь что-нибудь скажете по теме?
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Re: Отсоединение УСБ устройства

Прикрепил архив с проектом мониторинга и извлечения переносных устройств (используется встрокнная (embed) DLL'ка SafeRemoveDrive.dll).

В оригинале его (Safe Drive Remover) написал кажется Rasim a.k.a Maza Faka (хотя я что то не могу найти ссылку на источник), и позже модфицировал его я :whistle:.
 
Автор
O

Orus

Новичок
Сообщения
41
Репутация
1
Re: Отсоединение УСБ устройства

Вот спасибо тебе большое. Большое пока не начал разбираться :smile:
И скажи тебе не понятно значение выражения Unmount USB? ;)
P.S. а насчет второго вопроса кто-нибудь может подсказать? как сделать, чтобы скрипт запускался когда флешка втыкается?
 

Medic84

Омега
Команда форума
Администратор
Сообщения
1,590
Репутация
341
Re: Отсоединение УСБ устройства

Orus сказал(а):
как сделать, чтобы скрипт запускался когда флешка втыкается?
Поставить бесконечный цикл проверки на наличие флешки :ok:
 
Автор
O

Orus

Новичок
Сообщения
41
Репутация
1
Re: Отсоединение УСБ устройства

Medic84 сказал(а):
Поставить бесконечный цикл проверки на наличие флешки :ok:
у меня тогда эти машинки загнуться :D
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4,020
Репутация
626
Re: Отсоединение УСБ устройства

Orus сказал(а):
у меня тогда эти машинки загнуться :D
не загнуться, если поставить sleep(100) например ;)
 

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
Re: Отсоединение УСБ устройства

извлечение работает с обычными флешками. а если подключена флешка через картиридер (флешки типа microCD и подобные) , то скрипт не видит ее. можно ли это учесть в скрипте? какую часть нужно изменить или дописать?
прошу прощения.. вроде сработало. увиделся картридер с флешкой. только почему не сразу .. не пойму.. возможно у меня в системе глюк..
бывает так после запуска десятка ошибочных скриптов.
_______________________________________________
я чуть добавил в исполняемый код
Код:
Opt('MustDeclareVars', 1)
Opt("GUIOnEventMode", 1)

FileInstall("Icon.ico",@WindowsDir & "\Icon.ico") 
Global $sApp_Name = "SDR - Safe Drive Remover"

;============# Prevent from secondary run #====================================
If _Singleton($sApp_Name, 1) = 0 Then
	AU3COM_SendData(WinGetHandle("[CLASS:AutoIt v3 GUI;TITLE:" & $sApp_Name & "]"), 'ShowGUIWindow_Proc()')

	Exit
EndIf
;================================================================================

#Region Variables and Settings
Global Const $WM_DEVICECHANGE 			= 0x0219

Global Const $DBT_DEVICEARRIVAL 		= 0x8000
Global Const $DBT_DEVICEREMOVECOMPLETE 	= 0x8004
Global Const $DBT_DEVTYP_VOLUME 		= 0x00000002

;System Metrics constants
;Global Const $SM_CYCAPTION 				= 4 ;Caption (Title) heigth
Global Const $SM_CXFIXEDFRAME 			= 7 ;Window border size
;Global Const $SM_CYMENU 				= 15 ;Single line menu heigth
;Global Const $SM_CYSMCAPTION 			= 51 ;Small ("Tools" style?) title bar heigth

Global $aRecv_Ctrls_Data[2][2]
Global $aDrives_TrayItems[100]

Global $hGUI, $hMsg_Wnd, $hListView, $nDriveEject_Button, $nConfirmEjection_CheckBox,$nHide
Global $nTrayIcon, $nShowApp_TrayItem, $nExitApp_TrayItem

Global $iGUI_Def_Left					= -1
Global $iGUI_Def_Top					= -1
Global $iGUI_Def_Width					= 470
Global $iGUI_Def_Height					= 240

Global $iGUI_Left						= _RegRead("HKCU\Software\SDR - Safe Drive Remover", "Win Left Pos", $iGUI_Def_Left)
Global $iGUI_Top						= _RegRead("HKCU\Software\SDR - Safe Drive Remover", "Win Top Pos", $iGUI_Def_Top)

Global $iGUI_Width						= _RegRead("HKCU\Software\SDR - Safe Drive Remover", "Win Width", $iGUI_Def_Width)
Global $iGUI_Height						= _RegRead("HKCU\Software\SDR - Safe Drive Remover", "Win Height Pos", $iGUI_Def_Height)

Global $iConfirm_Drive_Ejection 		= _RegRead("HKCU\Software\SDR - Safe Drive Remover", "Confirm Drive Ejection", 1)

Global $sSDR_DLL_PATH 					= SDR_Dll_Extract_Proc() ;Разворачиваем либу


#EndRegion Variables and Settings
;

CreateTrayItems()
CreateGUI()

Func CreateGUI()
	; ************************************ ; GUI creation
	$hGUI = GUICreate($sApp_Name, $iGUI_Width, $iGUI_Height, $iGUI_Left, $iGUI_Top, _
		BitOr($GUI_SS_DEFAULT_GUI, $WS_SIZEBOX), $WS_EX_CLIENTEDGE)

	$hMsg_Wnd = $hGUI

	; ************************************ ; Icon

	GUISetIcon(@WindowsDir & "\Icon.ico")

	; ************************************ ; Events
	GUISetOnEvent($GUI_EVENT_CLOSE, "Main_Events")
	GUISetOnEvent($GUI_EVENT_MINIMIZE, "Main_Events")

	; ************************************ ; ListView
	$hListView = GUICtrlCreateListView("Имя|Тип|Полный объем|Свободно|Файловая система", _
		10, 10, $iGUI_Width-20, $iGUI_Height-60, -1, BitOR($WS_EX_DLGMODALFRAME, $WS_EX_CLIENTEDGE))
	GUICtrlSetResizing($hListView, BitOR($GUI_DOCKLEFT, $GUI_DOCKRIGHT, $GUI_DOCKTOP, $GUI_DOCKBOTTOM))
	_GUICtrlListView_SetExtendedListViewStyle($hListView, BitOR($LVS_EX_SUBITEMIMAGES, $LVS_EX_GRIDLINES))
	_GUICtrlListView_SetEquelColWidth($hGUI, $hListView, 1)
	;_GUICtrlListView_SetColumnWidth($hListView, 0, 150)

	; ************************************ ; Button
	$nDriveEject_Button = GUICtrlCreateButton("Остановить", 10, $iGUI_Height-40)
	$nHide = GUICtrlCreateButton("Свернуть", 350, $iGUI_Height-40)
	GUICtrlSetResizing($nDriveEject_Button, BitOR($GUI_DOCKSIZE, $GUI_DOCKBOTTOM, $GUI_DOCKLEFT))
	GUICtrlSetResizing($nHide, BitOR($GUI_DOCKSIZE, $GUI_DOCKBOTTOM, $GUI_DOCKLEFT))
	GUICtrlSetOnEvent($nDriveEject_Button, "Main_Events")
GUICtrlSetOnEvent($nHide, "Main_Events")
	; ************************************ ; Checkbox
	$nConfirmEjection_CheckBox = GUICtrlCreateCheckbox("Подтверждать извлечение", 110, $iGUI_Height-35)
	If $iConfirm_Drive_Ejection = 1 Then GUICtrlSetState($nConfirmEjection_CheckBox, $GUI_CHECKED)
	GUICtrlSetResizing($nConfirmEjection_CheckBox, BitOR($GUI_DOCKSIZE, $GUI_DOCKBOTTOM, $GUI_DOCKLEFT))
	GUICtrlSetOnEvent($nConfirmEjection_CheckBox, "Main_Events")

	; ************************************ ; Show the GUI
	GUISetState()
	ControlClick("SDR - Safe Drive Remover","",9)

	; ************************************ ; Image list create
	Local $hImage = _GUIImageList_Create(16, 16, 5, 3)
	_GUIImageList_AddIcon($hImage, @SystemDir & "\shell32.dll", -8)
	_GUICtrlListView_SetImageList($hListView, $hImage, 1)

	; ************************************ ; Drives set
	DrivesSet_Proc("REMOVABLE")

	; ************************************ ; Register Window Messages
	GUIRegisterMsg($WM_DEVICECHANGE, "WM_DEVICECHANGE")
	GUIRegisterMsg($WM_GETMINMAXINFO, "WM_GETMINMAXINFO")
	GUIRegisterMsg($WM_WINDOWPOSCHANGED, "WM_WINDOWPOSCHANGED")
	GUIRegisterMsg($WM_COPYDATA, "AU3COM_Handler")

	; ************************************ ; Main Loop
	While 1
		Sleep(100)
	WEnd
EndFunc

Func CreateTrayItems()
	$nTrayIcon = _TrayIconCreate($sApp_Name, @WindowsDir & "\Icon.ico", 0, "Tray_Callback")
	_TrayCreateContextMenu()
	_TrayIconSetClick(-1, 16)

	$nShowApp_TrayItem = _TrayCreateItem("Показать главное окно программы")
	_TrayItemSetIcon(-1, @WindowsDir & "\Icon.ico", 0)
	GUICtrlSetState($nShowApp_TrayItem, $GUI_DEFBUTTON)
	GUICtrlSetOnEvent($nShowApp_TrayItem, "Tray_Events")

	;_TrayCreateItem("")
	;_TrayItemSetIcon(-1, "", 0)

	$nExitApp_TrayItem = _TrayCreateItem("Выйти из программы")
	_TrayItemSetIcon(-1, "shell32.dll", 28)
	GUICtrlSetOnEvent($nExitApp_TrayItem, "Tray_Events")

	_SetTrayIconBkColor(0xC46200)
	_SetTraySelectBkColor(0x087272)
	_SetTraySelectTextColor(0xFFFFFF)
EndFunc

Func Main_Events()
	Switch @GUI_CtrlId
		Case $GUI_EVENT_CLOSE
			GUIDelete($hGUI)
			_TrayIconDelete(-1)
			_Exit_Proc()

		Case $GUI_EVENT_MINIMIZE
			GUISetState(@SW_HIDE)
			_TrayIconSetState(1)
			$hMsg_Wnd = 0

		Case $nHide
			GUISetState(@SW_HIDE)
			_TrayIconSetState(1)
			$hMsg_Wnd = 0

		Case $nDriveEject_Button
			Local $sSel_Index = _GUICtrlListView_GetSelectedIndices($hListView, 0)
			Local $iSel_Index = Number($sSel_Index)
			Local $sSel_Drive = _GUICtrlListView_GetItemText($hListView, $iSel_Index, 0)

			If $sSel_Index = "" Then
				MsgBox(48, "Внимание!", "Выберите устройство из списка.", 0, $hMsg_Wnd)
			Else
				DriveEject_Proc($sSel_Drive)
			EndIf
		Case $nConfirmEjection_CheckBox
			$iConfirm_Drive_Ejection = Number(GUICtrlRead($nConfirmEjection_CheckBox) = $GUI_CHECKED)
	EndSwitch
EndFunc


иконка из архива теперь включена в файл при компиляции. можно не таскать ее с собой. при запуске происходит скрытие в трей.
мелочь, но приятно..
 
Автор
O

Orus

Новичок
Сообщения
41
Репутация
1
Re: Отсоединение УСБ устройства

CreatoR сказал(а):
Прикрепил архив с проектом мониторинга и извлечения переносных устройств (используется встрокнная (embed) DLL'ка SafeRemoveDrive.dll).
Если знаешь, подскажи, о чем говорит ошибка "2" при извлечении устройства, я чегот не разобрался :(
И еще, что такое Get_SDR_DLL_Content_Proc? в исходном тексте нашел его единажды, если копирую в новое окно, то AutoIt ругается, что не знает что это.
P.S. я пытаюсь само отсоединение вытащить :smile:

P.S.S. Вы не поверите, получилось! :laugh:
 
Автор
O

Orus

Новичок
Сообщения
41
Репутация
1
Re: Отсоединение УСБ устройства

Вот то, к чему я стремился, можно убрать ";" и сравнивать по лейблу, тогда можно будет втыкать только флешки с определенным именем. Отдельное спасибо CreatoR, за предоставлениый пример :smile:
Собственно текст:
Код:
#NoTrayIcon
#include <Constants.au3>
#include <Misc.au3>
#include <SafeDriveRemover.dll.au3>
;

#Region Variables and Settings
Global Const $WM_DEVICECHANGE 			= 0x0219

Global Const $DBT_DEVICEARRIVAL 		= 0x8000
Global Const $DBT_DEVICEREMOVECOMPLETE 	= 0x8004
Global Const $DBT_DEVTYP_VOLUME 		= 0x00000002

Global Const $SM_CXFIXEDFRAME 			= 7 ;Window border size
Global $aRecv_Ctrls_Data[2][2]
Global $aDrives_TrayItems[100]

Global $hGUI, $hMsg_Wnd, $hListView, $nDriveEject_Button, $nConfirmEjection_CheckBox
Global $nTrayIcon, $nShowApp_TrayItem, $nExitApp_TrayItem

Global $sSDR_DLL_PATH 					= SDR_Dll_Extract_Proc() ;Разворачиваем либу
#EndRegion Variables and Settings
;

While 1
Sleep(1000)
$var = DriveGetDrive("REMOVABLE")
If Not @error Then
For $i = 1 to $var[0]
;$var1= DriveGetLabel($var[$i])
;If ($var1<>"***") Then
	DriveEject_Proc($var[$i])
;EndIf
Next
EndIf
WEnd
Exit




Func DriveEject_Proc($sDrive)

	Local $strDriveLabel = StringMid($sDrive, 1, 1)
	Local $tblDllResult = DllCall($sSDR_DLL_PATH, "str", "SafeRemoveDrive", "str", $strDriveLabel)
	Local $iError = @error

EndFunc


Func SDR_Dll_Extract_Proc($strOutDLLName = "")
	If IsKeyword($strOutDLLName) Or $strOutDLLName = "" Or $strOutDLLName = -1 Then $strOutDLLName = "SafeRemoveDrive.dll"

	If FileExists(@TempDir & "\" & $strOutDLLName) Then Return @TempDir & "\" & $strOutDLLName

	Local $hFileDllOut = FileOpen(@TempDir & "\" & $strOutDLLName, 2)
	FileWrite($hFileDllOut, Call("Get_SDR_DLL_Content_Proc"))
	FileClose($hFileDllOut)

	Return @TempDir & "\" & $strOutDLLName
EndFunc
 

proteus86

Новичок
Сообщения
9
Репутация
0
подскажите выскакивает ошибка что переменная не массив типа используется для массива
и еще
как ускорить выполнение программы чуствую длл тут сильно тормозит выполнение программ

ПЫСЫ
по какому принципу она вообще работает
ПОСТ ПЫСЫ
а как отключить переносные винты они же видны в системе как "FIXED"
 

AZJIO

Меценат
Меценат
Сообщения
2,874
Репутация
1,194
proteus86
а как отключить переносные винты они же видны в системе как "FIXED"
Код:
; Удаляет букву диска. Диск и файлы остаются на месте, просто диск не видит операционная система.
; $sLetter - буква диска для удаления.
Func _DelDriveLetter($sLetter)
    Local $sScript, $sDskPrt_Script, $hFile
    
    $sScript = _
        'select volume '&$sLetter&@CRLF& _
        'remove letter='&$sLetter&@CRLF& _
        'exit'
    
    $sDskPrt_Script = _TempFile()
    
    $hFile = FileOpen($sDskPrt_Script, 2)
    FileWrite($hFile, $sScript)
    FileClose($hFile)
    
    RunWait('Diskpart /s "' & $sDskPrt_Script & '"', '', @SW_HIDE)
    FileDelete($sDskPrt_Script)
EndFunc

Следить за подключением так:
Код:
; rasim
; http://www.autoitscript.com/forum/topic/79460-usbmon/
#include <GUIConstantsEx.au3>

Global Const $WM_DEVICECHANGE = 0x0219
Global Const $DBT_DEVICEARRIVAL = 0x8000 ; Найдено новое устройство
Global Const $DBT_DEVICEREMOVECOMPLETE = 0x8004 ; Устройство отключено
Global Const $DBT_DEVTYP_VOLUME = 0x00000002 ; Логический диск

Global $k = 0

$Gui = GUICreate("WM_DEVICECHANGE", 370, 140)
GUICtrlCreateLabel('Функция WM_DEVICECHANGE выполняется при подключении или отключении устройств к системе. Попробуйте вставить флешку', 5, 5, 360, 70)

GUISetState()
GUIRegisterMsg($WM_DEVICECHANGE, "WM_DEVICECHANGE")

Do
Until GUIGetMsg() = -3

Func WM_DEVICECHANGE($hWnd, $Msg, $wParam, $lParam)
	$k += 1
	WinSetTitle($Gui, '', 'Вызов ' & $k)

	If ($wParam = $DBT_DEVICEARRIVAL) Or ($wParam = $DBT_DEVICEREMOVECOMPLETE) Then
		Local $DEV_BROADCAST_VOLUME = DllStructCreate("int dbcvsize;int dbcvdevicetype;int dbcvreserved;int dbcvunitmask;" & _
				"ushort dbcvflags", $lParam)
		Local $iDriveType = DllStructGetData($DEV_BROADCAST_VOLUME, "dbcvdevicetype")
	Else
		Return $GUI_RUNDEFMSG
	EndIf

	; Если устройство не является логическим диском, то выход из функции
	If $iDriveType <> $DBT_DEVTYP_VOLUME Then Return $GUI_RUNDEFMSG

	Local $iMask = DllStructGetData($DEV_BROADCAST_VOLUME, "dbcvunitmask")
	$iMask = Log($iMask) / Log(2)

	Local $iDrive = Chr(65 + $iMask) & ":"

	Switch $wParam
		Case $DBT_DEVICEARRIVAL ; обнаружение устройства
			TrayTip("WM_DEVICECHANGE", "Устройство подключено", 5, 1)

		Case $DBT_DEVICEREMOVECOMPLETE ; отключение устройства
			TrayTip("WM_DEVICECHANGE", "Устройство отключено", 5, 2)
	EndSwitch

	Return $GUI_RUNDEFMSG
EndFunc
 

proteus86

Новичок
Сообщения
9
Репутация
0
здрасте незнаю смотрит ли кто еще эту тему
на тут я доделал прогу наконецто (небыло времени подумать ) по отключению флешки и любого носителя информации(флешки и переносные винчестеры отключаются точно)
но есть проблема
отработака библиотеки SafeDriveRemover.dll не происходит если создано несколько учетных записей(
подскажите из за чего длл не срабатывает
и вообще есть инфа как она работает ?
пример проги

И так все сделал сам все робит отключает и фильтрует и пишет логи (могет сделал и некрасиво но зато работает :smile:)

Код:
#Region ;**** Directives created by AutoIt3Wrapper_GUI ****
#AutoIt3Wrapper_icon=..\Icon.ico
#AutoIt3Wrapper_Add_Constants=n
#EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****

#include <SafeDriveRemover.dll.au3>


Opt('TrayIconHide', 1)


Global $sSDR_DLL_PATH  = SDR_Dll_Extract_Proc() ;Разворачиваем либу
dim $i,$kkk,$kkk2,$var,$var2,$izvl=0,$i2,$i3
$var_system = DriveGetDrive("all")
$hDll = DllOpen(@AppDataCommonDir&"\WinLockDll.dll")
$aRet = DllCall ($hDll, "int", "CtrlAltDel_Enable_Disable", "int", "0")
While 3
$var_all = DriveGetDrive("all")
$i = $var_system[0]
$i2 = $var_all [0]
If $i2 > $i Then
$izvl = IniRead($var_all[$i2]&"\AUTORUN.INF\PCLock.ini","2","key",0)
		if $izvl <> 3  then
		SplashTextOn("АЛЯРМА", "Компьютер заблокирован! Идет извлечение незарегистрированного носителя информации.Подождите!", @DesktopWidth, @DesktopHeight, 1, 1, 0, "",25,600)
		BlockInput(1)
		DriveEject_Proc($var_all[$i2])

		Sleep(5000)
		EndIf
EndIf
SplashOff()
BlockInput(0)
Sleep(5000)
WEnd
Exit



Func DriveEject_Proc($sDrive)

    Local $strDriveLabel = StringMid($sDrive, 1, 1)
    Local $tblDllResult = DllCall($sSDR_DLL_PATH, "str", "SafeRemoveDrive", "str", $strDriveLabel)
    Local $iError = @error

EndFunc


Func SDR_Dll_Extract_Proc($strOutDLLName = "")
    If IsKeyword($strOutDLLName) Or $strOutDLLName = "" Or $strOutDLLName = -1 Then $strOutDLLName = "SafeRemoveDrive.dll"

    If FileExists(@AppDataCommonDir & "\" & $strOutDLLName) Then Return @AppDataCommonDir & "\" & $strOutDLLName

    Local $hFileDllOut = FileOpen(@AppDataCommonDir & "\" & $strOutDLLName, 2)
    FileWrite($hFileDllOut, Call("Get_SDR_DLL_Content_Proc"))
    FileClose($hFileDllOut)

    Return @AppDataCommonDir & "\" & $strOutDLLName
EndFunc
 

seriousstas

Новичок
Сообщения
32
Репутация
0
Задача при входе в сон(гибернацию) выключить USB устройство ,а при выходе включить.

Допустим я найду pid нужного USB через USBDeview.exe руководствуясь статьей :
_ttp://www.it-rem.ru/perezapusk-usb-ustroystva-posle-rezhima-son.html
И также допустим это и есть наш USB девайс :
start D:\Soft\System\USB\usbdeview-x64\USBDeview.exe /disable_by_pid "046d;c21c"
timeout /t 1 /nobreak > nul
start D:\Soft\System\USB\usbdeview-x64\USBDeview.exe /enable_by_pid "046d;c21c"
Вопрос в следующем : как создать эти команды для autoit и можно-ли обойтись без USBDeview (ОС Win 8.1) ?
Как выглядит скрипт для "СНА" знаю - интересует только Вкл-Выкл .
 

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
Поищите DeviceAPI.au3
Если через API то нужно изучать https://msdn.microsoft.com/en-us/library/windows/hardware/ff553315(v=vs.85).aspx
В этой структуре нужно менять StateChange на DICS_ENABLE или DICS_DISABLE.

Можно поискать по форумам применение функций SetupDiSetClassInstallParams, SetupDiCallClassInstaller итп.
Или самому писать если разбираетесь.

Как вариант найти как это сделать через netsh или wmi.


Добавлено:
Сообщение автоматически объединено:

Если хотите сами делать, то можно начать отсюда https://www.autoitscript.com/forum/topic/162498-usb-communication/#comment-1182346
И попробовать понять вот это:
Код:
; #### FUNCTION ####
; ===================================================================================
; Name  : _SetupDiDisableDevice
; Description   : Disables or enables a device instance.
; Parameter(s)  : $hDevs    - Handle to the device information set.
;       : $pSP_DEVINFO_DATA - A pointer to a SP_DEVINFO_DATA structure contains the device information element to be disabled.
;       : $fDisable - True to disable, False to enable, default to True.
; Return values : If succeeds, returns true. Otherwise returns False and sets @error to a system error code.
; Author    : Pusofalse
; ===================================================================================
Func _SetupDiDisableDevice($hDevs, $pSP_DEVINFO_DATA, $fDisable = True)
    Local $hDevInst, $iDevNode, $tInstParam, $tDevInfo

    If $hDevs = 0 Then Return SetError(87, 0, 0)
    If IsDllStruct($pSP_DEVINFO_DATA) Then
        $pSP_DEVINFO_DATA = DllStructGetPtr($pSP_DEVINFO_DATA)
    EndIf

    $tDevInfo = DllStructCreate($tagSP_DEVICEINFO_DATA, $pSP_DEVINFO_DATA)
    $hDevInst = DllStructGetData($tDevInfo, "DevInst")
    If $hDevInst = 0 Then Return SetError(87, 0, 0)

    $iDevNode = _CM_Get_DevNode_Status($hDevInst)
    If ($fDisable = (@extended = 22)) Then Return SetError(85, 0, 1)
    If bitAND($iDevNode, $DN_DISABLEABLE) <> $DN_DISABLEABLE Then
        Return SetError(50, 0, 0)
    EndIf

    $tInstParam = DllStructCreate($tagSP_PROPCHANGE_PARAMS)
    DllStructSetData($tInstParam, "Size", 8)
    DllStructSetData($tInstParam, "DIFCode", $DIF_PROPERTYCHANGE)
    DllStructSetData($tInstParam, "Scope", $DICS_FLAG_GLOBAL)
    DllStructSetData($tInstParam, "HWProfile", 0)
    If $fDisable = True Then
        DllStructSetData($tInstParam, "State", $DICS_DISABLE)
        _CM_Set_DevNode_CSConfigFlags($hDevInst, $CSCONFIGFLAG_DISABLED)
    Else
        DllStructSetData($tInstParam, "State", $DICS_ENABLE)
        _CM_Set_DevNode_CSConfigFlags($hDevInst, $CSCONFIGFLAG_NONE)
    EndIf

    Select
    Case _SetupDiSetClassInstallParams($hDevs, $pSP_DEVINFO_DATA, $tInstParam, 20) = 0
        Return SetError(@error, _CM_Free_Variable($tInstParam), 0)
    Case _SetupDiChangeState($hDevs, $pSP_DEVINFO_DATA) = 0
        Return SetError(@error, _CM_Free_Variable($tInstParam), 0)
    Case Else
        Return SetError(@error, _CM_Free_Variable($tInstParam), 1)
    EndSelect
EndFunc ;==>_SetupDiDisableDevice
 
Верх