]> Cypherpunks repositories - gostls13.git/commitdiff
runtime, syscall: only search for Windows DLLs in the System32 directory
authorBrad Fitzpatrick <bradfitz@golang.org>
Fri, 25 Mar 2016 06:40:58 +0000 (06:40 +0000)
committerAndrew Gerrand <adg@golang.org>
Fri, 8 Apr 2016 05:21:10 +0000 (05:21 +0000)
Make sure that for any DLL that Go uses itself, we only look for the
DLL in the Windows System32 directory, guarding against DLL preloading
attacks.

(Unless the Windows version is ancient and LoadLibraryEx is
unavailable, in which case the user probably has bigger security
problems anyway.)

This does not change the behavior of syscall.LoadLibrary or NewLazyDLL
if the DLL name is something unused by Go itself.

This change also intentionally does not add any new API surface. Instead,
x/sys is updated with a LoadLibraryEx function and LazyDLL.Flags in:
    https://golang.org/cl/21388

Updates #14959

Change-Id: I8d29200559cc19edf8dcf41dbdd39a389cd6aeb9
Reviewed-on: https://go-review.googlesource.com/21140
Reviewed-by: Russ Cox <rsc@golang.org>
Run-TryBot: Brad Fitzpatrick <bradfitz@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-on: https://go-review.googlesource.com/21696
Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
15 files changed:
src/cmd/dist/deps.go
src/go/build/deps_test.go
src/internal/syscall/windows/registry/syscall.go
src/internal/syscall/windows/registry/zsyscall_windows.go
src/internal/syscall/windows/syscall_windows.go
src/internal/syscall/windows/sysdll/sysdll.go [new file with mode: 0644]
src/internal/syscall/windows/zsyscall_windows.go
src/runtime/export_windows_test.go
src/runtime/os1_windows.go
src/runtime/syscall_windows.go
src/runtime/syscall_windows_test.go
src/syscall/dll_windows.go
src/syscall/mksyscall_windows.go
src/syscall/syscall_windows.go
src/syscall/zsyscall_windows.go

