|
|
//++
//
// Copyright (C) Microsoft Corporation, 1987 - 1999
//
// Module Name:
//
// regutil.c
//
// Abstract:
//
// Queries into network drivers
//
// Author:
//
// Anilth - 4-20-1998
//
// Environment:
//
// User mode only.
// Contains NT-specific code.
//
// Revision History:
//
//--
#include "precomp.h"
#include "ipcfg.h"
//Registry Reading functions, should be able to be replaced by HrReg... standard routines
BOOL ReadRegistryString(HKEY Key, LPCTSTR ParameterName, LPTSTR String, LPDWORD Length) {
LONG err; DWORD valueType;
*String = '\0'; err = RegQueryValueEx(Key, ParameterName, NULL, // reserved
&valueType, (LPBYTE)String, Length );
if (err == ERROR_SUCCESS) {
ASSERT(valueType == REG_SZ || valueType == REG_MULTI_SZ);
DEBUG_PRINT(("ReadRegistryString(%s): val = \"%s\", type = %d, len = %d\n", ParameterName, String, valueType, *Length ));
} else {
DEBUG_PRINT(("ReadRegistryString(%s): err = %d\n", ParameterName, err));
}
return ((err == ERROR_SUCCESS) && (*Length > sizeof('\0'))); }
BOOL ReadRegistryIpAddrString(HKEY Key, LPCTSTR ParameterName, PIP_ADDR_STRING IpAddr) {
LONG err; DWORD valueLength = 0; DWORD valueType; LPBYTE valueBuffer; UINT stringCount; LPTSTR stringPointer; LPTSTR stringAddress[MAX_STRING_LIST_LENGTH + 1]; UINT i; err = RegQueryValueEx(Key, ParameterName, NULL, // reserved
&valueType, NULL, &valueLength ); if ((err == ERROR_SUCCESS)) { if((valueLength > 1) && (valueType == REG_SZ) || (valueLength > 2) && (valueType == REG_MULTI_SZ) ) { valueBuffer = Malloc(valueLength); if( NULL == valueBuffer) { DebugMessage("Out of Memory!"); err = ERROR_NOT_ENOUGH_MEMORY; goto Error; } err = RegQueryValueEx(Key, ParameterName, NULL, // reserved
&valueType, valueBuffer, &valueLength ); if ((err == ERROR_SUCCESS) && (valueLength > 1)) { stringPointer = valueBuffer; DEBUG_PRINT(("ReadRegistryIpAddrString(%s): \"%s\", len = %d\n", ParameterName, valueBuffer, valueLength )); if( REG_SZ == valueType ) { stringPointer += strspn(stringPointer, STRING_ARRAY_DELIMITERS); stringAddress[0] = stringPointer; stringCount = 1; while (stringPointer = strpbrk(stringPointer, STRING_ARRAY_DELIMITERS)) { *stringPointer++ = '\0'; stringPointer += strspn(stringPointer, STRING_ARRAY_DELIMITERS); stringAddress[stringCount] = stringPointer; if (*stringPointer) { ++stringCount; } } for (i = 0; i < stringCount; ++i) { AddIpAddressString(IpAddr, stringAddress[i], ""); } } else if( REG_MULTI_SZ == valueType ) { stringCount = 0; while(strlen(stringPointer)) { AddIpAddressString(IpAddr, stringPointer, ""); stringPointer += 1+strlen(stringPointer); stringCount ++; } if( 0 == stringCount ) err = ERROR_PATH_NOT_FOUND; } else { err = ERROR_PATH_NOT_FOUND; } } else { DEBUG_PRINT(("ReadRegistryIpAddrString(%s): err = %d, len = %d\n", ParameterName, err, valueLength )); err = ERROR_PATH_NOT_FOUND; } Free(valueBuffer); } else { DEBUG_PRINT(("ReadRegistryIpAddrString(%s): err = %d, type = %d, len = %d\n", ParameterName, err, valueType, valueLength )); err = ERROR_PATH_NOT_FOUND; } } Error: return (err == ERROR_SUCCESS); }
BOOL ReadRegistryOemString(HKEY Key, LPWSTR ParameterName, LPTSTR String, LPDWORD Length) {
LONG err; DWORD valueType; DWORD valueLength = 0;
//
// first, get the length of the string
//
*String = '\0'; err = RegQueryValueExW(Key, ParameterName, NULL, // reserved
&valueType, NULL, &valueLength ); if ((err == ERROR_SUCCESS) && (valueType == REG_SZ)) { if ((valueLength <= *Length) && (valueLength > sizeof(L'\0'))) {
UNICODE_STRING unicodeString; OEM_STRING oemString; LPWSTR str = (LPWSTR)Malloc(valueLength);
if(NULL == str) { assert(FALSE); DebugMessage("Out of memory!\n"); err = ERROR_NOT_ENOUGH_MEMORY; goto Error; }
//
// read the UNICODE string into allocated memory
//
err = RegQueryValueExW(Key, ParameterName, NULL, &valueType, (LPBYTE)str, &valueLength ); if (err == ERROR_SUCCESS) {
//
// convert the UNICODE string to OEM character set
//
RtlInitUnicodeString(&unicodeString, str); if ( RtlUnicodeStringToOemString(&oemString, &unicodeString, TRUE) == STATUS_SUCCESS) { if (oemString.Buffer != NULL) { strcpy(String, oemString.Buffer); DEBUG_PRINT(("ReadRegistryOemString(%ws): val = \"%s\", len = %d\n", ParameterName, String, valueLength )); } RtlFreeOemString(&oemString); }
} else {
DEBUG_PRINT(("ReadRegistryOemString(%ws): err = %d, type = %d, len = %d\n", ParameterName, err, valueType, valueLength ));
}
Free(str);
} else { DEBUG_PRINT(("ReadRegistryOemString(%ws): err = %d, type = %d, len = %d\n", ParameterName, err, valueType, valueLength ));
err = !ERROR_SUCCESS; } } else {
DEBUG_PRINT(("ReadRegistryOemString(%ws): err = %d, type = %d, len = %d\n", ParameterName, err, valueType, valueLength ));
err = !ERROR_SUCCESS; } Error:
return (err == ERROR_SUCCESS); }
BOOL ReadRegistryDword(HKEY Key, LPCTSTR ParameterName, LPDWORD Value) {
LONG err; DWORD valueLength; DWORD valueType;
valueLength = sizeof(*Value); err = RegQueryValueEx(Key, ParameterName, NULL, // reserved
&valueType, (LPBYTE)Value, &valueLength ); if ((err == ERROR_SUCCESS) && (valueType == REG_DWORD) && (valueLength == sizeof(DWORD))) {
DEBUG_PRINT(("ReadRegistryDword(%s): val = %d, type = %d, len = %d\n", ParameterName, *Value, valueType, valueLength ));
} else {
DEBUG_PRINT(("ReadRegistryDword(%d,%s): err = %d\n", Key, ParameterName, err));
err = !ERROR_SUCCESS; }
return (err == ERROR_SUCCESS); }
BOOL OpenAdapterKey( const LPTSTR AdapterName, PHKEY Key ) { LONG err; CHAR keyName[MAX_ADAPTER_NAME_LENGTH + sizeof(TCPIP_PARAMS_INTER_KEY)]; HKEY ServicesKey;
if (NULL == AdapterName) { DEBUG_PRINT("No Adapter Name"); return FALSE; }
//
// open the handle to this adapter's TCPIP parameter key
//
strcpy(keyName, TCPIP_PARAMS_INTER_KEY ); strcat(keyName, AdapterName);
err = RegOpenKey(HKEY_LOCAL_MACHINE,SERVICES_KEY,&ServicesKey);
if (err != ERROR_SUCCESS) { DEBUG_PRINT("Opening Services key failed!\n"); return FALSE; }
err = RegOpenKey(ServicesKey, keyName, Key );
if( err != ERROR_SUCCESS ){ DEBUG_PRINT(("OpenAdapterKey: RegOpenKey ServicesKey %s, err=%d\n", keyName, GetLastError() )); }else{ TRACE_PRINT(("Exit OpenAdapterKey: %s ok\n", keyName )); }
return (err == ERROR_SUCCESS); }
|