|
|
/*++
Copyright (c) 1997 Microsoft Corporation
Module Name:
reg.c
Abstract:
This module implements registry functions for the newfsp service provider
--*/
#include "newfsp.h"
BOOL GetNewFspRegistryData( BOOL *bLoggingEnabled, LPWSTR lpszLoggingDirectory, PDEVICE_INFO *pDeviceInfo, LPDWORD pdwNumDevices ) /*++
Routine Description:
Get the registry data for the newfsp service provider
Arguments:
bLoggingEnabled - indicates if logging is enabled lpszLoggingDirectory - indicates the logging directory pDeviceInfo - pointer to the virtual fax devices pdwNumDevice - pointer to the number of virtual fax devices
Return Value:
TRUE on success
--*/ { // hServiceProvidersKey is the handle to the fax service providers registry key
HKEY hServiceProvidersKey; // hNewFspKey is the handle to the newfsp service provider registry key
HKEY hNewFspKey; // hDevicesKey is the handle to the virtual fax devices registry key
HKEY hDevicesKey; // dwSubkeys is the number of virtual fax device registry subkeys
DWORD dwSubkeys; // dwIndex is a counter to enumerate each virtual fax device registry subkey
DWORD dwIndex; // szDeviceSubkey is the name of a virtual fax device registry subkey
WCHAR szDeviceSubkey[MAX_PATH]; // hDeviceSubkey is the handle to a virtual fax device registry subkey
HKEY hDeviceSubkey; DWORD dwType;
// pCurrentDeviceInfo is a pointer to the current virtual fax device
PDEVICE_INFO pCurrentDeviceInfo;
DWORD dwLoggingEnabledSize; DWORD dwLoggingDirectorySize; DWORD dwDirectorySize;
if (bLoggingEnabled != NULL) { *bLoggingEnabled = FALSE; }
if (lpszLoggingDirectory != NULL) { ZeroMemory(lpszLoggingDirectory, sizeof(WCHAR) * MAX_PATH_LEN); }
if (pDeviceInfo != NULL) { *pDeviceInfo = NULL; }
if (pdwNumDevices != NULL) { *pdwNumDevices = 0; }
// Open the fax service providers registry key
if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, FAX_PROVIDERS_REGKEY, 0, KEY_ALL_ACCESS, &hServiceProvidersKey) != ERROR_SUCCESS) { return FALSE; }
// Open the newfsp service provider registry key
if (RegOpenKeyEx(hServiceProvidersKey, NEWFSP_PROVIDER, 0, KEY_ALL_ACCESS, &hNewFspKey) != ERROR_SUCCESS) { RegCloseKey(hServiceProvidersKey); return FALSE; }
if (bLoggingEnabled != NULL) { // Get the logging enabled
dwLoggingEnabledSize = sizeof(BOOL); RegQueryValueEx(hNewFspKey, NEWFSP_LOGGING_ENABLED, NULL, &dwType, (LPBYTE) bLoggingEnabled, &dwLoggingEnabledSize); }
if (lpszLoggingDirectory != NULL) { // Get the logging directory
dwLoggingDirectorySize = sizeof(WCHAR) * MAX_PATH_LEN; RegQueryValueEx(hNewFspKey, NEWFSP_LOGGING_DIRECTORY, NULL, &dwType, (LPBYTE) lpszLoggingDirectory, &dwLoggingDirectorySize); }
if ((pDeviceInfo != NULL) || (pdwNumDevices != NULL)) { // Open the virtual fax devices registry key
if (RegOpenKeyEx(hNewFspKey, NEWFSP_DEVICES, 0, KEY_ALL_ACCESS, &hDevicesKey) != ERROR_SUCCESS) { RegCloseKey(hNewFspKey); RegCloseKey(hServiceProvidersKey); return FALSE; }
// Determine the number of virtual fax device registry subkeys
if (RegQueryInfoKey(hDevicesKey, NULL, NULL, NULL, &dwSubkeys, NULL, NULL, NULL, NULL, NULL, NULL, NULL) != ERROR_SUCCESS) { RegCloseKey(hDevicesKey); RegCloseKey(hNewFspKey); RegCloseKey(hServiceProvidersKey); return FALSE; } }
if (pdwNumDevices != NULL) { if (dwSubkeys < NEWFSP_DEVICE_LIMIT) { *pdwNumDevices = dwSubkeys; } else { *pdwNumDevices = NEWFSP_DEVICE_LIMIT; } }
if (pDeviceInfo != NULL) { if (dwSubkeys > 0) { // Allocate a block of memory for the first virtual fax device data
*pDeviceInfo = MemAllocMacro(sizeof(DEVICE_INFO)); }
// Enumerate the virtual fax device registry subkeys
for (pCurrentDeviceInfo = *pDeviceInfo, dwIndex = 0; (dwIndex < dwSubkeys) && (dwIndex < NEWFSP_DEVICE_LIMIT); pCurrentDeviceInfo = pCurrentDeviceInfo->pNextDeviceInfo, dwIndex++) { if (pCurrentDeviceInfo == NULL) { // A memory allocation for virtual fax device data failed, so go with what we have so far
*pdwNumDevices = dwIndex;
break; }
// Set the name of the virtual fax device registry subkey
wsprintf(szDeviceSubkey, L"%d", dwIndex); // Set the identifier of the virtual fax device
pCurrentDeviceInfo->DeviceId = dwIndex;
if (RegOpenKeyEx(hDevicesKey, szDeviceSubkey, 0, KEY_ALL_ACCESS, &hDeviceSubkey) == ERROR_SUCCESS) { // Get the incoming fax directory for the virtual fax device
dwDirectorySize = sizeof(WCHAR) * MAX_PATH_LEN; RegQueryValueEx(hDeviceSubkey, NEWFSP_DEVICE_DIRECTORY, NULL, &dwType, (LPBYTE) pCurrentDeviceInfo->Directory, &dwDirectorySize);
RegCloseKey(hDeviceSubkey); }
// Allocate a block of memory for the next virtual fax device data
if ((dwIndex < (dwSubkeys - 1)) && (dwIndex < (NEWFSP_DEVICE_LIMIT - 1))) { pCurrentDeviceInfo->pNextDeviceInfo = MemAllocMacro(sizeof(DEVICE_INFO)); } else { pCurrentDeviceInfo->pNextDeviceInfo = NULL; } } }
if ((pDeviceInfo != NULL) || (pdwNumDevices != NULL)) { RegCloseKey(hDevicesKey); }
RegCloseKey(hNewFspKey); RegCloseKey(hServiceProvidersKey);
return TRUE; }
VOID SetNewFspRegistryData( BOOL bLoggingEnabled, LPWSTR lpszLoggingDirectory, PDEVICE_INFO pDeviceInfo ) /*++
Routine Description:
Set the registry data for the newfsp service provider
Arguments:
bLoggingEnabled - indicates if logging is enabled lpszLoggingDirectory - indicates the logging directory pDeviceInfo - pointer to the virtual fax devices
Return Value:
None
--*/ { // hServiceProvidersKey is the handle to the fax service providers registry key
HKEY hServiceProvidersKey; // hNewFspKey is the handle to the newfsp service provider registry key
HKEY hNewFspKey; // hDevicesKey is the handle to the virtual fax devices registry key
HKEY hDevicesKey; // dwSubkeys is the number of virtual fax device registry subkeys
DWORD dwSubkeys; // dwIndex is a counter to enumerate each virtual fax device registry subkey
DWORD dwIndex; // szDeviceSubkey is the name of a virtual fax device registry subkey
WCHAR szDeviceSubkey[MAX_PATH]; // hDeviceSubkey is the handle to a virtual fax device registry subkey
HKEY hDeviceSubkey; DWORD dwDisposition;
// pCurrentDeviceInfo is a pointer to the current virtual fax device
PDEVICE_INFO pCurrentDeviceInfo;
// Open the fax service providers registry key
if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, FAX_PROVIDERS_REGKEY, 0, KEY_ALL_ACCESS, &hServiceProvidersKey) != ERROR_SUCCESS) { return; }
// Open the newfsp service provider registry key
if (RegCreateKeyEx(hServiceProvidersKey, NEWFSP_PROVIDER, 0, NULL, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &hNewFspKey, &dwDisposition) != ERROR_SUCCESS) { RegCloseKey(hServiceProvidersKey); return; }
// Set the logging enabled
RegSetValueEx(hNewFspKey, NEWFSP_LOGGING_ENABLED, 0, REG_DWORD, (LPBYTE) &bLoggingEnabled, sizeof(bLoggingEnabled));
// Set the logging directory
if (lpszLoggingDirectory != NULL) { RegSetValueEx(hNewFspKey, NEWFSP_LOGGING_DIRECTORY, 0, REG_SZ, (LPBYTE) lpszLoggingDirectory, (lstrlen(lpszLoggingDirectory) + 1) * sizeof(WCHAR)); }
// Open the virtual fax devices registry key
if (RegCreateKeyEx(hNewFspKey, NEWFSP_DEVICES, 0, NULL, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &hDevicesKey, &dwDisposition) != ERROR_SUCCESS) { RegCloseKey(hNewFspKey); RegCloseKey(hServiceProvidersKey); return; }
// Determine the number of virtual fax device registry subkeys
if (RegQueryInfoKey(hDevicesKey, NULL, NULL, NULL, &dwSubkeys, NULL, NULL, NULL, NULL, NULL, NULL, NULL) != ERROR_SUCCESS) { RegCloseKey(hDevicesKey); RegCloseKey(hNewFspKey); RegCloseKey(hServiceProvidersKey); return; }
// Enumerate the virtual fax device registry subkeys
for (pCurrentDeviceInfo = pDeviceInfo, dwIndex = 0; pCurrentDeviceInfo; pCurrentDeviceInfo = pCurrentDeviceInfo->pNextDeviceInfo, dwIndex++) { // Set the name of the virtual fax device registry subkey
wsprintf(szDeviceSubkey, L"%d", pCurrentDeviceInfo->DeviceId); if (RegCreateKeyEx(hDevicesKey, szDeviceSubkey, 0, NULL, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &hDeviceSubkey, &dwDisposition) == ERROR_SUCCESS) { // Set the incoming fax directory for the virtual fax device
RegSetValueEx(hDeviceSubkey, NEWFSP_DEVICE_DIRECTORY, 0, REG_SZ, (LPBYTE) pCurrentDeviceInfo->Directory, (lstrlen(pCurrentDeviceInfo->Directory) + 1) * sizeof(WCHAR));
RegCloseKey(hDeviceSubkey); } }
// Delete any removed virtual fax device registry subkeys
for ( ; dwIndex < dwSubkeys; dwIndex++) { // Set the name of the virtual fax device registry subkey
wsprintf(szDeviceSubkey, L"%d", dwIndex); RegDeleteKey(hDevicesKey, szDeviceSubkey); }
RegCloseKey(hDevicesKey); RegCloseKey(hNewFspKey); RegCloseKey(hServiceProvidersKey); }
|