00001
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027 #include "stdafx.h"
00028 #include <winspool.h>
00029 #include <tchar.h>
00030 #include "PrinterInstall.h"
00031 #include <windows.h>
00032
00033
00035 #define ENVIRONMENT _T("Windows NT x86")
00036 #define ENVIRONMENT_64 _T("Windows x64")
00038 #define DRIVER_DATA_TYPE _T("")
00040 #define PRINTER_DATA_TYPE _T("RAW")
00042 #define DRIVER_MANUFACTURER _T("Cogniview Systems")
00043
00045 #define DEFAULT_PORT_MONITOR _T("Local Port")
00046
00047
00049 #define PARAM_INSTALLPRINTER _T("/InstallPrinter")
00051 #define PARAM_REMOVEPRINTER _T("/UninstallPrinter")
00053 #define PARAM_NOUI _T("/NoUI")
00054
00061 std::tstring ConcatPaths(const std::tstring& sFolder, const std::tstring& sPathname, bool bAllowAbsoluteOverride )
00062 {
00063
00064 if (sFolder.empty())
00065
00066 return sPathname;
00067
00068 if (sPathname.empty())
00069
00070 return sFolder;
00071
00072
00073 if (bAllowAbsoluteOverride)
00074 if ((sPathname.size() > 2) && (sPathname[1] == ':') || ((sPathname[0] == '\\') && (sPathname[1] == '\\')))
00075 return sPathname;
00076
00077 std::tstring sRet = sFolder;
00078
00079
00080 CHAR c = sFolder[sFolder.size()-1];
00081 if ((c != '\\') && (c != '/'))
00082 sRet += _T("\\");
00083
00084
00085 c = sPathname[0];
00086 if ((c == '\\') || (c == '/'))
00087
00088 sRet += sPathname.substr(1);
00089 else
00090
00091 sRet += sPathname;
00092
00093 return sRet;
00094 }
00095
00100 bool ExistsAsFile(LPCTSTR pPath)
00101 {
00102 WIN32_FILE_ATTRIBUTE_DATA data;
00103 if (!::GetFileAttributesEx(pPath, GetFileExInfoStandard, &data))
00104 return false;
00105 if (data.dwFileAttributes & FILE_ATTRIBUTE_OFFLINE)
00106 return false;
00107
00108 return ((data.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) == 0);
00109 }
00111
00112 PVOID Disable64Redirection ()
00113 {
00114 HMODULE hUser = LoadLibrary(_T("Kernel32.dll"));
00115 if (hUser == NULL)
00116 return NULL;
00117
00118 PVOID OldValue = NULL;
00119 typedef BOOL (__stdcall *fptype)(__out PVOID);
00120 fptype fp = (fptype)GetProcAddress(hUser, "Wow64DisableWow64FsRedirection");
00121 if (fp != NULL)
00122 fp (OldValue);
00123
00124
00125
00126 FreeLibrary(hUser);
00127
00128 return OldValue;
00129 }
00131
00132 BOOL Revert64Redirection (PVOID oldval)
00133 {
00134 HMODULE hUser = LoadLibrary(_T("Kernel32.dll"));
00135 if (hUser == NULL)
00136 return NULL;
00137
00138 BOOL ret;
00139 typedef BOOL (__stdcall *fptype)(__in PVOID);
00140 fptype fp = (fptype)GetProcAddress(hUser, "Wow64RevertWow64FsRedirection");
00141 if (fp != NULL)
00142 ret = fp (oldval);
00143
00144
00145
00146 FreeLibrary(hUser);
00147
00148 return ret;
00149 }
00151
00160 PrinterInstall::PrinterInstall(LPCTSTR lpPrinterName, LPCTSTR lpPortName, LPCTSTR lpDriverName, LPCTSTR lpHardwareID, const LPCTSTR* pFiles) : m_sPrinterName(lpPrinterName), m_sPortName(lpPortName), m_sDriverName(lpDriverName), m_sHardwareID(lpHardwareID), m_nError(0), m_nLastError(0), m_bLockError(false), m_sPortMonitor(DEFAULT_PORT_MONITOR)
00161 {
00162
00163 while (*pFiles != NULL)
00164 {
00165 m_arFiles.push_back(*pFiles);
00166 pFiles++;
00167 }
00168 }
00169
00173 PrinterInstall::PrinterInstall() : m_nError(0), m_nLastError(0), m_bLockError(false), m_sPortMonitor(DEFAULT_PORT_MONITOR)
00174 {
00175 }
00176
00184 void PrinterInstall::InitializePrinterData(LPCTSTR lpPrinterName, LPCTSTR lpPortName, LPCTSTR lpDriverName, LPCTSTR lpHardwareID, const LPCTSTR* pFiles)
00185 {
00186
00187 m_sPrinterName = lpPrinterName;
00188 m_sPortName = lpPortName;
00189 m_sDriverName = lpDriverName;
00190 m_sHardwareID = lpHardwareID;
00191
00192
00193 m_arFiles.clear();
00194 while (*pFiles != NULL)
00195 {
00196 m_arFiles.push_back(*pFiles);
00197 pFiles++;
00198 }
00199 }
00200
00204 void PrinterInstall::SetError(int nError)
00205 {
00206
00207 if (m_bLockError)
00208
00209 return;
00210
00211
00212 m_nError = nError;
00213 m_nLastError = GetLastError();
00214
00215 m_bLockError = true;
00216 }
00217
00221 bool PrinterInstall::DoAddPort()
00222 {
00223
00224 PRINTER_DEFAULTS pd;
00225 ZeroMemory(&pd, sizeof(PRINTER_DEFAULTS));
00226 pd.DesiredAccess = SERVER_ACCESS_ADMINISTER;
00227 HANDLE hXcv = INVALID_HANDLE_VALUE;
00228
00229
00230 std::tstring s = _T(",XcvMonitor ") + m_sPortMonitor;
00231 if (!::OpenPrinter((TCHAR*)s.c_str(), &hXcv, &pd))
00232 {
00233 SetError(-1001);
00234 #ifdef TRACE
00235 TRACE(_T("Open printer failed: %d\n"), GetLastError());
00236 #endif
00237 return false;
00238 }
00239
00240
00241 DWORD cbneed,cbstate;
00242 TCHAR cOutputData[MAX_PATH];
00243 if (!::XcvData(hXcv, L"AddPort", (PBYTE)MakeWideString(m_sPortName).c_str(), (m_sPortName.size() + 1) * sizeof(WCHAR), (LPBYTE)cOutputData, MAX_PATH, &cbneed, &cbstate))
00244 {
00245 SetError(-1002);
00246 #ifdef TRACE
00247 TRACE(_T("XcdData failed: %d\n"), cbstate);
00248 #endif
00249 ::ClosePrinter(hXcv);
00250 return false;
00251 }
00252
00253 ::ClosePrinter(hXcv);
00254 return true;
00255 }
00256
00261 bool PrinterInstall::DoDeletePort(HWND hWnd)
00262 {
00263
00264 if (!::DeletePortW(NULL, hWnd, (WCHAR*)MakeWideString(m_sPortName).c_str()))
00265 {
00266 if (GetLastError() != 0)
00267 {
00268 #ifdef TRACE
00269 TRACE(_T("Delete port failed: %d\n"), GetLastError());
00270 #endif
00271
00272 }
00273 }
00274 return true;
00275 }
00276
00281 bool PrinterInstall::DoCopyFiles(LPCTSTR lpCopyFrom)
00282 {
00283 TCHAR lpPath[MAX_PATH + 1];
00284 DWORD uSize=0;
00285
00286
00287 if (!GetPrinterDriverDirectory(NULL, NULL, 1, (LPBYTE)lpPath, MAX_PATH + 1, &uSize))
00288 {
00289
00290 SetError(-1201);
00291 #ifdef TRACE
00292 TRACE(_T("Could not get printer driver directory: %d\n"), GetLastError());
00293 #endif
00294 return false;
00295 }
00296
00297
00298 std::tstring sFrom, sTo;
00299 for (STRARRAY::const_iterator i = m_arFiles.begin(); i != m_arFiles.end(); i++)
00300 {
00301
00302 sFrom = ConcatPaths(lpCopyFrom, (*i));
00303 sTo = ConcatPaths(lpPath, (*i));
00304
00305
00306 if (!::CopyFile(sFrom.c_str(), sTo.c_str(), FALSE))
00307 {
00308 SetError(-1202);
00309
00310
00311
00312
00313
00314
00315
00316 #ifdef TRACE
00317 TRACE(_T("Cannot copy file: %d\n"), GetLastError());
00318 #endif
00319 return false;
00320 }
00321 }
00322
00323 return true;
00324 }
00325
00329 bool PrinterInstall::DoRemoveFiles()
00330 {
00331 TCHAR lpPath[MAX_PATH + 1];
00332 DWORD uSize=0;
00333
00334
00335 if (!::GetPrinterDriverDirectory(NULL, NULL, 1, (LPBYTE)lpPath, MAX_PATH + 1, &uSize))
00336 {
00337
00338 SetError(-1301);
00339 #ifdef TRACE
00340 TRACE(_T("Cannot get printer driver directory: %d\n"), GetLastError());
00341 #endif
00342 return false;
00343 }
00344
00345
00346 std::tstring sFullPath;
00347 for (STRARRAY::const_iterator i = m_arFiles.begin(); i != m_arFiles.end(); i++)
00348 {
00349
00350 sFullPath = ConcatPaths(lpPath, (*i));
00351
00352 if (!::DeleteFile(sFullPath.c_str()))
00353 {
00354 #ifdef TRACE
00355 TRACE(_T("Warning: cannot delete file %s: %d\n"), (*i).c_str(), GetLastError());
00356 #endif
00357 }
00358 }
00359 return true;
00360 }
00361
00365 bool PrinterInstall::DoInstallPrinterDriver()
00366 {
00367
00368 DRIVER_INFO_6 info;
00369 memset(&info, 0, sizeof(info));
00370
00371 TCHAR lpPath[MAX_PATH];
00372 DWORD uSize=0;
00373
00374
00375 if (!::GetPrinterDriverDirectory(NULL, NULL, 1, (LPBYTE)lpPath, MAX_PATH, &uSize))
00376 {
00377
00378 SetError(-1401);
00379 #ifdef TRACE
00380 TRACE(_T("Could not get printer driver directory: %d\n"), GetLastError());
00381 #endif
00382 return false;
00383 }
00384
00385
00386 int nLen = _tcslen(lpPath);
00387 if ((nLen > 0) || (lpPath[nLen - 1] != '\\'))
00388 _tcscat_s(lpPath, _S(lpPath), _T("\\"));
00389
00390 TCHAR cDriverPath[MAX_PATH], cConfigPath[MAX_PATH], cHelpPath[MAX_PATH], cDataPath[MAX_PATH];
00391
00392 _tcscpy_s(cDriverPath, _S(cDriverPath), lpPath);
00393 _tcscat_s(cDriverPath, _S(cDriverPath), m_arFiles[DRIVER_FILE_NUM].c_str());
00394
00395 _tcscpy_s(cConfigPath, _S(cConfigPath), lpPath);
00396 _tcscat_s(cConfigPath, _S(cConfigPath), m_arFiles[UI_FILE_NUM].c_str());
00397
00398 _tcscpy_s(cHelpPath, _S(cHelpPath), lpPath);
00399 _tcscat_s(cHelpPath, _S(cHelpPath), m_arFiles[HELP_FILE_NUM].c_str());
00400
00401 _tcscpy_s(cDataPath, _S(cDataPath), lpPath);
00402 _tcscat_s(cDataPath, _S(cDataPath), m_arFiles[DATA_FILE_NUM].c_str());
00403
00404
00405 int nSize = 0;
00406 STRARRAY::const_iterator i;
00407 for (i = m_arFiles.begin(); i != m_arFiles.end(); i++)
00408 nSize += ((*i).size() + 1);
00409 nSize++;
00410 TCHAR* pBuffer = new TCHAR[nSize];
00411 nSize = 0;
00412 for (i = m_arFiles.begin(); i != m_arFiles.end(); i++)
00413 {
00414 memcpy(pBuffer + nSize, (*i).c_str(), (*i).size() * sizeof(TCHAR));
00415 nSize += (*i).size();
00416 pBuffer[nSize] = '\0';
00417 nSize++;
00418 }
00419 pBuffer[nSize] = '\0';
00420
00421
00422 info.cVersion = 3;
00423 info.pName = (TCHAR*)m_sDriverName.c_str();
00424 info.pEnvironment = m_bX64 ? ENVIRONMENT_64 : ENVIRONMENT;
00425 info.pDriverPath = cDriverPath;
00426 info.pDataFile = cDataPath;
00427 info.pConfigFile = cConfigPath;
00428 info.pHelpFile = cHelpPath;
00429 info.pDependentFiles = pBuffer;
00430 info.pMonitorName = NULL;
00431 info.pDefaultDataType = DRIVER_DATA_TYPE;
00432 info.dwlDriverVersion = 0x0000000200000000I64;
00433 info.pszMfgName = DRIVER_MANUFACTURER;
00434 info.pszHardwareID = (TCHAR*)m_sHardwareID.c_str();
00435 info.pszProvider = DRIVER_MANUFACTURER;
00436
00437
00438 if (!::AddPrinterDriver(NULL, 6, (LPBYTE)&info))
00439 {
00440
00441 SetError(-1402);
00442 #ifdef TRACE
00443 TRACE(_T("AddPrinterDriver failed: %d\n"), GetLastError());
00444 #endif
00445 delete [] pBuffer;
00446 return false;
00447 }
00448 delete [] pBuffer;
00449
00450
00451 return true;
00452 }
00453
00457 bool PrinterInstall::DoUninstallPrinterDriver()
00458 {
00459
00460 if (!::DeletePrinterDriverEx(NULL, m_bX64? ENVIRONMENT_64: ENVIRONMENT, (TCHAR*)m_sDriverName.c_str(), DPD_DELETE_UNUSED_FILES, 3))
00461 {
00462
00463 DWORD dw = GetLastError();
00464 if (dw != 0)
00465 {
00466
00467 SetError(-1501);
00468 #ifdef TRACE
00469 TRACE(_T("DeletePrinterDriver failed: %d\n"), dw);
00470 #endif
00471 return false;
00472 }
00473 }
00474 return true;
00475 }
00476
00480 bool PrinterInstall::DoAddPrinter()
00481 {
00482
00483 PRINTER_INFO_2 pi2;
00484 ZeroMemory(&pi2, sizeof(PRINTER_INFO_2));
00485
00486
00487 pi2.pServerName= NULL;
00488 pi2.pPrinterName = (TCHAR*)m_sPrinterName.c_str();
00489 pi2.pPortName = (TCHAR*)m_sPortName.c_str();
00490 pi2.pDriverName = (TCHAR*)m_sDriverName.c_str();
00491 pi2.pPrintProcessor = _T("WinPrint");
00492 pi2.pDatatype = PRINTER_DATA_TYPE;
00493 pi2.Attributes = PRINTER_ATTRIBUTE_DIRECT;
00494
00495
00496 HANDLE hPrinter = ::AddPrinter(NULL, 2, (LPBYTE)&pi2);
00497 if (hPrinter == NULL)
00498 {
00499
00500 #ifdef TRACE
00501 TRACE(_T("AddPrinter failed: %d\n"), GetLastError());
00502 #endif
00503 SetError(-1601);
00504 return false;
00505 }
00506 ::ClosePrinter(hPrinter);
00507
00508 return true;
00509 }
00510
00515 bool PrinterInstall::DoRemovePrinter(LPTSTR lpName)
00516 {
00517 BOOL bRet = FALSE;
00518 PRINTER_DEFAULTS pd;
00519 HANDLE hPrinter;
00520
00521 ZeroMemory(&pd, sizeof(PRINTER_DEFAULTS));
00522 pd.DesiredAccess = PRINTER_ALL_ACCESS;
00523
00524
00525 if (!::OpenPrinter(lpName, &hPrinter, &pd))
00526 {
00527
00528 SetError(-1701);
00529 #ifdef TRACE
00530 TRACE(_T("OpenPrinter failed while removing printer %s: %d"), lpName, GetLastError());
00531 #endif
00532 return false;
00533 }
00534
00535
00536 if (!::DeletePrinter(hPrinter))
00537 {
00538
00539 SetError(-1702);
00540 #ifdef TRACE
00541 TRACE(_T("DeletePrinter for printer %s failed: %d"), lpName, GetLastError());
00542 #endif
00543 return false;
00544 }
00545 ::ClosePrinter(hPrinter);
00546
00547 return true;
00548 }
00549
00554 bool PrinterInstall::IsPrinterInstalled(bool& bInstalled)
00555 {
00556 PRINTER_INFO_2* pInfo;
00557 DWORD dwSize, dwCount;
00558 bInstalled = false;
00559
00560
00561 ::EnumPrinters(PRINTER_ENUM_LOCAL, NULL, 2, NULL, 0, &dwSize, &dwCount);
00562 if (dwSize == 0)
00563 {
00564
00565 return true;
00566 }
00567
00568
00569 pInfo = (PRINTER_INFO_2*)new char[dwSize];
00570 if (!::EnumPrinters(PRINTER_ENUM_LOCAL, NULL, 2, (LPBYTE)pInfo, dwSize, &dwSize, &dwCount))
00571 {
00572
00573 SetError(-1801);
00574 delete [] pInfo;
00575 return false;
00576 }
00577
00578
00579 for (int i=0;!bInstalled && (i<(int)dwCount);i++)
00580 {
00581 if (_tcscmp(pInfo[i].pDriverName, m_sDriverName.c_str()) == 0)
00582
00583 bInstalled = true;
00584 }
00585
00586
00587 delete [] pInfo;
00588 return true;
00589 }
00590
00594 bool PrinterInstall::DoRemovePrinters()
00595 {
00596 PRINTER_INFO_2* pInfo;
00597 DWORD dwSize, dwCount;
00598
00599
00600 ::EnumPrinters(PRINTER_ENUM_LOCAL, NULL, 2, NULL, 0, &dwSize, &dwCount);
00601 if (dwSize == 0)
00602 {
00603
00604 return true;
00605 }
00606
00607
00608 pInfo = (PRINTER_INFO_2*)new char[dwSize];
00609 if (!::EnumPrinters(PRINTER_ENUM_LOCAL, NULL, 2, (LPBYTE)pInfo, dwSize, &dwSize, &dwCount))
00610 {
00611
00612 SetError(-1801);
00613 delete [] pInfo;
00614 return false;
00615 }
00616
00617
00618 for (int i=0;i<(int)dwCount;i++)
00619 {
00620
00621 if (_tcscmp(pInfo[i].pDriverName, m_sDriverName.c_str()) == 0)
00622 {
00623
00624 if (!DoRemovePrinter(pInfo[i].pPrinterName))
00625 {
00626
00627 delete [] pInfo;
00628 return false;
00629 }
00630 }
00631 }
00632
00633 delete [] pInfo;
00634 return true;
00635 }
00636
00642 int PrinterInstall::Install(LPCTSTR lpFilesPath, HWND hParent)
00643 {
00644
00645 ResetError();
00646
00647 if (m_sPrinterName.empty())
00648 {
00649
00650 SetError(-2);
00651 return m_nError;
00652 }
00653
00654
00655 if ((lpFilesPath == NULL) || (_tcslen(lpFilesPath) == 0))
00656 {
00657
00658 SetError(-1);
00659 return m_nError;
00660 }
00661
00662
00663 if (!DoAddPort())
00664 return m_nError;
00665
00666
00667 if (!DoCopyFiles(lpFilesPath))
00668 {
00669 DoRemoveFiles();
00670 DoDeletePort(hParent);
00671 return m_nError;
00672 }
00673
00674
00675 if (!DoInstallPrinterDriver())
00676 {
00677 DoRemoveFiles();
00678 DoDeletePort(hParent);
00679 return m_nError;
00680 }
00681
00682
00683 if (!DoAddPrinter())
00684 {
00685 DoUninstallPrinterDriver();
00686 DoDeletePort(hParent);
00687 return m_nError;
00688 }
00689
00690 return 0;
00691 }
00692
00697 int PrinterInstall::Uninstall(HWND hParent)
00698 {
00699
00700 ResetError();
00701
00702
00703 if (m_sPrinterName.empty())
00704 {
00705
00706 SetError(-2);
00707 return m_nError;
00708 }
00709
00710
00711 if (!DoRemovePrinters())
00712 {
00713
00714 DoUninstallPrinterDriver();
00715 DoDeletePort(hParent);
00716 return m_nError;
00717 }
00718
00719
00720 if (!DoUninstallPrinterDriver())
00721 {
00722
00723 int nRet = m_nError;
00724 DoDeletePort(hParent);
00725 return m_nError;
00726 }
00727
00728
00729 if (!DoDeletePort(hParent))
00730 return m_nError;
00731
00732 return 0;
00733 }
00734
00735
00750 bool PrinterInstall::DoCommandLine(int nArgs, TCHAR** pArgs, bool& bNoUI, LPCTSTR lpRelativeDriverFolder)
00751 {
00752
00753 bNoUI = false;
00754 ResetError();
00755
00756
00757 for (int i = 1; i < nArgs; i++)
00758 {
00759 if (_tcscmp(pArgs[i], PARAM_NOUI) == 0)
00760
00761 bNoUI = true;
00762 else if (_tcscmp(pArgs[i], PARAM_INSTALLPRINTER) == 0)
00763 {
00764
00765 TCHAR cPath[MAX_PATH + 2];
00766
00767 if (!::GetModuleFileName(NULL, cPath, MAX_PATH + 1))
00768
00769 SetError(-100);
00770 else
00771 {
00772
00773 TCHAR* pSlash = _tcsrchr(cPath, '\\');
00774 if (pSlash == NULL)
00775 SetError(-101);
00776 else
00777 {
00778
00779 *(pSlash + 1) = '\0';
00780 _tcscat_s(cPath, _S(cPath), lpRelativeDriverFolder);
00781
00782 Install(cPath, NULL);
00783 }
00784 }
00785
00786 return true;
00787 }
00788 else if (_tcscmp(__targv[i], PARAM_REMOVEPRINTER) == 0)
00789 {
00790
00791 Uninstall(NULL);
00792 return true;
00793 }
00794 }
00795
00796
00797 return false;
00798 }
00799
00806 bool PrinterInstall::AddPortMonitor(LPCTSTR lpMonitorName, LPCTSTR lpMonitorFile, LPCTSTR lpFilePath)
00807 {
00808
00809 PVOID oldval = Disable64Redirection();
00810
00811
00812 DWORD dwNeeded, dwReturned;
00813 ::EnumMonitors(NULL, 1, NULL, 0, &dwNeeded, &dwReturned);
00814 if (dwNeeded > 0)
00815 {
00816 MONITOR_INFO_1* pMonitors = (MONITOR_INFO_1*)new char[dwNeeded];
00817 bool bFound = false;
00818 if (::EnumMonitors(NULL, 1, (LPBYTE)pMonitors, dwNeeded, &dwNeeded, &dwReturned))
00819 {
00820 for (DWORD i=0;!bFound && (i<dwReturned);i++)
00821 bFound = _tcscmp(pMonitors[i].pName, lpMonitorName) == 0;
00822 }
00823 delete [] pMonitors;
00824 if (bFound)
00825 return true;
00826 }
00827
00828 TCHAR lpPath[MAX_PATH + 1];
00829
00830
00831 if (!GetSystemDirectory(lpPath, MAX_PATH + 1))
00832 {
00833
00834 SetError(-2001);
00835 #ifdef TRACE
00836 TRACE(_T("Could not get system directory: %d\n"), GetLastError());
00837 #endif
00838 return false;
00839 }
00840
00841
00842 std::tstring sFrom, sTo;
00843 sFrom = ConcatPaths(lpFilePath, lpMonitorFile);
00844 sTo = ConcatPaths(lpPath, lpMonitorFile);
00845
00846 if (!ExistsAsFile(sTo.c_str()))
00847 {
00848 if (!::CopyFile(sFrom.c_str(), sTo.c_str(), FALSE))
00849 {
00850
00851 SetError(-2002);
00852
00853
00854
00855
00856
00857
00858
00859 #ifdef TRACE
00860 TRACE(_T("Cannot copy file: %d\n"), GetLastError());
00861 #endif
00862 return false;
00863 }
00864 }
00865
00866
00867 MONITOR_INFO_2 info;
00868 info.pName = (TCHAR*)lpMonitorName;
00869 info.pEnvironment = m_bX64 ? ENVIRONMENT_64 : ENVIRONMENT;
00870 info.pDLLName = (TCHAR*)lpMonitorFile;
00871
00872
00873 if (!::AddMonitor(NULL, 2, (LPBYTE)&info))
00874 {
00875 int nError = GetLastError();
00876
00877 SetError(-2003);
00878 #ifdef TRACE
00879 TRACE(_T("Cannot add a port monitor: %d\n"), GetLastError());
00880 #endif
00881 return false;
00882 }
00883
00884
00885 Revert64Redirection(oldval);
00886
00887
00888 m_sPortMonitor = lpMonitorName;
00889 return true;
00890 }
00891
00896 bool PrinterInstall::RemovePortMonitor(LPCTSTR lpMonitorName)
00897 {
00898
00899 if (!::DeleteMonitor(NULL, m_bX64? ENVIRONMENT_64: ENVIRONMENT, (TCHAR*)lpMonitorName))
00900 {
00901
00902 DWORD dw = GetLastError();
00903 if (dw != 0)
00904 {
00905
00906 SetError(-2101);
00907 #ifdef TRACE
00908 TRACE(_T("Cannot remove a port monitor: %d\n"), dw);
00909 #endif
00910 return false;
00911 }
00912 }
00913
00914 return true;
00915 }