mirror of
https://github.com/safing/portmaster
synced 2025-09-02 02:29:12 +00:00
63 lines
1.2 KiB
Go
63 lines
1.2 KiB
Go
// +build windows
|
|
|
|
package iphelper
|
|
|
|
import (
|
|
"errors"
|
|
"fmt"
|
|
|
|
"github.com/tevino/abool"
|
|
"golang.org/x/sys/windows"
|
|
)
|
|
|
|
var (
|
|
errInvalid = errors.New("IPHelper not initialzed or broken")
|
|
)
|
|
|
|
// IPHelper represents a subset of the Windows iphlpapi.dll.
|
|
type IPHelper struct {
|
|
dll *windows.LazyDLL
|
|
|
|
getExtendedTCPTable *windows.LazyProc
|
|
getExtendedUDPTable *windows.LazyProc
|
|
|
|
valid *abool.AtomicBool
|
|
}
|
|
|
|
func checkIPHelper() (err error) {
|
|
if ipHelper == nil {
|
|
ipHelper, err = New()
|
|
return err
|
|
}
|
|
return nil
|
|
}
|
|
|
|
// New returns a new IPHelper API (with an instance of iphlpapi.dll loaded).
|
|
func New() (*IPHelper, error) {
|
|
|
|
new := &IPHelper{}
|
|
new.valid = abool.NewBool(false)
|
|
var err error
|
|
|
|
// load dll
|
|
new.dll = windows.NewLazySystemDLL("iphlpapi.dll")
|
|
err = new.dll.Load()
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
// load functions
|
|
new.getExtendedTCPTable = new.dll.NewProc("GetExtendedTcpTable")
|
|
err = new.getExtendedTCPTable.Find()
|
|
if err != nil {
|
|
return nil, fmt.Errorf("could find proc GetExtendedTcpTable: %s", err)
|
|
}
|
|
new.getExtendedUDPTable = new.dll.NewProc("GetExtendedUdpTable")
|
|
err = new.getExtendedUDPTable.Find()
|
|
if err != nil {
|
|
return nil, fmt.Errorf("could find proc GetExtendedUdpTable: %s", err)
|
|
}
|
|
|
|
new.valid.Set()
|
|
return new, nil
|
|
}
|