func RegisterUnicastAddressChangeCallback(callback func(notificationType MibNotificationType, unicastAddress *MibUnicastIPAddressRow)) (*UnicastAddressChangeCallback, error) {
	s := &UnicastAddressChangeCallback{cb: callback}
	unicastAddressChangeAddRemoveMutex.Lock()
	defer unicastAddressChangeAddRemoveMutex.Unlock()
	unicastAddressChangeMutex.Lock()
	defer unicastAddressChangeMutex.Unlock()
	unicastAddressChangeCallbacks[s] = true
	if unicastAddressChangeHandle == 0 {
		err := notifyUnicastIPAddressChange(windows.AF_UNSPEC, windows.NewCallback(unicastAddressChanged), 0, false, &unicastAddressChangeHandle)
		if err != nil {
			delete(unicastAddressChangeCallbacks, s)
			unicastAddressChangeHandle = 0
			return nil, err
		}
	}
	return s, nil
}
RegisterUnicastAddressChangeCallback registers a new UnicastAddressChangeCallback. If this particular callback is already
registered, the function will silently return. Returned UnicastAddressChangeCallback.Unregister method should be used
to unregister.
package winipcfg
import (
	"sync"
	"golang.org/x/sys/windows"
)
type UnicastAddressChangeCallback struct {
	cb   func(notificationType MibNotificationType, unicastAddress *MibUnicastIPAddressRow)
	wait sync.WaitGroup
}
var (
	unicastAddressChangeAddRemoveMutex = sync.Mutex{}
	unicastAddressChangeMutex          = sync.Mutex{}
	unicastAddressChangeCallbacks      = make(map[*UnicastAddressChangeCallback]bool)
	unicastAddressChangeHandle         = windows.Handle(0)
)