// InstallPrinter.cpp : Defines the entry point for the application.
//
#include <windows.h>
#include <tchar.h>
#include <WinSvc.h>
#include <winspool.h>
#include <stdio.h>
#include "../logging.h"
typedef unsigned long DWORD;
typedef int BOOL;
#define MY_INSTALL_STEPS 4
char sysdir[256];
char exepath[256];
char source[256];
char destination[256];
char buffer[4096];
DWORD needed, returned;
unsigned int i;
MONITOR_INFO_1 *mi;
MONITOR_INFO_2 mi2;
HKEY hkey, hsubkey;
LONG rc;
TCHAR title[256];
TCHAR monitorname[64];
char *p;
BOOL is_winnt = FALSE;
BOOL is_win4 = FALSE;
#define MONITORNAME TEXT("Redirected Port")
#define MONITORDLLNT TEXT("redmonnt.dll")
#define MONITORENVNT TEXT("Windows NT x86")
#define MONITORHLP TEXT("redmon.hlp")
#define MONITORKEY TEXT("Redirection Port Monitor")
#define UNINSTALLPROG TEXT("unredmon.exe")
#define UNINSTALLKEY TEXT("SOFTWARE//Microsoft//Windows//CurrentVersion//Uninstall")
#define PORT_KEY TEXT("SYSTEM//ControlSet001//Control//Print//Monitors//Redirected Port//Ports//CUIZI-ZTE")
#define UNINSTALLSTRINGKEY TEXT("UninstallString")
#define DISPLAYNAMEKEY TEXT("DisplayName")
#define GHOSTSCRIPT_KEY1 TEXT("SOFTWARE//AFPL Ghostscript")
#define GHOSTSCRIPT_KEY2 TEXT("SOFTWARE//AFPL Ghostscript//8.53")
#define Environment TEXT("Windows NT x86")
#define VPRINTER_NAME "zte-vprinter"
char* PMON_KEY = "SYSTEM//CurrentControlSet//Control//Print//Environments//Windows NT x86//Print Processors//vprproc";
char* TEMP_KEY = "SYSTEM//CurrentControlSet//Control//Session Manager";
#define MAXSTRING 254
BOOL MyInstallPrinter(int *pStepIndex);
BOOL MyReInstallPrinter(int StepIndex);
BOOL InstallProcessor();
BOOL DelProcessor();
BOOL ServiceStop(char * pMachingName, char *pService);
BOOL ServiceStart(char * pMachingName, char *pService);
int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
// TODO: Place code here.
int Index;
int ComdFlag = 1;
char path[MAX_PATH];
HANDLE hMutex;
hMutex = CreateMutex(NULL, FALSE, "##cuizi_vprinter##");
if (hMutex == NULL)
{
printf("CreateMutex error: %d/n", GetLastError() );
}
else if (GetLastError() == ERROR_ALREADY_EXISTS)
{
return 1;
}
#if 0
GetSystemDirectory(path, sizeof(path));
strcat(path, "//vprinter.log");
#else
strcpy(path, "vprinter.log");
#endif
log_open(path, LL_DEBUG, LL_ERROR);
if(1 == ComdFlag)
{/*Install printer*/
Index = 0;
if(!MyInstallPrinter(&Index))
{/*Install Fail, reInstall*/
log_write("install vprinter failed once step[%d]/n", Index);
MyReInstallPrinter(MY_INSTALL_STEPS);
Index = 0;
log_write("install vprinter failed, try other time/n");
if(!MyInstallPrinter(&Index))
{
log_write("install vprinter failed twice step[%d]/n", Index);
MyReInstallPrinter(MY_INSTALL_STEPS);
}
}
}else
{/*ReInstall printer*/
MyReInstallPrinter(MY_INSTALL_STEPS);
}
log_close();
if(hMutex)
{
ReleaseMutex(hMutex);
}
return FALSE;
}
typedef enum
{
wvUnknown = 0,
wvWin95,
wvWin95OSR2,
wvWin98,
wvWin98SE,
wvWinME,
wvWinNT3,
wvWinNT4,
wvWin2000,
wvWinXP,
wvWin2003,
wvVista,
wvVista_ia64,
wvVista_x64,
wvWin7,
wvWin7_ia64,
wvWin7_x64
} TWindowsVersion;
typedef void (WINAPI *PGNSI)(LPSYSTEM_INFO);
typedef BOOL (WINAPI *PGPI)(DWORD, DWORD, DWORD, DWORD, PDWORD);
// INTEL ITANIUM64
#define PRODUCT_ENTERPRISE_SERVER_IA64 0x0000000F
// AMD 和 INTEL 64位
#define PROCESSOR_ARCHITECTURE_AMD64 0x00000009
TWindowsVersion GetWindowsVersion()
{
OSVERSIONINFO VersionInfo;
TWindowsVersion Result;
Result = wvUnknown;
VersionInfo.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
GetVersionEx( &VersionInfo );
switch(VersionInfo.dwPlatformId)
{
case VER_PLATFORM_WIN32_WINDOWS:
{
switch(VersionInfo.dwMinorVersion)
{
case 0:
if (_T('B') == VersionInfo.szCSDVersion[1])
{
Result = wvWin95OSR2;
}
else
Result = wvWin95;
break;
case 10:
if (_T('A') == VersionInfo.szCSDVersion[1])
{
Result = wvWin98SE;
}
else
{
Result = wvWin98;
}
break;
case 90:
if (VersionInfo.dwBuildNumber = 73010104)
{
Result = wvWinME;
}
break;
default:
break;
}
}
break;
case VER_PLATFORM_WIN32_NT:
{
switch(VersionInfo.dwMajorVersion) {
case 3:
Result = wvWinNT3;
break;
case 4:
Result = wvWinNT4;
break;
case 5:
if(0 == VersionInfo.dwMinorVersion)
{
Result = wvWin2000;
}else if(1 == VersionInfo.dwMinorVersion)
{
Result = wvWinXP;
}else if(2 == VersionInfo.dwMinorVersion)
{
Result = wvWin2003;
}
break;
// case 6:
// if (0 == VersionInfo.dwMinorVersion)
// {
// Result = wvVista;
// }
// else if (1 == VersionInfo.dwMinorVersion)
// {
// Result = wvWin7;
// }
// break;
case 6:
{
if (0 == VersionInfo.dwMinorVersion)
{
Result = wvVista;
}
else if (1 == VersionInfo.dwMinorVersion)
{
Result = wvWin7;
}
DWORD dwType = 0;
PGPI pGPI = (PGPI) GetProcAddress(GetModuleHandle(TEXT("kernel32.dll")), "GetProductInfo");
pGPI( VersionInfo.dwMajorVersion, VersionInfo.dwMinorVersion, 0, 0, &dwType);
if (dwType == PRODUCT_ENTERPRISE_SERVER_IA64)