/*++ Copyright (c) 1996 Microsoft Corporation Module Name: registry.c Abstract: Functions for accessing registry information under: HKEY_CURRENT_USER and HKEY_LOCAL_MACHINE Environment: Windows NT fax driver user interface Revision History: 01/29/96 -davidx- Created it. mm/dd/yy -author- description --*/ #include "faxlib.h" #include "registry.h" LPTSTR GetRegistryExpandStr( HKEY hRootKey, LPTSTR pKeyName, LPTSTR pValueName ) /*++ Routine Description: Get a EXPAND_SZ value from the registry Arguments: hRootKey - Specifies a handle to the root registry key pKeyName - Specifies the name of the sub registry key pValueName - Specifies the name of the registry value Return Value: Pointer to an expanded string, NULL if there is an error --*/ { DWORD size, type; LONG status; HKEY hRegKey; LPTSTR pRegStr = NULL, pExpandedStr; // // Get a handle to the user info registry key // if (! (hRegKey = OpenRegistryKey(hRootKey, pKeyName, FALSE, REG_READONLY))) return NULL; // // Figure out how much memory to allocate // size = 0; status = RegQueryValueEx(hRegKey, pValueName, NULL, &type, NULL, &size); if ((status == ERROR_SUCCESS) && (type == REG_EXPAND_SZ || type == REG_SZ) && (pRegStr = MemAlloc(size))) { // // Read the registry value // status = RegQueryValueEx(hRegKey, pValueName, NULL, NULL, (PBYTE) pRegStr, &size); if (status != ERROR_SUCCESS || IsEmptyString(pRegStr)) { MemFree(pRegStr); pRegStr = NULL; } else if (type == REG_EXPAND_SZ) { // // Substitute any environment variables // if ((size = ExpandEnvironmentStrings(pRegStr, NULL, 0)) == 0 || (pExpandedStr = MemAlloc(sizeof(TCHAR) * size)) == NULL) { MemFree(pRegStr); pRegStr = NULL; } else { if (ExpandEnvironmentStrings(pRegStr, pExpandedStr, size) == 0) *pExpandedStr = NUL; MemFree(pRegStr); pRegStr = pExpandedStr; } } } RegCloseKey(hRegKey); return pRegStr; } PDEVMODE GetPerUserDevmode( LPTSTR pPrinterName ) /*++ Routine Description: Get per-user devmode information for the specified printer Arguments: pPrinterName - Specifies the name of the printer we're interested in Return Value: Pointer to per-user devmode information read from the registry --*/ { PVOID pDevmode = NULL; HANDLE hPrinter; PPRINTER_INFO_9 pPrinterInfo; TCHAR PrinterBuffer[64]; // // Make sure the printer name is valid // if (pPrinterName == NULL) { _tcscpy(PrinterBuffer,L"Fax"); } else { _tcscpy(PrinterBuffer,pPrinterName); } // // Open the printer // if (!OpenPrinter(PrinterBuffer,&hPrinter,NULL) ) { return NULL; } pPrinterInfo = MyGetPrinter(hPrinter,9); if (!pPrinterInfo || !pPrinterInfo->pDevMode) { ClosePrinter(hPrinter); return NULL; } pDevmode = MemAlloc(sizeof(DRVDEVMODE) ); if (!pDevmode) { MemFree(pPrinterInfo); ClosePrinter(hPrinter); return NULL; } CopyMemory((PVOID) pDevmode, (PVOID) pPrinterInfo->pDevMode, sizeof(DRVDEVMODE) ); MemFree( pPrinterInfo ); ClosePrinter( hPrinter ); return pDevmode; } VOID SavePerUserDevmode( LPTSTR pPrinterName, PDEVMODE pDevmode ) /*++ Routine Description: Save per-user devmode information for the specified printer Arguments: pPrinterName - Specifies the name of the printer we're interested in pDevmode - Points to the devmode to be saved Return Value: NONE --*/ { HKEY hRegKey; INT size; // // Make sure the printer name is valid // if (pPrinterName == NULL) { Error(("Bad printer name\n")); return; } // // Open the registry key for write access // if (! (hRegKey = GetUserInfoRegKey(REGKEY_FAX_DEVMODE, REG_READWRITE))) return; // // Save the devmode information as binary data // size = pDevmode->dmSize + pDevmode->dmDriverExtra; RegSetValueEx(hRegKey, pPrinterName, 0, REG_BINARY, (PBYTE) pDevmode, size); RegCloseKey(hRegKey); } LPTSTR GetUserCoverPageDir( VOID ) { LPTSTR CpDirTmp = NULL; LPTSTR CpDir = MemAlloc(MAX_PATH*sizeof(TCHAR)); SHGetSpecialFolderPath(NULL, CpDir , CSIDL_PERSONAL, FALSE); CpDirTmp = GetRegistryExpandStr(HKEY_CURRENT_USER, REGKEY_FAX_SETUP, REGVAL_CP_LOCATION); if (CpDirTmp == NULL) { HKEY hKey = OpenRegistryKey(HKEY_CURRENT_USER,REGKEY_FAX_SETUP,FALSE, REG_READONLY); if (hKey) { SetRegistryStringExpand(hKey,REGVAL_CP_LOCATION,DEFAULT_COVERPAGE_DIR); RegCloseKey(hKey); CpDirTmp = GetRegistryExpandStr(HKEY_CURRENT_USER, REGKEY_FAX_SETUP, REGVAL_CP_LOCATION); } } if (CpDir && CpDirTmp) { _tcscat( CpDir, TEXT("\\") ); _tcscat( CpDir, CpDirTmp ); } if (CpDirTmp) { MemFree(CpDirTmp); } return CpDir; } LPTSTR GetCoverPageEditor( VOID ) { LPTSTR CpEd = GetRegistryStringExpand(HKEY_CURRENT_USER, REGKEY_FAX_SETUP, REGVAL_CP_EDITOR); if (CpEd == NULL) { HKEY hKey = OpenRegistryKey(HKEY_CURRENT_USER,REGKEY_FAX_SETUP,FALSE, REG_READWRITE); if (hKey) { SetRegistryStringExpand(hKey,REGVAL_CP_EDITOR,DEFAULT_COVERPAGE_EDITOR); RegCloseKey(hKey); return GetRegistryExpandStr(HKEY_CURRENT_USER, REGKEY_FAX_SETUP, REGVAL_CP_EDITOR); } } return CpEd; }