/*++ Copyright (c) 1993 Microsoft Corporation Module Name: registry.c Abstract: Registry interface routines for Windows NT Setup API Dll. Author: Ted Miller (tedm) 6-Feb-1995 Revision History: --*/ #include "setupntp.h" #pragma hdrstop // // Private function prototypes. // DWORD QueryMultiSzDevRegPropToArray( IN DEVINST DevInst, IN ULONG CmPropertyCode, OUT PTSTR **StringArray, OUT PUINT StringCount ); DWORD SetArrayToMultiSzDevRegProp( IN DEVINST DevInst, IN ULONG CmPropertyCode, IN PTSTR *StringArray, IN UINT StringCount ); DWORD QueryRegistryValue( IN HKEY KeyHandle, IN PCTSTR ValueName, OUT PTSTR *Value, OUT PDWORD DataType, OUT PDWORD DataSizeBytes ) { LONG l; *DataSizeBytes = 0; l = RegQueryValueEx(KeyHandle,ValueName,NULL,DataType,NULL,DataSizeBytes); if(l != NO_ERROR) { return((DWORD)l); } *Value = MyMalloc(*DataSizeBytes); if(*Value == NULL) { return(ERROR_NOT_ENOUGH_MEMORY); } l = RegQueryValueEx(KeyHandle,ValueName,NULL,DataType,(PVOID)*Value,DataSizeBytes); if(l != NO_ERROR) { MyFree(*Value); } return((DWORD)l); } DWORD QueryMultiSzValueToArray( IN HKEY Root, IN PCTSTR Subkey, IN PCTSTR ValueName, OUT PTSTR **Array, OUT PUINT StringCount, IN BOOL FailIfDoesntExist ) { DWORD d; HKEY hKey; DWORD DataType; DWORD DataSizeBytes; PTSTR Value; DWORD DataSizeChars; INT Count,i; PTSTR *array; PTSTR p; // // Open the subkey // d = RegOpenKeyEx(Root,Subkey,0,KEY_READ,&hKey); if((d != NO_ERROR) && FailIfDoesntExist) { return(d); } if(d != NO_ERROR) { Value = MyMalloc(sizeof(TCHAR)); if(!Value) { return(ERROR_NOT_ENOUGH_MEMORY); } *Value = 0; DataSizeChars = 1; Count = 0; } else { // // Query the value and close the subkey. // If the data is not multisz type, we don't know what to // do with it here. // d = QueryRegistryValue(hKey,ValueName,&Value,&DataType,&DataSizeBytes); RegCloseKey(hKey); if(d != NO_ERROR) { if(FailIfDoesntExist) { return(d); } Value = MyMalloc(sizeof(TCHAR)); if(!Value) { return(ERROR_NOT_ENOUGH_MEMORY); } *Value = 0; DataSizeChars = 1; Count = 0; } else { if(DataType != REG_MULTI_SZ) { MyFree(Value); return(ERROR_INVALID_DATA); } DataSizeChars = DataSizeBytes/sizeof(TCHAR); // // Count strings. The number of strings is equal to the number of nul // characters minus 1. // Count = -1; for(i=0; ((DWORD)i)