windows-nt/Source/XPSP1/NT/printscan/fax/samples/newfsp/reg.c
2020-09-26 16:20:57 +08:00

280 lines
9.7 KiB
C

/*++
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);
}