找回密码
 加入
搜索
查看: 5179|回复: 9

[系统综合] 求助使用setupAPI操作硬件的问题?

  [复制链接]
发表于 2010-7-9 14:11:05 | 显示全部楼层 |阅读模式
如何使用setupAPI如何直接获取某一类型硬件的ID,比如显卡,和使用setupAPI如何能自动卸载除USB之外的所有幽灵硬件?
发表于 2010-7-9 15:12:49 | 显示全部楼层
顶出P版~
发表于 2010-7-9 16:29:31 | 显示全部楼层
1、无视你的第一个问题。
2、枚举HKLM\SYSTEM\ControlSet002\Enum的所有子键,将子键名称连起来就是设备范例ID,用CM_Locate_DevNode在设备树中定位此设备,如果不能成功,说明这个是幽灵硬件,用_SetupDiCreateDeviceDevs创建设备句柄,_SetupDiRemoveDevice删除(注意第3个参数要设为True)。

评分

参与人数 3威望 +2 金钱 +80 收起 理由
afan + 2
hzxymkb + 50 P版哥终于出来了!
水木子 + 30 学习啦!

查看全部评分

发表于 2010-7-10 09:41:30 | 显示全部楼层
1、无视你的第一个问题。
2、枚举HKLM\SYSTEM\ControlSet002\Enum的所有子键,将子键名称连起来就是设备范 ...
pusofalse 发表于 2010-7-9 16:29


应该是枚举HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet或者根据HKEY_LOCAL_MACHINE\SYSTEM\Select的值来确定控制集号吧。ControlSet002的信息有可能是不准确的。
发表于 2010-7-10 09:53:12 | 显示全部楼层
获取某一类型的硬件ID,以前是直接枚举HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Class\下的值。可是在PE下这些注册表项不全或者完全缺失。如果硬件没安装驱动时CLass下的值也是空的。因而在PE下转向使用devcon.exe hwids 来获取未安装的某一类型的硬件ID。是想直接使用P版的setupAPI来实现,无奈现在还读不懂P大的代码。
发表于 2010-7-10 10:04:29 | 显示全部楼层
例如使用devcon.exe hwids PCI\CC_0100 PCI\CC_0101 PCI\CC_0103 PCI\CC_0104 PCI\CC_0106 PCI\CC_0180 >>hwids.txt 来获取硬盘控制器的ID。
发表于 2010-7-10 10:08:26 | 显示全部楼层
未必[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\PCI\ 下还没有?
P大的解决方案没有问题。
 楼主| 发表于 2010-7-10 10:16:19 | 显示全部楼层
看来论坛高手还真不少!
顶起来!等P版再次出来!
发表于 2010-7-10 14:11:02 | 显示全部楼层
#include <Access.au3>
#include <Array.au3>
#include <file.au3>

Local $regreturn,$aRecord


reg()
_ArrayDisplay($regreturn)
For $n=1 To UBound($regreturn)-1
        id($regreturn[$n])
        _ArrayDisplay($aRecord, "每个值")
Next

;id("PCI\VEN_1002&dev_5940")

Func id($Find)
Dim $yo 
$adSource = @ScriptDir & "\HwidDB.mdb"
$adTable = "easydrv"
$adCol = "hwid"
;$Find = "PCI\VEN_11AB&DEV_4320"
$adFull = 1
$yo = _accessQueryLike($adSource, $adTable, $adCol, $Find, $adFull)
;_ArrayDisplay($yo, "返回值")
If IsArray($yo) Then
For $i=1 To $yo[0]
$aRecord = StringSplit($yo[$i], Chr(28))
;_ArrayDisplay($aRecord, "每个值")
Return $aRecord
Next
EndIf
EndFunc

Func reg()
        Dim $key="HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\PCI",$regreturn[1]
For $i = 1 to 100
$var = RegEnumKey($key, $i)
if @error <> 0 Then ExitLoop
        For $n=1 To 100
                $subvarname=$key&""&$var
                $subvar=RegEnumKey($subvarname,$n)
                If @error <> 0 Then ExitLoop
                        $aaa=RegRead($subvarname&""&$subvar&"","class")
                        ;If $aaa = "system" Or $aaa = "display" Or $aaa = "net"  Or $aaa="hdc"  Or $aaa="media" Or $aaa="usb" Then
                                $hdid=RegRead($subvarname&""&$subvar&"","HardwareID")
                                $bb=StringSplit($hdid,@CRLF)
                                ;_ArrayDisplay($bb)
                                If UBound($bb)>5 Then
                                $cc=StringSplit($bb[1],"&")
                                ;_ArrayDisplay($cc)
                                $regre=$cc[1]&"&"&$cc[2]
                        Else
                                $cc=StringSplit($bb[1],"&")
                                ;_ArrayDisplay($cc)
                                $regre=$cc[1]&"&"&$cc[2]&"&"&$cc[3]
                        EndIf
                                _ArrayAdd($regreturn,$regre)

        Next
next
        Return $regreturn        
EndFunc

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?加入

×
发表于 2010-7-10 20:37:24 | 显示全部楼层
回复 9# 3mile


    比较感兴趣的是HwidDB的创建??
您需要登录后才可以回帖 登录 | 加入

本版积分规则

QQ|手机版|小黑屋|AUTOIT CN ( 鲁ICP备19019924号-1 )谷歌 百度

GMT+8, 2024-12-23 07:22 , Processed in 0.165507 second(s), 28 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表