mirror of
https://github.com/safing/portmaster
synced 2025-09-01 18:19:12 +00:00
79 lines
2.3 KiB
Go
79 lines
2.3 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
|
|
// getOwnerModuleFromTcpEntry *windows.LazyProc
|
|
// getOwnerModuleFromTcp6Entry *windows.LazyProc
|
|
// getOwnerModuleFromUdpEntry *windows.LazyProc
|
|
// getOwnerModuleFromUdp6Entry *windows.LazyProc
|
|
|
|
valid *abool.AtomicBool
|
|
}
|
|
|
|
// 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")
|
|
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.getOwnerModuleFromTcpEntry = new.dll.NewProc("GetOwnerModuleFromTcpEntry")
|
|
// err = new.getOwnerModuleFromTcpEntry.Find()
|
|
// if err != nil {
|
|
// return nil, fmt.Errorf("could find proc GetOwnerModuleFromTcpEntry: %s", err)
|
|
// }
|
|
// new.getOwnerModuleFromTcp6Entry = new.dll.NewProc("GetOwnerModuleFromTcp6Entry")
|
|
// err = new.getOwnerModuleFromTcp6Entry.Find()
|
|
// if err != nil {
|
|
// return nil, fmt.Errorf("could find proc GetOwnerModuleFromTcp6Entry: %s", err)
|
|
// }
|
|
// new.getOwnerModuleFromUdpEntry = new.dll.NewProc("GetOwnerModuleFromUdpEntry")
|
|
// err = new.getOwnerModuleFromUdpEntry.Find()
|
|
// if err != nil {
|
|
// return nil, fmt.Errorf("could find proc GetOwnerModuleFromUdpEntry: %s", err)
|
|
// }
|
|
// new.getOwnerModuleFromUdp6Entry = new.dll.NewProc("GetOwnerModuleFromUdp6Entry")
|
|
// err = new.getOwnerModuleFromUdp6Entry.Find()
|
|
// if err != nil {
|
|
// return nil, fmt.Errorf("could find proc GetOwnerModuleFromUdp6Entry: %s", err)
|
|
// }
|
|
|
|
new.valid.Set()
|
|
return new, nil
|
|
}
|