調用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