/* SPDX-License-Identifier: MIT * * Copyright (C) 2017-2019 WireGuard LLC. All Rights Reserved. */ package service import ( "fmt" "golang.org/x/sys/windows" "syscall" ) type Error uint32 const ( ErrorSuccess Error = iota ErrorRingloggerOpen ErrorLoadConfiguration ErrorCreateWintun ErrorDetermineWintunName ErrorUAPIListen ErrorUAPISerialization ErrorDeviceSetConfig ErrorBindSocketsToDefaultRoutes ErrorSetNetConfig ErrorDetermineExecutablePath ErrorFindAdministratorsSID ErrorOpenNULFile ErrorTrackTunnels ErrorEnumerateSessions ErrorWin32 ) func (e Error) Error() string { switch e { case ErrorSuccess: return "No error." case ErrorRingloggerOpen: return "Unable to open log file." case ErrorDetermineExecutablePath: return "Unable to determine path of running executable." case ErrorLoadConfiguration: return "Unable to load configuration from path." case ErrorCreateWintun: return "Unable to create Wintun device." case ErrorDetermineWintunName: return "Unable to determine Wintun name." case ErrorUAPIListen: return "Unable to listen on named pipe." case ErrorUAPISerialization: return "Unable to serialize configuration into uapi form." case ErrorDeviceSetConfig: return "Unable to set device configuration." case ErrorBindSocketsToDefaultRoutes: return "Unable to bind sockets to default route." case ErrorSetNetConfig: return "Unable to set interface addresses, routes, dns, and/or adapter settings." case ErrorFindAdministratorsSID: return "Unable to find Administrators SID." case ErrorOpenNULFile: return "Unable to open NUL file." case ErrorTrackTunnels: return "Unable to track existing tunnels." case ErrorEnumerateSessions: return "Unable to enumerate current sessions." case ErrorWin32: return "An internal Windows error has occurred." default: return "An unknown error has occurred." } } func determineErrorCode(err error, serviceError Error) (bool, uint32) { if syserr, ok := err.(syscall.Errno); ok { return false, uint32(syserr) } else if serviceError != ErrorSuccess { return true, uint32(serviceError) } else { return false, windows.NO_ERROR } } func combineErrors(err error, serviceError Error) error { if serviceError != ErrorSuccess { if err != nil { return fmt.Errorf("%v: %v", serviceError, err) } else { return serviceError } } return err } const ( serviceDOES_NOT_EXIST uint32 = 0x00000424 serviceMARKED_FOR_DELETE uint32 = 0x00000430 serviceNEVER_STARTED uint32 = 0x00000435 )