294 lines
5.9 KiB
C
294 lines
5.9 KiB
C
/*++
|
|
|
|
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;
|
|
}
|