59 lines
1.2 KiB
Go
59 lines
1.2 KiB
Go
//go:build windows
|
|
|
|
package oomprofile
|
|
|
|
import (
|
|
"errors"
|
|
"os"
|
|
|
|
"golang.org/x/sys/windows"
|
|
)
|
|
|
|
func (b *profileBuilder) readMapping() {
|
|
snapshot, err := createModuleSnapshot()
|
|
if err != nil {
|
|
b.addMappingEntry(0, 0, 0, "", "", true)
|
|
return
|
|
}
|
|
defer windows.CloseHandle(snapshot)
|
|
|
|
var module windows.ModuleEntry32
|
|
module.Size = uint32(windows.SizeofModuleEntry32)
|
|
err = windows.Module32First(snapshot, &module)
|
|
if err != nil {
|
|
b.addMappingEntry(0, 0, 0, "", "", true)
|
|
return
|
|
}
|
|
for err == nil {
|
|
exe := windows.UTF16ToString(module.ExePath[:])
|
|
b.addMappingEntry(
|
|
uint64(module.ModBaseAddr),
|
|
uint64(module.ModBaseAddr)+uint64(module.ModBaseSize),
|
|
0,
|
|
exe,
|
|
peBuildID(exe),
|
|
false,
|
|
)
|
|
err = windows.Module32Next(snapshot, &module)
|
|
}
|
|
}
|
|
|
|
func createModuleSnapshot() (windows.Handle, error) {
|
|
for {
|
|
snapshot, err := windows.CreateToolhelp32Snapshot(windows.TH32CS_SNAPMODULE|windows.TH32CS_SNAPMODULE32, uint32(windows.GetCurrentProcessId()))
|
|
var errno windows.Errno
|
|
if err != nil && errors.As(err, &errno) && errno == windows.ERROR_BAD_LENGTH {
|
|
continue
|
|
}
|
|
return snapshot, err
|
|
}
|
|
}
|
|
|
|
func peBuildID(file string) string {
|
|
info, err := os.Stat(file)
|
|
if err != nil {
|
|
return file
|
|
}
|
|
return file + info.ModTime().String()
|
|
}
|