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  }