Jump to content
wraithdu

Custom Registry Functions UDF

Recommended Posts

wraithdu

Update 2/2/12:

v2.0.7

Fix _RegRead returns string data for _RegExport.

Update 1/30/12:

v2.0.6 - SCRIPT BREAKING

Change _RegRead treatment of REG_MULTI_SZ data. Data is returned in a comparable format to AutoIt's native RegRead function: CRLF delimited substrings. (AutoIt's RegRead actually returns LF delimited substrings.)

Update 1/29/12:

v2.0.5

Added more supported formats to the Export function and fixed infinite loop errors. REG_LINK remains unsupported.

v2.0.4

Fixed some REG_MULTI_SZ issues in Write/Copy/Move functions. Re-read the _RegWrite header notes for the pertinent information. Thanks again step887 for reporting.

Update 1/28/12:

v2.0.3

Do not use RegDeleteKeyEx on 32-bit OS's, it is not needed (and does not exist on XP 32-bit and lower, or lower than Server 2003 SP1). Thanks step887 for reporting the error!

Update 12/2/10:

v2.0.2

Fixed wrong @error return from _RegRead which would cause _RegValueExists to incorrectly return Success.

Update 5/25/10:

Ok, huge overhaul.

Added:

- Function documentation!

- Improved _RegRead and _RegWrite to better handle data. Specifically, REG_MULTI_SZ data types are correctly read / exported if the data was incorrectly written to the registry by another application. And the data is correctly written even if it was supplied to the function with incorrect termination. Because of the unusual format of this data type, it is returned from _RegRead as binary data.

- _RegRead / _RegWrite support all known registry value data types (in at a least a limited way). For uncommon types, the values are read / written as binary data.

- Better error checking and reporting, especially before any delete operations.

- x64 Platform: Support for directly reading the 32-bit and 64-bit registry views from both 32-bit and 64-bit scripts.

- All operations are now done via custom registry functions. I didn't want to go all the way, but AutoIt doesn't support a root key like HKLM32 to force reading the 32-bit registry on the x64 platform from a native 64-bit script. Once I decided to introduce that capability in some of the higher level functions, I had to rewrite all the low level functions as well.

- _RegExport function to recursively export a key or a single value to a MS compatible REG file.

- Other undocumented helper functions that could be pilfered for nefarious usage.

There might be some more minor things that I've forgotten. I've tested this pretty well, but please report any bugs or problems.

Update 4/16/2010:

Added the latest version of this UDF. It includes some custom _RegWrite / _RegRead functions as well. The _RegWrite function allows you to set the REG_OPTION_VOLATILE flag on a registry key. Example at the bottom.

I needed this for a script, and didn't necessarily like big_daddy's solution. Here's a recursive registry copy/move function. I tested it and it seems to work perfectly (knock on wood). It could probably use some more error catching, so suggestions are welcome.

_RegFunc.au3

Edited by wraithdu
  • Like 2

Share this post


Link to post
Share on other sites
wraithdu

Threw in _RegCopyValue / _RegMoveValue for good measure.

_RegCopyValue / _RegMoveValue

** above

Edited by wraithdu

Share this post


Link to post
Share on other sites
wraithdu

Seems I needed more -

_RegKeyExists / _RegValueExists / _RegKeyEmpty

** above

Edited by wraithdu

Share this post


Link to post
Share on other sites
wraithdu

Update, properly declare variables in functions. Caught myself in recursion hell cause of this...

** above

search terms: regmovekey regcopykey moveregkey copyregkey movekey copykey reg registry move copy key

Edited by wraithdu

Share this post


Link to post
Share on other sites
wraithdu

Small update, added _RegSubkeySearch() which searches keys for the searchterm and returns the key index, or 0 if not found.

Mode:

0 = substring search

1 = search from beginning of key name

Case sense:

0 = case insensitive

1 = case sensitive

So defaults would be a case insensitive substring search.

Edited by wraithdu

Share this post


Link to post
Share on other sites
wraithdu

Major update. Please report any problems.

Share this post


