home *** CD-ROM | disk | FTP | other *** search
/ The Best of Select: Windows 95 Special 1 / WINDOWS95_1.ISO / utils / perl32 / hives.pl < prev    next >
Text File  |  1995-06-20  |  11KB  |  483 lines

  1. # WINPERL HIVES.PL
  2. # Written by Maxwell N. Andrews
  3. #
  4. # Date: 6th May 1995
  5. #
  6. # Version: v1.00
  7. #
  8.  
  9. #
  10. # Constants for use in accessing the NT/Windows 95 Registry database.
  11. #
  12.  
  13. #
  14. # Return error codes
  15. #
  16.  
  17. $ERROR_SUCCESS       = 0;
  18. $ERROR_NO_MORE_ITEMS = 259;
  19.  
  20. #
  21. # Standard access types
  22. #
  23.  
  24. $READ_CONTROL              =  0x00020000;
  25. $SYNCHRONIZE               =  0x00100000;
  26. $STANDARD_RIGHTS_REQUIRED  =  0x000F0000;
  27. $STANDARD_RIGHTS_READ      =  $READ_CONTROL;
  28. $STANDARD_RIGHTS_WRITE     =  $READ_CONTROL;
  29. $STANDARD_RIGHTS_EXECUTE   =  $READ_CONTROL;
  30. $STANDARD_RIGHTS_ALL       =  0x001F0000;
  31. $SPECIFIC_RIGHTS_ALL       =  0x0000FFFF;
  32.  
  33. #
  34. # Pre-Defined registry keys
  35. #
  36.  
  37. $HKEY_CLASSES_ROOT     = 0x80000000;
  38. $HKEY_CURRENT_USER     = 0x80000001;
  39. $HKEY_LOCAL_MACHINE    = 0x80000002;
  40. $HKEY_USERS            = 0x80000003;
  41. $HKEY_PERFORMANCE_DATA = 0x80000004;
  42. $HKEY_CURRENT_CONFIG   = 0x80000005;
  43. $HKEY_DYN_DATA         = 0x80000006;
  44.  
  45.  
  46. #
  47. # Open/Create Options
  48. #
  49.  
  50. $REG_OPTION_RESERVED     = 0x00000000;  # Parameter is reserved
  51. $REG_OPTION_NON_VOLATILE = 0x00000000;  # Key is preserved
  52.                                          # when system is rebooted
  53. $REG_OPTION_VOLATILE     = 0x00000001;  # Key is not preserved
  54.                                          # when system is rebooted
  55. $REG_OPTION_CREATE_LINK  = 0x00000002;  # Created key is a
  56.                                          # symbolic link
  57.  
  58. #
  59. # Key creation/open disposition
  60. #
  61.  
  62. $REG_CREATED_NEW_KEY      =  0x00000001;   # New Registry Key created
  63. $REG_OPENED_EXISTING_KEY  =  0x00000002;   # Existing Key opened
  64.  
  65. #
  66. # Key restore flags
  67. #
  68.  
  69. $REG_WHOLE_HIVE_VOLATILE   =  0x00000001;   # Restore whole hive volatile
  70. $REG_REFRESH_HIVE          =  0x00000002;   # Unwind changes to last flush
  71.  
  72.  
  73. #
  74. # Notify filter values
  75. #
  76.  
  77. $REG_NOTIFY_CHANGE_NAME        =  0x00000001; # Create or delete (child)
  78. $REG_NOTIFY_CHANGE_ATTRIBUTES  =  0x00000002;
  79. $REG_NOTIFY_CHANGE_LAST_SET    =  0x00000004; # time stamp
  80. $REG_NOTIFY_CHANGE_SECURITY    =  0x00000008;
  81.  
  82. $REG_LEGAL_CHANGE_FILTER = $REG_NOTIFY_CHANGE_NAME |
  83.     $REG_NOTIFY_CHANGE_ATTRIBUTES |
  84.     $REG_NOTIFY_CHANGE_LAST_SET |
  85.     $REG_NOTIFY_CHANGE_SECURITY;
  86.  
  87. #
  88. #
  89. # Predefined Value Types.
  90. #
  91.  
  92. $REG_NONE                    = 0; # No value type
  93. $REG_SZ                      = 1; # Unicode nul terminated string
  94. $REG_EXPAND_SZ               = 2; # Unicode nul terminated string
  95.                                   # (with environment variable references)
  96. $REG_BINARY                  = 3; # Free form binary
  97. $REG_DWORD                   = 4; # 32-bit number
  98. $REG_DWORD_LITTLE_ENDIAN     = 4; # 32-bit number (same as REG_DWORD)
  99. $REG_DWORD_BIG_ENDIAN        = 5; # 32-bit number
  100. $REG_LINK                    = 6; # Symbolic Link (unicode)
  101. $REG_MULTI_SZ                = 7; # Multiple Unicode strings
  102. $REG_RESOURCE_LIST           = 8; # Resource list in the resource map
  103. $REG_FULL_RESOURCE_DESCRIPTOR = 9;# Resource list in the hardware description
  104.  
  105.     
  106. #
  107. # Registry Specific Access Rights.
  108. #
  109.  
  110. $KEY_QUERY_VALUE         = 0x0001;
  111. $KEY_SET_VALUE           = 0x0002;
  112. $KEY_CREATE_SUB_KEY      = 0x0004;
  113. $KEY_ENUMERATE_SUB_KEYS  = 0x0008;
  114. $KEY_NOTIFY              = 0x0010;
  115. $KEY_CREATE_LINK         = 0x0020;
  116.  
  117. $KEY_READ                = ($STANDARD_RIGHTS_READ   |
  118.                             $KEY_QUERY_VALUE        |
  119.                             $KEY_ENUMERATE_SUB_KEYS |
  120.                             $KEY_NOTIFY)                 
  121.                              &                           
  122.                            ~$SYNCHRONIZE;
  123.  
  124.  
  125. $KEY_WRITE               = ($STANDARD_RIGHTS_WRITE   |
  126.                             $KEY_SET_VALUE           |
  127.                             $KEY_CREATE_SUB_KEY)
  128.                              &
  129.                             ~$SYNCHRONIZE;
  130.  
  131. $KEY_EXECUTE             = $KEY_READ & (~$SYNCHRONIZE);
  132.  
  133. $KEY_ALL_ACCESS          = ($STANDARD_RIGHTS_ALL    |
  134.                             $KEY_QUERY_VALUE        |
  135.                             $KEY_SET_VALUE          |
  136.                             $KEY_CREATE_SUB_KEY     |
  137.                             $KEY_ENUMERATE_SUB_KEYS |
  138.                             $KEY_NOTIFY             |
  139.                             $KEY_CREATE_LINK)
  140.                              &
  141.                            (~$SYNCHRONIZE);
  142.  
  143. sub _RegEnumValueEx 
  144. {
  145.        local( $hKey, $Key )= @_;
  146.        local( $errNo )= 0;
  147.        local( $newKey)= 0;
  148.        local( $iSubKey )= 0;
  149.        local( $szValue,$dwType,$bData );
  150.  
  151.        ( $newKey= RegOpenKeyEx( $hKey, $Key, $KEY_READ ) ) || return 0;
  152.  
  153.        while ( 1 )
  154.        { 
  155.                 ( $szValue, $dwType, $bData )= RegEnumValue( $newKey, $iSubKey++ );
  156.  
  157.                 last if $! == $ERROR_NO_MORE_ITEMS;
  158.  
  159.                 if ( $! )
  160.                 {
  161.                    $errNo= $!;
  162.  
  163.                    RegCloseKey;
  164.  
  165.                    $!= $errNo;
  166.  
  167.                    return 0;
  168.                 }
  169.  
  170.                 if ( $dwType == $REG_NONE ) 
  171.                 {
  172.                    $rNone{$szValue}= unpack( "a*", $bData ) ;
  173.                  }
  174.                  elsif ( $dwType == $REG_SZ ) 
  175.                  {
  176.                          $rString{$szValue}= unpack( "a*", $bData ) ;
  177.                  }
  178.                  elsif ( $dwType == $REG_EXPAND_SZ ) 
  179.                  {
  180.                          $rXString{$szValue}= unpack( "a*", $bData ) ;
  181.                  }
  182.                  elsif ( $dwType == $REG_BINARY ) 
  183.                  { 
  184.                          $rBinary{$szValue}= $bData;
  185.                   }
  186.                  elsif ( $dwType == $REG_DWORD ) 
  187.                  {
  188.                          $rDWord{$szValue}= unpack( "L*", $bData ) ;
  189.                  }
  190.                  elsif ( $dwType == $REG_DWORD_BIG_ENDIAN ) 
  191.                  {
  192.                          $rBigDWord{$szValue}= unpack("N*",$bData ) ;
  193.                  }
  194.                  elsif ( $dwType == $REG_LINK ) 
  195.                  {
  196.                          $rLink{$szValue}= unpack( "a*", $bData ) ;
  197.                  }
  198.                  elsif ( $dwType == $REG_MULTI_SZ ) 
  199.                  {
  200.                          $rMultiString{$szValue}= unpack( "a*", $bData ) ;
  201.                  }
  202.                  elsif ( $dwType == $REG_RESOURCE_LIST ) 
  203.                  {
  204.                          $rResList{$szValue}= unpack( "a*", $bData ) ;
  205.                  }
  206.                  elsif ( $dwType == $REG_FULL_RESOURCE_DESCRIPTOR ) 
  207.                  {
  208.                      $rFullResDesc= unpack( "a*", $bData ) ;
  209.                  }
  210.       }
  211.  
  212.       RegCloseKey || return 0;
  213.  
  214.       1;
  215. }
  216.  
  217. sub getLM 
  218. {
  219.        &_RegEnumValueEx( &LMhKey,@_  );
  220. }
  221.  
  222. sub getU 
  223. {
  224.        &_RegEnumValueEx( &usersHKEY,@_  );
  225. }
  226.  
  227. sub getCU
  228. {
  229.        &_RegEnumValueEx( $HKEY_CURRENT_USER,@_  );
  230. }
  231.  
  232. sub getCR
  233. {
  234.        &_RegEnumValueEx( $HKEY_CLASSES_ROOT,@_  );
  235. }
  236.  
  237. sub getPD
  238. {
  239.        &_RegEnumValueEx( $HKEY_PERFORMANCE_DATA,@_  );
  240. }
  241.  
  242. # Windows 95 extras
  243.  
  244. sub getDD
  245. {
  246.        &_RegEnumValueEx( $HKEY_DYN_DATA,@_  );
  247. }
  248.  
  249. sub getCC
  250. {
  251.        &_RegEnumValueEx( $HKEY_CURRENT_CONFIG,@_  );
  252. }
  253.  
  254. sub _RegSetValueEx
  255. {
  256.        local( $hKey,$Key,$szValue,$dwType,$bData )= @_;
  257.        local( $errNo )= 0;
  258.        local( $newKey )= 0;
  259.  
  260.        ( $newKey= RegOpenKeyEx( $hKey,$Key,$KEY_WRITE ) ) || return 0;
  261.  
  262.        RegSetValueEx( $newKey,$szValue,$dwType,$bData );
  263.  
  264.        if ( $! )
  265.        {
  266.           $errNo= $!;
  267.  
  268.           RegCloseKey;
  269.  
  270.           $!= $errNo;
  271.  
  272.           return 0;
  273.        }
  274.  
  275.        RegCloseKey || return 0;
  276.  
  277.        1;
  278. }
  279.  
  280. sub setLM
  281. {
  282.        &_RegSetValueEx( &LMhKey,@_  );
  283. }
  284.  
  285. sub setU
  286. {
  287.        &_RegSetValueEx( &usersHKEY,@_  );
  288. }
  289.  
  290. sub setCU
  291. {
  292.        &_RegSetValueEx( $HKEY_CURRENT_USER,@_  );
  293. }
  294.  
  295. sub setCR
  296. {
  297.        &_RegSetValueEx( $HKEY_CLASSES_ROOT,@_  );
  298. }
  299.  
  300. sub setPD
  301. {
  302.        &_RegSetValueEx( $HKEY_PERFORMANCE_DATA,@_  );
  303. }
  304.  
  305. # Windows 95 extras
  306.  
  307. sub setDD
  308. {
  309.        &_RegSetValueEx( $HKEY_DYN_DATA,@_  );
  310. }
  311.  
  312. sub setCC
  313. {
  314.        &_RegSetValueEx( $HKEY_CURRENT_CONFIG,@_  );
  315. }
  316.  
  317. sub _RegCreateKeyEx
  318. {
  319.        local( $hKey,$Key,$szValue )= @_;
  320.        local( $secAttrib )= "";
  321.        local( $Class )= "";
  322.  
  323.        RegCreateKeyEx( $hKey,$Key,$Class,$REG_OPTION_NON_VOLATILE,$KEY_ALL_ACCESS,$secAttrib );
  324.  
  325.        !$!;
  326. }
  327.  
  328. sub cKeyLM
  329. {
  330.        &_RegCreateKeyEx( &LMhKey,@_  );
  331. }
  332.  
  333. sub cKeyU
  334. {
  335.        &_RegCreateKeyEx( &usersHKEY,@_  );
  336. }
  337.  
  338. sub cKeyCU
  339. {
  340.        &_RegCreateKeyEx( $HKEY_CURRENT_USER,@_  );
  341. }
  342.  
  343. sub cKeyCR
  344. {
  345.        &_RegCreateKeyEx( $HKEY_CLASSES_ROOT,@_  );
  346. }
  347.  
  348. sub cKeyPD
  349. {
  350.        &_RegCreateKeyEx( $HKEY_PERFORMANCE_DATA,@_  );
  351. }
  352.  
  353. # Windows 95 extras
  354.  
  355. sub cKeyDD
  356. {
  357.        &_RegCreateKeyEx( $HKEY_DYN_DATA,@_  );
  358. }
  359.  
  360. sub cKeyCC
  361. {
  362.        &_RegCreateKeyEx( $HKEY_CURRENT_CONFIG,@_  );
  363. }
  364.  
  365. sub _RegDeleteKey
  366. {
  367.        local( $hKey,$Key )= @_;
  368.  
  369.        RegDeleteKey( $hKey,$Key );
  370.  
  371.        !$!;
  372. }
  373.  
  374. sub dKeyLM
  375. {
  376.        &_RegDeleteKey( &LMhKey,@_  );
  377. }
  378.  
  379. sub dKeyU
  380. {
  381.        &_RegDeleteKey( &usersHKEY,@_  );
  382. }
  383.  
  384. sub dKeyCU
  385. {
  386.        &_RegDeleteKey( $HKEY_CURRENT_USER,@_  );
  387. }
  388.  
  389. sub dKeyCR
  390. {
  391.        &_RegDeleteKey( $HKEY_CLASSES_ROOT,@_  );
  392. }
  393.  
  394. sub dKeyPD
  395. {
  396.        &_RegDeleteKey( $HKEY_PERFORMANCE_DATA,@_  );
  397. }
  398.  
  399. # Windows 95 extras
  400.  
  401. sub dKeyDD
  402. {
  403.        &_RegDeleteKey( $HKEY_DYN_DATA,@_  );
  404. }
  405.  
  406. sub dKeyCC
  407. {
  408.        &_RegDeleteKey( $HKEY_CURRENT_CONFIG,@_  );
  409. }
  410.  
  411. sub _RegDeleteValue
  412. {
  413.        local( $hKey,$Key )= @_;
  414.  
  415.        RegDeleteValue( $hKey,$Key,$szValue );
  416.  
  417.        !$!;
  418. }
  419.  
  420. sub dValueLM
  421. {
  422.        &_RegDeleteValue( &LMhKey,@_  );
  423. }
  424.  
  425. sub dValueU
  426. {
  427.        &_RegDeleteValue( &usersHKEY,@_  );
  428. }
  429.  
  430. sub dValueCU
  431. {
  432.        &_RegDeleteValue( $HKEY_CURRENT_USER,@_  );
  433. }
  434.  
  435. sub dValueCR
  436. {
  437.        &_RegDeleteValue( $HKEY_CLASSES_ROOT,@_  );
  438. }
  439.  
  440. sub dValuePD
  441. {
  442.        &_RegDeleteValue( $HKEY_PERFORMANCE_DATA,@_  );
  443. }
  444.  
  445. # Windows 95 extras
  446.  
  447. sub dValueDD
  448. {
  449.        &_RegDeleteValue( $HKEY_DYN_DATA,@_  );
  450. }
  451.  
  452. sub dValueCC
  453. {
  454.        &_RegDeleteValue( $HKEY_CURRENT_CONFIG,@_  );
  455. }
  456.  
  457. sub LMhKey
  458. {
  459.        if ( defined( $rHKEY_LOCAL_MACHINE ) )
  460.        {
  461.             $rHKEY_LOCAL_MACHINE;
  462.        }
  463.        else
  464.        {
  465.            $HKEY_LOCAL_MACHINE;
  466.        }
  467. }
  468.  
  469. sub usersHKEY 
  470. {
  471.        if ( defined( $rHKEY_USERS ) )
  472.        {
  473.             $rHKEY_USERS;
  474.        }
  475.        else
  476.        {
  477.            $HKEY_USERS;
  478.        }
  479. }
  480.  
  481. 1;
  482.