1// +build windows 2 3package speakeasy 4 5import ( 6 "syscall" 7) 8 9// SetConsoleMode function can be used to change value of ENABLE_ECHO_INPUT: 10// http://msdn.microsoft.com/en-us/library/windows/desktop/ms686033(v=vs.85).aspx 11const ENABLE_ECHO_INPUT = 0x0004 12 13func getPassword() (password string, err error) { 14 var oldMode uint32 15 16 err = syscall.GetConsoleMode(syscall.Stdin, &oldMode) 17 if err != nil { 18 return 19 } 20 21 var newMode uint32 = (oldMode &^ ENABLE_ECHO_INPUT) 22 23 err = setConsoleMode(syscall.Stdin, newMode) 24 defer setConsoleMode(syscall.Stdin, oldMode) 25 if err != nil { 26 return 27 } 28 29 return readline() 30} 31 32func setConsoleMode(console syscall.Handle, mode uint32) (err error) { 33 dll := syscall.MustLoadDLL("kernel32") 34 proc := dll.MustFindProc("SetConsoleMode") 35 r, _, err := proc.Call(uintptr(console), uintptr(mode)) 36 37 if r == 0 { 38 return err 39 } 40 return nil 41} 42