koch supports the finish command for smooth installations on Windows
This commit is contained in:
parent
3dc8e593ff
commit
6e6b90278c
3 changed files with 224 additions and 74 deletions
66
lib/windows/registry.nim
Normal file
66
lib/windows/registry.nim
Normal file
|
|
@ -0,0 +1,66 @@
|
|||
import winlean, os
|
||||
|
||||
type
|
||||
HKEY* = uint
|
||||
|
||||
const
|
||||
HKEY_LOCAL_MACHINE* = HKEY(0x80000002u)
|
||||
HKEY_CURRENT_USER* = HKEY(2147483649)
|
||||
|
||||
RRF_RT_ANY = 0x0000ffff
|
||||
KEY_WOW64_64KEY = 0x0100
|
||||
KEY_WOW64_32KEY = 0x0200
|
||||
KEY_READ = 0x00020019
|
||||
REG_SZ = 1
|
||||
|
||||
proc regOpenKeyEx(hKey: HKEY, lpSubKey: WideCString, ulOptions: int32,
|
||||
samDesired: int32,
|
||||
phkResult: var HKEY): int32 {.
|
||||
importc: "RegOpenKeyExW", dynlib: "Advapi32.dll", stdcall.}
|
||||
|
||||
proc regCloseKey(hkey: HKEY): int32 {.
|
||||
importc: "RegCloseKey", dynlib: "Advapi32.dll", stdcall.}
|
||||
|
||||
proc regGetValue(key: HKEY, lpSubKey, lpValue: WideCString;
|
||||
dwFlags: int32 = RRF_RT_ANY, pdwType: ptr int32,
|
||||
pvData: pointer,
|
||||
pcbData: ptr int32): int32 {.
|
||||
importc: "RegGetValueW", dynlib: "Advapi32.dll", stdcall.}
|
||||
|
||||
template call(f) =
|
||||
let err = f
|
||||
if err != 0:
|
||||
raiseOSError(err.OSErrorCode, astToStr(f))
|
||||
|
||||
proc getUnicodeValue*(path, key: string; handle: HKEY): string =
|
||||
let hh = newWideCString path
|
||||
let kk = newWideCString key
|
||||
var bufsize: int32
|
||||
# try a couple of different flag settings:
|
||||
var flags: int32 = RRF_RT_ANY
|
||||
let err = regGetValue(handle, hh, kk, flags, nil, nil, addr bufsize)
|
||||
if err != 0:
|
||||
var newHandle: HKEY
|
||||
call regOpenKeyEx(handle, hh, 0, KEY_READ or KEY_WOW64_64KEY, newHandle)
|
||||
call regGetValue(newHandle, nil, kk, flags, nil, nil, addr bufsize)
|
||||
var res = newWideCString("", bufsize)
|
||||
call regGetValue(newHandle, nil, kk, flags, nil, cast[pointer](res),
|
||||
addr bufsize)
|
||||
result = res $ bufsize
|
||||
call regCloseKey(newHandle)
|
||||
else:
|
||||
var res = newWideCString("", bufsize)
|
||||
call regGetValue(handle, hh, kk, flags, nil, cast[pointer](res),
|
||||
addr bufsize)
|
||||
result = res $ bufsize
|
||||
|
||||
proc regSetValue(key: HKEY, lpSubKey, lpValueName: WideCString,
|
||||
dwType: int32; lpData: WideCString; cbData: int32): int32 {.
|
||||
importc: "RegSetKeyValueW", dynlib: "Advapi32.dll", stdcall.}
|
||||
|
||||
proc setUnicodeValue*(path, key, val: string; handle: HKey) =
|
||||
let hh = newWideCString path
|
||||
let kk = newWideCString key
|
||||
let vv = newWideCString val
|
||||
call regSetValue(handle, hh, kk, REG_SZ, vv, (vv.len.int32+1)*2)
|
||||
|
||||
Loading…
Add table
Add a link
Reference in a new issue