1// Copyright 2016 Keybase, Inc. All rights reserved. Use of
2// this source code is governed by the included BSD license.
3
4package libkb
5
6import (
7	"errors"
8	"syscall"
9	"unsafe"
10)
11
12const loadLibrarySearchSystem32 = 0x800
13
14// SaferDLLLoading sets DLL load path to be safer.
15func SaferDLLLoading() error {
16	kernel32, err := syscall.LoadDLL("kernel32.dll")
17	if err != nil {
18		return err
19	}
20
21	procSetDllDirectoryW, err := kernel32.FindProc("SetDllDirectoryW")
22	if err != nil {
23		return err
24	}
25	var zero uint16
26	r1, _, e1 := syscall.Syscall(procSetDllDirectoryW.Addr(), 1,
27		uintptr(unsafe.Pointer(&zero)), 0, 0)
28
29	procSetDefaultDllDirectories, err := kernel32.FindProc("SetDefaultDllDirectories")
30	if err == nil && procSetDefaultDllDirectories.Addr() != 0 {
31		r1, _, e1 = syscall.Syscall(procSetDefaultDllDirectories.Addr(), 1,
32			loadLibrarySearchSystem32, 0, 0)
33		if r1 == 0 {
34			return e1
35		}
36	} else {
37		return errors.New("SetDefaultDllDirectories not found - please install KB2533623 for safer DLL loading")
38	}
39
40	return nil
41}
42