天天看點

自定義腳本引擎 - 調用系統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
           

繼續閱讀