syscall_windows_test.go 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171
  1. // Copyright 2012 The Go Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style
  3. // license that can be found in the LICENSE file.
  4. package windows_test
  5. import (
  6. "io/ioutil"
  7. "os"
  8. "path/filepath"
  9. "runtime"
  10. "syscall"
  11. "testing"
  12. "golang.org/x/sys/windows"
  13. )
  14. func TestWin32finddata(t *testing.T) {
  15. dir, err := ioutil.TempDir("", "go-build")
  16. if err != nil {
  17. t.Fatalf("failed to create temp directory: %v", err)
  18. }
  19. defer os.RemoveAll(dir)
  20. path := filepath.Join(dir, "long_name.and_extension")
  21. f, err := os.Create(path)
  22. if err != nil {
  23. t.Fatalf("failed to create %v: %v", path, err)
  24. }
  25. f.Close()
  26. type X struct {
  27. fd windows.Win32finddata
  28. got byte
  29. pad [10]byte // to protect ourselves
  30. }
  31. var want byte = 2 // it is unlikely to have this character in the filename
  32. x := X{got: want}
  33. pathp, _ := windows.UTF16PtrFromString(path)
  34. h, err := windows.FindFirstFile(pathp, &(x.fd))
  35. if err != nil {
  36. t.Fatalf("FindFirstFile failed: %v", err)
  37. }
  38. err = windows.FindClose(h)
  39. if err != nil {
  40. t.Fatalf("FindClose failed: %v", err)
  41. }
  42. if x.got != want {
  43. t.Fatalf("memory corruption: want=%d got=%d", want, x.got)
  44. }
  45. }
  46. func TestFormatMessage(t *testing.T) {
  47. dll := windows.MustLoadDLL("netevent.dll")
  48. const TITLE_SC_MESSAGE_BOX uint32 = 0xC0001B75
  49. const flags uint32 = syscall.FORMAT_MESSAGE_FROM_HMODULE | syscall.FORMAT_MESSAGE_ARGUMENT_ARRAY | syscall.FORMAT_MESSAGE_IGNORE_INSERTS
  50. buf := make([]uint16, 300)
  51. _, err := windows.FormatMessage(flags, uintptr(dll.Handle), TITLE_SC_MESSAGE_BOX, 0, buf, nil)
  52. if err != nil {
  53. t.Fatalf("FormatMessage for handle=%x and errno=%x failed: %v", dll.Handle, TITLE_SC_MESSAGE_BOX, err)
  54. }
  55. }
  56. func abort(funcname string, err error) {
  57. panic(funcname + " failed: " + err.Error())
  58. }
  59. func ExampleLoadLibrary() {
  60. h, err := windows.LoadLibrary("kernel32.dll")
  61. if err != nil {
  62. abort("LoadLibrary", err)
  63. }
  64. defer windows.FreeLibrary(h)
  65. proc, err := windows.GetProcAddress(h, "GetVersion")
  66. if err != nil {
  67. abort("GetProcAddress", err)
  68. }
  69. r, _, _ := syscall.Syscall(uintptr(proc), 0, 0, 0, 0)
  70. major := byte(r)
  71. minor := uint8(r >> 8)
  72. build := uint16(r >> 16)
  73. print("windows version ", major, ".", minor, " (Build ", build, ")\n")
  74. }
  75. func TestTOKEN_ALL_ACCESS(t *testing.T) {
  76. if windows.TOKEN_ALL_ACCESS != 0xF01FF {
  77. t.Errorf("TOKEN_ALL_ACCESS = %x, want 0xF01FF", windows.TOKEN_ALL_ACCESS)
  78. }
  79. }
  80. func TestCreateWellKnownSid(t *testing.T) {
  81. sid, err := windows.CreateWellKnownSid(windows.WinBuiltinAdministratorsSid)
  82. if err != nil {
  83. t.Fatalf("Unable to create well known sid for administrators: %v", err)
  84. }
  85. sidStr, err := sid.String()
  86. if err != nil {
  87. t.Fatalf("Unable to convert sid into string: %v", err)
  88. }
  89. if sidStr != "S-1-5-32-544" {
  90. t.Fatalf("Expecting administrators to be S-1-5-32-544, but found %s instead", sidStr)
  91. }
  92. }
  93. func TestPseudoTokens(t *testing.T) {
  94. version, err := windows.GetVersion()
  95. if err != nil {
  96. t.Fatal(err)
  97. }
  98. if ((version&0xffff)>>8)|((version&0xff)<<8) < 0x0602 {
  99. return
  100. }
  101. realProcessToken, err := windows.OpenCurrentProcessToken()
  102. if err != nil {
  103. t.Fatal(err)
  104. }
  105. defer realProcessToken.Close()
  106. realProcessUser, err := realProcessToken.GetTokenUser()
  107. if err != nil {
  108. t.Fatal(err)
  109. }
  110. pseudoProcessToken := windows.GetCurrentProcessToken()
  111. pseudoProcessUser, err := pseudoProcessToken.GetTokenUser()
  112. if err != nil {
  113. t.Fatal(err)
  114. }
  115. if !windows.EqualSid(realProcessUser.User.Sid, pseudoProcessUser.User.Sid) {
  116. t.Fatal("The real process token does not have the same as the pseudo process token")
  117. }
  118. runtime.LockOSThread()
  119. defer runtime.UnlockOSThread()
  120. err = windows.RevertToSelf()
  121. if err != nil {
  122. t.Fatal(err)
  123. }
  124. pseudoThreadToken := windows.GetCurrentThreadToken()
  125. _, err = pseudoThreadToken.GetTokenUser()
  126. if err != windows.ERROR_NO_TOKEN {
  127. t.Fatal("Expected an empty thread token")
  128. }
  129. pseudoThreadEffectiveToken := windows.GetCurrentThreadEffectiveToken()
  130. pseudoThreadEffectiveUser, err := pseudoThreadEffectiveToken.GetTokenUser()
  131. if err != nil {
  132. t.Fatal(nil)
  133. }
  134. if !windows.EqualSid(realProcessUser.User.Sid, pseudoThreadEffectiveUser.User.Sid) {
  135. t.Fatal("The real process token does not have the same as the pseudo thread effective token, even though we aren't impersonating")
  136. }
  137. err = windows.ImpersonateSelf(windows.SecurityImpersonation)
  138. if err != nil {
  139. t.Fatal(err)
  140. }
  141. defer windows.RevertToSelf()
  142. pseudoThreadUser, err := pseudoThreadToken.GetTokenUser()
  143. if err != nil {
  144. t.Fatal(err)
  145. }
  146. if !windows.EqualSid(realProcessUser.User.Sid, pseudoThreadUser.User.Sid) {
  147. t.Fatal("The real process token does not have the same as the pseudo thread token after impersonating self")
  148. }
  149. }