1 /************************************************************** 2 * 3 * Licensed to the Apache Software Foundation (ASF) under one 4 * or more contributor license agreements. See the NOTICE file 5 * distributed with this work for additional information 6 * regarding copyright ownership. The ASF licenses this file 7 * to you under the Apache License, Version 2.0 (the 8 * "License"); you may not use this file except in compliance 9 * with the License. You may obtain a copy of the License at 10 * 11 * http://www.apache.org/licenses/LICENSE-2.0 12 * 13 * Unless required by applicable law or agreed to in writing, 14 * software distributed under the License is distributed on an 15 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16 * KIND, either express or implied. See the License for the 17 * specific language governing permissions and limitations 18 * under the License. 19 * 20 *************************************************************/ 21 22 23 24 // MARKER(update_precomp.py): autogen include statement, do not remove 25 #include "precompiled_shell.hxx" 26 27 #if defined _MSC_VER 28 #pragma warning(push, 1) 29 #endif 30 #include <windows.h> 31 #if defined _MSC_VER 32 #pragma warning(pop) 33 #endif 34 #include <malloc.h> 35 #include "internal/dbgmacros.hxx" 36 #include "internal/registry.hxx" 37 38 #if defined _MSC_VER 39 #pragma warning(push, 1) 40 #endif 41 #include <objbase.h> 42 #if defined _MSC_VER 43 #pragma warning(pop) 44 #endif 45 46 //--------------------------------------- 47 // 48 //--------------------------------------- 49 50 // Size of a CLSID as a string 51 const int CLSID_STRING_SIZE = 39; 52 53 //--------------------------------------- 54 // 55 //--------------------------------------- 56 57 bool SetRegistryKey(HKEY RootKey, const char* KeyName, const char* ValueName, const char* Value) 58 { 59 HKEY hSubKey; 60 61 // open or create the desired key 62 int rc = RegCreateKeyExA( 63 RootKey, KeyName, 0, "", REG_OPTION_NON_VOLATILE, KEY_WRITE, 0, &hSubKey, 0); 64 65 if (ERROR_SUCCESS == rc) 66 { 67 rc = RegSetValueExA( 68 hSubKey, ValueName, 0, REG_SZ, reinterpret_cast<const BYTE*>(Value), strlen(Value) + 1); 69 70 RegCloseKey(hSubKey); 71 } 72 73 return (ERROR_SUCCESS == rc); 74 } 75 76 //--------------------------------------- 77 // 78 //--------------------------------------- 79 80 bool DeleteRegistryKey(HKEY RootKey, const char* KeyName) 81 { 82 HKEY hKey; 83 84 int rc = RegOpenKeyExA( 85 RootKey, 86 KeyName, 87 0, 88 KEY_READ | DELETE, 89 &hKey); 90 91 if ( rc == ERROR_FILE_NOT_FOUND ) 92 return true; 93 94 if (ERROR_SUCCESS == rc) 95 { 96 char* SubKey; 97 DWORD nMaxSubKeyLen; 98 99 rc = RegQueryInfoKeyA( 100 hKey, 0, 0, 0, 0, 101 &nMaxSubKeyLen, 102 0, 0, 0, 0, 0, 0); 103 104 nMaxSubKeyLen++; // space for trailing '\0' 105 106 SubKey = reinterpret_cast<char*>( 107 _alloca(nMaxSubKeyLen*sizeof(char))); 108 109 while (ERROR_SUCCESS == rc) 110 { 111 DWORD nLen = nMaxSubKeyLen; 112 113 rc = RegEnumKeyExA( 114 hKey, 115 0, // always index zero 116 SubKey, 117 &nLen, 118 0, 0, 0, 0); 119 120 if (ERROR_NO_MORE_ITEMS == rc) 121 { 122 rc = RegDeleteKeyA(RootKey, KeyName); 123 break; 124 } 125 else if (rc == ERROR_SUCCESS) 126 { 127 DeleteRegistryKey(hKey, SubKey); 128 } 129 130 } // while 131 132 RegCloseKey(hKey); 133 134 } // if 135 136 return (ERROR_SUCCESS == rc); 137 } 138 139 /** May be used to determine if the specified registry key has subkeys 140 The function returns true on success else if an error occurs false 141 */ 142 bool HasSubkeysRegistryKey(HKEY RootKey, const char* KeyName, /* out */ bool& bResult) 143 { 144 HKEY hKey; 145 146 LONG rc = RegOpenKeyExA(RootKey, KeyName, 0, KEY_READ, &hKey); 147 148 if (ERROR_SUCCESS == rc) 149 { 150 DWORD nSubKeys = 0; 151 152 rc = RegQueryInfoKeyA(hKey, 0, 0, 0, &nSubKeys, 0, 0, 0, 0, 0, 0, 0); 153 154 bResult = (nSubKeys > 0); 155 } 156 157 return (ERROR_SUCCESS == rc); 158 } 159 160 // Convert a CLSID to a char string. 161 std::string ClsidToString(const CLSID& clsid) 162 { 163 // Get CLSID 164 LPOLESTR wszCLSID = NULL; 165 StringFromCLSID(clsid, &wszCLSID); 166 167 char buff[39]; 168 // Covert from wide characters to non-wide. 169 wcstombs(buff, wszCLSID, sizeof(buff)); 170 171 // Free memory. 172 CoTaskMemFree(wszCLSID) ; 173 174 return std::string(buff); 175 } 176 177 //--------------------------------------- 178 // 179 //--------------------------------------- 180 181 bool QueryRegistryKey(HKEY RootKey, const char* KeyName, const char* ValueName, char *pszData, DWORD dwBufLen) 182 { 183 HKEY hKey; 184 185 int rc = RegOpenKeyExA( 186 RootKey, 187 KeyName, 188 0, 189 KEY_READ, 190 &hKey); 191 192 if (ERROR_SUCCESS == rc) 193 { 194 rc = RegQueryValueExA( 195 hKey, ValueName, NULL, NULL, (LPBYTE)pszData,&dwBufLen); 196 197 RegCloseKey(hKey); 198 } 199 200 return (ERROR_SUCCESS == rc); 201 } 202