gz13802424 发表于 2019-1-10 15:25:23

SetupAPI匹配win10-64位(部分)

本帖最后由 gz13802424 于 2019-1-10 22:21 编辑

SetupAPI 里面包含了很多很实用的API调用,但是SetupAPI是 11/20/2009 书写的,到现在已经有10年时间了,已经没办法完全匹配到最新的Win10系统

我在日常使用时,把平时自己使用到的几个API调用重新修改了,使之能在Win7 32位(64位)、Win10 32位(64位)下正常使用

并且在这里还要多谢 “haijie1223” 大哥的指点

不多废话了,直接上干货

一、_CM_Get_Process_Heap( “haijie1223” 大哥的指点)
原定义
$iResult = DllCall("Kernel32.dll", "long", "GetProcessHeap")

修改为
$iResult = DllCall("Kernel32.dll", "handle", "GetProcessHeap")

二、_SetupDiEnumDeviceInfo(自己折腾出来的)
原定义
DllStructSetData($tSP_DEVINFO_DATA, "Size", 28)
修改为
DllStructSetData($tSP_DEVINFO_DATA, "Size",DllStructGetSize($tSP_DEVINFO_DATA))

三、_SetupDiOpenDeviceInfo(自己折腾出来的)
原定义
DllStructSetData($tSP_DEVINFO_DATA, "Size", 28)
修改为
DllStructSetData($tSP_DEVINFO_DATA, "Size",DllStructGetSize($tSP_DEVINFO_DATA))


四、 _SetupDiCreateDeviceInfo(自己折腾出来的)
原定义
DllStructSetData($tSP_DEVINFO_DATA, "Size", 28)
修改为
DllStructSetData($tSP_DEVINFO_DATA, "Size",DllStructGetSize($tSP_DEVINFO_DATA))

五、_SetupDiGetDeviceInterfaceDetail(自己折腾出来的)
原定义
DllStructSetData($tSP_DEVINFO_DATA, "Size", 28)
修改为
DllStructSetData($tSP_DEVINFO_DATA, "Size",DllStructGetSize($tSP_DEVINFO_DATA))

六、_SetupDiOpenDeviceInterface(自己折腾出来的)
原定义
DllStructSetData($tSP_DEVINFO_DATA, "Size", 28)
修改为
DllStructSetData($tSP_DEVINFO_DATA, "Size",DllStructGetSize($tSP_DEVINFO_DATA))

七、_SetupDiRegisterDeviceInfo(自己折腾出来的)
原定义
DllStructSetData($tSP_DEVINFO_DATA, "Size", 28)
修改为
DllStructSetData($tSP_DEVINFO_DATA, "Size",DllStructGetSize($tSP_DEVINFO_DATA))

八、_SetupDiCreateDeviceInterface(自己折腾出来的)
原定义
DllStructSetData($tSP_DEVINFO_DATA, "Size", 28)
修改为
DllStructSetData($tSP_DEVINFO_DATA, "Size",DllStructGetSize($tSP_DEVINFO_DATA))

九、_SetupDiEnumDeviceInterfaces(自己折腾出来的)
原定义
DllStructSetData($tSP_DEVINFO_DATA, "Size", 28)
修改为
DllStructSetData($tSP_DEVINFO_DATA, "Size",DllStructGetSize($tSP_DEVINFO_DATA))

十、_SetupDiGetClassImageList(自己折腾出来的,一直没直接验证是正确但是也没有异常,这一条的修改我自己标注为 “存疑”)
原定义
DllStructSetData($tSP_DEVINFO_DATA, "Size", 12)
修改为
DllStructSetData($tSP_DEVINFO_DATA, "Size",DllStructGetSize($tSP_DEVINFO_DATA))

---------------------------------------------------分----割----线---------------------------------------------------
P版曾经发了一个AU3书写服务形态的例程,但是没有匹配到64位编译模式,我自己也折腾了一下
原定义
$pServiceTable = _ServiceHeapAlloc(32)
$tServiceTable = DllStructCreate($tagSERVICE_TABLE_ENTRY, $pServiceTable)
DllStructSetData($tServiceTable, "ServiceName", $pServiceTable + 16)
DllStructSetData($tServiceTable, "ServiceMain", $pServiceMain)

$tServiceName = DllStructCreate("char ServiceName[16]", $pServiceTable + 16)
DllStructSetData($tServiceName, "ServiceName", "AutoIt3Service")