Link to post
Share on other sites
asdf8

wraithdu

some keys are incorrectly exported:

_RegExport('example.reg', 'HKEY_CLASSES_ROOT\.doc')

Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\.doc]
@="Word.document.8"
"Content Type"="application/msword"

[HKEY_CLASSES_ROOT\.doc\OpenWithList]

[HKEY_CLASSES_ROOT\.doc\OpenWithList\WordPad.exe]
@=""

regedit

Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\.doc]
@="Word.document.8"
"Content Type"="application/msword"

[HKEY_CLASSES_ROOT\.doc\OpenWithList]

[HKEY_CLASSES_ROOT\.doc\OpenWithList\WordPad.exe]
@=""

[HKEY_CLASSES_ROOT\.doc\PersistentHandler]
@="{98de59a0-d175-11cd-a7bd-00006b827d94}"

[HKEY_CLASSES_ROOT\.doc\ShellNew]

[HKEY_CLASSES_ROOT\.doc\Word.document.6]

[HKEY_CLASSES_ROOT\.doc\Word.document.6\ShellNew]
"FileName"="winword.doc"

[HKEY_CLASSES_ROOT\.doc\Word.document.8]

[HKEY_CLASSES_ROOT\.doc\Word.document.8\ShellNew]
"FileName"="winword8.doc"

[HKEY_CLASSES_ROOT\.doc\WordDocument]

[HKEY_CLASSES_ROOT\.doc\WordDocument\ShellNew]
"FileName"="winword2.doc"

[HKEY_CLASSES_ROOT\.doc\WordPad.document.1]

[HKEY_CLASSES_ROOT\.doc\WordPad.document.1\ShellNew]
"NullFile"=""

Share this post


Link to post
Share on other sites
wraithdu

Thanks, looking into it.

Share this post


Link to post
Share on other sites
wraithdu

Ok, it's fixed. It was an Access Denied error when enumerating the keys... which makes no sense to me. As a general rule, I try open files / keys / whatever with the minimum required access rights. Apparently MSDN wasn't entirely truthful. I've updated everything to use either KEY_READ or KEY_WRITE, which should be minimal enough not to cause issues, yet provide all the normally required access rights.

Share this post


Link to post
Share on other sites
MasterChief

Could you possibly add some way to edit permissions within a script. This would help me so much seeing as I need to write to the registry, but I need that value to be read only access to all users. Thanks

Share this post


Link to post
Share on other sites
wraithdu

Look into the app SetACL, and script that. I have no idea what is required to set / change registry key / value permissions at this moment.

Share this post


Link to post
Share on other sites
KaFu
JFX

Thanks a lot, very good :graduated:

How about adding support for creation of symbolic links like Regln have?

Share this post


Link to post
Share on other sites
Fire

Thx so much wraithdu for this GREAT UDF!

It solved my problem when reading REG_QWORD(11) types values from regedit!

+5 stars from me!

Thank you!


[size="5"] [/size]

Share this post


Link to post
Share on other sites
wraithdu

Dang, found a small bug today. See first post.

Share this post


Link to post
Share on other sites
step887

This is great work, however, I think I may have found an error,

I started off trying to use move key and it was failing

The copy works,, found out the delete was not

it works fine on my win 7 64 bit (not compiled)

when i copy to VM of xp sp3 32 bit, it does not work

$err = _RegWrite("HKEY_LOCAL_MACHINE\Software\test")

MsgBox(0,@extended, @error & @CRLF & $err)

$err = _RegKeyExists("HKEY_LOCAL_MACHINE\Software\test")

MsgBox(0,@extended, @error & @CRLF & $err)

$err = _RegDelete("HKEY_LOCAL_MACHINE\Software\test")

MsgBox(0,@extended, @error & @CRLF & $err)

return = 0 -- Failure - 0 and sets @error

@error = 3 --- Failed to delete key / value (@extended contains RegDelete* return value)

@extended = 0 ---Returns 0 if the key/value does not exist

everything else seems to work. (ie regwrite, regkeyexist)

I am not smart enough to figure out the dllcall

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×