windows-nt/Source/XPSP1/NT/printscan/fax/setup/wizdll/printer.c

1045 lines
25 KiB
C
Raw Normal View History

2020-09-26 03:20:57 -05:00
/*++
Copyright (c) 1996 Microsoft Corporation
Module Name:
printer.c
Abstract:
This file implements the printer/spooler code.
Environment:
WIN32 User Mode
Author:
Wesley Witt (wesw) 17-Feb-1996
--*/
#include "wizard.h"
#pragma hdrstop
TCHAR Environment[MAX_PATH];
TCHAR DataFile[MAX_PATH];
TCHAR ConfigFile[MAX_PATH];
TCHAR DriverFile[MAX_PATH];
TCHAR MonitorFile[MAX_PATH];
TCHAR PrinterName[MAX_PATH];
TCHAR DriverDirectory[MAX_PATH];
DRIVER_INFO_2 DriverInfo =
{
2, // cVersion
FAX_DRIVER_NAME, // pName
Environment, // pEnvironment
DriverFile, // pDriverPath
DataFile, // pDataFile
ConfigFile // pConfigFile
};
PRINTER_INFO_2 PrinterInfo =
{
NULL, // pServerName
PrinterName, // pPrinterName
NULL, // pShareName
NULL, // pPortName
FAX_DRIVER_NAME, // pDriverName
NULL, // pComment
NULL, // pLocation
NULL, // pDevMode
NULL, // pSepFile
TEXT("winprint"), // pPrintProcessor
TEXT("RAW"), // pDatatype
NULL, // pParameters
NULL, // pSecurityDescriptor
0, // Attributes
0, // Priority
0, // DefaultPriority
0, // StartTime
0, // UntilTime
0, // Status
0, // cJobs
0 // AveragePPM
};
MONITOR_INFO_2 MonitorInfo =
{
FAX_MONITOR_NAME, // pName
Environment, // pEnvironment
MonitorFile // pDLLName
};
BOOL
AddPrinterDrivers(
VOID
)
{
DWORD i;
DWORD BytesNeeded;
for (i=0; i<MAX_PLATFORMS; i++) {
if (!Platforms[i].Selected) {
continue;
}
_tcscpy( Environment, Platforms[i].PrintPlatform );
if (!GetPrinterDriverDirectory(
NULL,
Environment,
1,
(LPBYTE) DriverDirectory,
sizeof(DriverDirectory),
&BytesNeeded
)) {
DebugPrint(( TEXT("GetPrinterDriverDirectory() failed, ec=%d"), GetLastError() ));
return FALSE;
}
//
// form the file names
//
_tcscpy( DriverFile, DriverDirectory );
_tcscat( DriverFile, TEXT("\\faxdrv.dll") );
_tcscpy( DataFile, DriverDirectory );
_tcscat( DataFile, TEXT("\\faxwiz.dll") );
_tcscpy( ConfigFile, DriverDirectory );
_tcscat( ConfigFile, TEXT("\\faxui.dll") );
if ((!AddPrinterDriver( NULL, 2, (LPBYTE) &DriverInfo )) &&
(GetLastError() != ERROR_PRINTER_DRIVER_ALREADY_INSTALLED)) {
DebugPrint(( TEXT("AddPrinterDriver() failed, ec=%d"), GetLastError() ));
return FALSE;
}
}
return TRUE;
}
BOOL
SetDefaultPrinter(
LPTSTR PrinterName,
BOOL OverwriteDefaultPrinter
)
{
HKEY hKey;
LPTSTR PrinterInfo;
LPTSTR DefaultPrinter;
BOOL Rslt;
if (!OverwriteDefaultPrinter) {
//
// check to see if there is a printer
// marked as the default ptinter
//
hKey = OpenRegistryKey(
HKEY_CURRENT_USER,
TEXT("Software\\Microsoft\\Windows NT\\CurrentVersion\\Windows"),
FALSE,
KEY_READ
);
if (hKey == NULL) {
return FALSE;
}
DefaultPrinter = GetRegistryString( hKey, TEXT("Device"), EMPTY_STRING );
RegCloseKey( hKey );
if (DefaultPrinter && DefaultPrinter[0]) {
MemFree( DefaultPrinter );
return FALSE;
}
//
// ok, there is not a default printer
// and we can proceed
//
MemFree( DefaultPrinter );
}
//
// get the printer information for the requested printer
//
hKey = OpenRegistryKey(
HKEY_CURRENT_USER,
TEXT("Software\\Microsoft\\Windows NT\\CurrentVersion\\Devices"),
FALSE,
KEY_READ
);
if (hKey == NULL) {
return FALSE;
}
PrinterInfo = GetRegistryString( hKey, PrinterName, EMPTY_STRING );
RegCloseKey( hKey );
if (PrinterInfo == NULL || PrinterInfo[0] == 0) {
MemFree( PrinterInfo );
return FALSE;
}
DefaultPrinter = MemAlloc( (_tcslen(PrinterName) + _tcslen(PrinterInfo) + 16) * sizeof(TCHAR) );
if (!DefaultPrinter) {
MemFree( PrinterInfo );
return FALSE;
}
_tcscpy( DefaultPrinter, PrinterName );
_tcscat( DefaultPrinter, TEXT(",") );
_tcscat( DefaultPrinter, PrinterInfo );
MemFree( PrinterInfo );
hKey = OpenRegistryKey(
HKEY_CURRENT_USER,
TEXT("Software\\Microsoft\\Windows NT\\CurrentVersion\\Windows"),
FALSE,
KEY_ALL_ACCESS
);
if (hKey == NULL) {
MemFree( DefaultPrinter );
return FALSE;
}
Rslt = SetRegistryString( hKey, TEXT("Device"), DefaultPrinter );
RegCloseKey( hKey );
MemFree( DefaultPrinter );
return Rslt;
}
BOOL
CreateServerFaxPrinter(
HWND hwnd,
LPTSTR FaxPrinterName
)
{
HANDLE hPrinter;
SYSTEM_INFO SystemInfo;
DWORD BytesNeeded;
DWORD PortCount;
PORT_INFO_2 *PortInfo = NULL;
DWORD i;
LPTSTR PortNames = NULL;
LPTSTR p;
PRINTER_DEFAULTS PrinterDefaults;
//
// set the printer name
//
_tcscpy( PrinterName, FaxPrinterName );
//
// add the fax port monitor
// the fax ports that the fax monitor presents
// to the spooler are dynamic. they are ctreated
// at the time the monitor initializes. the ports
// are created based on data that the monitor
// gets from the fax service when it calls FaxEnumPorts().
//
GetSystemInfo( &SystemInfo );
if ( (SystemInfo.wProcessorArchitecture > 3) || (EnumPlatforms[SystemInfo.wProcessorArchitecture] == WRONG_PLATFORM ) ) {
return FALSE;
}
_tcscpy( Environment, Platforms[ EnumPlatforms[SystemInfo.wProcessorArchitecture] ].PrintPlatform );
_tcscpy( MonitorFile, TEXT("faxmon.dll") );
if ((!AddMonitor( NULL, 2, (LPBYTE) &MonitorInfo )) &&
(GetLastError() != ERROR_PRINT_MONITOR_ALREADY_INSTALLED)) {
DebugPrint(( TEXT("AddMonitor() failed, ec=%d"), GetLastError() ));
return FALSE;
}
//
// enumerate the ports so we can isolate the fax ports
//
if ((!EnumPorts( NULL, 2, NULL, 0, &BytesNeeded, &PortCount )) && (GetLastError() == ERROR_INSUFFICIENT_BUFFER)) {
PortInfo = (PORT_INFO_2 *) MemAlloc( BytesNeeded );
if (PortInfo) {
if (EnumPorts( NULL, 2, (LPBYTE)PortInfo, BytesNeeded, &BytesNeeded, &PortCount )) {
for (BytesNeeded=0,i=0; i<PortCount; i++) {
if (PortInfo[i].pMonitorName && (_tcscmp( PortInfo[i].pMonitorName, FAX_MONITOR_NAME ) == 0)) {
BytesNeeded += _tcslen( PortInfo[i].pPortName ) + 4;
}
}
if (!BytesNeeded) {
//
// there are no fax ports available
//
DebugPrint(( TEXT("There are no FAX ports available") ));
return FALSE;
}
PortNames = (LPTSTR) MemAlloc( (BytesNeeded + 16) * sizeof(TCHAR) );
if (PortNames) {
p = PortNames;
for (p=PortNames,i=0; i<PortCount; i++) {
if (PortInfo[i].pMonitorName && (_tcscmp( PortInfo[i].pMonitorName, FAX_MONITOR_NAME ) == 0)) {
_tcscpy( p, PortInfo[i].pPortName );
_tcscat( p, TEXT(",") );
p += _tcslen( p );
}
}
*(p-1) = 0;
PrinterInfo.pPortName = PortNames;
}
}
}
}
if (!PrinterInfo.pPortName) {
//
// there are no fax ports available
//
DebugPrint(( TEXT("There are no FAX ports available") ));
return FALSE;
}
if (!AddPrinterDrivers()) {
return FALSE;
}
//
// add the printer, open it if it already exists
//
hPrinter = AddPrinter( NULL, 2, (LPBYTE) &PrinterInfo );
if (!hPrinter) {
if (GetLastError() == ERROR_PRINTER_ALREADY_EXISTS) {
PrinterDefaults.pDatatype = NULL;
PrinterDefaults.pDevMode = NULL;
PrinterDefaults.DesiredAccess = PRINTER_ALL_ACCESS;
if (!OpenPrinter( FaxPrinterName, &hPrinter, &PrinterDefaults )) {
DebugPrint(( TEXT("OpenPrinter() failed, ec=%d"), GetLastError() ));
return FALSE;
}
} else {
DebugPrint(( TEXT("AddPrinter() failed, ec=%d"), GetLastError() ));
return FALSE;
}
}
//
// share the printer
//
if (!ShareFaxPrinter( &hPrinter, FaxPrinterName )) {
DebugPrint(( TEXT("ShareFaxPrinter() failed") ));
if (!NtGuiMode) {
PopUpMsg( hwnd, IDS_SHARE_FAX_PRINTER, FALSE, 0 );
}
}
//
// make the fax printer the default printer, if it is the only printer
//
SetDefaultPrinter( FaxPrinterName, FALSE );
//
// set the bit that allow status strings to display correctly
//
i = 1;
i = SetPrinterData(
hPrinter,
SPLREG_UI_SINGLE_STATUS,
REG_DWORD,
(LPBYTE) &i,
sizeof(DWORD)
);
if ((i != ERROR_SUCCESS) && (i != ERROR_SUCCESS_RESTART_REQUIRED)) {
DebugPrint(( TEXT("SetPrinterData() failed, ec=%d"), i ));
return FALSE;
}
//
// release resources and leave...
//
MemFree( PortNames );
MemFree( PortInfo );
ClosePrinter( hPrinter );
return TRUE;
}
DWORD
CreateClientFaxPrinter(
HWND hwnd,
LPTSTR FaxPrinterName
)
{
DWORD ec = ERROR_SUCCESS;
SYSTEM_INFO SystemInfo;
DWORD i;
GetSystemInfo( &SystemInfo );
if ((SystemInfo.wProcessorArchitecture > 3) || (EnumPlatforms[SystemInfo.wProcessorArchitecture] == WRONG_PLATFORM)) {
return ERROR_INVALID_FUNCTION;
}
_tcscpy( Environment, Platforms[ EnumPlatforms[SystemInfo.wProcessorArchitecture] ].PrintPlatform );
if (!GetPrinterDriverDirectory(
NULL,
Environment,
1,
(LPBYTE) DriverDirectory,
sizeof(DriverDirectory),
&i
)) {
ec = GetLastError();
DebugPrint(( TEXT("GetPrinterDriverDirectory() failed, ec=%d"), ec ));
return ec;
}
//
// form the file names
//
_tcscpy( DriverFile, DriverDirectory );
_tcscat( DriverFile, TEXT("\\faxdrv.dll") );
_tcscpy( DataFile, DriverDirectory );
_tcscat( DataFile, TEXT("\\faxwiz.dll") );
_tcscpy( ConfigFile, DriverDirectory );
_tcscat( ConfigFile, TEXT("\\faxui.dll") );
if ((!AddPrinterDriver( NULL, 2, (LPBYTE) &DriverInfo )) &&
(GetLastError() != ERROR_PRINTER_DRIVER_ALREADY_INSTALLED)) {
ec = GetLastError();
DebugPrint(( TEXT("AddPrinterDriver() failed, ec=%d"), GetLastError() ));
return ec;
}
//
// add the printer
//
add_printer_connection:
if (!AddPrinterConnection( FaxPrinterName )) {
i = GetLastError();
if (i == ERROR_INVALID_PRINTER_NAME) {
int DlgErr = DialogBoxParam(
FaxWizModuleHandle,
MAKEINTRESOURCE(IDD_PRINTER_NAME),
hwnd,
PrinterNameDlgProc,
(LPARAM) FaxPrinterName
);
if (DlgErr == -1 || DlgErr == 0) {
DebugPrint(( TEXT("PrinterNameDlgProc() failed or was cancelled") ));
return ERROR_INVALID_FUNCTION;
}
if (!AddPrinterConnection( FaxPrinterName )) {
DebugPrint(( TEXT("AddPrinterConnection() failed, ec=%d"), i ));
goto add_printer_connection;
}
} else {
DebugPrint(( TEXT("AddPrinterConnection() failed, ec=%d"), i ));
return i;
}
}
//
// make the fax printer the default printer, if it is the only printer
//
SetDefaultPrinter( FaxPrinterName, FALSE);
return ERROR_SUCCESS;
}
BOOL
IsPrinterFaxPrinter(
LPTSTR PrinterName
)
{
HANDLE hPrinter = NULL;
PRINTER_DEFAULTS PrinterDefaults;
SYSTEM_INFO SystemInfo;
DWORD Size;
DWORD Rval = FALSE;
LPDRIVER_INFO_2 DriverInfo = NULL;
PrinterDefaults.pDatatype = NULL;
PrinterDefaults.pDevMode = NULL;
PrinterDefaults.DesiredAccess = PRINTER_READ;
if (!OpenPrinter( PrinterName, &hPrinter, &PrinterDefaults )) {
DebugPrint(( TEXT("OpenPrinter() failed, ec=%d"), GetLastError() ));
return FALSE;
}
GetSystemInfo( &SystemInfo );
Size = 4096;
DriverInfo = (LPDRIVER_INFO_2) MemAlloc( Size );
if (!DriverInfo) {
DebugPrint(( TEXT("Memory allocation failed, size=%d"), Size ));
goto exit;
}
if ( (SystemInfo.wProcessorArchitecture > 3) || (EnumPlatforms[SystemInfo.wProcessorArchitecture] == WRONG_PLATFORM ) ) {
return FALSE;
}
Rval = GetPrinterDriver(
hPrinter,
Platforms[ EnumPlatforms[SystemInfo.wProcessorArchitecture] ].PrintPlatform,
2,
(LPBYTE) DriverInfo,
Size,
&Size
);
if (!Rval) {
DebugPrint(( TEXT("GetPrinterDriver() failed, ec=%d"), GetLastError() ));
goto exit;
}
if (_tcscmp( DriverInfo->pName, FAX_DRIVER_NAME ) == 0) {
Rval = TRUE;
} else {
Rval = FALSE;
}
exit:
MemFree( DriverInfo );
ClosePrinter( hPrinter );
return Rval;
}
LPTSTR
MakePrinterShareName(
LPTSTR pServerName,
LPTSTR pPrinterName
)
/*++
Routine Description:
Given a server name and a printer name, generate a unique share name.
Arguments:
pServerName - Specifies the server name, NULL for local host
pPrinterName - Specifies the printer name
Return Value:
Pointer to the generated share name, NULL if there is an error
--*/
{
static TCHAR illegalDosChars[] = TEXT( " *?/\\|,;:+=<>[]\"" );
TCHAR shareName[16];
INT cch, shareSuffix;
DWORD dwFlags, cPrinters, index;
LPTSTR pDest, pShareName;
PPRINTER_INFO_2 pPrinterInfo2;
//
// Copy up to the first 8 characters of the printer name
//
ZeroMemory( shareName, sizeof(shareName) );
pDest = shareName;
cch = 0;
while (cch < 8 && *pPrinterName) {
//
// Skip invalid DOS filename characters
//
if (!_tcschr( illegalDosChars, *pPrinterName )) {
*pDest++ = *pPrinterName;
cch++;
}
pPrinterName++;
}
//
// If the share name is empty, start with a default.
// This should very rarely happen.
//
if (cch == 0) {
_tcscpy( shareName, GetString( IDS_DEFAULT_SHARE ) );
pDest += _tcslen(pDest);
}
//
// Get the list of shared printers on the server.
// Be aware that share names returned by EnumPrinters
// may be in the form of \\servername\sharename.
//
dwFlags = PRINTER_ENUM_SHARED | (pServerName ? PRINTER_ENUM_NAME : PRINTER_ENUM_LOCAL);
if (! (pPrinterInfo2 = MyEnumPrinters( pServerName, 2, &cPrinters, dwFlags ))) {
cPrinters = 0;
}
for (index = 0; index < cPrinters; index++) {
if (pPrinterInfo2[index].pShareName &&
(pShareName = _tcsrchr(pPrinterInfo2[index].pShareName, TEXT('\\')))) {
pPrinterInfo2[index].pShareName = pShareName + 1;
}
}
//
// Make sure the share name is unique. If not, add a numeric suffix to it.
//
for (shareSuffix = 0; shareSuffix < 1000; shareSuffix++) {
if (shareSuffix > 0) {
*pDest = TEXT('.');
wsprintf( pDest + 1, TEXT("%d"), shareSuffix );
}
//
// Check if the proposed share name matches any of the existing share names.
//
for (index = 0; index < cPrinters; index++) {
if (pPrinterInfo2[index].pShareName &&
_tcsicmp(pPrinterInfo2[index].pShareName, shareName) == 0) {
break;
}
}
//
// Stop searching when we find a unique share name.
//
if (index >= cPrinters) {
break;
}
}
MemFree( pPrinterInfo2 );
return (shareSuffix < 1000) ? StringDup( shareName ) : NULL;
}
BOOL
ShareFaxPrinter(
LPHANDLE hPrinter,
LPTSTR FaxPrinterName
)
{
DWORD i;
DWORD Size;
TCHAR String[4];
HANDLE hPrinterServer;
LPPRINTER_INFO_2 PrinterInfo = NULL;
PRINTER_DEFAULTS PrinterDefaults;
BOOL Rval = FALSE;
LPTSTR ShareName;
ShareName = MakePrinterShareName( NULL, FaxPrinterName );
if (!ShareName) {
return FALSE;
}
if ((!GetPrinter( *hPrinter, 2, NULL, 0, &i )) && (GetLastError() != ERROR_INSUFFICIENT_BUFFER)) {
DebugPrint(( TEXT("GetPrinter() failed, ec=%d"), GetLastError() ));
goto exit;
}
PrinterInfo = (LPPRINTER_INFO_2) MemAlloc( i );
if (!PrinterInfo) {
DebugPrint(( TEXT("MemAlloc() failed, size=%d"), i ));
goto exit;
}
if (!GetPrinter( *hPrinter, 2, (LPBYTE) PrinterInfo, i, &i )) {
DebugPrint(( TEXT("GetPrinter() failed, ec=%d"), GetLastError() ));
goto exit;
}
PrinterInfo->pShareName = ShareName;
PrinterInfo->Attributes |= PRINTER_ATTRIBUTE_SHARED;
PrinterInfo->pComment = GetString( IDS_FAX_SHARE_COMMENT );
if (!SetPrinter( *hPrinter, 2, (LPBYTE) PrinterInfo, 0 )) {
DebugPrint(( TEXT("SetPrinter() failed, ec=%d"), GetLastError() ));
goto exit;
}
//
// allow the printer to have remote connections
//
PrinterDefaults.pDatatype = NULL;
PrinterDefaults.pDevMode = NULL;
PrinterDefaults.DesiredAccess = SERVER_ACCESS_ADMINISTER;
if (!OpenPrinter( NULL, &hPrinterServer, &PrinterDefaults )) {
DebugPrint(( TEXT("OpenPrinter() failed, ec=%d"), GetLastError() ));
goto exit;
}
//
// remove the fax driver from the list of driver names
//
String[0] = 0;
Size = sizeof(TCHAR);
i = SetPrinterData(
hPrinterServer,
SPLREG_NO_REMOTE_PRINTER_DRIVERS,
REG_SZ,
(LPBYTE) String,
Size
);
if ((i != ERROR_SUCCESS) && (i != ERROR_SUCCESS_RESTART_REQUIRED)) {
DebugPrint(( TEXT("SetPrinterData() failed, ec=%d"), i ));
goto exit;
}
//
// we have to restart the spooler for the
// SetPrinterData() to take affect
//
ClosePrinter( *hPrinter );
PrinterDefaults.pDatatype = NULL;
PrinterDefaults.pDevMode = NULL;
PrinterDefaults.DesiredAccess = PRINTER_ALL_ACCESS;
if (!OpenPrinter( FaxPrinterName, hPrinter, &PrinterDefaults )) {
DebugPrint(( TEXT("OpenPrinter() failed, ec=%d"), GetLastError() ));
goto exit;
}
Rval = TRUE;
exit:
MemFree( PrinterInfo );
MemFree( ShareName );
ClosePrinter( hPrinterServer );
return Rval;
}
BOOL
DeleteFaxPrinters(
HWND hwnd
)
{
PPRINTER_INFO_2 PrinterInfo;
PMONITOR_INFO_2 MonitorInfo;
DWORD Count;
HANDLE hPrinter;
PRINTER_DEFAULTS PrinterDefaults;
DWORD i,j;
LPTSTR FileName = NULL;
PDRIVER_INFO_2 DriverInfo;
PDRIVER_INFO_2 DriverInfoDel;
TCHAR Buffer[MAX_PATH];
PrinterInfo = MyEnumPrinters( NULL, 2, &Count, 0 );
if (!PrinterInfo) {
return FALSE;
}
PrinterDefaults.pDatatype = NULL;
PrinterDefaults.pDevMode = NULL;
PrinterDefaults.DesiredAccess = PRINTER_ALL_ACCESS;
for (i=0; i<Count; i++) {
//
// is this a fax printer??
//
if (_tcsicmp( PrinterInfo[i].pDriverName, FAX_DRIVER_NAME ) == 0) {
if (PrinterInfo[i].Attributes & PRINTER_ATTRIBUTE_LOCAL) {
if (!OpenPrinter( PrinterInfo[i].pPrinterName, &hPrinter, &PrinterDefaults )) {
DebugPrint(( TEXT("OpenPrinter() failed, ec=%d"), GetLastError() ));
continue;
}
{
BOOL DidWeDelete ;
BOOL DidWeClose ;
DWORD LastError ;
DidWeDelete = DeletePrinter( hPrinter ); // Returns 1 even when print jobs are in queue.
if( !DidWeDelete ){
LastError = GetLastError() ;
}
DidWeClose = ClosePrinter( hPrinter );
if( !DidWeClose ){
LastError = GetLastError();
}
}
} else {
DeletePrinterConnection( PrinterInfo[i].pPrinterName );
}
}
}
MemFree( PrinterInfo );
//
// See if any FAX printers are still pending deletion.
//
PrinterInfo = MyEnumPrinters( NULL, 2, &Count, 0 );
if (PrinterInfo) {
for (i=0; i<Count; i++) {
//
// Is this a fax printer? If so, warn the user that it wasn't deleted
//
if (_tcsicmp( PrinterInfo[i].pDriverName, FAX_DRIVER_NAME ) == 0) {
if( PrinterInfo[i].Status == PRINTER_STATUS_PENDING_DELETION ){
PopUpMsgFmt(
hwnd,
IDS_FAX_PRINTER_PENDING_DELETION,
FALSE,
0,
PrinterInfo[i].pPrinterName
);
}
else {
PopUpMsgFmt(
hwnd,
IDS_COULD_NOT_DELETE_FAX_PRINTER,
FALSE,
0,
PrinterInfo[i].pPrinterName
);
}
}
}
}
MemFree( PrinterInfo );
MonitorInfo = MyEnumMonitors( &Count );
if (MonitorInfo) {
for (i=0; i<Count; i++) {
if (_tcscmp( MonitorInfo[i].pName, FAX_MONITOR_NAME ) == 0) {
FileName = MonitorInfo[i].pDLLName;
break;
}
}
}
if (!DeleteMonitor( NULL, NULL, FAX_MONITOR_NAME )) {
DebugPrint(( TEXT("DeleteMonitor() failed, ec=%d"), GetLastError() ));
}
if (FileName) {
ExpandEnvironmentStrings( TEXT("%systemroot%\\system32\\"), Buffer, sizeof(Buffer)/sizeof(TCHAR) );
_tcscat( Buffer, FileName );
MyDeleteFile( Buffer );
}
if (MonitorInfo) {
MemFree( MonitorInfo );
}
for (i=0; i<MAX_PLATFORMS; i++) {
DriverInfo = MyEnumDrivers( Platforms[i].PrintPlatform, &Count );
DriverInfoDel = NULL;
if (DriverInfo) {
for (j=0; j<Count; j++) {
if (_tcscmp( DriverInfo[j].pName, FAX_DRIVER_NAME ) == 0) {
DriverInfoDel = &DriverInfo[j];
break;
}
}
}
if (!DeletePrinterDriver( NULL, Platforms[i].PrintPlatform, FAX_DRIVER_NAME )) {
DebugPrint(( TEXT("DeletePrinterDriver() failed, ec=%d"), GetLastError() ));
}
if (DriverInfoDel) {
MyDeleteFile( DriverInfoDel->pDriverPath );
MyDeleteFile( DriverInfoDel->pDataFile );
MyDeleteFile( DriverInfoDel->pConfigFile );
}
if (DriverInfo) {
MemFree( DriverInfo );
}
}
return TRUE;
}
PVOID
MyEnumPrinters(
LPTSTR pServerName,
DWORD level,
PDWORD pcPrinters,
DWORD Flags
)
{
PBYTE pPrinterInfo = NULL;
DWORD cb;
if (!Flags) {
Flags = PRINTER_ENUM_LOCAL | PRINTER_ENUM_CONNECTIONS;
}
if (!EnumPrinters(Flags, pServerName, level, NULL, 0, &cb, pcPrinters) &&
GetLastError() == ERROR_INSUFFICIENT_BUFFER &&
(pPrinterInfo = MemAlloc(cb)) &&
EnumPrinters(Flags, pServerName, level, pPrinterInfo, cb, &cb, pcPrinters))
{
return pPrinterInfo;
}
MemFree(pPrinterInfo);
return NULL;
}
PVOID
MyEnumDrivers(
LPTSTR pEnvironment,
PDWORD pcDrivers
)
{
PBYTE pDriverInfo = NULL;
DWORD cb;
if (!EnumPrinterDrivers(NULL, pEnvironment, 2, 0, 0, &cb, pcDrivers ) &&
GetLastError() == ERROR_INSUFFICIENT_BUFFER &&
(pDriverInfo = MemAlloc(cb)) &&
EnumPrinterDrivers(NULL, pEnvironment, 2, pDriverInfo, cb, &cb, pcDrivers ))
{
return pDriverInfo;
}
MemFree(pDriverInfo);
return NULL;
}
PVOID
MyEnumMonitors(
PDWORD pcMonitors
)
{
PBYTE pMonitorInfo = NULL;
DWORD cb;
if (!EnumMonitors(NULL, 2, 0, 0, &cb, pcMonitors ) &&
GetLastError() == ERROR_INSUFFICIENT_BUFFER &&
(pMonitorInfo = MemAlloc(cb)) &&
EnumMonitors(NULL, 2, pMonitorInfo, cb, &cb, pcMonitors ))
{
return pMonitorInfo;
}
MemFree(pMonitorInfo);
return NULL;
}