谁能提供下能禁用/启用设备的udf或 除了 devcon 外部程序?
devcon的兼容性太差了,改系统文件的话,需要179+57kb的大小,郁闷有没有其他好点的
我现在能得知就是硬件名和由以下得的DriverDesc
$colItems = $objWMIService.ExecQuery("Select * From Win32_NetworkAdapterConfiguration Where IPEnabled = True And Index='" & $CardIndex & "'")
For $objItem In $colItems
$rKey = StringMid($objItem.Caption, 6, 4)
Next
$Path = "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Class\{4D36E972-E325-11CE-BFC1-08002BE10318}\"
$key = RegRead($Path & $rkey, "DriverDesc")
Return $Key 要是我有钱就好了,就能买下http://www.autoitx.com/forum.php?mod=viewthread&tid=10139&page=1&fromuid=7644076#pid94104
其中就有udf。。。。哭 我也穷呀
一个程序20元没有人看呀 突然发现了这个http://www.autoitx.com/forum.php?mod=viewthread&tid=9302&page=1&fromuid=7644076#pid80048
去试试先
无$tagSPDEVINFODATA,无法使用,奇怪了
还需要Setupapi.dll。。。额
不合格 e ,自顶 你能得到设备ID吗?如果能,我给你写一个。
通过设备名称来禁用,会存在通用性问题,因为DriverDesc得到的只是设备的描述或显示的友好名称,如果两个不同的设备用到了同样的名称,那在这种情况下,到底要禁用哪一个,虽然这样的几率很小。
而设备ID在系统中是唯一的,大凡禁用、启用硬件设备的程序,都是通过设备ID(Device instance ID)实现的,没有哪个程序会通过某个设备的描述来对其禁用、启用。 读懂这个你就能办到了
http://www.autoitx.com/forum.php?mod=viewthread&tid=9302&page=1&fromuid=7644076#pid80048 读懂这个你就能办到了
http://www.autoitx.com/forum.php?mod=viewthread&tid=9302&page=1&fromuid=7644076#pid80048
bing614 发表于 2009-10-7 03:35 http://www.autoitx.com/images/common/back.gif
这帖子的$tagSPDEVINFODATA,我这没有。。。 你能得到设备ID吗?如果能,我给你写一个。
通过设备名称来禁用,会存在通用性问题,因为DriverDesc得到的只是设备的描述或显示的友好名称,如果两个不同的设备用到了同样的名称,那在这种情况下,到底要禁用哪一个 ...
pusofalse 发表于 2009-10-7 01:46 http://www.autoitx.com/images/common/back.gif
设备id要怎么获取啊?
只要能获取,我就可以写
额,我先去看看 PCI\VEN_10EC&DEV_8167&SUBSYS_E0001458&REV_10\4&BC67B8D&0&28F0: Realtek RTL8169/8110 Family Gigabit Ethernet NIC
这里面应该有吧
Const $DN_DISABLEABLE = 0x02000
Const $DICS_ENABLE = 0x0001
Const $DICS_DISABLE = 0x0002
Const $DICS_FLAG_GLOBAL = 0x0001
Const $DICS_FLAG_CONFIGSPECIFIC = 0x0002
Const $DIF_PROPERTYCHANGE = 0x0012
Const $tagSP_DEVINFO_DATA = "dword Size;byte Guid;dword DevInst;ulong_ptr Reserved"
Const $tagSP_CLASSINSTALL_HEADER = "dword Size;dword DIFCode"
Const $tagSP_PROPCHANGE_PARAMS = $tagSP_CLASSINSTALL_HEADER & ";dword State;dword Scope;dword HWProfile"
Local $sDevID = "PCI\VEN_10EC&DEV_8167&SUBSYS_E0001458&REV_10\4&BC67B8D&0&28F0"
If _DisableDevice($sDevID, True) Then ; True to disable, False to enable.
Msgbox(64, "Success", $sDevID & " : Success.")
Else
Msgbox(48, "Failure", $sDevID & " : Failure, error code: " & @error)
EndIf
Func _DisableDevice($sDevInstID, $fDisable = True)
Local $hDevs, $tDevInfo, $pDevInfo, $hDevInst, $iResult, $iDevNode, $tInstParam
$iResult = DllCall("Setupapi.dll", "ptr", "SetupDiCreateDeviceInfoList", "ptr", 0, "hWnd", 0)
If $iResult = 0 Then Return SetError(__GetLastError(0), 0, 0)
$hDevs = $iResult
$tDevInfo = DllStructCreate($tagSP_DEVINFO_DATA)
$pDevInfo = DllStructGetPtr($tDevInfo)
DllStructSetData($tDevInfo, "Size", DllStructGetSize($tDevInfo))
$iResult = DllCall("Setupapi.dll", "int", "SetupDiOpenDeviceInfo", "ptr", $hDevs, _
"str", $sDevInstID, "hWnd", 0, "dword", 0, "ptr", $pDevInfo)
If $iResult = 0 Then Return SetError(__GetLastError($hDevs), 0, 0)
$iResult =DllCall("Setupapi.dll", "int", "SetupDiSetSelectedDevice" ,"ptr", $hDevs, "ptr", $pDevInfo)
If $iResult = 0 Then Return SetError(__GetLastError($hDevs), 0, 0)
$hDevInst = DllStructGetData($tDevInfo, "DevInst")
$iResult = DllCall("Setupapi.dll", "long", "CM_Get_DevNode_Status", "ulong*", 0, _
"ulong*", 0, "dword", $hDevInst, "ulong", 0)
If $iResult Then Return SetError($iResult, 0, 0 * __GetLastError($hDevs))
If ($fDisable = ($iResult = 22)) Then Return SetError(85, 0, 1)
$iDevNode = $iResult
If bitAND($iDevNode, $DN_DISABLEABLE) <> $DN_DISABLEABLE Then
Return SetError(50, 0, 0 * __GetLastError($hDevs))
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)
DllStructSetData($tInstParam, "State", $DICS_DISABLE)
If $fDisable = False Then DllStructSetData($tInstParam, "State", $DICS_ENABLE)
$iResult = DllCall("Setupapi.dll", "int", "SetupDiSetClassInstallParams", "ptr", $hDevs, _
"ptr", $pDevInfo, "ptr", DllStructGetPtr($tInstParam), "dword", 20)
If $iResult = 0 Then Return SetError(__GetLastError($hDevs), 0, 0)
$iResult = DllCall("Setupapi.dll", "int", "SetupDiChangeState", _
"ptr", $hDevs, "ptr", $pDevInfo)
If $iResult = 0 Then Return SetError(__GetLastError($hDevs), 0, 0)
$tDevInfo = 0
$tInstParam = 0
Return SetError(__GetLastError($hDevs) * 0, 0, 1)
EndFunc ;==>_DisableDevice
Func __GetLastError($hDevs)
Local $iResult = DllCall("Kernel32.dll", "long", "GetLastError")
If $hDevs <> 0 Then DllCall("Setupapi.dll", "int", "SetupDiDestroyDeviceInfoList", "ptr", $hDevs)
Return $iResult
EndFunc ;==>__GetLastError
以上代码适用于所有支持禁用操作的硬件设备。 非常感谢,又没其他方式得到设备ID
我可以知道设备名。。。 得到设备范例ID的方法多得很。
1: 读取注册表。
2: WMI。
3: 第三方。
4: API。
5: 。。。
1, SetupDiClassGuidsFromName 返回设备的类别GUID。比如要获取某显卡的信息,给此函数指定"Display",网卡则对应"NET",磁盘对应"DiskDrive"。
2, SetupDiGetClassDevs 返回设备信息集。传递第1步中得到的GUID给此函数,返回设备信息集合句柄。
3, SetupDiEnumDeviceInfo 枚举设备信息集合中的设备,返回SP_DEVICEINFO_DATA指针。
4, SetupDiGetDeviceRegistryProperty, 传递SP_DEVICEINFO_DATA指针给此函数,获取设备属性,其中包含设备ID。
5, SetupDiDestroyDeviceInfoList 销毁第2步中得到的设备信息集合句柄。 非常感谢,待会研究下 OK,解决了,用$objItem.PNPDeviceID来获去设备ID
页:
[1]
2