View in color | License | Download script | History |
30-Apr 16:00 UTC
[0.058] 23.215k
[0.058] 23.215k
registry.rREBOL [
Title: "Win-Registry-Control"
Date: 21-Aug-2001
Version: 1.1.0
File: %registry.r
Author: "Frank Sievertsen"
Usage: {
^-^-USE THIS SCRIPT ON YOUR OWN RISK!
^-^-read registry:HKEY_CURRENT_USER\
^-^-^-you will receive a block of all subkeys and
^-^-^-values of the key.
^-^-^-IMPORTANT: use Backslash instead of Slash !!!!
^-^-read registry:HKEY_CURRENT_USER\Software\
^-^-^-Same as above
^-^-read registry:HKEY_CURRENT_USER\Software\Rebol\View\\HOME
^-^-^-Reads the value "Home"
^-^-^-IMPORTANT: double backslash before value
^-^-NEW: registry:computer_name:HKEY_LOCAL_MACHINE\....
^-^-When reading Text/binary/dword - Values, you will get
^-^-string/binary/integer - Values.
^-^-Example:
^-^->> read registry:current_user\software\rebol\
^-^-== [%Console\ %View\ %\test-value %\]
^-^- ^--------------- ^--------------
^-^- keys values
^-^-The last result is the "standard value" of the registry-key
^-^-"Rebol". I set it.
^-^-To find out, if a result is a key or a value, use:
^-^-registry-value?: func [file [file!]] [
^-^-^-(first file) = #"\"
^-^-]
^-^-write registry:HKEY_CURRENT_USER\Software\Test\ none
^-^-^-Creates the Key "Test"
^-^-write registry:CURRENT_USER\Software\Test\\example "Hallo"
^-^-^-Writes text "Hallo" to value "example" in key "test"
^-^-write registry:CURRENT_USER\Software\Test\\example #{aa}
^-^-^-Writes binary-val to value "example" in key "test"
^-^-write registry:CURRENT_USER\Software\Test\\example 881
^-^-^-Writes DWORD 881 to value "example" in key "test"
^-^-registry-delete registry:CURRENT_USER\Software\Test\
^-^-^-Deletes key "Test"
^-^-registry-delete registry:CURRENT_USER\Software\Test\\example
^-^-^-Deletes value "example"
^-}
Purpose: "View and modify data of windows registry."
History: [
1.1.0 {
^-^-^-Now you can connect to other computers with
^-^-^-registry:computer_name\HKEY_...
^-^-}
1.0.0 {
^-^-^-First release
^-^-}
]
Email: %fsievert--uos--de
library: [
level: 'advanced
platform: [windows win]
type: 'tool
domain: 'win-api
tested-under: none
support: none
license: none
see-also: none
]
]
if any [
not system/user-license/id
system/version/4 <> 3
] [
either system/view [
inform layout [backdrop 200.200.200
h1 "You need Rebol/Command or Rebol/Pro"
h1 "and a Windows Computer"
button "Ok" [unview/all]
]
] [
print "You need Rebol/Command or Rebol/Pro"
print "and a Windows Computer"
]
quit
]
context [
registry: make object! [
lib: load/library %Advapi32.dll
long-holder: make struct! [val [long]] [0]
RegOpenKeyEx: make routine! [
hkey [long]
lpsubkey [string!]
uloptions [long]
samDesired [long]
phkResult [struct! [val [long]]]
return: [long]
] lib "RegOpenKeyExA"
RegQueryValueEx: make routine! [
hKey [Long]
lpValueName [String!]
lpReserved [Long]
lpType [struct! [val [long]]]
lpData [string!] ; returns any-type
lpcbData [struct! [val [long]]]
return: [long]
] lib "RegQueryValueExA"
RegCloseKey: make routine! [
hkey [long]
return: [long]
] lib "RegCloseKey"
RegCreateKey: make routine! [
hkey [long]
lpSubKey [string!]
phkResult [struct! [val [long]]]
return: [long]
] lib "RegCreateKeyA"
RegSetValueEx: make routine! [
hkey [long]
lpValueName [string!]
reserved [long]
dwType [long]
lpData [string!]
cbData [long]
return: [long]
] lib "RegSetValueExA"
RegEnumValue: make routine! [
hkey [long]
dwIndex [long]
lpValueName [string!] ; Returns name
length [struct! [val [long]]] ; in: size out: length
lpReserved [long]
lpType [struct! [val [long]]]
lpData [long]
lpcdData [long]
return: [long]
] lib "RegEnumValueA"
RegEnumKey: make routine! [
hkey [long]
dwIndex [long]
lpName [string!] ; Returns name
length [struct! [var [long]]]
return: [long]
] lib "RegEnumKeyA"
RegEnumKeyEx: make routine! [
hkey [long]
dwIndex [long]
lpName [string!] ; Returns name
length [struct! [var [long]]]
reserved [long] ; 0
lpClass [long] ; 0
lpcClass [long] ; 0
lpftLastWriteTime [string!]
return: [long]
] lib "RegEnumKeyExA"
RegDeleteKey: make routine! [
hKey [long]
lpSubKey [string!]
return: [long]
] lib "RegDeleteKeyA"
RegDeleteValue: make routine! [
hKey [long]
lpValueName [string!]
return: [long]
] lib "RegDeleteValueA"
RegConnectRegistry: make routine! [
lpMachineName [string!]
hKey [long] ; LOCAL_MACHINE OR USERS
phkResult [struct! [val [long]]]
return: [long]
] lib "RegConnectRegistryA"
; HOTKEYS
HKEY_CLASSES_ROOT: to-integer #{80000000}
HKEY_CURRENT_CONFIG: to-integer #{80000005}
HKEY_CURRENT_USER: to-integer #{80000001}
HKEY_DYN_DATA: to-integer #{80000006}
HKEY_LOCAL_MACHINE: to-integer #{80000002}
HKEY_PERFORMANCE_DATA: to-integer #{80000004}
HKEY_USERS: to-integer #{80000003}
; ACCESS-VALUES
KEY_READ: to-integer #{020019}
KEY_WRITE: to-integer #{020006}
; DATATYPES
D_Problem: -1
D_No-data: 0
D_Text: 1
D_Binary: 3
D_Double: 4
key: make struct! long-holder [0]
type: make struct! long-holder [0]
data: make struct! long-holder [0]
open-key: func [
hkey [word!]
path [string!]
/write
/remote computer [string! none!]
/local k
] [
k: get in self hkey
if computer [
if not zero? RegConnectRegistry
computer
k
k: make struct! long-holder [0] [
make error! "RegConnectRegistry"
]
k: k/val
]
if not zero? RegOpenKeyEx
k
path
0
either write [KEY_WRITE] [KEY_READ]
key
[
make error! "RegOpenKey"
]
if computer [
RegCloseKey k
]
]
get-value: func [
hkey [word!]
path [string!]
value [string!]
/remote computer [none! string!]
] [
open-key/remote hkey path computer
RegQueryValueEx
key/val
value
0
type
""
data
if not zero? RegQueryValueEx
key/val
value
0
type
mem: head insert/dup copy "" to-char 0 data/val
data
[
make error! "RegQueryValueEx"
]
RegCloseKey key/val
switch/default type/val reduce [
D_Text [remove back tail mem]
D_Binary [mem: to-binary mem]
D_Double [
change third long-holder mem
mem: long-holder/val
]
] [
make error! "Unknown Datatype"
]
mem
]
set-value: func [hkey [word!] path [string!] value [string!]
data [string! binary! integer!]
/remote computer
/local out-data
] [
open-key/write/remote hkey path computer
switch type?/word data [
binary! [out-data: to-string data]
string! [out-data: rejoin [data to-char 0]]
integer! [
long-holder/val: data
out-data: to-string third long-holder
]
]
if not zero? RegSetValueEx
key/val
value
0
get select [
binary! D_Binary
string! D_Text
integer! D_Double
] type?/word data
out-data
length? out-data
[
make error! "Unable to set value"
]
]
create-key: func [hkey [word!] path [string!] /local key] [
if not zero? RegCreateKey
get in self hkey
path
key: make struct! long-holder [0]
[
make error! "Unable to create key"
]
RegCloseKey key/val
]
get-keys: func [
hkey [word!] path [string!]
/remote computer
/local out count buf length type time
] [
out: copy []
count: 0
buf: head insert/dup copy "" to-char 0 1024
open-key/remote hkey path computer
time: head insert/dup copy "" to-char 0 100
forever [
length: make struct! long-holder [1024]
type: make struct! long-holder [0]
if not zero? RegEnumKeyEx
key/val
count
buf
length
0
0
0
time
[
break
]
count: count + 1
append out copy/part buf length/val
]
RegCloseKey key/val
out
]
get-values: func [
hkey [word!] path [string!]
/remote computer
/local out count buf length type
] [
out: copy []
count: 0
buf: head insert/dup copy "" to-char 0 1024
open-key/remote hkey path computer
forever [
length: make struct! long-holder [1024]
type: make struct! long-holder [0]
if not zero? RegEnumValue
key/val
count
buf
length
0
type
0
0
[
break
]
count: count + 1
append out copy/part buf length/val
]
RegCloseKey key/val
out
]
delete-key: func [hkey [word!] path [string!]] [
if not zero? RegDeleteKey
get in self hkey
path
[
make error! "Unable to delete key"
]
]
delete-value: func [hkey [word!] path [string!] value [string!] /remote computer] [
open-key/write/remote hkey path computer
RegDeleteValue
key/val
value
RegCloseKey key/val
]
]
comment {
registry:HKEY_CURRENT_USER\
registry:HKEY_CURRENT_USER\Rebol\View
registry:HKEY_CURRENT_USER\Rebol\View\\HOME
Later:
registry:host.domain.com:HKEY_CURRENT_USER\Rebol\View\\HOME
}
registry-url: context [
base-out: make object! [
host: none
top-key: none
path: none
value: none
]
out: none
t1: t2: t3: t4: none
init: [(
out: make base-out []
)]
key-names: [
"CLASSES_ROOT"
| "CURRENT_USER"
| "LOCAL_MACHINE"
| "USERS"
| "CURRENT_CONFIG"
| "DYN_DATA"
]
computer-chars: complement charset ":\"
computer-name: [
copy t1 some computer-chars ":"
(out/host: t1)
]
top-key: [
opt "HKEY_"
copy t1 key-names
["\" | end]
(
out/top-key: to-word rejoin [
"HKEY_" uppercase t1
]
)
]
non-bslash: complement charset "\"
key: [
some non-bslash
["\" | end]
]
key-path: [
copy t1 any [key]
(
out/path: any [t1 copy ""]
)
]
value: [
"\" copy t1 to end
(
out/value: any [t1 copy ""]
)
]
start: [
init
"registry:"
opt computer-name
top-key
key-path
opt value
]
parser: func [url [url!]] [
if not parse/all url start [
make error! "REGISTRY URL error"
]
out
]
]
make root-protocol [
scheme: 'REGISTRY
port-id: checksum "REGISTRY"
init: func [port spec /local data] [
if not url? spec [
make error! "only urls are supported by registry-scheme"
]
port/locals: make object! [
data: none
]
port/locals/data: data: registry-url/parser spec
port/host: data/host
port/path: data/path
port/target: data/value
]
open: func [port] [
port/state/flags: system/standard/port-flags/pass-thru
]
copy: func [port /local out] [
either none? port/target [
out: registry/get-keys/remote port/locals/data/top-key port/path port/host
forall out [
out/1: to-file append out/1 "\"
]
append out registry/get-values/remote port/locals/data/top-key port/path port/host
forall out [
out/1: to-file head system/words/insert out/1 "\"
]
head out
] [
registry/get-value/remote port/locals/data/top-key port/path port/target port/host
]
]
insert: func [port data] [
registry/create-key/remove port/locals/data/top-key port/path port/host
if found? port/target [
registry/set-value/remote port/locals/data/top-key port/path port/target data port/host
]
port
]
close: func [port] [
]
net-utils/net-install :scheme self 0
]
system/words/registry-delete: func [url [url!] /local data] [
data: registry-url/parser url
either found? data/value [
registry/delete-value/remote data/top-key data/path data/value data/host
] [
registry/delete-key/remote data/top-key data/path data/host
]
]
] Notes
|