github.com/gofiber/fiber/v2@v2.47.0/internal/gopsutil/process/process_windows_amd64.go (about) 1 //go:build windows 2 // +build windows 3 4 package process 5 6 import ( 7 "syscall" 8 "unsafe" 9 10 "github.com/gofiber/fiber/v2/internal/gopsutil/common" 11 ) 12 13 type PROCESS_MEMORY_COUNTERS struct { 14 CB uint32 15 PageFaultCount uint32 16 PeakWorkingSetSize uint64 17 WorkingSetSize uint64 18 QuotaPeakPagedPoolUsage uint64 19 QuotaPagedPoolUsage uint64 20 QuotaPeakNonPagedPoolUsage uint64 21 QuotaNonPagedPoolUsage uint64 22 PagefileUsage uint64 23 PeakPagefileUsage uint64 24 } 25 26 func queryPebAddress(procHandle syscall.Handle, is32BitProcess bool) uint64 { 27 if is32BitProcess { 28 //we are on a 64-bit process reading an external 32-bit process 29 var wow64 uint 30 31 ret, _, _ := common.ProcNtQueryInformationProcess.Call( 32 uintptr(procHandle), 33 uintptr(common.ProcessWow64Information), 34 uintptr(unsafe.Pointer(&wow64)), 35 uintptr(unsafe.Sizeof(wow64)), 36 uintptr(0), 37 ) 38 if int(ret) >= 0 { 39 return uint64(wow64) 40 } 41 } else { 42 //we are on a 64-bit process reading an external 64-bit process 43 var info processBasicInformation64 44 45 ret, _, _ := common.ProcNtQueryInformationProcess.Call( 46 uintptr(procHandle), 47 uintptr(common.ProcessBasicInformation), 48 uintptr(unsafe.Pointer(&info)), 49 uintptr(unsafe.Sizeof(info)), 50 uintptr(0), 51 ) 52 if int(ret) >= 0 { 53 return info.PebBaseAddress 54 } 55 } 56 57 //return 0 on error 58 return 0 59 } 60 61 func readProcessMemory(procHandle syscall.Handle, _ bool, address uint64, size uint) []byte { 62 var read uint 63 64 buffer := make([]byte, size) 65 66 ret, _, _ := common.ProcNtReadVirtualMemory.Call( 67 uintptr(procHandle), 68 uintptr(address), 69 uintptr(unsafe.Pointer(&buffer[0])), 70 uintptr(size), 71 uintptr(unsafe.Pointer(&read)), 72 ) 73 if int(ret) >= 0 && read > 0 { 74 return buffer[:read] 75 } 76 return nil 77 }