Module RegistryAPI.pkg

     1// RegistryAPI.pkg
     2// Author: SWB
     3Use LanguageText.pkg
     4Use Dll.pkg
     5Use DFTypes.pkg
     6Use WinKern.pkg
     7
     8// These are the key root values.
     9Define HKEY_CLASSES_ROOT     for |CI$80000000
    10Define HKEY_CURRENT_USER     for |CI$80000001
    11Define HKEY_LOCAL_MACHINE    for |CI$80000002
    12Define HKEY_USERS            for |CI$80000003
    13Define HKEY_PERFORMANCE_DATA for |CI$80000004
    14Define HKEY_CURRENT_CONFIG   for |CI$80000005
    15Define HKEY_DYN_DATA         for |CI$80000006
    16
    17Define KEY_QUERY_VALUE        for |CI$0001
    18Define KEY_SET_VALUE          for |CI$0002
    19Define KEY_CREATE_SUB_KEY     for |CI$0004
    20Define KEY_ENUMERATE_SUB_KEYS for |CI$0008
    21Define KEY_NOTIFY             for |CI$0010
    22Define KEY_CREATE_LINK        for |CI$0020
    23
    24Define READ_CONTROL   for |CI$00020000
    25Define WRITE_DAC      for |CI$00040000
    26Define WRITE_OWNER    for |CI$00080000
    27Define SYNCHRONIZE    for |CI$00100000
    28Define NOTSYNCHRONIZE for |CI$FFEFFFFF // This one made up for ease of use
    29
    30Define STANDARD_RIGHTS_REQUIRED for |CI$000F0000
    31Define STANDARD_RIGHTS_READ     for READ_CONTROL
    32Define STANDARD_RIGHTS_WRITE    for READ_CONTROL
    33Define STANDARD_RIGHTS_EXECUTE  for READ_CONTROL
    34Define STANDARD_RIGHTS_ALL      for |CI$001F0000
    35Define SPECIFIC_RIGHTS_ALL      for |CI$0000FFFF
    36
    37Define KEY_READ for ((STANDARD_RIGHTS_READ ior KEY_QUERY_VALUE ior KEY_ENUMERATE_SUB_KEYS ior KEY_NOTIFY) IAND (NOTSYNCHRONIZE))
    38Define KEY_WRITE for ((STANDARD_RIGHTS_WRITE ior KEY_SET_VALUE ior KEY_CREATE_SUB_KEY) iand (NOTSYNCHRONIZE))
    39Define KEY_EXECUTE for  ((KEY_READ) iand (NOTSYNCHRONIZE))
    40Define KEY_ALL_ACCESS for ((STANDARD_RIGHTS_ALL ior KEY_QUERY_VALUE ior KEY_SET_VALUE ior KEY_CREATE_SUB_KEY ior KEY_ENUMERATE_SUB_KEYS ior KEY_NOTIFY ior KEY_CREATE_LINK) IAND (NOTSYNCHRONIZE))
    41
    42// Predefined Value Types.
    43Define REG_NONE                       for 0    // No value type
    44Define REG_SZ                         for 1    // Unicode nul terminated string
    45Define REG_EXPAND_SZ                  for 2    // Unicode nul terminated string (WITH ENVIRONMENT VARIABLE REFERENCES)
    46Define REG_BINARY                     for 3    // Free form binary
    47Define REG_DWORD                      for 4    // 32-bit number
    48Define REG_DWORD_LITTLE_ENDIAN        for 4    // 32-bit number (same as REG_DWORD)
    49Define REG_DWORD_BIG_ENDIAN           for 5    // 32-bit number
    50Define REG_LINK                       for 6    // Symbolic Link (unicode)
    51Define REG_MULTI_SZ                   for 7    // Multiple Unicode strings
    52Define REG_RESOURCE_LIST              for 8    // Resource list in the resource map
    53Define REG_FULL_RESOURCE_DESCRIPTOR   for 9   // Resource list in the hardware description
    54Define REG_RESOURCE_REQUIREMENTS_LIST for 10
    55
    56// Open/Create Options
    57Define REG_OPTION_RESERVED       for 0   // Parameter is reserved
    58Define REG_OPTION_NON_VOLATILE   for 0   // Key is preserved when system is rebooted
    59Define REG_OPTION_VOLATILE       for 1   // Key is not preserved when system is rebooted
    60Define REG_OPTION_CREATE_LINK    for 2   // Created key is a symbolic link
    61Define REG_OPTION_BACKUP_RESTORE for 4   // open for backup or restore special access rules privilege required
    62Define REG_OPTION_OPEN_LINK      for 8   // Open symbolic link
    63Define REG_LEGAL_OPTION          for (REG_OPTION_RESERVED ior REG_OPTION_NON_VOLATILE ior REG_OPTION_VOLATILE ior REG_OPTION_CREATE_LINK ior REG_OPTION_BACKUP_RESTORE ior REG_OPTION_OPEN_LINK)
    64
    65// Key creation/open disposition
    66Define REG_CREATED_NEW_KEY      for 1   // New Registry Key created
    67Define REG_OPENED_EXISTING_KEY  for 2   // Existing Key opened
    68
    69External_Function RegOpenKeyEx "RegOpenKeyExA" AdvApi32.dll ;
    70    Handle hKey String sSubKey DWord ulOptions DWord samDesired Pointer lphKey ;
    71    Returns Dword
    72
    73External_Function RegCloseKey "RegCloseKey" AdvApi32.dll ;
    74    Handle hKey ;
    75    Returns DWord
    76
    77External_Function RegEnumKeyEx "RegEnumKeyExA" AdvApi32.dll ;
    78    Handle hKey Dword dwIndex Pointer lpsName Pointer lpcbName ;
    79    Pointer lpReserved Pointer lpClass Pointer lpcbClass Pointer pTime ;
    80    Returns DWord
    81
    82External_Function RegSetValueEx "RegSetValueExA" AdvApi32.dll ;
    83    Handle hKey String sValueName Dword dwReserved Dword dwType Pointer lpsData Dword cbData ;
    84    Returns Dword
    85
    86External_Function RegQueryValueEx "RegQueryValueExA" AdvApi32.dll ;
    87    Handle hKey String sValueName Pointer lpReserved Pointer lpsDwType Pointer lpsData Pointer lpcbData ;
    88    Returns Dword
    89
    90External_Function RegCreateKeyEx "RegCreateKeyExA"  AdvApi32.dll ;
    91    Handle hKey ;                  // handle to open key
    92    String lpSubKey ;              // subkey name
    93    DWord Reserved ;               // reserved
    94    String lpClass ;               // class string
    95    DWord dwOptions ;              // special options flag
    96    DWord samDesired ;             // desired security access
    97    Pointer lpSecurityAttributes ;
    98    Pointer phkResult ;            // receives opened handle
    99    Pointer lpdwDisposition ;      // disposition value buffer
   100Returns Integer
   101
   102External_Function ShDeleteKey "SHDeleteKeyA" Shlwapi.dll Handle hKey String sKey Returns Integer
   103
   104External_Function RegDeleteValue "RegDeleteValueA" AdvApi32.dll Handle hKey String sKey Returns Integer
   105
   106External_Function RegEnumValue "RegEnumValueA" AdvApi32.dll  ;
   107    Handle hKey;              // handle to key to query
   108    DWord dwIndex;          // index of value to query
   109    Pointer lpValueName;     // buffer for value string
   110    Pointer lpcbValueName;  // size of value buffer
   111    Pointer lpReserved;     // reserved
   112    Pointer lpType;         // buffer for type code
   113    Pointer lpData;          // buffer for value data
   114    Pointer lpcbData;       // size of data buffer
   115Returns Integer // WINERROR
   116
   117External_Function RegEnumKey "RegEnumKeyEx" AdvApi32.dll  ;
   118  Handle hKey ;               // handle to key to enumerate
   119  DWord dwIndex ;             // index of subkey to enumerate
   120  Pointer lpName ;            // address of buffer for subkey name
   121  Pointer lpcbName ;          // address for size of subkey buffer
   122  Pointer lpReserved ;        // reserved
   123  Pointer lpClass ;           // address of buffer for class string
   124  Pointer lpcbClass ;         // address for size of class buffer
   125  Pointer lpftLastWriteTime ; // address for time key last written to
   126Returns Integer // WINERROR
   127
   128External_Function RegQueryInfoKey "RegQueryInfoKeyA" AdvApi32.dll  ;
   129  Handle hKey ;                    // handle to key to query
   130  Pointer lpClass ;                // buffer for class string
   131  Pointer lpcbClass ;              // size of class string buffer
   132  Pointer lpReserved ;             // reserved
   133  Pointer lpcSubKeys ;             // number of subkeys
   134  Pointer lpcbMaxSubKeyLen ;       // longest subkey name length
   135  Pointer lpcbMaxClassLen ;        // longest class string length
   136  Pointer lpcValues ;              // number of value entries
   137  Pointer lpcbMaxValueNameLen ;    // longest value name length
   138  Pointer lpcbMaxValueLen ;        // longest value data length
   139  Pointer lpcbSecurityDescriptor ; // descriptor length
   140  Pointer lpftLastWriteTime ;      // last write time
   141Returns Integer // WINERROR
   142
   143External_Function RegFlushKey "RegFlushKey" AdvApi32.dll ;
   144    Handle hKey ;
   145    Returns DWord
   146
   147Type tFileTime
   148    Field tFileTime.dwLowDateTime  as DWord
   149    Field tFileTime.dwHighDateTime as DWord
   150End_Type
   151
   152Type tRegKeyInfo
   153    Field tRegKeyInfo.NumSubKeys              as Integer
   154    Field tRegKeyInfo.MaxSubKeyLen            as Integer
   155    Field tRegKeyInfo.NumValues               as Integer
   156    Field tRegKeyInfo.MaxValueLen             as Integer
   157    Field tRegKeyInfo.MaxDataLen              as Integer
   158    Field tRegKeyInfo.FileTime.dwLowDateTime  as DWord
   159    Field tRegKeyInfo.FileTime.dwHighDateTime as DWord
   160End_Type
   161
   162Function FormatWinError Global Integer iError Returns String
   163    Integer iFlags iBytes iResult
   164    Pointer pAddress
   165    String sBuffer
   166
   167    // Initialize pAddress, just to make sure AddressOf() works
   168    Move 0 To pAddress
   169
   170    // Set the flags...
   171    Move (FORMAT_MESSAGE_ALLOCATE_BUFFER iOr FORMAT_MESSAGE_FROM_SYSTEM iOr FORMAT_MESSAGE_IGNORE_INSERTS) To iFlags
   172
   173    // If FormatMessage fails iBytes will be 0, therefore no bytes will be copied and the error will only
   174    // display the error code returned from GetLastError...
   175    Move (FormatMessage(iFlags,0,iError,0,AddressOf(pAddress),0,0)) To iBytes
   176
   177    // Allocate the buffer...
   178    Move (Repeat(Character(0),iBytes)) To sBuffer
   179    If (iBytes > 0) Move (CopyMemory(AddressOf(sBuffer),pAddress,iBytes)) To iResult
   180
   181    // Display the error code and message, if no message is available use 'No error text available'.
   182    If (Trim(sBuffer) = "") Move C_$NoErrorTextAvailable To sBuffer
   183    //Error 9999 ("("+String(iError)+") "+sBuffer)
   184    //Error 9999 ('Windows has reported the following Error:' +character(13)+Character(13) +sBuffer +character(13) +'(Windows Error Code=' +String(iError) +')')
   185
   186    // Free memory used by the buffer...
   187    Move (Free(pAddress)) To iResult
   188    Function_Return (sBuffer +" (" +C_$ErrorCode +"=" +String(iError) +")")
   189End_Function // FormatWinError
   190
   191
   192