Files
komari-agent/monitoring/process_windows.go
2025-04-29 20:57:23 +08:00

57 lines
1.1 KiB
Go

//go:build windows
// +build windows
package monitoring
import (
"syscall"
"unsafe"
)
// ProcessCount returns the number of running processes
func ProcessCount() (count int) {
return processCountWindows()
}
// processCountWindows counts processes using Windows API
func processCountWindows() (count int) {
// Load kernel32.dll
kernel32, err := syscall.LoadLibrary("kernel32.dll")
if err != nil {
return 0
}
defer syscall.FreeLibrary(kernel32)
// Get EnumProcesses function
enumProcesses, err := syscall.GetProcAddress(kernel32, "K32EnumProcesses")
if err != nil {
return 0
}
// Prepare buffer for process IDs
const maxProcesses = 1024
pids := make([]uint32, maxProcesses)
var bytesReturned uint32
// Call EnumProcesses
ret, _, _ := syscall.SyscallN(
uintptr(enumProcesses),
uintptr(unsafe.Pointer(&pids[0])),
uintptr(len(pids)*4),
uintptr(unsafe.Pointer(&bytesReturned)),
)
if ret == 0 {
return 0
}
// Count valid PIDs
count = int(bytesReturned) / 4 // bytesReturned is size in bytes, divide by 4 for uint32 count
if count > maxProcesses {
count = maxProcesses
}
return count
}