调用windows系统dll来枚举部分设备
代码例子如下:
func enum_hid()
//定义结构体描述,安照C++的结构体写
//定义个结构体类型
local GUID = defstruct()
GUID.Data1 = "ui4"
GUID.Data2 = "ui2"
GUID.Data3 = "ui2"
GUID.Data4 = "byte[8]"
local SP_DEVINFO_DATA = defstruct()
SP_DEVINFO_DATA.cbSize="ui4"
SP_DEVINFO_DATA.ClassGuid = GUID
SP_DEVINFO_DATA.DevInst = "ui4"
SP_DEVINFO_DATA.Reserved = "ui4"
local SP_CLASSINSTALL_HEADER = defstruct()
SP_CLASSINSTALL_HEADER.cbSize="ui4"
SP_CLASSINSTALL_HEADER.InstallFunction="ui4"
local SP_PROPCHANGE_PARAMS = defstruct()
//结构体套结构体
SP_PROPCHANGE_PARAMS.ClassInstallHeader=SP_CLASSINSTALL_HEADER
SP_PROPCHANGE_PARAMS.StateChange="ui4"
SP_PROPCHANGE_PARAMS.Scope="ui4"
SP_PROPCHANGE_PARAMS.HwProfile="ui4"
//加载Kernel32.dll
local Kernel32 = stdcall_dll("Kernel32.dll")
local _guid = cbuffer(16, 16)
//加载hid.dll
local hid = cdecl_dll("hid.dll")
//调用hid.dll!HidD_GetHidGuid函数获取guid(32位程序,所用用了4字节)
hid.HidD_GetHidGuid([{"i4"=_guid.ptr()}])
//加载setupapi.dll
local setupapi = stdcall_dll("setupapi.dll")
//调用setupapi!SetupDiGetClassDevsA函数
//[{类型描述=数值}]是参数,最后一个是标识函数的返回值
local hDevInfo = setupapi.SetupDiGetClassDevsA([{"i4"=_guid.ptr()}, {"i4"=0}, {"i4"=0}, {"i4"=0x18}], "i4")
if(hDevInfo == -1)
then
return 0
end
local ERROR_INSUFFICIENT_BUFFER = 122
local index = 0
while(1)
//定义结构体实际对象,会计算字节对齐方式下的元素的偏移
local spdevInfoData = struct(SP_DEVINFO_DATA)
//结构体大小
spdevInfoData.cbSize = spdevInfoData.__len__
//结构体转byte buffer
local dev_data = spdevInfoData.pack()
if(setupapi.SetupDiEnumDeviceInfo([{"ui4"=hDevInfo}, {"ui4"=index}, {"ui4"=dev_data.ptr()}], "i4"))
then
local reqsize = cbuffer(4, 4)
local suc = setupapi.SetupDiGetDeviceRegistryPropertyA([{"ui4"=hDevInfo}, {"ui4"=dev_data.ptr()}, {"ui4"=0}, {"ui4"=0}, {"ui4"=0}, {"ui4"=0}, {"ui4"=reqsize.ptr()}], "i4")
if(!suc)
then
if(ERROR_INSUFFICIENT_BUFFER == Kernel32.GetLastError([], "ui4"))
then
//转dword
local newsize = reqsize.asType("ui4")
if(newsize > 0)
then
local buffer = cbuffer(newsize, newsize)
suc = setupapi.SetupDiGetDeviceRegistryPropertyA([{"ui4"=hDevInfo}, {"ui4"=dev_data.ptr()}, {"ui4"=0}, {"ui4"=0}, {"ui4"=buffer.ptr()}, {"ui4"=newsize}, {"ui4"=reqsize.ptr()}], "i4")
if(suc)
then
os.debug.box(buffer.asString())
end
end
end
end
else
break
end
index = index + 1
end
return 0
end