自定义脚本引擎 - 调用系统dll函数

调用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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值