Jump to content

Custom Registry Functions UDF


wraithdu
 Share

Recommended Posts

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
Link to comment
Share on other sites

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
Link to comment
Share on other sites

  • 1 month later...

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
Link to comment
Share on other sites

  • 9 months later...
  • 11 months later...
  • 1 month later...

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"=""
Link to comment
Share on other sites

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.

Link to comment
Share on other sites

  • 5 months later...
  • 4 weeks later...
  • 1 year later...

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

Link to comment
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
 Share

  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...