index 9fd98173f315ac3fd00e4b713cc3e18b0c3b841a..0838914b9c51ba4b73c01419ca73bd655f2b49a4 100644 (file)
@@ -5,43 +5,44 @@ package main
 var builddeps = map[string][]string{
        "bufio":                             {"bytes", "errors", "internal/race", "io", "runtime", "runtime/internal/atomic", "runtime/internal/sys", "sync", "sync/atomic", "unicode", "unicode/utf8"},
        "bytes":                             {"errors", "internal/race", "io", "runtime", "runtime/internal/atomic", "runtime/internal/sys", "sync", "sync/atomic", "unicode", "unicode/utf8"},
-       "compress/flate":                    {"bufio", "bytes", "errors", "fmt", "internal/race", "internal/syscall/windows", "internal/syscall/windows/registry", "io", "math", "os", "reflect", "runtime", "runtime/internal/atomic", "runtime/internal/sys", "sort", "strconv", "sync", "sync/atomic", "syscall", "time", "unicode", "unicode/utf16", "unicode/utf8"},
-       "compress/zlib":                     {"bufio", "bytes", "compress/flate", "errors", "fmt", "hash", "hash/adler32", "internal/race", "internal/syscall/windows", "internal/syscall/windows/registry", "io", "math", "os", "reflect", "runtime", "runtime/internal/atomic", "runtime/internal/sys", "sort", "strconv", "sync", "sync/atomic", "syscall", "time", "unicode", "unicode/utf16", "unicode/utf8"},
+       "compress/flate":                    {"bufio", "bytes", "errors", "fmt", "internal/race", "internal/syscall/windows", "internal/syscall/windows/registry", "internal/syscall/windows/sysdll", "io", "math", "os", "reflect", "runtime", "runtime/internal/atomic", "runtime/internal/sys", "sort", "strconv", "sync", "sync/atomic", "syscall", "time", "unicode", "unicode/utf16", "unicode/utf8"},
+       "compress/zlib":                     {"bufio", "bytes", "compress/flate", "errors", "fmt", "hash", "hash/adler32", "internal/race", "internal/syscall/windows", "internal/syscall/windows/registry", "internal/syscall/windows/sysdll", "io", "math", "os", "reflect", "runtime", "runtime/internal/atomic", "runtime/internal/sys", "sort", "strconv", "sync", "sync/atomic", "syscall", "time", "unicode", "unicode/utf16", "unicode/utf8"},
        "container/heap":                    {"runtime", "runtime/internal/atomic", "runtime/internal/sys", "sort"},
        "crypto":                            {"errors", "hash", "internal/race", "io", "math", "runtime", "runtime/internal/atomic", "runtime/internal/sys", "strconv", "sync", "sync/atomic", "unicode/utf8"},
        "crypto/sha1":                       {"crypto", "errors", "hash", "internal/race", "io", "math", "runtime", "runtime/internal/atomic", "runtime/internal/sys", "strconv", "sync", "sync/atomic", "unicode/utf8"},
-       "debug/dwarf":                       {"encoding/binary", "errors", "fmt", "internal/race", "internal/syscall/windows", "internal/syscall/windows/registry", "io", "math", "os", "path", "reflect", "runtime", "runtime/internal/atomic", "runtime/internal/sys", "sort", "strconv", "strings", "sync", "sync/atomic", "syscall", "time", "unicode", "unicode/utf16", "unicode/utf8"},
-       "debug/elf":                         {"bufio", "bytes", "compress/flate", "compress/zlib", "debug/dwarf", "encoding/binary", "errors", "fmt", "hash", "hash/adler32", "internal/race", "internal/syscall/windows", "internal/syscall/windows/registry", "io", "math", "os", "path", "reflect", "runtime", "runtime/internal/atomic", "runtime/internal/sys", "sort", "strconv", "strings", "sync", "sync/atomic", "syscall", "time", "unicode", "unicode/utf16", "unicode/utf8"},
-       "debug/macho":                       {"bytes", "debug/dwarf", "encoding/binary", "errors", "fmt", "internal/race", "internal/syscall/windows", "internal/syscall/windows/registry", "io", "math", "os", "path", "reflect", "runtime", "runtime/internal/atomic", "runtime/internal/sys", "sort", "strconv", "strings", "sync", "sync/atomic", "syscall", "time", "unicode", "unicode/utf16", "unicode/utf8"},
+       "debug/dwarf":                       {"encoding/binary", "errors", "fmt", "internal/race", "internal/syscall/windows", "internal/syscall/windows/registry", "internal/syscall/windows/sysdll", "io", "math", "os", "path", "reflect", "runtime", "runtime/internal/atomic", "runtime/internal/sys", "sort", "strconv", "strings", "sync", "sync/atomic", "syscall", "time", "unicode", "unicode/utf16", "unicode/utf8"},
+       "debug/elf":                         {"bufio", "bytes", "compress/flate", "compress/zlib", "debug/dwarf", "encoding/binary", "errors", "fmt", "hash", "hash/adler32", "internal/race", "internal/syscall/windows", "internal/syscall/windows/registry", "internal/syscall/windows/sysdll", "io", "math", "os", "path", "reflect", "runtime", "runtime/internal/atomic", "runtime/internal/sys", "sort", "strconv", "strings", "sync", "sync/atomic", "syscall", "time", "unicode", "unicode/utf16", "unicode/utf8"},
+       "debug/macho":                       {"bytes", "debug/dwarf", "encoding/binary", "errors", "fmt", "internal/race", "internal/syscall/windows", "internal/syscall/windows/registry", "internal/syscall/windows/sysdll", "io", "math", "os", "path", "reflect", "runtime", "runtime/internal/atomic", "runtime/internal/sys", "sort", "strconv", "strings", "sync", "sync/atomic", "syscall", "time", "unicode", "unicode/utf16", "unicode/utf8"},
        "encoding":                          {"runtime", "runtime/internal/atomic", "runtime/internal/sys"},
        "encoding/base64":                   {"errors", "internal/race", "io", "math", "runtime", "runtime/internal/atomic", "runtime/internal/sys", "strconv", "sync", "sync/atomic", "unicode/utf8"},
        "encoding/binary":                   {"errors", "internal/race", "io", "math", "reflect", "runtime", "runtime/internal/atomic", "runtime/internal/sys", "strconv", "sync", "sync/atomic", "unicode/utf8"},
-       "encoding/json":                     {"bytes", "encoding", "encoding/base64", "errors", "fmt", "internal/race", "internal/syscall/windows", "internal/syscall/windows/registry", "io", "math", "os", "reflect", "runtime", "runtime/internal/atomic", "runtime/internal/sys", "sort", "strconv", "strings", "sync", "sync/atomic", "syscall", "time", "unicode", "unicode/utf16", "unicode/utf8"},
+       "encoding/json":                     {"bytes", "encoding", "encoding/base64", "errors", "fmt", "internal/race", "internal/syscall/windows", "internal/syscall/windows/registry", "internal/syscall/windows/sysdll", "io", "math", "os", "reflect", "runtime", "runtime/internal/atomic", "runtime/internal/sys", "sort", "strconv", "strings", "sync", "sync/atomic", "syscall", "time", "unicode", "unicode/utf16", "unicode/utf8"},
        "errors":                            {"runtime", "runtime/internal/atomic", "runtime/internal/sys"},
-       "flag":                              {"errors", "fmt", "internal/race", "internal/syscall/windows", "internal/syscall/windows/registry", "io", "math", "os", "reflect", "runtime", "runtime/internal/atomic", "runtime/internal/sys", "sort", "strconv", "sync", "sync/atomic", "syscall", "time", "unicode/utf16", "unicode/utf8"},
-       "fmt":                               {"errors", "internal/race", "internal/syscall/windows", "internal/syscall/windows/registry", "io", "math", "os", "reflect", "runtime", "runtime/internal/atomic", "runtime/internal/sys", "strconv", "sync", "sync/atomic", "syscall", "time", "unicode/utf16", "unicode/utf8"},
-       "go/ast":                            {"bytes", "errors", "fmt", "go/scanner", "go/token", "internal/race", "internal/syscall/windows", "internal/syscall/windows/registry", "io", "math", "os", "path/filepath", "reflect", "runtime", "runtime/internal/atomic", "runtime/internal/sys", "sort", "strconv", "strings", "sync", "sync/atomic", "syscall", "time", "unicode", "unicode/utf16", "unicode/utf8"},
-       "go/build":                          {"bufio", "bytes", "errors", "fmt", "go/ast", "go/doc", "go/parser", "go/scanner", "go/token", "internal/race", "internal/syscall/windows", "internal/syscall/windows/registry", "io", "io/ioutil", "log", "math", "net/url", "os", "path", "path/filepath", "reflect", "regexp", "regexp/syntax", "runtime", "runtime/internal/atomic", "runtime/internal/sys", "sort", "strconv", "strings", "sync", "sync/atomic", "syscall", "text/template", "text/template/parse", "time", "unicode", "unicode/utf16", "unicode/utf8"},
-       "go/doc":                            {"bytes", "errors", "fmt", "go/ast", "go/scanner", "go/token", "internal/race", "internal/syscall/windows", "internal/syscall/windows/registry", "io", "io/ioutil", "math", "net/url", "os", "path", "path/filepath", "reflect", "regexp", "regexp/syntax", "runtime", "runtime/internal/atomic", "runtime/internal/sys", "sort", "strconv", "strings", "sync", "sync/atomic", "syscall", "text/template", "text/template/parse", "time", "unicode", "unicode/utf16", "unicode/utf8"},
-       "go/parser":                         {"bytes", "errors", "fmt", "go/ast", "go/scanner", "go/token", "internal/race", "internal/syscall/windows", "internal/syscall/windows/registry", "io", "io/ioutil", "math", "os", "path/filepath", "reflect", "runtime", "runtime/internal/atomic", "runtime/internal/sys", "sort", "strconv", "strings", "sync", "sync/atomic", "syscall", "time", "unicode", "unicode/utf16", "unicode/utf8"},
-       "go/scanner":                        {"bytes", "errors", "fmt", "go/token", "internal/race", "internal/syscall/windows", "internal/syscall/windows/registry", "io", "math", "os", "path/filepath", "reflect", "runtime", "runtime/internal/atomic", "runtime/internal/sys", "sort", "strconv", "strings", "sync", "sync/atomic", "syscall", "time", "unicode", "unicode/utf16", "unicode/utf8"},
-       "go/token":                          {"errors", "fmt", "internal/race", "internal/syscall/windows", "internal/syscall/windows/registry", "io", "math", "os", "reflect", "runtime", "runtime/internal/atomic", "runtime/internal/sys", "sort", "strconv", "sync", "sync/atomic", "syscall", "time", "unicode/utf16", "unicode/utf8"},
+       "flag":                              {"errors", "fmt", "internal/race", "internal/syscall/windows", "internal/syscall/windows/registry", "internal/syscall/windows/sysdll", "io", "math", "os", "reflect", "runtime", "runtime/internal/atomic", "runtime/internal/sys", "sort", "strconv", "sync", "sync/atomic", "syscall", "time", "unicode/utf16", "unicode/utf8"},
+       "fmt":                               {"errors", "internal/race", "internal/syscall/windows", "internal/syscall/windows/registry", "internal/syscall/windows/sysdll", "io", "math", "os", "reflect", "runtime", "runtime/internal/atomic", "runtime/internal/sys", "strconv", "sync", "sync/atomic", "syscall", "time", "unicode/utf16", "unicode/utf8"},
+       "go/ast":                            {"bytes", "errors", "fmt", "go/scanner", "go/token", "internal/race", "internal/syscall/windows", "internal/syscall/windows/registry", "internal/syscall/windows/sysdll", "io", "math", "os", "path/filepath", "reflect", "runtime", "runtime/internal/atomic", "runtime/internal/sys", "sort", "strconv", "strings", "sync", "sync/atomic", "syscall", "time", "unicode", "unicode/utf16", "unicode/utf8"},
+       "go/build":                          {"bufio", "bytes", "errors", "fmt", "go/ast", "go/doc", "go/parser", "go/scanner", "go/token", "internal/race", "internal/syscall/windows", "internal/syscall/windows/registry", "internal/syscall/windows/sysdll", "io", "io/ioutil", "log", "math", "net/url", "os", "path", "path/filepath", "reflect", "regexp", "regexp/syntax", "runtime", "runtime/internal/atomic", "runtime/internal/sys", "sort", "strconv", "strings", "sync", "sync/atomic", "syscall", "text/template", "text/template/parse", "time", "unicode", "unicode/utf16", "unicode/utf8"},
+       "go/doc":                            {"bytes", "errors", "fmt", "go/ast", "go/scanner", "go/token", "internal/race", "internal/syscall/windows", "internal/syscall/windows/registry", "internal/syscall/windows/sysdll", "io", "io/ioutil", "math", "net/url", "os", "path", "path/filepath", "reflect", "regexp", "regexp/syntax", "runtime", "runtime/internal/atomic", "runtime/internal/sys", "sort", "strconv", "strings", "sync", "sync/atomic", "syscall", "text/template", "text/template/parse", "time", "unicode", "unicode/utf16", "unicode/utf8"},
+       "go/parser":                         {"bytes", "errors", "fmt", "go/ast", "go/scanner", "go/token", "internal/race", "internal/syscall/windows", "internal/syscall/windows/registry", "internal/syscall/windows/sysdll", "io", "io/ioutil", "math", "os", "path/filepath", "reflect", "runtime", "runtime/internal/atomic", "runtime/internal/sys", "sort", "strconv", "strings", "sync", "sync/atomic", "syscall", "time", "unicode", "unicode/utf16", "unicode/utf8"},
+       "go/scanner":                        {"bytes", "errors", "fmt", "go/token", "internal/race", "internal/syscall/windows", "internal/syscall/windows/registry", "internal/syscall/windows/sysdll", "io", "math", "os", "path/filepath", "reflect", "runtime", "runtime/internal/atomic", "runtime/internal/sys", "sort", "strconv", "strings", "sync", "sync/atomic", "syscall", "time", "unicode", "unicode/utf16", "unicode/utf8"},
+       "go/token":                          {"errors", "fmt", "internal/race", "internal/syscall/windows", "internal/syscall/windows/registry", "internal/syscall/windows/sysdll", "io", "math", "os", "reflect", "runtime", "runtime/internal/atomic", "runtime/internal/sys", "sort", "strconv", "sync", "sync/atomic", "syscall", "time", "unicode/utf16", "unicode/utf8"},
        "hash":                              {"errors", "internal/race", "io", "runtime", "runtime/internal/atomic", "runtime/internal/sys", "sync", "sync/atomic"},
        "hash/adler32":                      {"errors", "hash", "internal/race", "io", "runtime", "runtime/internal/atomic", "runtime/internal/sys", "sync", "sync/atomic"},
        "internal/race":                     {"runtime", "runtime/internal/atomic", "runtime/internal/sys"},
        "internal/singleflight":             {"internal/race", "runtime", "runtime/internal/atomic", "runtime/internal/sys", "sync", "sync/atomic"},
-       "internal/syscall/windows":          {"errors", "internal/race", "runtime", "runtime/internal/atomic", "runtime/internal/sys", "sync", "sync/atomic", "syscall", "unicode/utf16"},
-       "internal/syscall/windows/registry": {"errors", "internal/race", "io", "runtime", "runtime/internal/atomic", "runtime/internal/sys", "sync", "sync/atomic", "syscall", "unicode/utf16"},
+       "internal/syscall/windows":          {"errors", "internal/race", "internal/syscall/windows/sysdll", "runtime", "runtime/internal/atomic", "runtime/internal/sys", "sync", "sync/atomic", "syscall", "unicode/utf16"},
+       "internal/syscall/windows/registry": {"errors", "internal/race", "internal/syscall/windows/sysdll", "io", "runtime", "runtime/internal/atomic", "runtime/internal/sys", "sync", "sync/atomic", "syscall", "unicode/utf16"},
+       "internal/syscall/windows/sysdll":   {"runtime", "runtime/internal/atomic", "runtime/internal/sys"},
        "io":                      {"errors", "internal/race", "runtime", "runtime/internal/atomic", "runtime/internal/sys", "sync", "sync/atomic"},
-       "io/ioutil":               {"bytes", "errors", "internal/race", "internal/syscall/windows", "internal/syscall/windows/registry", "io", "math", "os", "path/filepath", "runtime", "runtime/internal/atomic", "runtime/internal/sys", "sort", "strconv", "strings", "sync", "sync/atomic", "syscall", "time", "unicode", "unicode/utf16", "unicode/utf8"},
-       "log":                     {"errors", "fmt", "internal/race", "internal/syscall/windows", "internal/syscall/windows/registry", "io", "math", "os", "reflect", "runtime", "runtime/internal/atomic", "runtime/internal/sys", "strconv", "sync", "sync/atomic", "syscall", "time", "unicode/utf16", "unicode/utf8"},
+       "io/ioutil":               {"bytes", "errors", "internal/race", "internal/syscall/windows", "internal/syscall/windows/registry", "internal/syscall/windows/sysdll", "io", "math", "os", "path/filepath", "runtime", "runtime/internal/atomic", "runtime/internal/sys", "sort", "strconv", "strings", "sync", "sync/atomic", "syscall", "time", "unicode", "unicode/utf16", "unicode/utf8"},
+       "log":                     {"errors", "fmt", "internal/race", "internal/syscall/windows", "internal/syscall/windows/registry", "internal/syscall/windows/sysdll", "io", "math", "os", "reflect", "runtime", "runtime/internal/atomic", "runtime/internal/sys", "strconv", "sync", "sync/atomic", "syscall", "time", "unicode/utf16", "unicode/utf8"},
        "math":                    {"runtime", "runtime/internal/atomic", "runtime/internal/sys"},
-       "net/url":                 {"bytes", "errors", "fmt", "internal/race", "internal/syscall/windows", "internal/syscall/windows/registry", "io", "math", "os", "reflect", "runtime", "runtime/internal/atomic", "runtime/internal/sys", "sort", "strconv", "strings", "sync", "sync/atomic", "syscall", "time", "unicode", "unicode/utf16", "unicode/utf8"},
-       "os":                      {"errors", "internal/race", "internal/syscall/windows", "internal/syscall/windows/registry", "io", "runtime", "runtime/internal/atomic", "runtime/internal/sys", "sync", "sync/atomic", "syscall", "time", "unicode/utf16", "unicode/utf8"},
-       "os/exec":                 {"bytes", "errors", "internal/race", "internal/syscall/windows", "internal/syscall/windows/registry", "io", "math", "os", "path/filepath", "runtime", "runtime/internal/atomic", "runtime/internal/sys", "sort", "strconv", "strings", "sync", "sync/atomic", "syscall", "time", "unicode", "unicode/utf16", "unicode/utf8"},
-       "os/signal":               {"errors", "internal/race", "internal/syscall/windows", "internal/syscall/windows/registry", "io", "os", "runtime", "runtime/internal/atomic", "runtime/internal/sys", "sync", "sync/atomic", "syscall", "time", "unicode/utf16", "unicode/utf8"},
+       "net/url":                 {"bytes", "errors", "fmt", "internal/race", "internal/syscall/windows", "internal/syscall/windows/registry", "internal/syscall/windows/sysdll", "io", "math", "os", "reflect", "runtime", "runtime/internal/atomic", "runtime/internal/sys", "sort", "strconv", "strings", "sync", "sync/atomic", "syscall", "time", "unicode", "unicode/utf16", "unicode/utf8"},
+       "os":                      {"errors", "internal/race", "internal/syscall/windows", "internal/syscall/windows/registry", "internal/syscall/windows/sysdll", "io", "runtime", "runtime/internal/atomic", "runtime/internal/sys", "sync", "sync/atomic", "syscall", "time", "unicode/utf16", "unicode/utf8"},
+       "os/exec":                 {"bytes", "errors", "internal/race", "internal/syscall/windows", "internal/syscall/windows/registry", "internal/syscall/windows/sysdll", "io", "math", "os", "path/filepath", "runtime", "runtime/internal/atomic", "runtime/internal/sys", "sort", "strconv", "strings", "sync", "sync/atomic", "syscall", "time", "unicode", "unicode/utf16", "unicode/utf8"},
+       "os/signal":               {"errors", "internal/race", "internal/syscall/windows", "internal/syscall/windows/registry", "internal/syscall/windows/sysdll", "io", "os", "runtime", "runtime/internal/atomic", "runtime/internal/sys", "sync", "sync/atomic", "syscall", "time", "unicode/utf16", "unicode/utf8"},
        "path":                    {"errors", "internal/race", "io", "runtime", "runtime/internal/atomic", "runtime/internal/sys", "strings", "sync", "sync/atomic", "unicode", "unicode/utf8"},
-       "path/filepath":           {"errors", "internal/race", "internal/syscall/windows", "internal/syscall/windows/registry", "io", "os", "runtime", "runtime/internal/atomic", "runtime/internal/sys", "sort", "strings", "sync", "sync/atomic", "syscall", "time", "unicode", "unicode/utf16", "unicode/utf8"},
+       "path/filepath":           {"errors", "internal/race", "internal/syscall/windows", "internal/syscall/windows/registry", "internal/syscall/windows/sysdll", "io", "os", "runtime", "runtime/internal/atomic", "runtime/internal/sys", "sort", "strings", "sync", "sync/atomic", "syscall", "time", "unicode", "unicode/utf16", "unicode/utf8"},
        "reflect":                 {"errors", "internal/race", "math", "runtime", "runtime/internal/atomic", "runtime/internal/sys", "strconv", "sync", "sync/atomic", "unicode/utf8"},
        "regexp":                  {"bytes", "errors", "internal/race", "io", "math", "regexp/syntax", "runtime", "runtime/internal/atomic", "runtime/internal/sys", "sort", "strconv", "strings", "sync", "sync/atomic", "unicode", "unicode/utf8"},
        "regexp/syntax":           {"bytes", "errors", "internal/race", "io", "math", "runtime", "runtime/internal/atomic", "runtime/internal/sys", "sort", "strconv", "strings", "sync", "sync/atomic", "unicode", "unicode/utf8"},
@@ -53,12 +54,12 @@ var builddeps = map[string][]string{
        "strings":                 {"errors", "internal/race", "io", "runtime", "runtime/internal/atomic", "runtime/internal/sys", "sync", "sync/atomic", "unicode", "unicode/utf8"},
        "sync":                    {"internal/race", "runtime", "runtime/internal/atomic", "runtime/internal/sys", "sync/atomic"},
        "sync/atomic":             {"runtime", "runtime/internal/atomic", "runtime/internal/sys"},
-       "syscall":                 {"errors", "internal/race", "runtime", "runtime/internal/atomic", "runtime/internal/sys", "sync", "sync/atomic", "unicode/utf16"},
-       "text/template":           {"bytes", "errors", "fmt", "internal/race", "internal/syscall/windows", "internal/syscall/windows/registry", "io", "io/ioutil", "math", "net/url", "os", "path/filepath", "reflect", "runtime", "runtime/internal/atomic", "runtime/internal/sys", "sort", "strconv", "strings", "sync", "sync/atomic", "syscall", "text/template/parse", "time", "unicode", "unicode/utf16", "unicode/utf8"},
-       "text/template/parse":     {"bytes", "errors", "fmt", "internal/race", "internal/syscall/windows", "internal/syscall/windows/registry", "io", "math", "os", "reflect", "runtime", "runtime/internal/atomic", "runtime/internal/sys", "strconv", "strings", "sync", "sync/atomic", "syscall", "time", "unicode", "unicode/utf16", "unicode/utf8"},
-       "time":                    {"errors", "internal/race", "internal/syscall/windows/registry", "io", "runtime", "runtime/internal/atomic", "runtime/internal/sys", "sync", "sync/atomic", "syscall", "unicode/utf16"},
+       "syscall":                 {"errors", "internal/race", "internal/syscall/windows/sysdll", "runtime", "runtime/internal/atomic", "runtime/internal/sys", "sync", "sync/atomic", "unicode/utf16"},
+       "text/template":           {"bytes", "errors", "fmt", "internal/race", "internal/syscall/windows", "internal/syscall/windows/registry", "internal/syscall/windows/sysdll", "io", "io/ioutil", "math", "net/url", "os", "path/filepath", "reflect", "runtime", "runtime/internal/atomic", "runtime/internal/sys", "sort", "strconv", "strings", "sync", "sync/atomic", "syscall", "text/template/parse", "time", "unicode", "unicode/utf16", "unicode/utf8"},
+       "text/template/parse":     {"bytes", "errors", "fmt", "internal/race", "internal/syscall/windows", "internal/syscall/windows/registry", "internal/syscall/windows/sysdll", "io", "math", "os", "reflect", "runtime", "runtime/internal/atomic", "runtime/internal/sys", "strconv", "strings", "sync", "sync/atomic", "syscall", "time", "unicode", "unicode/utf16", "unicode/utf8"},
+       "time":                    {"errors", "internal/race", "internal/syscall/windows/registry", "internal/syscall/windows/sysdll", "io", "runtime", "runtime/internal/atomic", "runtime/internal/sys", "sync", "sync/atomic", "syscall", "unicode/utf16"},
        "unicode":                 {"runtime", "runtime/internal/atomic", "runtime/internal/sys"},
        "unicode/utf16":           {"runtime", "runtime/internal/atomic", "runtime/internal/sys"},
        "unicode/utf8":            {"runtime", "runtime/internal/atomic", "runtime/internal/sys"},
-       "cmd/go":                  {"bufio", "bytes", "compress/flate", "compress/zlib", "container/heap", "crypto", "crypto/sha1", "debug/dwarf", "debug/elf", "debug/macho", "encoding", "encoding/base64", "encoding/binary", "encoding/json", "errors", "flag", "fmt", "go/ast", "go/build", "go/doc", "go/parser", "go/scanner", "go/token", "hash", "hash/adler32", "internal/race", "internal/singleflight", "internal/syscall/windows", "internal/syscall/windows/registry", "io", "io/ioutil", "log", "math", "net/url", "os", "os/exec", "os/signal", "path", "path/filepath", "reflect", "regexp", "regexp/syntax", "runtime", "runtime/internal/atomic", "runtime/internal/sys", "sort", "strconv", "strings", "sync", "sync/atomic", "syscall", "text/template", "text/template/parse", "time", "unicode", "unicode/utf16", "unicode/utf8"},
+       "cmd/go":                  {"bufio", "bytes", "compress/flate", "compress/zlib", "container/heap", "crypto", "crypto/sha1", "debug/dwarf", "debug/elf", "debug/macho", "encoding", "encoding/base64", "encoding/binary", "encoding/json", "errors", "flag", "fmt", "go/ast", "go/build", "go/doc", "go/parser", "go/scanner", "go/token", "hash", "hash/adler32", "internal/race", "internal/singleflight", "internal/syscall/windows", "internal/syscall/windows/registry", "internal/syscall/windows/sysdll", "io", "io/ioutil", "log", "math", "net/url", "os", "os/exec", "os/signal", "path", "path/filepath", "reflect", "regexp", "regexp/syntax", "runtime", "runtime/internal/atomic", "runtime/internal/sys", "sort", "strconv", "strings", "sync", "sync/atomic", "syscall", "text/template", "text/template/parse", "time", "unicode", "unicode/utf16", "unicode/utf8"},
 }
index 376931e1981e034961bb01e53ef12d10813635d9..1e6be2f7469338be3352f4241cfb68136b24a1c9 100644 (file)
@@ -132,10 +132,10 @@ var pkgDeps = map[string][]string{
        // End of linear dependency definitions.
 
        // Operating system access.
-       "syscall":                           {"L0", "internal/race", "unicode/utf16"},
+       "syscall":                           {"L0", "internal/race", "internal/syscall/windows/sysdll", "unicode/utf16"},
        "internal/syscall/unix":             {"L0", "syscall"},
-       "internal/syscall/windows":          {"L0", "syscall"},
-       "internal/syscall/windows/registry": {"L0", "syscall", "unicode/utf16"},
+       "internal/syscall/windows":          {"L0", "syscall", "internal/syscall/windows/sysdll"},
+       "internal/syscall/windows/registry": {"L0", "syscall", "internal/syscall/windows/sysdll", "unicode/utf16"},
        "time":          {"L0", "syscall", "internal/syscall/windows/registry"},
        "os":            {"L1", "os", "syscall", "time", "internal/syscall/windows"},
        "path/filepath": {"L2", "os", "syscall"},
index 5426cae90963308313cc186026e9187dcd0b6b78..02d985cec90b0f9ccdf40179a9c5540a1f1f2d93 100644 (file)
@@ -8,7 +8,7 @@ package registry
 
 import "syscall"
 
-//go:generate go run $GOROOT/src/syscall/mksyscall_windows.go -output zsyscall_windows.go syscall.go
+//go:generate go run $GOROOT/src/syscall/mksyscall_windows.go -output zsyscall_windows.go -systemdll syscall.go
 
 const (
        _REG_OPTION_NON_VOLATILE = 0
index 9c17675a249a9c0e47eeb931cda9caba5b6b2cd2..7e473d4e1de7b2609cb645a05060f02e1803c205 100644 (file)
@@ -4,12 +4,13 @@ package registry
 
 import "unsafe"
 import "syscall"
+import "internal/syscall/windows/sysdll"
 
 var _ unsafe.Pointer
 
 var (
-       modadvapi32 = syscall.NewLazyDLL("advapi32.dll")
-       modkernel32 = syscall.NewLazyDLL("kernel32.dll")
+       modadvapi32 = syscall.NewLazyDLL(sysdll.Add("advapi32.dll"))
+       modkernel32 = syscall.NewLazyDLL(sysdll.Add("kernel32.dll"))
 
        procRegCreateKeyExW           = modadvapi32.NewProc("RegCreateKeyExW")
        procRegDeleteKeyW             = modadvapi32.NewProc("RegDeleteKeyW")
index 165e8945ec37a547d93c15992219eac2de0c5e4e..e6a3f238d884ff125e49a46b6deccea9df75f70e 100644 (file)
@@ -6,7 +6,7 @@ package windows
 
 import "syscall"
 
-//go:generate go run ../../../syscall/mksyscall_windows.go -output zsyscall_windows.go syscall_windows.go
+//go:generate go run ../../../syscall/mksyscall_windows.go -output zsyscall_windows.go -systemdll syscall_windows.go
 
 const GAA_FLAG_INCLUDE_PREFIX = 0x00000010
 
diff --git a/src/internal/syscall/windows/sysdll/sysdll.go b/src/internal/syscall/windows/sysdll/sysdll.go
new file mode 100644 (file)
index 0000000..4e0018f
--- /dev/null
@@ -0,0 +1,28 @@
+// Copyright 2016 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 sysdll is an internal leaf package that records and reports
+// which Windows DLL names are used by Go itself. These DLLs are then
+// only loaded from the System32 directory. See Issue 14959.
+package sysdll
+
+// IsSystemDLL reports whether the named dll key (a base name, like
+// "foo.dll") is a system DLL which should only be loaded from the
+// Windows SYSTEM32 directory.
+//
+// Filenames are case sensitive, but that doesn't matter because
+// the case registered with Add is also the same case used with
+// LoadDLL later.
+//
+// It has no associated mutex and should only be mutated serially
+// (currently: during init), and not concurrent with DLL loading.
+var IsSystemDLL = map[string]bool{}
+
+// Add notes that dll is a system32 DLL which should only be loaded
+// from the Windows SYSTEM32 directory. It returns its argument back,
+// for ease of use in generated code.
+func Add(dll string) string {
+       IsSystemDLL[dll] = true
+       return dll
+}
index de41786c76e77950ffa5940c9023fc93b5b8e8a7..d599258976b81d014b3e7fee43520223c770aab6 100644 (file)
@@ -4,12 +4,13 @@ package windows
 
 import "unsafe"
 import "syscall"
+import "internal/syscall/windows/sysdll"
 
 var _ unsafe.Pointer
 
 var (
-       modiphlpapi = syscall.NewLazyDLL("iphlpapi.dll")
-       modkernel32 = syscall.NewLazyDLL("kernel32.dll")
+       modiphlpapi = syscall.NewLazyDLL(sysdll.Add("iphlpapi.dll"))
+       modkernel32 = syscall.NewLazyDLL(sysdll.Add("kernel32.dll"))
 
        procGetAdaptersAddresses = modiphlpapi.NewProc("GetAdaptersAddresses")
        procGetComputerNameExW   = modkernel32.NewProc("GetComputerNameExW")
index f712c6f65353c60df57708949c369f7399055ab4..7b269ecccb4db7d3be2f9b0f7f1046974d30bdf2 100644 (file)
@@ -15,3 +15,7 @@ func NumberOfProcessors() int32 {
        stdcall1(_GetSystemInfo, uintptr(unsafe.Pointer(&info)))
        return int32(info.dwnumberofprocessors)
 }
+
+func LoadLibraryExStatus() (useEx, haveEx, haveFlags bool) {
+       return useLoadLibraryEx, _LoadLibraryExW != nil, _AddDllDirectory != nil
+}
index a28e11e088db114102655ce0562acb5a8ac3d284..b4411dacc211ca227b88e873b172c5769a6613fe 100644 (file)
@@ -93,8 +93,11 @@ var (
 
        // Following syscalls are only available on some Windows PCs.
        // We will load syscalls, if available, before using them.
+       _AddDllDirectory,
        _AddVectoredContinueHandler,
-       _GetQueuedCompletionStatusEx stdFunction
+       _GetQueuedCompletionStatusEx,
+       _LoadLibraryExW,
+       _ stdFunction
 )
 
 type sigset struct{}
@@ -117,8 +120,10 @@ func loadOptionalSyscalls() {
                return stdFunction(unsafe.Pointer(f))
        }
        if l != 0 {
+               _AddDllDirectory = findfunc("AddDllDirectory")
                _AddVectoredContinueHandler = findfunc("AddVectoredContinueHandler")
                _GetQueuedCompletionStatusEx = findfunc("GetQueuedCompletionStatusEx")
+               _LoadLibraryExW = findfunc("LoadLibraryExW")
        }
 }
 
@@ -127,6 +132,11 @@ func getLoadLibrary() uintptr {
        return uintptr(unsafe.Pointer(_LoadLibraryW))
 }
 
+//go:nosplit
+func getLoadLibraryEx() uintptr {
+       return uintptr(unsafe.Pointer(_LoadLibraryExW))
+}
+
 //go:nosplit
 func getGetProcAddress() uintptr {
        return uintptr(unsafe.Pointer(_GetProcAddress))
@@ -161,6 +171,22 @@ const (
 // in sys_windows_386.s and sys_windows_amd64.s
 func externalthreadhandler()
 
+// When loading DLLs, we prefer to use LoadLibraryEx with
+// LOAD_LIBRARY_SEARCH_* flags, if available. LoadLibraryEx is not
+// available on old Windows, though, and the LOAD_LIBRARY_SEARCH_*
+// flags are not available on some versions of Windows without a
+// security patch.
+//
+// https://msdn.microsoft.com/en-us/library/ms684179(v=vs.85).aspx says:
+// "Windows 7, Windows Server 2008 R2, Windows Vista, and Windows
+// Server 2008: The LOAD_LIBRARY_SEARCH_* flags are available on
+// systems that have KB2533623 installed. To determine whether the
+// flags are available, use GetProcAddress to get the address of the
+// AddDllDirectory, RemoveDllDirectory, or SetDefaultDllDirectories
+// function. If GetProcAddress succeeds, the LOAD_LIBRARY_SEARCH_*
+// flags can be used with LoadLibraryEx."
+var useLoadLibraryEx bool
+
 func osinit() {
        asmstdcallAddr = unsafe.Pointer(funcPC(asmstdcall))
 
@@ -168,6 +194,8 @@ func osinit() {
 
        loadOptionalSyscalls()
 
+       useLoadLibraryEx = (_LoadLibraryExW != nil && _AddDllDirectory != nil)
+
        disableWER()
 
        externalthreadhandlerp = funcPC(externalthreadhandler)
index e2ff7a8a0fbc7ae66c278b6940547b4322032a80..0d52544488be14de0850976d6bd8d3337eac390f 100644 (file)
@@ -88,6 +88,41 @@ func compileCallback(fn eface, cleanstack bool) (code uintptr) {
        return callbackasmAddr(n)
 }
 
+const _LOAD_LIBRARY_SEARCH_SYSTEM32 = 0x00000800
+
+//go:linkname syscall_loadsystemlibrary syscall.loadsystemlibrary
+//go:nosplit
+func syscall_loadsystemlibrary(filename *uint16) (handle, err uintptr) {
+       c := &getg().m.syscall
+
+       if useLoadLibraryEx {
+               c.fn = getLoadLibraryEx()
+               c.n = 3
+               args := struct {
+                       lpFileName *uint16
+                       hFile      uintptr // always 0
+                       flags      uint32
+               }{filename, 0, _LOAD_LIBRARY_SEARCH_SYSTEM32}
+               c.args = uintptr(noescape(unsafe.Pointer(&args)))
+       } else {
+               // User is on Windows XP or something ancient.
+               // The caller wanted to only load the filename DLL
+               // from the System32 directory but that facility
+               // doesn't exist, so just load it the normal way. This
+               // is a potential security risk, but so is Windows XP.
+               c.fn = getLoadLibrary()
+               c.n = 1
+               c.args = uintptr(noescape(unsafe.Pointer(&filename)))
+       }
+
+       cgocall(asmstdcallAddr, unsafe.Pointer(c))
+       handle = c.r1
+       if handle == 0 {
+               err = c.err
+       }
+       return
+}
+
 //go:linkname syscall_loadlibrary syscall.loadlibrary
 //go:nosplit
 func syscall_loadlibrary(filename *uint16) (handle, err uintptr) {
index 79807035cc75140c232e8cd74280ffcdc10c4615..3f350cec27acc64f0958061e0af8a5703255ebf8 100644 (file)
@@ -7,6 +7,8 @@ package runtime_test
 import (
        "bytes"
        "fmt"
+       "internal/syscall/windows/sysdll"
+       "internal/testenv"
        "io/ioutil"
        "os"
        "os/exec"
@@ -771,3 +773,94 @@ func TestNumCPU(t *testing.T) {
                t.Fatalf("SetProcessAffinityMask didn't set newmask of 0x%x. Current mask is 0x%x.", newmask, mask)
        }
 }
+
+// See Issue 14959
+func TestDLLPreloadMitigation(t *testing.T) {
+       if _, err := exec.LookPath("gcc"); err != nil {
+               t.Skip("skipping test: gcc is missing")
+       }
+
+       dir0, err := os.Getwd()
+       if err != nil {
+               t.Fatal(err)
+       }
+       defer os.Chdir(dir0)
+
+       const src = `
+#include <stdint.h>
+#include <windows.h>
+
+uintptr_t cfunc() {
+   SetLastError(123);
+}
+`
+       tmpdir, err := ioutil.TempDir("", "TestDLLPreloadMitigation")
+       if err != nil {
+               t.Fatal("TempDir failed: ", err)
+       }
+       defer os.RemoveAll(tmpdir)
+
+       srcname := "nojack.c"
+       err = ioutil.WriteFile(filepath.Join(tmpdir, srcname), []byte(src), 0)
+       if err != nil {
+               t.Fatal(err)
+       }
+       name := "nojack.dll"
+       cmd := exec.Command("gcc", "-shared", "-s", "-Werror", "-o", name, srcname)
+       cmd.Dir = tmpdir
+       out, err := cmd.CombinedOutput()
+       if err != nil {
+               t.Fatalf("failed to build dll: %v - %v", err, string(out))
+       }
+       dllpath := filepath.Join(tmpdir, name)
+
+       dll := syscall.MustLoadDLL(dllpath)
+       dll.MustFindProc("cfunc")
+       dll.Release()
+
+       // Get into the directory with the DLL we'll load by base name
+       // ("nojack.dll") Think of this as the user double-clicking an
+       // installer from their Downloads directory where a browser
+       // silently downloaded some malicious DLLs.
+       os.Chdir(tmpdir)
+
+       // First before we can load a DLL from the current directory,
+       // loading it only as "nojack.dll", without an absolute path.
+       delete(sysdll.IsSystemDLL, name) // in case test was run repeatedly
+       dll, err = syscall.LoadDLL(name)
+       if err != nil {
+               t.Fatalf("failed to load %s by base name before sysdll registration: %v", name, err)
+       }
+       dll.Release()
+
+       // And now verify that if we register it as a system32-only
+       // DLL, the implicit loading from the current directory no
+       // longer works.
+       sysdll.IsSystemDLL[name] = true
+       dll, err = syscall.LoadDLL(name)
+       if err == nil {
+               dll.Release()
+               if wantLoadLibraryEx() {
+                       t.Fatalf("Bad: insecure load of DLL by base name %q before sysdll registration: %v", name, err)
+               }
+               t.Skip("insecure load of DLL, but expected")
+       }
+}
+
+// wantLoadLibraryEx reports whether we expect LoadLibraryEx to work for tests.
+func wantLoadLibraryEx() bool {
+       return testenv.Builder() == "windows-amd64-gce" || testenv.Builder() == "windows-386-gce"
+}
+
+func TestLoadLibraryEx(t *testing.T) {
+       use, have, flags := runtime.LoadLibraryExStatus()
+       if use {
+               return // success.
+       }
+       if wantLoadLibraryEx() {
+               t.Fatalf("Expected LoadLibraryEx+flags to be available. (LoadLibraryEx=%v; flags=%v)",
+                       have, flags)
+       }
+       t.Skipf("LoadLibraryEx not usable, but not expected. (LoadLibraryEx=%v; flags=%v)",
+               have, flags)
+}
index 3cf4b1be8c9cbdbf002dc231117c53456680435d..572fcee7e48b18f8bd8446100f51c6f0a23e87ff 100644 (file)
@@ -5,6 +5,7 @@
 package syscall
 
 import (
+       "internal/syscall/windows/sysdll"
        "sync"
        "sync/atomic"
        "unsafe"
@@ -26,6 +27,7 @@ func Syscall9(trap, nargs, a1, a2, a3, a4, a5, a6, a7, a8, a9 uintptr) (r1, r2 u
 func Syscall12(trap, nargs, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12 uintptr) (r1, r2 uintptr, err Errno)
 func Syscall15(trap, nargs, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15 uintptr) (r1, r2 uintptr, err Errno)
 func loadlibrary(filename *uint16) (handle uintptr, err Errno)
+func loadsystemlibrary(filename *uint16) (handle uintptr, err Errno)
 func getprocaddress(handle uintptr, procname *uint8) (proc uintptr, err Errno)
 
 // A DLL implements access to a single DLL.
@@ -34,13 +36,19 @@ type DLL struct {
        Handle Handle
 }
 
-// LoadDLL loads DLL file into memory.
-func LoadDLL(name string) (dll *DLL, err error) {
+// LoadDLL loads the named DLL file into memory.
+func LoadDLL(name string) (*DLL, error) {
        namep, err := UTF16PtrFromString(name)
        if err != nil {
                return nil, err
        }
-       h, e := loadlibrary(namep)
+       var h uintptr
+       var e Errno
+       if sysdll.IsSystemDLL[name] {
+               h, e = loadsystemlibrary(namep)
+       } else {
+               h, e = loadlibrary(namep)
+       }
        if e != 0 {
                return nil, &DLLError{
                        Err:     e,
index 622272ad50222b49a4f19db0f62d3f875f48b710..546cb0d432aa5ea68320ca72a35adc0e4398a3b7 100644 (file)
@@ -57,6 +57,7 @@ import (
        "io/ioutil"
        "log"
        "os"
+       "sort"
        "strconv"
        "strings"
        "text/template"
@@ -65,6 +66,8 @@ import (
 var (
        filename       = flag.String("output", "", "output file name (standard output if omitted)")
        printTraceFlag = flag.Bool("trace", false, "generate print statement after every syscall")
+       systemDLL      = flag.Bool("systemdll", false, "whether all DLLs should be loaded from the Windows system directory")
+       sysRepo        = flag.Bool("xsys", false, "whether this code is for the x/sys subrepo")
 )
 
 func trim(s string) string {
@@ -593,8 +596,14 @@ func (f *Fn) HelperName() string {
 
 // Source files and functions.
 type Source struct {
-       Funcs []*Fn
-       Files []string
+       Funcs   []*Fn
+       Files   []string
+       Imports []string
+}
+
+func (src *Source) Import(pkg string) {
+       src.Imports = append(src.Imports, pkg)
+       sort.Strings(src.Imports)
 }
 
 // ParseFiles parses files listed in fs and extracts all syscall
@@ -604,6 +613,12 @@ func ParseFiles(fs []string) (*Source, error) {
        src := &Source{
                Funcs: make([]*Fn, 0),
                Files: make([]string, 0),
+               Imports: []string{
+                       "unsafe",
+               },
+       }
+       if *systemDLL {
+               src.Import("internal/syscall/windows/sysdll")
        }
        for _, file := range fs {
                if err := src.ParseFile(file); err != nil {
@@ -676,9 +691,30 @@ func (src *Source) ParseFile(path string) error {
 
 // Generate output source file from a source set src.
 func (src *Source) Generate(w io.Writer) error {
+       if *sysRepo && packageName != "windows" {
+               src.Import("golang.org/x/sys/windows")
+       }
+       if packageName != "syscall" {
+               src.Import("syscall")
+       }
        funcMap := template.FuncMap{
                "packagename": packagename,
                "syscalldot":  syscalldot,
+               "newlazydll": func(dll string) string {
+                       arg := "\"" + dll + ".dll\""
+                       if *systemDLL {
+                               arg = "sysdll.Add(" + arg + ")"
+                       }
+                       if *sysRepo {
+                               if packageName == "windows" {
+                                       return "&LazyDLL{Name: " + arg + ", Flags: LoadLibrarySearchSystem32}"
+                               } else {
+                                       return "&windows.LazyDLL{Name: " + arg + ", Flags: windows.LoadLibrarySearchSystem32}"
+                               }
+                       } else {
+                               return syscalldot() + "NewLazyDLL(" + arg + ")"
+                       }
+               },
        }
        t := template.Must(template.New("main").Funcs(funcMap).Parse(srcTemplate))
        err := t.Execute(w, src)
@@ -733,8 +769,10 @@ const srcTemplate = `
 
 package {{packagename}}
 
-import "unsafe"{{if syscalldot}}
-import "syscall"{{end}}
+import (
+{{range .Imports}}"{{.}}"
+{{end}}
+)
 
 var _ unsafe.Pointer
 
@@ -746,7 +784,7 @@ var (
 
 {{/* help functions */}}
 
-{{define "dlls"}}{{range .DLLs}}       mod{{.}} = {{syscalldot}}NewLazyDLL("{{.}}.dll")
+{{define "dlls"}}{{range .DLLs}}       mod{{.}} = {{newlazydll .}}
 {{end}}{{end}}
 
 {{define "funcnames"}}{{range .Funcs}} proc{{.DLLFuncName}} = mod{{.DLLName}}.NewProc("{{.DLLFuncName}}")
index 6416655ade3e7b20fb594c08400a2c1c8cf9aba4..1d02ee0c5384b740c12897399ce5eaa132294792 100644 (file)
@@ -14,7 +14,7 @@ import (
        "unsafe"
 )
 
-//go:generate go run mksyscall_windows.go -output zsyscall_windows.go syscall_windows.go security_windows.go
+//go:generate go run mksyscall_windows.go -systemdll -output zsyscall_windows.go syscall_windows.go security_windows.go
 
 type Handle uintptr
 
index 7879ba1aa5c4a980e526bdd5dfb592033cb00179..bb3e892eb2b3559ea249c6997dce57fa12fca57d 100644 (file)
@@ -2,22 +2,25 @@
 
 package syscall
 
-import "unsafe"
+import (
+       "internal/syscall/windows/sysdll"
+       "unsafe"
+)
 
 var _ unsafe.Pointer
 
 var (
-       modkernel32 = NewLazyDLL("kernel32.dll")
-       modadvapi32 = NewLazyDLL("advapi32.dll")
-       modshell32  = NewLazyDLL("shell32.dll")
-       modmswsock  = NewLazyDLL("mswsock.dll")
-       modcrypt32  = NewLazyDLL("crypt32.dll")
-       modws2_32   = NewLazyDLL("ws2_32.dll")
-       moddnsapi   = NewLazyDLL("dnsapi.dll")
-       modiphlpapi = NewLazyDLL("iphlpapi.dll")
-       modsecur32  = NewLazyDLL("secur32.dll")
-       modnetapi32 = NewLazyDLL("netapi32.dll")
-       moduserenv  = NewLazyDLL("userenv.dll")
+       modkernel32 = NewLazyDLL(sysdll.Add("kernel32.dll"))
+       modadvapi32 = NewLazyDLL(sysdll.Add("advapi32.dll"))
+       modshell32  = NewLazyDLL(sysdll.Add("shell32.dll"))
+       modmswsock  = NewLazyDLL(sysdll.Add("mswsock.dll"))
+       modcrypt32  = NewLazyDLL(sysdll.Add("crypt32.dll"))
+       modws2_32   = NewLazyDLL(sysdll.Add("ws2_32.dll"))
+       moddnsapi   = NewLazyDLL(sysdll.Add("dnsapi.dll"))
+       modiphlpapi = NewLazyDLL(sysdll.Add("iphlpapi.dll"))
+       modsecur32  = NewLazyDLL(sysdll.Add("secur32.dll"))
+       modnetapi32 = NewLazyDLL(sysdll.Add("netapi32.dll"))
+       moduserenv  = NewLazyDLL(sysdll.Add("userenv.dll"))
 
        procGetLastError                       = modkernel32.NewProc("GetLastError")
        procLoadLibraryW                       = modkernel32.NewProc("LoadLibraryW")