| 
<?php
/***
 *    This sample script :
 *    1) Enumerates all the keys under HKCU\Software and prints them
 *    2) Creates the HKCU\TestRegistry\Values key
 *    3) Creates/updates the following keys (using WMI API calls) :
 *        a) A binary value :
 *            1. using a string
 *            2. using a byte array
 *            3. using a hex string
 *        b) A dword value
 *        c) An expanded string value
 *        d) A multi-string value :
 *            1. With only one string
 *            2. With multiple strings
 *        e) A qword value
 *        f) A string value
 *    4) Creates/updates the following keys (using WShell Registry calls) :
 *        a) A string value
 *        b) An expanded string value
 *        c) A DWORD value
 *    5) Enumerates all the values in the HKCU\TestRegistry\Values key
 *    6) Enumerates all values, using RegistryValue objects
 *    7) Retrieves created key values
 *    8) Deletes a key
 *    9) Tries to delete the created subkey (HKCU\TestRegistry)
 *
 *    The check_error() function defined in this script is called after each registry method invocation
 *    and prints an error message if the function call failed.
 *
 ***/
 
 include ( 'Registry.class.php' ) ;
 
 if  ( php_sapi_name ( )  ==  'cli' )
 {
 $eol    =  PHP_EOL ;
 $tab    =  "\t" ;
 }
 else
 {
 $eol    =  "<br/>" ;
 $tab    =  str_repeat ( " ", 8 ) ;
 }
 
 
 // check_error -
 //    Checks that the last called registry method succeded.
 function  check_error ( )
 {
 global        $registry, $tab, $eol ;
 
 $status        =  $registry -> GetLastError ( ) ;
 
 if  ( $status )
 {
 echo ( "Last registry call failed, status = 0x" . sprintf ( "%08X", $status ) . $eol ) ;
 exit ;
 }
 }
 
 // 0) Create the registry object
 $registry    =  new Registry ( ) ;
 
 // 1) Enumerate all the keys under HKCU\Software and print them
 $keys    =  $registry -> EnumKeys ( Registry::HKCU, 'Software' ) ;
 check_error ( ) ;
 
 echo ( "Registry keys for HKCU\\Software :\n" ) ;
 
 foreach ( $keys  as  $key )
 echo ( "$tab$key$eol" ) ;
 
 // 2) Create the HKCU\TestRegistry\Values key
 $test_key    =  'TestRegistry/Values' ;        // Slashes are replaced by backslashes
 $registry -> CreateKey ( Registry::HKCU, $test_key ) ;
 check_error ( ) ;
 
 // 3.a.1) Create the HKCU\TestRegistry\Values\BinaryValueFromString key
 $registry -> SetBinaryValue ( Registry::HKCU, $test_key, 'BinaryValueFromString', 'ABCDEF' ) ;
 check_error ( ) ;
 
 // 3.a.2) Create the HKCU\TestRegistry\Values\BinaryValueFromrArray key (set to "ABC")
 $registry -> SetBinaryValue ( Registry::HKCU, $test_key, 'BinaryValueFromArray', [ 65, 66, 67 ] ) ;
 check_error ( ) ;
 
 // 3.a.3) Create the HKCU\TestRegistry\Values\BinaryValueFromrHexString key (set to "0123456789ABCDEF")
 $registry -> SetBinaryValueFromHexString ( Registry::HKCU, $test_key, 'BinaryValueFromHexString', "0123456789ABCDEF" ) ;
 check_error ( ) ;
 
 // 3.b) Create the HKCU\TestRegistry\Values\DWORDValue key (set to 0x01020304)
 $registry -> SetDWORDValue ( Registry::HKCU, $test_key, 'DWORDValue', 0x01020304 ) ;
 check_error ( ) ;
 
 // 3.c) Create the HKCU\TestRegistry\Values\ExpandedStringValue key, referencing the %WINDIR% environment variable
 $registry -> SetExpandedStringValue ( Registry::HKCU, $test_key, 'ExpandedStringValue', '%WINDIR%\Something' ) ;
 check_error ( ) ;
 
 // 3.d.1) Create the HKCU\TestRegistry\Values\MultiStringValueSingle key
 $registry -> SetMultiStringValue ( Registry::HKCU, $test_key, 'MultiStringValueSingle', 'A sample string' ) ;
 check_error ( ) ;
 
 // 3.d.2) Create the HKCU\TestRegistry\Values\MultiStringValueMultiple key
 $registry -> SetMultiStringValue ( Registry::HKCU, $test_key, 'MultiStringValueMultiple',
 [ 'Sample 1', 'Sample 2', 'Sample 3' ] ) ;
 check_error ( ) ;
 
 // 3.e) Create the HKCU\TestRegistry\Values\QWORDValue key (one greater than PHP_INT_MAX, and the other equal to 1)
 $registry -> SetQWORDValue ( Registry::HKCU, $test_key, 'QWORDBigValue', PHP_INT_MAX * 10 ) ;
 check_error ( ) ;
 
 $registry -> SetQWORDValue ( Registry::HKCU, $test_key, 'QWORDValue', 1 ) ;
 check_error ( ) ;
 
 // 3.f) Create the HKCU\TestRegistry\Values\StringValue key
 $registry -> SetStringValue ( Registry::HKCU, $test_key, 'StringValue', 'this is a sample string value' ) ;
 check_error ( ) ;
 
 // 4.a) Create the HKCU\TestRegistry\Values\WShellStringValue key
 $registry -> SetValue ( Registry::HKCU, $test_key, 'WShellStringValue', 'this is a sample WSHELL string value', Registry::REG_SZ ) ;
 check_error ( ) ;
 
 // 4.b) Create the HKCU\TestRegistry\Values\WShellExpandedStringValue key
 $registry -> SetValue ( Registry::HKCU, $test_key, 'WShellExpandedStringValue', 'this is a sample WSHELL expanded string value, WINDIR = %WINDIR%',
 Registry::REG_EXPAND_SZ ) ;
 check_error ( ) ;
 
 // 4.c) Create the HKCU\TestRegistry\Values\WShellDWORDValue key
 $registry -> SetValue ( Registry::HKCU, $test_key, 'WShellDWORDValue', 0x01020304,
 Registry::REG_DWORD ) ;
 check_error ( ) ;
 
 // 5) Enumerate all the values in the HKCU\TestRegistry\Values key with their type
 $keys    =  $registry -> EnumValues ( Registry::HKCU, $test_key, false ) ;
 check_error ( ) ;
 
 echo ( "Created values :$eol" ) ;
 
 foreach  ( $keys  as  $key => $type )
 echo ( "$tab$key ($type)$eol" ) ;
 
 // 6) Enumerate all the values in the HKCU\TestRegistry\Values key, using registry value objects
 $keys    =  $registry -> EnumValuesEx ( Registry::HKCU, $test_key ) ;
 check_error ( ) ;
 
 echo ( "Created RegistryValue objects :$eol" ) ;
 
 foreach  ( $keys  as  $value )
 echo ( "$tab" . str_replace ( "$eol", "$eol$tab", print_r ( $value, true ) ) ) ;
 
 // 7) Retrieve created key values - You must known the type of each key before doing that, or else use the GetValue() method,
 //    which works only on REG_SZ, REG_EXPAND_SZ, REG_DWORD and REG_BINARY types.
 echo ( "Created values :$eol" ) ;
 
 echo ( "$tab$test_key/BinaryValueFromArray     : " . $registry -> GetBinaryValue ( Registry::HKCU, $test_key, 'BinaryValueFromArray' ) . $eol ) ;
 echo ( "$tab$test_key/BinaryValueFromHexString : " . $registry -> GetBinaryValue ( Registry::HKCU, $test_key, 'BinaryValueFromHexString' ) . $eol ) ;
 echo ( "$tab$test_key/BinaryValueFromString    : " . $registry -> GetBinaryValue ( Registry::HKCU, $test_key, 'BinaryValueFromString' ) . $eol ) ;
 echo ( "$tab$test_key/DWORDValue               : 0x" . sprintf ( "%08X", $registry -> GetDWORDValue ( Registry::HKCU, $test_key, 'DWORDValue' ) ) . $eol ) ;
 echo ( "$tab$test_key/ExpandedStringValue      : " . $registry -> GetExpandedStringValue ( Registry::HKCU, $test_key, 'ExpandedStringValue' ) . $eol ) ;
 echo ( "$tab$test_key/BinaryValueFromHexString : " . $registry -> GetBinaryValue ( Registry::HKCU, $test_key, 'BinaryValueFromHexString' ) . $eol ) ;
 echo ( "$tab$test_key/MultiStringValueMultiple : " . implode ( ', ', $registry -> GetMultiStringValue ( Registry::HKCU, $test_key, 'MultiStringValueMultiple' ) ) . $eol ) ;
 echo ( "$tab$test_key/MultiStringValueSingle   : " . implode ( ', ', $registry -> GetMultiStringValue ( Registry::HKCU, $test_key, 'MultiStringValueSingle' ) ) . $eol ) ;
 echo ( "$tab$test_key/MultiStringValueMultiple : " . implode ( ', ', $registry -> GetMultiStringValue ( Registry::HKCU, $test_key, 'MultiStringValueMultiple' ) ) . $eol ) ;
 echo ( "$tab$test_key/QWORDBigValue            : " . $registry -> GetQWORDValue ( Registry::HKCU, $test_key, 'QWORDBigValue' ) . $eol ) ;
 echo ( "$tab$test_key/QWORDValue               : " . $registry -> GetQWORDValue ( Registry::HKCU, $test_key, 'QWORDValue' ) . $eol ) ;
 echo ( "$tab$test_key/StringValue              : " . $registry -> GetQWORDValue ( Registry::HKCU, $test_key, 'StringValue' ) . $eol ) ;
 echo ( "$tab$test_key/WShellDWORDValue         : 0x" . sprintf ( "%08X", $registry -> GetValue ( Registry::HKCU, $test_key, 'WShellDWORDValue' ) ) . $eol ) ;
 
 // Note that the GetValue() method for WShell does not seem to process variable expansion
 echo ( "$tab$test_key/WShellExpandedStringValue: " . $registry -> GetValue ( Registry::HKCU, $test_key, 'WShellExpandedStringValue' ) . $eol ) ;
 echo ( "$tab$test_key/WShellStringValue        : " . $registry -> GetValue ( Registry::HKCU, $test_key, 'WShellStringValue' ) . $eol ) ;
 
 // 8) Delete a subkey (HKCU\TestRegistry\Values\WShellExpandedStringValue key)
 $registry -> DeleteValue ( Registry::HKCU, $test_key, 'WShellExpandedStringValue' ) ;
 check_error ( ) ;
 
 // 9) Delete the test subkey - leads to an error, since a key can only be deleted if it has no subkeys - so you'll have to delete TestRegistry manually under HKCU
 $registry -> DeleteKey ( Registry::HKCU, 'TestRegistry' ) ;
 check_error ( ) ;
 
 |