|
|
/*++
Copyright (c) 1994 Microsoft Corporation
Module Name:
registry.cxx
Abstract:
Functions to read/write registry parameters
Contents: OpenInternetSettingsKey CloseInternetSettingsKey InternetGetComputerName InternetDeleteRegistryValue InternetReadRegistryDword InternetWriteRegistryDword InternetReadRegistryString InternetWriteRegistryString InternetReadRegistryBinary (InternetReadRegistryDwordKey) (InternetReadRegistryStringKey) (InternetReadRegistryBinaryKey) (InternetGetPrivateProfileString) (ReadRegistryOemString) (WriteRegistryDword) ReadRegistryDword
Author:
Richard L Firth (rfirth) 20-Mar-1995
Environment:
Win32(s) user-level DLL
Revision History:
20-Mar-1995 rfirth Created
--*/
#include <wininetp.h>
char vszDelimiters[] = ";, ";
//
// manifests
//
#define INTERNET_CLIENT_KEY "Internet Settings"
#define SYSTEM_INI_FILE_NAME "SYSTEM.INI"
#define NETWORK_SECTION_NAME "Network"
#define COMPUTER_NAME_VALUE "ComputerName"
#define PROFILE_INT_BUFFER_LENGTH 128
#define MIME_TO_FILE_EXTENSION_KEY "MIME\\Database\\Content Type\\"
#define EXTENSION_VALUE "Extension"
//
// macros
//
#define INTERNET_SETTINGS_KEY "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Internet Settings"
#define INTERNET_CACHE_SETTINGS_KEY "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Internet Settings\\5.0\\Cache"
//
// private prototypes
//
PRIVATE DWORD InternetReadRegistryDwordKey( IN HKEY ParameterKey, IN LPCSTR ParameterName, OUT LPDWORD ParameterValue );
PRIVATE DWORD InternetReadRegistryStringKey( IN HKEY ParameterKey, IN LPCSTR ParameterName, OUT LPSTR ParameterValue, IN OUT LPDWORD ParameterLength );
//PRIVATE
//DWORD
//InternetReadRegistryBinaryKey(
// IN HKEY ParameterKey,
// IN LPCSTR ParameterName,
// OUT LPBYTE ParameterValue,
// IN OUT LPDWORD ParameterLength
// );
//
//PRIVATE
//DWORD
//InternetGetPrivateProfileString(
// IN LPSTR IniFileName,
// IN LPSTR SectionName,
// IN LPCSTR ParameterName,
// OUT LPSTR ParameterValue,
// IN OUT LPDWORD ParameterLength
// );
PRIVATE DWORD ReadRegistryOemString( IN HKEY Key, IN LPCSTR ParameterName, OUT LPSTR String, IN OUT LPDWORD Length );
PRIVATE DWORD WriteRegistryDword( IN HKEY Key, IN LPCSTR ParameterName, IN DWORD ParameterValue );
//
// private data
//
PRIVATE HKEY hKeyInternetSettings = NULL;
//
// functions
//
DWORD OpenInternetSettingsKey( VOID )
/*++
Routine Description:
Opens registry key for Internet Settings branch
Arguments:
None.
Return Value:
DWORD Success - ERROR_SUCCESS
Failure - ERROR_NOT_ENOUGH_MEMORY
--*/
{ DEBUG_ENTER((DBG_REGISTRY, Dword, "OpenInternetSettingsKey", NULL ));
DWORD error = ERROR_SUCCESS;
if (!GeneralInitCritSec.Lock()) { goto quit; error = ERROR_NOT_ENOUGH_MEMORY; }
if (hKeyInternetSettings == NULL) {
DWORD dwDisposition;
REGCREATEKEYEX(HKEY_LOCAL_MACHINE, INTERNET_SETTINGS_KEY, 0, // reserved
NULL, // class
0, // options
KEY_READ | KEY_WRITE, NULL, // security attributes
&hKeyInternetSettings, &dwDisposition ); }
GeneralInitCritSec.Unlock();
quit: DEBUG_LEAVE(error);
return error; }
DWORD CloseInternetSettingsKey( VOID )
/*++
Routine Description:
Closes Internet Settings registry key
Arguments:
None.
Return Value:
DWORD Success - ERROR_SUCCESS
Failure -
--*/
{ DEBUG_ENTER((DBG_REGISTRY, Dword, "CloseInternetSettingsKey", NULL ));
DWORD error = ERROR_SUCCESS;
if (hKeyInternetSettings != NULL) { error = REGCLOSEKEY(hKeyInternetSettings); hKeyInternetSettings = NULL; }
DEBUG_LEAVE(error);
return error; }
PUBLIC DWORD InternetDeleteRegistryValue( IN LPSTR ParameterName )
/*++
Routine Description:
Delets an entry from a the Internet Client registry key if the platform is NT/Win95.
Arguments:
ParameterName - name of the parameter to retrieve (e.g. AccessType)
Return Value:
DWORD Success - ERROR_SUCCESS
Failure - ERROR_PATH_NOT_FOUND
--*/
{ DWORD error;
DEBUG_ENTER((DBG_REGISTRY, Dword, "InternetDeleteRegistryValue", "%q", ParameterName ));
HKEY clientKey;
//
// open the registry key containing the Internet client values (this is
// in the same place on NT and Win95)
//
error = REGOPENKEYEX(HKEY_CURRENT_USER, INTERNET_SETTINGS_KEY, 0, // reserved
KEY_ALL_ACCESS, &clientKey );
if (error == ERROR_SUCCESS) {
error = RegDeleteValue(clientKey, ParameterName );
REGCLOSEKEY(clientKey); }
DEBUG_LEAVE(error);
return error; }
DWORD InternetReadRegistryDword( IN LPCSTR ParameterName, OUT LPDWORD ParameterValue )
/*++
Routine Description:
Reads a single DWORD from a the Internet Client registry key if the platform is NT/Win95, else reads the value from SYSTEM.INI if we are running on Win32s
Arguments:
ParameterName - name of the parameter to retrieve (e.g. AccessType)
ParameterValue - pointer to place to store retrieved value
Return Value:
DWORD Success - ERROR_SUCCESS
Failure - ERROR_PATH_NOT_FOUND
--*/
{ DEBUG_ENTER((DBG_REGISTRY, Dword, "InternetReadRegistryDword", "%q, %x", ParameterName, ParameterValue ));
DWORD error = InternetReadRegistryDwordKey(HKEY_LOCAL_MACHINE, ParameterName, ParameterValue );
DEBUG_LEAVE(error);
return error; }
#ifdef WININET6
DWORD InternetIDEWriteRegistryDword( IN LPCSTR ParameterName, IN DWORD ParameterValue )
/*++
Routine Description:
Writes a single DWORD from to the Internet Client registry key if the platform is NT/Win95, otherwise it fails.
Arguments:
ParameterName - name of the parameter to retrieve (e.g. AccessType)
ParameterValue - value to store in registry.
Return Value:
DWORD Success - ERROR_SUCCESS
Failure - ERROR_PATH_NOT_FOUND
--*/
{ DEBUG_ENTER((DBG_REGISTRY, Dword, "InternetIDEWriteRegistryDword", "%q, %x", ParameterName, ParameterValue ));
DWORD error = GlobalIdentity ? WriteIDRegDword(ParameterName, ParameterValue) : InternetWriteRegistryDword(ParameterName, ParameterValue);
DEBUG_LEAVE(error);
return error; }
DWORD InternetIDEReadRegistryDword( IN LPCSTR ParameterName, OUT LPDWORD ParameterValue )
/*++
Routine Description:
If we're in an identity-mode, we'll read from the special location. Otherwise, read from the old location.
Arguments:
ParameterName - name of the parameter to retrieve (e.g. AccessType)
ParameterValue - pointer to place to store retrieved value
Return Value:
DWORD Success - ERROR_SUCCESS
Failure - ERROR_PATH_NOT_FOUND
--*/
{ DEBUG_ENTER((DBG_REGISTRY, Dword, "InternetIDEReadRegistryDword", "%q, %x", ParameterName, ParameterValue ));
DWORD error = GlobalIdentity ? ReadIDRegDword(ParameterName, ParameterValue) : InternetReadRegistryDwordKey(HKEY_CURRENT_USER, ParameterName, ParameterValue);
DEBUG_LEAVE(error);
return error; } #endif
DWORD InternetCacheReadRegistryDword( IN LPCSTR ParameterName, OUT LPDWORD ParameterValue )
/*++
Routine Description:
Reads a single DWORD from a the Internet Client registry key if the platform is NT/Win95, else reads the value from SYSTEM.INI if we are running on Win32s
Arguments:
ParameterName - name of the parameter to retrieve (e.g. AccessType)
ParameterValue - pointer to place to store retrieved value
Return Value:
DWORD Success - ERROR_SUCCESS
Failure - ERROR_PATH_NOT_FOUND
--*/
{ DEBUG_ENTER((DBG_REGISTRY, Dword, "InternetCacheReadRegistryDword", "%q, %x", ParameterName, ParameterValue ));
DWORD error = ERROR_SUCCESS; HKEY clientKey;
error = REGOPENKEYEX(HKEY_CURRENT_USER, INTERNET_CACHE_SETTINGS_KEY, 0, // reserved
KEY_QUERY_VALUE, &clientKey );
if (error == ERROR_SUCCESS) { error = ReadRegistryDword(clientKey, ParameterName, ParameterValue ); REGCLOSEKEY(clientKey); }
DEBUG_LEAVE(error);
return error; }
DWORD InternetWriteRegistryDword( IN LPCSTR ParameterName, IN DWORD ParameterValue )
/*++
Routine Description:
Writes a single DWORD from to the Internet Client registry key if the platform is NT/Win95, otherwise it fails.
Arguments:
ParameterName - name of the parameter to retrieve (e.g. AccessType)
ParameterValue - value to store in registry.
Return Value:
DWORD Success - ERROR_SUCCESS
Failure - ERROR_PATH_NOT_FOUND
--*/
{ DEBUG_ENTER((DBG_REGISTRY, Dword, "InternetWriteRegistryDword", "%q, %x", ParameterName, ParameterValue ));
DWORD error;
if (hKeyInternetSettings != NULL) { error = WriteRegistryDword(hKeyInternetSettings, ParameterName, ParameterValue ); } else { error = ERROR_SUCCESS; }
DEBUG_PRINT(REGISTRY, INFO, ("InternetWriteRegistryDword(%q): value = %d (%#x)\n", ParameterName, ParameterValue, ParameterValue ));
DEBUG_LEAVE(error);
return error; }
DWORD InternetReadRegistryString( IN LPCSTR ParameterName, OUT LPSTR ParameterValue, IN OUT LPDWORD ParameterLength )
/*++
Routine Description:
Reads a string from the Internet Client registry key on NT/Win95, or reads the corresponding value from SYSTEM.INI on a Win32s platform
Arguments:
ParameterName - name of value parameter within key (e.g. EmailName)
ParameterValue - pointer to string buffer for returned string
ParameterLength - IN: number of bytes in ParameterValue OUT: number of bytes in string (excluding trailing '\0')
Return Value:
DWORD Success - ERROR_SUCCESS
Failure - ERROR_PATH_NOT_FOUND
--*/
{ DEBUG_ENTER((DBG_REGISTRY, Dword, "InternetReadRegistryString", "%q, %x, %x [%d]", ParameterName, ParameterValue, ParameterLength, *ParameterLength ));
DWORD error = InternetReadRegistryStringKey(HKEY_CURRENT_USER, ParameterName, ParameterValue, ParameterLength );
DEBUG_LEAVE(error);
return error; }
//
//DWORD
//InternetWriteRegistryString(
// IN LPCSTR ParameterName,
// IN LPSTR ParameterValue
// )
//
///*++
//
//Routine Description:
//
// Writes a string to the Internet Client registry key on NT/Win95, or writes
// the corresponding value to SYSTEM.INI on Win32s platform
//
//Arguments:
//
// ParameterName - name of value parameter within key (e.g. EmailName)
//
// ParameterValue - pointer to string to write
//
//Return Value:
//
// DWORD
// Success - ERROR_SUCCESS
//
// Failure -
//
//--*/
//
//{
// DEBUG_ENTER((DBG_REGISTRY,
// Dword,
// "InternetWriteRegistryString",
// "%.40q, %.80q",
// ParameterName,
// ParameterValue
// ));
//
// DWORD error;
//
// if (IsPlatformWin32s()) {
//
// BOOL ok;
//
// ok = WritePrivateProfileString(INTERNET_CLIENT_KEY,
// ParameterName,
// ParameterValue,
// SYSTEM_INI_FILE_NAME
// );
// error = ok ? ERROR_SUCCESS : GetLastError();
// } else {
//
// //
// // BUGBUG - currently, nothing needs to write to registry if NT or Win95
// //
//
// INET_ASSERT(FALSE);
//
// }
//
// DEBUG_LEAVE(error);
//
// return error;
//}
//
//
//DWORD
//InternetReadRegistryBinary(
// IN LPCSTR ParameterName,
// OUT LPBYTE ParameterValue,
// IN OUT LPDWORD ParameterLength
// )
//
///*++
//
//Routine Description:
//
// Reads a binary value from the Internet Client registry key on NT/Win95, or
// reads the corresponding value from SYSTEM.INI on a Win32s platform
//
//Arguments:
//
// ParameterName - name of value parameter within key (e.g. EmailName)
//
// ParameterValue - pointer to buffer for returned data
//
// ParameterLength - IN: number of bytes in ParameterValue
// OUT: number of bytes in buffer, or required size
//
//Return Value:
//
// DWORD
// Success - ERROR_SUCCESS
//
// Failure - ERROR_PATH_NOT_FOUND
// The parameter wasn't found
//
// ERROR_MORE_DATA
// The buffer isn't large enough
//
//--*/
//
//{
// DEBUG_ENTER((DBG_REGISTRY,
// Dword,
// "InternetReadRegistryBinary",
// "%q, %#x, %#x [%d]",
// ParameterName,
// ParameterValue,
// ParameterLength,
// *ParameterLength
// ));
//
// DWORD error;
//
// error = InternetReadRegistryBinaryKey(HKEY_CURRENT_USER,
// ParameterName,
// ParameterValue,
// ParameterLength
// );
//
// DEBUG_LEAVE(error);
//
// return error;
//}
//
// private functions
//
PUBLIC DWORD InternetReadRegistryDwordKey( IN HKEY ParameterKey, IN LPCSTR ParameterName, OUT LPDWORD ParameterValue )
/*++
Routine Description:
Reads a single DWORD from a the Internet Client registry key if the platform is NT/Win95, else reads the value from SYSTEM.INI if we are running on Win32s.
Does not modify the *ParameterValue if the registry variable cannot be read
Arguments:
ParameterKey - root registry key (e.g. HKEY_CURRENT_USER)
ParameterName - name of the parameter to retrieve (e.g. AccessType)
ParameterValue - pointer to place to store retrieved value
Return Value:
DWORD Success - ERROR_SUCCESS
Failure - ERROR_PATH_NOT_FOUND
--*/
{ DEBUG_ENTER((DBG_REGISTRY, Dword, "InternetReadRegistryDwordKey", "%s, %q, %x", (ParameterKey == HKEY_LOCAL_MACHINE) ? "HKEY_LOCAL_MACHINE" : (ParameterKey == HKEY_CURRENT_USER) ? "HKEY_CURRENT_USER" : "???", ParameterName, ParameterValue ));
DWORD error = ERROR_SUCCESS; HKEY clientKey = hKeyInternetSettings;
if (ParameterKey != HKEY_CURRENT_USER) { error = REGOPENKEYEX(ParameterKey, INTERNET_SETTINGS_KEY, 0, // reserved
KEY_QUERY_VALUE, &clientKey ); } else if (clientKey == NULL) { error = ERROR_PATH_NOT_FOUND; }
if (error == ERROR_SUCCESS) { error = ReadRegistryDword(clientKey, ParameterName, ParameterValue ); if (clientKey != hKeyInternetSettings) { REGCLOSEKEY(clientKey); } }
DEBUG_PRINT(REGISTRY, INFO, ("InternetReadRegistryDwordKey(%q): value = %d (%#x)\n", ParameterName, *ParameterValue, *ParameterValue ));
DEBUG_LEAVE(error);
return error; }
PRIVATE DWORD InternetReadRegistryStringKey( IN HKEY ParameterKey, IN LPCSTR ParameterName, OUT LPSTR ParameterValue, IN OUT LPDWORD ParameterLength )
/*++
Routine Description:
Reads a string from the Internet Client registry key on NT/Win95, or reads the corresponding value from SYSTEM.INI on a Win32s platform
Arguments:
ParameterKey - root registry key (e.g. HKEY_LOCAL_MACHINE)
ParameterName - name of value parameter within key (e.g. EmailName)
ParameterValue - pointer to string buffer for returned string
ParameterLength - IN: number of bytes in ParameterValue OUT: number of bytes in string (excluding trailing '\0')
Return Value:
DWORD Success - ERROR_SUCCESS
Failure - ERROR_PATH_NOT_FOUND
--*/
{ DEBUG_ENTER((DBG_REGISTRY, Dword, "InternetReadRegistryStringKey", "%s (%x), %q, %x, %x [%d]", (ParameterKey == HKEY_LOCAL_MACHINE) ? "HKEY_LOCAL_MACHINE" : (ParameterKey == HKEY_CURRENT_USER) ? "HKEY_CURRENT_USER" : "???", ParameterKey, ParameterName, ParameterValue, ParameterLength, *ParameterLength ));
//
// zero-terminate the string
//
if (*ParameterLength > 0) { *ParameterValue = '\0'; }
DWORD error = ERROR_SUCCESS; HKEY clientKey = hKeyInternetSettings;
if (ParameterKey != HKEY_CURRENT_USER) { error = REGOPENKEYEX(ParameterKey, INTERNET_SETTINGS_KEY, 0, // reserved
KEY_QUERY_VALUE, &clientKey ); } else if (clientKey == NULL) { error = ERROR_PATH_NOT_FOUND; }
if (error == ERROR_SUCCESS) { error = ReadRegistryOemString(clientKey, ParameterName, ParameterValue, ParameterLength ); if (clientKey != hKeyInternetSettings) { REGCLOSEKEY(clientKey); } }
DEBUG_PRINT(REGISTRY, INFO, ("InternetReadRegistryStringKey(%q): value = %q\n", ParameterName, ParameterValue ));
DEBUG_LEAVE(error);
return error; }
//
//PRIVATE
//DWORD
//InternetReadRegistryBinaryKey(
// IN HKEY ParameterKey,
// IN LPCSTR ParameterName,
// OUT LPBYTE ParameterValue,
// IN OUT LPDWORD ParameterLength
// )
//
///*++
//
//Routine Description:
//
// Reads a binary value from the Internet Client registry key on NT/Win95, or
// reads the corresponding value from SYSTEM.INI on a Win32s platform
//
//Arguments:
//
// ParameterKey - root registry key (e.g. HKEY_LOCAL_MACHINE)
//
// ParameterName - name of value parameter within key (e.g. EmailName)
//
// ParameterValue - pointer to buffer for returned data
//
// ParameterLength - IN: number of bytes in ParameterValue
// OUT: number of bytes in buffer, or required size
//
//Return Value:
//
// DWORD
// Success - ERROR_SUCCESS
//
// Failure - ERROR_PATH_NOT_FOUND
// The parameter wasn't found
//
// ERROR_MORE_DATA
// The buffer isn't large enough
//
//--*/
//
//{
// DEBUG_ENTER((DBG_REGISTRY,
// Dword,
// "InternetReadRegistryBinaryKey",
// "%s (%x), %q, %#x, %#x [%d]",
// (ParameterKey == HKEY_LOCAL_MACHINE)
// ? "HKEY_LOCAL_MACHINE"
// : (ParameterKey == HKEY_CURRENT_USER)
// ? "HKEY_CURRENT_USER"
// : "???",
// ParameterKey,
// ParameterName,
// ParameterValue,
// ParameterLength,
// *ParameterLength
// ));
//
// DWORD error;
// HKEY clientKey;
//
// //
// // open the registry key containing the Internet client values (this is
// // in the same place on NT and Win95)
// //
//
// error = REGOPENKEYEX(ParameterKey,
// INTERNET_SETTINGS_KEY,
// 0, // reserved
// KEY_QUERY_VALUE,
// &clientKey
// );
//
// if (error == ERROR_SUCCESS) {
//
// DWORD valueType;
//
// error = RegQueryValueEx(clientKey,
// ParameterName,
// NULL, // reserved
// &valueType,
// ParameterValue,
// ParameterLength
// );
// REGCLOSEKEY(clientKey);
// }
//
// DEBUG_PRINT(REGISTRY,
// INFO,
// ("InternetReadRegistryBinaryKey(%q): length = %d\n",
// ParameterName,
// *ParameterLength
// ));
//
// DEBUG_LEAVE(error);
//
// return error;
//}
//
//
//PRIVATE
//DWORD
//InternetGetPrivateProfileString(
// IN LPSTR IniFileName,
// IN LPSTR SectionName,
// IN LPCSTR ParameterName,
// OUT LPSTR ParameterValue,
// IN OUT LPDWORD ParameterLength
// )
//
///*++
//
//Routine Description:
//
// Reads an string out of an INI file. Mainly just for Win32s
//
//Arguments:
//
// IniFileName - name of INI file to read
//
// SectionName - name of section in INI file to read
//
// ParameterName - name of entry in section to read
//
// ParameterValue - returned string
//
// ParameterLength - IN: Length of ParameterValue
// OUT: Number of characters in ParameterValue, excluding
// terminating NUL
//
//Return Value:
//
// DWORD
// Success - ERROR_SUCCESS
//
// Failure - ERROR_PATH_NOT_FOUND
// ERROR_FILE_NOT_FOUND
//
//--*/
//
//{
// DWORD error;
// DWORD nChars;
//
// nChars = GetPrivateProfileString(SectionName,
// ParameterName,
// "", // lpszDefault
// ParameterValue,
// *ParameterLength,
// IniFileName
// );
// if (nChars > 0) {
// *ParameterLength = nChars;
// error = ERROR_SUCCESS;
// } else {
// error = ERROR_PATH_NOT_FOUND;
// }
// return error;
//}
PRIVATE DWORD ReadRegistryOemString( IN HKEY Key, IN LPCSTR ParameterName, OUT LPSTR String, IN OUT LPDWORD Length )
/*++
Routine Description:
Reads a string out of the registry as an OEM string
Arguments:
Key - open registry key where to read value from
ParameterName - name of registry value to read
String - place to put it
Length - IN: length of String buffer in characters OUT: length of String in characters, as if returned from strlen()
Return Value:
DWORD Success - ERROR_SUCCESS
Failure - ERROR_FILE_NOT_FOUND Couldn't find the parameter
ERROR_PATH_NOT_FOUND Couldn't find the parameter --*/
{ DEBUG_ENTER((DBG_REGISTRY, Dword, "ReadRegistryOemString", "%#x, %q, %#x, %#x [%d]", Key, ParameterName, String, Length, *Length ));
LONG error; DWORD valueType; LPSTR str; DWORD valueLength;
//
// first, get the length of the string
//
valueLength = *Length; error = RegQueryValueEx(Key, ParameterName, NULL, // reserved
&valueType, (LPBYTE)String, &valueLength ); if (error != ERROR_SUCCESS) { goto quit; }
//
// we only support REG_SZ (single string) values in this function
//
if (valueType != REG_SZ) { error = ERROR_PATH_NOT_FOUND; goto quit; }
//
// if 1 or 0 chars returned then the string is empty
//
if (valueLength <= sizeof(char)) { error = ERROR_PATH_NOT_FOUND; goto quit; }
//
// convert the ANSI string to OEM character set in place. According to Win
// help, this always succeeds
//
CharToOem(String, String);
//
// return the length as if returned from strlen() (i.e. drop the '\0')
//
*Length = valueLength - sizeof(char);
DEBUG_PRINT(REGISTRY, INFO, ("ReadRegistryOemString(%q) returning %q (%d chars)\n", ParameterName, String, *Length ));
quit:
DEBUG_LEAVE(error);
return error; }
DWORD ReadRegistryDword( IN HKEY Key, IN LPCSTR ParameterName, OUT LPDWORD ParameterValue )
/*++
Routine Description:
Reads a DWORD parameter from the registry
Won't modify *ParameterValue unless a valid value is read from the registry
Arguments:
Key - handle of open registry key where parameter resides
ParameterName - name of DWORD parameter to read
ParameterValue - returned DWORD parameter read from registry
Return Value:
DWORD Success - ERROR_SUCCESS
Failure - ERROR_PATH_NOT_FOUND One of the following occurred: - the parameter is not in the specified registry key - the parameter is the wrong type - the parameter is the wrong size
--*/
{ DEBUG_ENTER((DBG_REGISTRY, Dword, "ReadRegistryDword", "%x, %q, %x", Key, ParameterName, ParameterValue ));
DWORD error; DWORD valueLength; DWORD valueType; DWORD value;
valueLength = sizeof(*ParameterValue); error = (DWORD)RegQueryValueEx(Key, ParameterName, NULL, // reserved
&valueType, (LPBYTE)&value, &valueLength );
//
// if the size or type aren't correct then return an error, else only if
// success was returned do we modify *ParameterValue
//
if (error == ERROR_SUCCESS) { if (((valueType != REG_DWORD) && (valueType != REG_BINARY)) || (valueLength != sizeof(DWORD))) {
DEBUG_PRINT(REGISTRY, ERROR, ("valueType = %d, valueLength = %d\n", valueType, valueLength ));
error = ERROR_PATH_NOT_FOUND; } else { *ParameterValue = value; } }
DEBUG_LEAVE(error);
return error; }
PRIVATE DWORD WriteRegistryDword( IN HKEY Key, IN LPCSTR ParameterName, IN DWORD ParameterValue )
/*++
Routine Description:
Writes a DWORD parameter from the registry
Will write ParameterValue to the key.
Arguments:
Key - handle of open registry key where parameter resides
ParameterName - name of DWORD parameter to write
ParameterValue - DWORD parameter to write from registry
Return Value:
DWORD Success - ERROR_SUCCESS
Failure - ERROR_PATH_NOT_FOUND One of the following occurred: - the parameter is not in the specified registry key - the parameter is the wrong type - the parameter is the wrong size
--*/
{ DEBUG_ENTER((DBG_REGISTRY, Dword, "WriteRegistryDword", "%x, %q, %x", Key, ParameterName, ParameterValue ));
DWORD error; DWORD valueLength; DWORD valueType; DWORD value;
valueLength = sizeof(ParameterValue); valueType = REG_DWORD; value = ParameterValue;
error = (DWORD)RegSetValueEx(Key, ParameterName, NULL, // reserved
valueType, (LPBYTE)&value, valueLength );
DEBUG_PRINT(REGISTRY, INFO, ("added: valueType = %d, valueLength = %d\n", valueType, valueLength ));
DEBUG_LEAVE(error);
return error; }
#if INET_DEBUG
typedef struct { LIST_ENTRY entry; HKEY hkey; char * file; int line; char name[1]; } DBGREGKEYINFO;
SERIALIZED_LIST DbgRegKeyList;
VOID DbgRegKey_Init(VOID) { InitializeSerializedList(&DbgRegKeyList); }
VOID DbgRegKey_Terminate(VOID) { TerminateSerializedList(&DbgRegKeyList); }
void regkey_add(const char * name, HKEY hkey, char * file, int line) {
if (!name) { name = ""; }
int len = lstrlen(name); DBGREGKEYINFO * p = (DBGREGKEYINFO *)ALLOCATE_FIXED_MEMORY(sizeof(DBGREGKEYINFO) + len);
if (p) { //dprintf("Wininet.DbgRegKey: adding %q\n", name);
memcpy(p->name, name, len + 1); p->line = line; p->file = file; p->hkey = hkey; InsertAtHeadOfSerializedList(&DbgRegKeyList, &p->entry); } }
void regkey_remove(HKEY hkey) { if (LockSerializedList(&DbgRegKeyList)) {
DBGREGKEYINFO * p = (DBGREGKEYINFO *)HeadOfSerializedList(&DbgRegKeyList);
while (p != (DBGREGKEYINFO *)SlSelf(&DbgRegKeyList)) { if (p->hkey == hkey) { RemoveFromSerializedList(&DbgRegKeyList, (PLIST_ENTRY)p); //dprintf("Wininet.DbgRegKey: removing %q\n", p->name);
FREE_MEMORY(p); break; } p = (DBGREGKEYINFO *)p->entry.Flink; } UnlockSerializedList(&DbgRegKeyList); } }
char * regkey_name(HKEY hkey, const char * subname) { switch ((INT_PTR)hkey) { case (INT_PTR)HKEY_CLASSES_ROOT: return NEW_STRING("HKEY_CLASSES_ROOT");
case (INT_PTR)HKEY_CURRENT_USER: return NEW_STRING("HKEY_CURRENT_USER");
case (INT_PTR)HKEY_LOCAL_MACHINE: return NEW_STRING("HKEY_LOCAL_MACHINE");
case (INT_PTR)HKEY_USERS: return NEW_STRING("HKEY_USERS");
case (INT_PTR)HKEY_PERFORMANCE_DATA: return NEW_STRING("HKEY_PERFORMANCE_DATA");
case (INT_PTR)HKEY_CURRENT_CONFIG: return NEW_STRING("HKEY_CURRENT_CONFIG");
case (INT_PTR)HKEY_DYN_DATA: return NEW_STRING("HKEY_DYN_DATA"); }
char * name = NULL;
if (LockSerializedList(&DbgRegKeyList)) { DBGREGKEYINFO * p = (DBGREGKEYINFO *)HeadOfSerializedList(&DbgRegKeyList);
while (p != (DBGREGKEYINFO *)SlSelf(&DbgRegKeyList)) { if (p->hkey == hkey) {
int len = lstrlen(p->name); int slen = lstrlen(subname);
name = (char *)ALLOCATE_FIXED_MEMORY(len + 1 + slen + 1); if (name) { memcpy(name, p->name, len); name[len] = '\\'; memcpy(name + len + 1, subname, slen + 1); } break; } p = (DBGREGKEYINFO *)p->entry.Flink; } UnlockSerializedList(&DbgRegKeyList); }
return name; }
void regkey_freename(char * name) { if (name) { FREE_MEMORY(name); } }
LONG DbgRegOpenKey( IN HKEY hKey, IN LPCTSTR lpszSubKey, OUT PHKEY phkResult, char * file, int line ) { char * keyname = regkey_name(hKey, lpszSubKey); LONG rc = RegOpenKey(hKey, lpszSubKey, phkResult);
if (rc == 0) { regkey_add(keyname, *phkResult, file, line); } regkey_freename(keyname); return rc; }
LONG DbgRegOpenKeyEx( IN HKEY hKey, IN LPCSTR lpSubKey, IN DWORD ulOptions, IN REGSAM samDesired, OUT PHKEY phkResult, char * file, int line ) { char * keyname = regkey_name(hKey, lpSubKey); LONG rc = RegOpenKeyEx(hKey, lpSubKey, ulOptions, samDesired, phkResult);
if (rc == 0) { regkey_add(keyname, *phkResult, file, line); } regkey_freename(keyname); return rc; }
LONG DbgRegCreateKeyEx( IN HKEY hKey, IN LPCSTR lpSubKey, IN DWORD Reserved, IN LPSTR lpClass, IN DWORD dwOptions, IN REGSAM samDesired, IN LPSECURITY_ATTRIBUTES lpSecurityAttributes, OUT PHKEY phkResult, OUT LPDWORD lpdwDisposition, char * file, int line ) { char * keyname = regkey_name(hKey, lpSubKey); LONG rc = RegCreateKeyEx(hKey, lpSubKey, Reserved, lpClass, dwOptions, samDesired, lpSecurityAttributes, phkResult, lpdwDisposition);
if (rc == 0) { regkey_add(keyname, *phkResult, file, line); } regkey_freename(keyname); return rc; }
LONG DbgRegCloseKey( IN HKEY hKey ) { LONG rc = RegCloseKey(hKey);
if (rc == 0) { regkey_remove(hKey); } return rc; }
#endif // INET_DEBUG
|