...
1
2
3
4
5 package process
6
7 import (
8 "syscall"
9 "unsafe"
10
11 "golang.org/x/sys/windows"
12 )
13
14 var _ unsafe.Pointer
15
16
17
18 const (
19 errnoERROR_IO_PENDING = 997
20 )
21
22 var (
23 errERROR_IO_PENDING error = syscall.Errno(errnoERROR_IO_PENDING)
24 errERROR_EINVAL error = syscall.EINVAL
25 )
26
27
28
29 func errnoErr(e syscall.Errno) error {
30 switch e {
31 case 0:
32 return errERROR_EINVAL
33 case errnoERROR_IO_PENDING:
34 return errERROR_IO_PENDING
35 }
36
37
38
39 return e
40 }
41
42 var (
43 modkernel32 = windows.NewLazySystemDLL("kernel32.dll")
44
45 procK32EnumProcesses = modkernel32.NewProc("K32EnumProcesses")
46 procK32GetProcessMemoryInfo = modkernel32.NewProc("K32GetProcessMemoryInfo")
47 procQueryFullProcessImageNameW = modkernel32.NewProc("QueryFullProcessImageNameW")
48 )
49
50 func enumProcesses(pids *uint32, bufferSize uint32, retBufferSize *uint32) (err error) {
51 r1, _, e1 := syscall.Syscall(procK32EnumProcesses.Addr(), 3, uintptr(unsafe.Pointer(pids)), uintptr(bufferSize), uintptr(unsafe.Pointer(retBufferSize)))
52 if r1 == 0 {
53 err = errnoErr(e1)
54 }
55 return
56 }
57
58 func getProcessMemoryInfo(process handle, memCounters *ProcessMemoryCountersEx, size uint32) (err error) {
59 r1, _, e1 := syscall.Syscall(procK32GetProcessMemoryInfo.Addr(), 3, uintptr(process), uintptr(unsafe.Pointer(memCounters)), uintptr(size))
60 if r1 == 0 {
61 err = errnoErr(e1)
62 }
63 return
64 }
65
66 func queryFullProcessImageName(process handle, flags uint32, buffer *uint16, bufferSize *uint32) (err error) {
67 r1, _, e1 := syscall.Syscall6(procQueryFullProcessImageNameW.Addr(), 4, uintptr(process), uintptr(flags), uintptr(unsafe.Pointer(buffer)), uintptr(unsafe.Pointer(bufferSize)), 0, 0)
68 if r1 == 0 {
69 err = errnoErr(e1)
70 }
71 return
72 }
73
View as plain text