Add a basic windows registry vocabulary
parent
62e85195f7
commit
67fa5080f4
|
@ -0,0 +1 @@
|
|||
Doug Coleman
|
|
@ -0,0 +1 @@
|
|||
windows
|
|
@ -0,0 +1,7 @@
|
|||
! Copyright (C) 2010 Doug Coleman.
|
||||
! See http://factorcode.org/license.txt for BSD license.
|
||||
USING: kernel tools.test windows.advapi32 windows.registry ;
|
||||
IN: windows.registry.tests
|
||||
|
||||
[ ]
|
||||
[ HKEY_CURRENT_USER "SOFTWARE\\\\Microsoft" read-registry drop ] unit-test
|
|
@ -0,0 +1,194 @@
|
|||
! Copyright (C) 2010 Doug Coleman.
|
||||
! See http://factorcode.org/license.txt for BSD license.
|
||||
USING: alien.c-types byte-arrays kernel locals sequences
|
||||
windows.advapi32 windows.errors math windows
|
||||
windows.kernel32 windows.time accessors alien.data
|
||||
nested-comments windows.types classes.struct continuations ;
|
||||
IN: windows.registry
|
||||
|
||||
ERROR: open-key-failed key subkey mode error-string ;
|
||||
ERROR: create-key-failed hKey lpSubKey lpClass dwOptions
|
||||
samDesired lpSecurityAttributes phkResult lpdwDisposition ;
|
||||
|
||||
CONSTANT: registry-value-max-length 16384
|
||||
|
||||
:: open-key ( key subkey mode -- hkey )
|
||||
key subkey 0 mode HKEY <c-object>
|
||||
[
|
||||
RegOpenKeyEx dup ERROR_SUCCESS = [
|
||||
drop
|
||||
] [
|
||||
[ key subkey mode ] dip n>win32-error-string
|
||||
open-key-failed
|
||||
] if
|
||||
] keep *uint ;
|
||||
|
||||
:: create-key* ( hKey lpSubKey lpClass dwOptions samDesired lpSecurityAttributes -- hkey new? )
|
||||
hKey lpSubKey 0 lpClass dwOptions samDesired lpSecurityAttributes
|
||||
HKEY <c-object>
|
||||
DWORD <c-object>
|
||||
f :> ret!
|
||||
[ RegCreateKeyEx ret! ] 2keep
|
||||
[ *uint ]
|
||||
[ *uint REG_CREATED_NEW_KEY = ] bi*
|
||||
ret ERROR_SUCCESS = [
|
||||
[
|
||||
hKey lpSubKey 0 lpClass dwOptions samDesired
|
||||
lpSecurityAttributes
|
||||
] dip n>win32-error-string
|
||||
create-key-failed
|
||||
] unless ;
|
||||
|
||||
: create-key ( hkey lsubkey -- hkey )
|
||||
f 0 KEY_ALL_ACCESS f create-key* drop ;
|
||||
|
||||
: close-key ( hkey -- )
|
||||
RegCloseKey dup ERROR_SUCCESS = [
|
||||
drop
|
||||
] [
|
||||
n>win32-error-string throw
|
||||
] if ;
|
||||
|
||||
:: with-open-registry-key ( key subkey mode quot -- )
|
||||
key subkey mode open-key :> hkey
|
||||
[ hkey quot call ]
|
||||
[ hkey close-key ]
|
||||
[ ] cleanup ; inline
|
||||
|
||||
:: with-create-registry-key ( key subkey quot -- )
|
||||
key subkey create-key :> hkey
|
||||
[ hkey quot call ]
|
||||
[ hkey close-key ]
|
||||
[ ] cleanup ; inline
|
||||
|
||||
<PRIVATE
|
||||
|
||||
: grow-buffer ( byte-array -- byte-array' )
|
||||
length 2 * <byte-array> ;
|
||||
|
||||
:: reg-query-value-ex ( key subkey ptr1 ptr2 buffer -- buffer )
|
||||
buffer length <uint> :> pdword
|
||||
key subkey ptr1 ptr2 buffer pdword [ RegQueryValueEx ] 2keep
|
||||
rot :> ret
|
||||
ret ERROR_SUCCESS = [
|
||||
*uint head
|
||||
] [
|
||||
ret ERROR_MORE_DATA = [
|
||||
2drop
|
||||
key subkey ptr1 ptr2 buffer
|
||||
grow-buffer reg-query-value-ex
|
||||
] [
|
||||
ret n>win32-error-string throw
|
||||
] if
|
||||
] if ;
|
||||
|
||||
TUPLE: registry-info
|
||||
key
|
||||
class-name
|
||||
sub-keys
|
||||
longest-subkey
|
||||
longest-class-string
|
||||
#values
|
||||
max-value
|
||||
max-value-data
|
||||
security-descriptor
|
||||
last-write-time ;
|
||||
|
||||
TUPLE: registry-enum-key ;
|
||||
|
||||
|
||||
:: reg-enum-keys ( registry-info -- seq )
|
||||
registry-info sub-keys>> iota [
|
||||
[ registry-info key>> ] dip
|
||||
registry-value-max-length TCHAR <c-array> dup :> registry-value
|
||||
registry-value length dup :> registry-value-length
|
||||
f
|
||||
DWORD <c-object> dup :> type
|
||||
f ! BYTE <c-object> dup :> data
|
||||
f ! BYTE <c-object> dup :> buffer
|
||||
RegEnumKeyEx dup ERROR_SUCCESS = [
|
||||
|
||||
] [
|
||||
] if
|
||||
] map ;
|
||||
|
||||
:: reg-query-info-key ( key -- n )
|
||||
key
|
||||
MAX_PATH
|
||||
dup TCHAR <c-array> dup :> class-buffer
|
||||
swap <int> dup :> class-buffer-length
|
||||
f
|
||||
DWORD <c-object> dup :> sub-keys
|
||||
DWORD <c-object> dup :> longest-subkey
|
||||
DWORD <c-object> dup :> longest-class-string
|
||||
DWORD <c-object> dup :> #values
|
||||
DWORD <c-object> dup :> max-value
|
||||
DWORD <c-object> dup :> max-value-data
|
||||
DWORD <c-object> dup :> security-descriptor
|
||||
FILETIME <struct> dup :> last-write-time
|
||||
RegQueryInfoKey :> ret
|
||||
ret ERROR_SUCCESS = [
|
||||
key
|
||||
class-buffer
|
||||
sub-keys *uint
|
||||
longest-subkey *uint
|
||||
longest-class-string *uint
|
||||
#values *uint
|
||||
max-value *uint
|
||||
max-value-data *uint
|
||||
security-descriptor *uint
|
||||
last-write-time FILETIME>timestamp
|
||||
registry-info boa
|
||||
] [
|
||||
ret n>win32-error-string
|
||||
] if ;
|
||||
|
||||
: set-reg-key ( hkey value type lpdata cbdata -- )
|
||||
[ 0 ] 3dip
|
||||
RegSetValueEx dup ERROR_SUCCESS = [
|
||||
drop
|
||||
] [
|
||||
"omg" throw
|
||||
] if ;
|
||||
|
||||
: set-reg-binary ( hkey value lpdata cbdata -- )
|
||||
[ REG_BINARY ] 2dip set-reg-key ;
|
||||
|
||||
: set-reg-dword ( hkey value lpdata cbdata -- )
|
||||
[ REG_DWORD ] 2dip set-reg-key ;
|
||||
|
||||
: set-reg-dword-le ( hkey value lpdata cbdata -- )
|
||||
[ REG_DWORD_LITTLE_ENDIAN ] 2dip set-reg-key ;
|
||||
|
||||
: set-reg-dword-be ( hkey value lpdata cbdata -- )
|
||||
[ REG_DWORD_BIG_ENDIAN ] 2dip set-reg-key ;
|
||||
|
||||
: set-reg-expand-sz ( hkey value lpdata cbdata -- )
|
||||
[ REG_EXPAND_SZ ] 2dip set-reg-key ;
|
||||
|
||||
: set-reg-link ( hkey value lpdata cbdata -- )
|
||||
[ REG_LINK ] 2dip set-reg-key ;
|
||||
|
||||
: set-reg-multi-sz ( hkey value lpdata cbdata -- )
|
||||
[ REG_MULTI_SZ ] 2dip set-reg-key ;
|
||||
|
||||
: set-reg-none ( hkey value lpdata cbdata -- )
|
||||
[ REG_NONE ] 2dip set-reg-key ;
|
||||
|
||||
: set-reg-qword ( hkey value lpdata cbdata -- )
|
||||
[ REG_QWORD ] 2dip set-reg-key ;
|
||||
|
||||
: set-reg-qword-le ( hkey value lpdata cbdata -- )
|
||||
[ REG_QWORD_LITTLE_ENDIAN ] 2dip set-reg-key ;
|
||||
|
||||
: set-reg-sz ( hkey value lpdata cbdata -- )
|
||||
[ REG_SZ ] 2dip set-reg-key ;
|
||||
|
||||
PRIVATE>
|
||||
|
||||
: windows-performance-data ( -- byte-array )
|
||||
HKEY_PERFORMANCE_DATA "Global" f f
|
||||
21 2^ <byte-array> reg-query-value-ex ;
|
||||
|
||||
: read-registry ( key subkey -- registry-info )
|
||||
KEY_READ [ reg-query-info-key ] with-open-registry-key ;
|
Loading…
Reference in New Issue