$tServiceStatus = DllStructCreate($tagSERVICE_STATUS)
$pServiceStatus = DllStructGetPtr($tServiceStatus)
DllStructSetData($tServiceStatus, "ServiceType", 16)
DllStructSetData($tServiceStatus, "ControlsAccepted", 3)


修改为
$pServiceTable = _ServiceHeapAlloc(32 * (@AutoItX64 + 1))
$tServiceTable = DllStructCreate($tagSERVICE_TABLE_ENTRY, $pServiceTable)
DllStructSetData($tServiceTable, "ServiceName", $pServiceTable + 16 * (@AutoItX64 + 1))
DllStructSetData($tServiceTable, "ServiceMain", $pServiceMain)

$tServiceName = DllStructCreate("char ServiceName[" & 16 * (@AutoItX64 + 1) & "]", $pServiceTable + 16 * (@AutoItX64 + 1))
DllStructSetData($tServiceName, "ServiceName", $sServiceName)

$tServiceStatus = DllStructCreate($tagSERVICE_STATUS)
$pServiceStatus = DllStructGetPtr($tServiceStatus)
DllStructSetData($tServiceStatus, "ServiceType", 16 * (@AutoItX64 + 1))
DllStructSetData($tServiceStatus, "ControlsAccepted", 3)

haijie1223 发表于 2019-1-10 15:30:13

谁是流氓发

gz13802424 发表于 2019-1-10 15:32:07

SetupAPI 接近7000行的代码,我因兴趣而半路出家学习编程,英文底子弱,实在是没办法去从头到尾梳理一次,所以在这里只是贴出部分代码,希望能抛砖引玉,要是能引来某位大神把SetupAPI重新梳理一下那才是真正造福大众

gz13802424 发表于 2019-1-10 15:41:53

haijie1223 发表于 2019-1-10 15:30
谁是流氓发

刚入坑,对各位大神还不太了解,在这里引用了他在QQ的昵称“流氓发”
他QQ的头像和你在论坛上的头是一样,你自己自我介绍一下



redapple2008 发表于 2019-1-10 16:33:41

高手啊,大神,应该有人更新一下了。

haijie1223 发表于 2019-1-10 17:39:59

gz13802424 发表于 2019-1-10 15:41
刚入坑,对各位大神还不太了解,在这里引用了他在QQ的昵称“流氓发”
他QQ的头像和你在论坛上的头是一样 ...

不认识。。。

yglgogogo 发表于 2019-1-14 22:31:23

最近咋了都在玩这个。。。

gz13802424 发表于 2019-1-14 23:18:51

yglgogogo 发表于 2019-1-14 22:31
最近咋了都在玩这个。。。

看到你发的贴子了,先多谢

有空看看我这个http://www.autoitx.com/thread-71064-1-1.html,帮忙把下面的调用语法写一下(关键是入数参数结构和返回参数结构)
               "ApplyChanges hresult(dword);" & _
                "GetWallpaper hresult(wstr;uint;dword);" & _
                "SetWallpaper hresult(wstr;dword);" & _
                "GetWallpaperOptions hresult(struct*;dword);" & _
                "SetWallpaperOptions hresult(struct*;dword);" & _
                "GetPattern hresult(wstr;uint;dword);" & _
                "SetPattern hresult(wstr;dword);" & _
                "GetDesktopItemOptions hresult(struct*;dword);" & _
                "SetDesktopItemOptions hresult(struct*;dword);" & _
                "AddDesktopItem hresult(struct*;dword);" & _
                "AddDesktopItemWithUI hresult(hwnd;struct*;dword);" & _
                "ModifyDesktopItem hresult(struct*;dword);" & _
                "RemoveDesktopItem hresult(struct*;dword);" & _
                "GetDesktopItemCount hresult(int*;dword);" & _
                "GetDesktopItem hresult(int;struct*;dword);" & _
                "GetDesktopItemByID hresult(ulong_ptr;struct*;dword);" & _
                "GenerateDesktopItemHtml hresult(wstr;struct*;dword);" & _
                "AddUrl hresult(hwnd;wstr;struct*;dword);" & _
                "GetDesktopItemBySource hresult(wstr;struct*;dword);"
页: [1]
查看完整版本: SetupAPI匹配win10-64位(部分)