| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107 | // Copyright 2012 The Go Authors. All rights reserved.// Use of this source code is governed by a BSD-style// license that can be found in the LICENSE file.package windows_testimport (	"io/ioutil"	"os"	"path/filepath"	"syscall"	"testing"	"unsafe"	"golang.org/x/sys/windows")func TestWin32finddata(t *testing.T) {	dir, err := ioutil.TempDir("", "go-build")	if err != nil {		t.Fatalf("failed to create temp directory: %v", err)	}	defer os.RemoveAll(dir)	path := filepath.Join(dir, "long_name.and_extension")	f, err := os.Create(path)	if err != nil {		t.Fatalf("failed to create %v: %v", path, err)	}	f.Close()	type X struct {		fd  windows.Win32finddata		got byte		pad [10]byte // to protect ourselves	}	var want byte = 2 // it is unlikely to have this character in the filename	x := X{got: want}	pathp, _ := windows.UTF16PtrFromString(path)	h, err := windows.FindFirstFile(pathp, &(x.fd))	if err != nil {		t.Fatalf("FindFirstFile failed: %v", err)	}	err = windows.FindClose(h)	if err != nil {		t.Fatalf("FindClose failed: %v", err)	}	if x.got != want {		t.Fatalf("memory corruption: want=%d got=%d", want, x.got)	}}func TestFormatMessage(t *testing.T) {	dll := windows.MustLoadDLL("pdh.dll")	pdhOpenQuery := func(datasrc *uint16, userdata uint32, query *windows.Handle) (errno uintptr) {		r0, _, _ := syscall.Syscall(dll.MustFindProc("PdhOpenQueryW").Addr(), 3, uintptr(unsafe.Pointer(datasrc)), uintptr(userdata), uintptr(unsafe.Pointer(query)))		return r0	}	pdhCloseQuery := func(query windows.Handle) (errno uintptr) {		r0, _, _ := syscall.Syscall(dll.MustFindProc("PdhCloseQuery").Addr(), 1, uintptr(query), 0, 0)		return r0	}	var q windows.Handle	name, err := windows.UTF16PtrFromString("no_such_source")	if err != nil {		t.Fatal(err)	}	errno := pdhOpenQuery(name, 0, &q)	if errno == 0 {		pdhCloseQuery(q)		t.Fatal("PdhOpenQuery succeeded, but expected to fail.")	}	const flags uint32 = syscall.FORMAT_MESSAGE_FROM_HMODULE | syscall.FORMAT_MESSAGE_ARGUMENT_ARRAY | syscall.FORMAT_MESSAGE_IGNORE_INSERTS	buf := make([]uint16, 300)	_, err = windows.FormatMessage(flags, uintptr(dll.Handle), uint32(errno), 0, buf, nil)	if err != nil {		t.Fatal("FormatMessage for handle=%x and errno=%x failed: %v", dll.Handle, errno, err)	}}func abort(funcname string, err error) {	panic(funcname + " failed: " + err.Error())}func ExampleLoadLibrary() {	h, err := windows.LoadLibrary("kernel32.dll")	if err != nil {		abort("LoadLibrary", err)	}	defer windows.FreeLibrary(h)	proc, err := windows.GetProcAddress(h, "GetVersion")	if err != nil {		abort("GetProcAddress", err)	}	r, _, _ := syscall.Syscall(uintptr(proc), 0, 0, 0, 0)	major := byte(r)	minor := uint8(r >> 8)	build := uint16(r >> 16)	print("windows version ", major, ".", minor, " (Build ", build, ")\n")}
 |