| Abhay Kumar | a61c522 | 2025-11-10 07:32:50 +0000 | [diff] [blame^] | 1 | // +build windows |
| 2 | |
| 3 | package speakeasy |
| 4 | |
| 5 | import ( |
| 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 |
| 11 | const ENABLE_ECHO_INPUT = 0x0004 |
| 12 | |
| 13 | func 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 | |
| 32 | func 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 | } |