|
|
|
|
@ -29,8 +29,8 @@ import (
|
|
|
|
|
"errors"
|
|
|
|
|
"fmt"
|
|
|
|
|
"sync"
|
|
|
|
|
. "syscall"
|
|
|
|
|
. "unsafe"
|
|
|
|
|
"syscall"
|
|
|
|
|
"unsafe"
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
// Maximum size of message can be sent to pageant
|
|
|
|
|
@ -53,7 +53,7 @@ const (
|
|
|
|
|
type copyData struct {
|
|
|
|
|
dwData uintptr
|
|
|
|
|
cbData uint32
|
|
|
|
|
lpData Pointer
|
|
|
|
|
lpData unsafe.Pointer
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
var (
|
|
|
|
|
@ -65,7 +65,7 @@ var (
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
func winAPI(dllName, funcName string) func(...uintptr) (uintptr, uintptr, error) {
|
|
|
|
|
proc := MustLoadDLL(dllName).MustFindProc(funcName)
|
|
|
|
|
proc := syscall.MustLoadDLL(dllName).MustFindProc(funcName)
|
|
|
|
|
return func(a ...uintptr) (uintptr, uintptr, error) { return proc.Call(a...) }
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@ -96,21 +96,21 @@ func query(msg []byte) ([]byte, error) {
|
|
|
|
|
|
|
|
|
|
thID, _, _ := winGetCurrentThreadID()
|
|
|
|
|
mapName := fmt.Sprintf("PageantRequest%08x", thID)
|
|
|
|
|
pMapName, _ := UTF16PtrFromString(mapName)
|
|
|
|
|
pMapName, _ := syscall.UTF16PtrFromString(mapName)
|
|
|
|
|
|
|
|
|
|
mmap, err := CreateFileMapping(InvalidHandle, nil, PAGE_READWRITE, 0, MaxMessageLen+4, pMapName)
|
|
|
|
|
mmap, err := syscall.CreateFileMapping(syscall.InvalidHandle, nil, syscall.PAGE_READWRITE, 0, MaxMessageLen+4, pMapName)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return nil, err
|
|
|
|
|
}
|
|
|
|
|
defer CloseHandle(mmap)
|
|
|
|
|
defer syscall.CloseHandle(mmap)
|
|
|
|
|
|
|
|
|
|
ptr, err := MapViewOfFile(mmap, FILE_MAP_WRITE, 0, 0, 0)
|
|
|
|
|
ptr, err := syscall.MapViewOfFile(mmap, syscall.FILE_MAP_WRITE, 0, 0, 0)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return nil, err
|
|
|
|
|
}
|
|
|
|
|
defer UnmapViewOfFile(ptr)
|
|
|
|
|
defer syscall.UnmapViewOfFile(ptr)
|
|
|
|
|
|
|
|
|
|
mmSlice := (*(*[MaxMessageLen]byte)(Pointer(ptr)))[:]
|
|
|
|
|
mmSlice := (*(*[MaxMessageLen]byte)(unsafe.Pointer(ptr)))[:]
|
|
|
|
|
|
|
|
|
|
copy(mmSlice, msg)
|
|
|
|
|
|
|
|
|
|
@ -119,10 +119,10 @@ func query(msg []byte) ([]byte, error) {
|
|
|
|
|
cds := copyData{
|
|
|
|
|
dwData: agentCopydataID,
|
|
|
|
|
cbData: uint32(len(mapNameBytesZ)),
|
|
|
|
|
lpData: Pointer(&(mapNameBytesZ[0])),
|
|
|
|
|
lpData: unsafe.Pointer(&(mapNameBytesZ[0])),
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
resp, _, _ := winSendMessage(paWin, wmCopydata, 0, uintptr(Pointer(&cds)))
|
|
|
|
|
resp, _, _ := winSendMessage(paWin, wmCopydata, 0, uintptr(unsafe.Pointer(&cds)))
|
|
|
|
|
|
|
|
|
|
if resp == 0 {
|
|
|
|
|
return nil, ErrSendMessage
|
|
|
|
|
@ -140,7 +140,7 @@ func query(msg []byte) ([]byte, error) {
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func pageantWindow() uintptr {
|
|
|
|
|
nameP, _ := UTF16PtrFromString("Pageant")
|
|
|
|
|
h, _, _ := winFindWindow(uintptr(Pointer(nameP)), uintptr(Pointer(nameP)))
|
|
|
|
|
nameP, _ := syscall.UTF16PtrFromString("Pageant")
|
|
|
|
|
h, _, _ := winFindWindow(uintptr(unsafe.Pointer(nameP)), uintptr(unsafe.Pointer(nameP)))
|
|
|
|
|
return h
|
|
|
|
|
}
|
|
|
|
|
|