Use golang to call the win API

280 visualizações
Pular para a primeira mensagem não lida

流沙

não lida,
14 de dez. de 2017, 23:15:5214/12/2017
para golang-nuts
API Address:https://msdn.microsoft.com/en-us/library/ms706716(VS.85).aspx

Code:
package main

// #define WIN32_LEAN_AND_MEAN
// #include <windows.h>

import (
"fmt"
"syscall"
"unsafe"
"C"
)
var (
wlankernal,_ = syscall.LoadLibrary("Wlanapi.dll")
wlanhandle,_ = syscall.GetProcAddress(wlankernal,"WlanOpenHandle")
wlanclosehandle,_ = syscall.GetProcAddress(wlankernal,"WlanCloseHandle")
wlanenumInterfaces,_ = syscall.GetProcAddress(wlankernal,"WlanEnumInterfaces")
wlangetprofile,_ = syscall.GetProcAddress(wlankernal,"WlanGetProfileList")
)
type ulong int32

type WLAN_INTERFACE_INFO struct{
InterfaceGuid syscall.GUID
strInterfaceDescription string
isState uint
}

type WLAN_INTERFACE_INFO_LIST struct {
NumberOfItems uint32
Index uint32
InterfaceInfo WLAN_INTERFACE_INFO
}

type WLAN_PROFILE_INFO struct{
ProfileName C.char
Flags ulong
}

type WLAN_PROFILE_INFO_LIST struct{
NumberOfItems ulong
Index ulong
ProfileInfo WLAN_PROFILE_INFO
}

func abort(funcname string, err error) {
panic(fmt.Sprintf("%s failed: %v", funcname, err))
}

//打开一个WLAN句柄
func WlanOpenHandle() (result uint32) {
negotiated_version := uint32(0)
client_handle := uint32(0)
dwClientVersion := uint32(2)
var nargs uintptr = 4
ret,_,callErr := syscall.Syscall6(uintptr(wlanhandle),
nargs,
uintptr(dwClientVersion),
0,
uintptr(unsafe.Pointer(&negotiated_version)),
uintptr(unsafe.Pointer(&client_handle)),
0,
0,
)
if ret != 0{
abort("StartWLANHandleError", callErr)
return
}
result = uint32(client_handle)
return
}

//关闭WLAN句柄
func WlanCloseHandle() {
var nargs uintptr = 2
handle :=WlanOpenHandle()
ret,_,callErr := syscall.Syscall(uintptr(wlanclosehandle),
nargs,
uintptr(handle),
0,
0,
)
if ret !=0{
abort("CloseHandleError",callErr)
return
}
fmt.Println("WlanCloseHandle Successful")
}


func main() {
defer syscall.FreeLibrary(wlankernal)
var nargs uintptr = 3
handle :=WlanOpenHandle();
var wlan_interface_info WLAN_INTERFACE_INFO_LIST;
ret,_,callErr := syscall.Syscall(uintptr(wlanenumInterfaces),
nargs,
uintptr(handle),
0,
uintptr(unsafe.Pointer(&wlan_interface_info)),
)
if ret !=0{
abort("WlanEnumInterfacesError",callErr)
return
}
WlanCloseHandle()
fmt.Println(ret)
fmt.Println(wlan_interface_info)
}


wlan_interface_info returns a value of {7306176 0 {{0 0 0 [0 0 0 0 0 0 0 0]}  0}}
This value seems to be wrong!
May I ask how to solve this problem?

jake...@gmail.com

não lida,
15 de dez. de 2017, 12:47:3315/12/2017
para golang-nuts
I have not called a Windows API from go before, so there may be other problems with your code. But looking at WlanEnumInterfaces documentation the last parameter is not a pointer to a pointer to a WLAN_INTERFACE_INFO_LIST, it is a pointer to a PWLAN_INTERFACE_INFO_LIST. So, in C terms. it is a WLAN_INTERFACE_INFO_LIST**. In other words, you should be passing it a pointer to a uintptr, then dereferencing it twice to get the actual list.

(Also, don't forget to call WlanFreeMemory when you are done.)

Good Luck
 - Jake

流沙

não lida,
20 de dez. de 2017, 21:34:0420/12/2017
para golang-nuts
Thanks

在 2017年12月16日星期六 UTC+8上午1:47:33,Jake Montgomery写道:
Responder a todos
Responder ao autor
Encaminhar
0 nova mensagem