safing-portmaster/windows_kext/kextinterface/command.go
2024-05-16 16:21:27 +03:00

119 lines
3.3 KiB
Go

package kextinterface
import (
"encoding/binary"
"io"
)
// Command IDs.
const (
CommandShutdown = 0
CommandVerdict = 1
CommandUpdateV4 = 2
CommandUpdateV6 = 3
CommandClearCache = 4
CommandGetLogs = 5
CommandBandwidthStats = 6
CommandPrintMemoryStats = 7
CommandCleanEndedConnections = 8
)
// KextVerdict is the verdict ID used to with the kext.
type KextVerdict uint8
// Kext Verdicts.
// Make sure this is in sync with the Rust version.
const (
// VerdictUndecided is the default status of new connections.
VerdictUndecided KextVerdict = 0
VerdictUndeterminable KextVerdict = 1
VerdictAccept KextVerdict = 2
VerdictPermanentAccept KextVerdict = 3
VerdictBlock KextVerdict = 4
VerdictPermanentBlock KextVerdict = 5
VerdictDrop KextVerdict = 6
VerdictPermanentDrop KextVerdict = 7
VerdictRerouteToNameserver KextVerdict = 8
VerdictRerouteToTunnel KextVerdict = 9
VerdictFailed KextVerdict = 10
)
type Verdict struct {
command uint8
ID uint64
Verdict uint8
}
type UpdateV4 struct {
command uint8
Protocol uint8
LocalAddress [4]byte
LocalPort uint16
RemoteAddress [4]byte
RemotePort uint16
Verdict uint8
}
type UpdateV6 struct {
command uint8
Protocol uint8
LocalAddress [16]byte
LocalPort uint16
RemoteAddress [16]byte
RemotePort uint16
Verdict uint8
}
// SendShutdownCommand sends a Shutdown command to the kext.
func SendShutdownCommand(writer io.Writer) error {
_, err := writer.Write([]byte{CommandShutdown})
return err
}
// SendVerdictCommand sends a Verdict command to the kext.
func SendVerdictCommand(writer io.Writer, verdict Verdict) error {
verdict.command = CommandVerdict
return binary.Write(writer, binary.LittleEndian, verdict)
}
// SendUpdateV4Command sends a UpdateV4 command to the kext.
func SendUpdateV4Command(writer io.Writer, update UpdateV4) error {
update.command = CommandUpdateV4
return binary.Write(writer, binary.LittleEndian, update)
}
// SendUpdateV6Command sends a UpdateV6 command to the kext.
func SendUpdateV6Command(writer io.Writer, update UpdateV6) error {
update.command = CommandUpdateV6
return binary.Write(writer, binary.LittleEndian, update)
}
// SendClearCacheCommand sends a ClearCache command to the kext.
func SendClearCacheCommand(writer io.Writer) error {
_, err := writer.Write([]byte{CommandClearCache})
return err
}
// SendGetLogsCommand sends a GetLogs command to the kext.
func SendGetLogsCommand(writer io.Writer) error {
_, err := writer.Write([]byte{CommandGetLogs})
return err
}
// SendGetBandwidthStatsCommand sends a GetBandwidthStats command to the kext.
func SendGetBandwidthStatsCommand(writer io.Writer) error {
_, err := writer.Write([]byte{CommandBandwidthStats})
return err
}
// SendPrintMemoryStatsCommand sends a PrintMemoryStats command to the kext.
func SendPrintMemoryStatsCommand(writer io.Writer) error {
_, err := writer.Write([]byte{CommandPrintMemoryStats})
return err
}
// SendCleanEndedConnectionsCommand sends a CleanEndedConnections command to the kext.
func SendCleanEndedConnectionsCommand(writer io.Writer) error {
_, err := writer.Write([]byte{CommandCleanEndedConnections})
return err
}