portmon.c

来自「虚拟打印端口」· C语言 代码 · 共 2,232 行 · 第 1/4 页

C
2,232
字号
    syslog(TEXT("rClosePort returns "));
    sysnum(flag);
    syslog(TEXT("\r\n"));
#endif
    return flag;
}


BOOL WINAPI 
rSetPortTimeOuts(HANDLE  hPort, LPCOMMTIMEOUTS lpCTO, DWORD reserved)
{
    REDATA *prd = GlobalLock((HGLOBAL)hPort);
    BOOL flag;
#ifdef DEBUG_REDMON
    syslog(TEXT("rSetPortTimeouts\r\n"));
#endif
    if (prd == (REDATA *)NULL) {
	SetLastError(ERROR_INVALID_HANDLE);
	return FALSE;
    }

    flag = redmon_set_port_timeouts(prd, lpCTO, reserved);

    GlobalUnlock((HGLOBAL)hPort);

#ifdef DEBUG_REDMON
    syslog(TEXT("rSetPortTimeouts returns "));
    sysnum(flag);
    syslog(TEXT("\r\n"));
#endif
    return flag;
}
 
#ifdef UNICODE
void
GetNTversion(void)
{
   OSVERSIONINFO osvi;
   osvi.dwOSVersionInfoSize = sizeof(osvi);
   if (GetVersionEx(&osvi)) {
	ntver = osvi.dwMajorVersion * 100 + osvi.dwMinorVersion;
   }
   else {
	ntver = 0;
   }
}
#endif /* UNICODE */

/* Exported functions */


#ifdef UNICODE
#ifdef NT35
/* Windows NT 3.51 */
BOOL WINAPI _export
InitializeMonitor(LPWSTR pRegisterRoot)
{
#ifdef UNUSED
    TCHAR buf[MAXSTR];
    wsprintf(buf, TEXT("InitializeMonitor: registrykey=%s"), 
		pRegisterRoot);
    MessageBox(NULL, buf, MONITORNAME, MB_OK);
#endif
#ifdef DEBUG_REDMON
    syslog(TEXT("InitializeMonitor "));
    syslog(pRegisterRoot);
    syslog(TEXT("\r\n"));
#endif

    if (lstrlen(pRegisterRoot) + 1 > sizeof(rekey) / sizeof(TCHAR)) 
	return FALSE;

    lstrcpy(rekey, pRegisterRoot);
    GetNTversion();

    return TRUE;
}
#endif

#ifdef NT40
/* Windows NT4 version */
MONITOREX mex = {
    {sizeof(MONITOR)},
    {
    rEnumPorts,
    rOpenPort,
    NULL, /* OpenPortEx */
    rStartDocPort,
    rWritePort,
    rReadPort,
    rEndDocPort,
    rClosePort,
    rAddPort,
    rAddPortEx,
    rConfigurePort,
    rDeletePort,
    NULL, /* GetPrinterDataFromPort */
    rSetPortTimeOuts,
    }
};

LPMONITOREX WINAPI _export
InitializePrintMonitor(LPWSTR pRegisterRoot)
{
#ifdef DEBUG_REDMON
    syslog(TEXT("InitializePrintMonitor "));
    syslog(pRegisterRoot);
    syslog(TEXT("\r\n"));
#endif
#ifdef UNUSED
    wsprintf(buf, TEXT("InitializePrintMonitor: registrykey=%s"), 
		pRegisterRoot);
    MessageBox(NULL, buf, MONITORNAME, MB_OK);
#endif

    if (lstrlen(pRegisterRoot) + 1 > sizeof(rekey) / sizeof(TCHAR)) 
	return FALSE;

    lstrcpy(rekey, pRegisterRoot);
    GetNTversion();

    return &mex;
}
#endif	/* NT40 */

#ifdef NT50
/* Windows 2000 version */

MONITOR2 mon2 = {
    sizeof(MONITOR2),
    rsEnumPorts,
    rsOpenPort,
    NULL, /* OpenPortEx */
    rStartDocPort,
    rWritePort,
    rReadPort,
    rEndDocPort,
    rClosePort,
    NULL, /* AddPort */
    NULL, /* AddPortEx */
    NULL, /* ConfigurePort */
    NULL, /* DeletePort */
    NULL, /* GetPrinterDataFromPort */
    rSetPortTimeOuts,
    rsXcvOpenPort,
    rsXcvDataPort,
    rsXcvClosePort,
    rsShutdown
#ifdef NOTUSED
    ,NULL /* SendRecvBidiDataFromPort */
#endif
};

LPMONITOR2 WINAPI 
InitializePrintMonitor2(PMONITORINIT pMonitorInit, PHANDLE phMonitor)
{
#ifdef UNUSED
    MessageBox(NULL, TEXT("InitializePrintMonitor2"), MONITORNAME, MB_OK);
#endif
#ifdef DEBUG_REDMON
    syslog(TEXT("InitializePrintMonitor2"));
    syslog(TEXT("\r\n  cbSize="));
    sysnum(pMonitorInit->cbSize);
    syslog(TEXT("\r\n  hSpooler="));
    syshex((DWORD)(pMonitorInit->hSpooler));
    syslog(TEXT("\r\n  hckRegistryRoot="));
    syshex((DWORD)(pMonitorInit->hckRegistryRoot));
    syslog(TEXT("\r\n  pMonitorReg="));
    syshex((DWORD)(pMonitorInit->pMonitorReg));
    syslog(TEXT("\r\n  bLocal="));
    sysnum(pMonitorInit->bLocal);
    syslog(TEXT("\r\n"));
#endif
    GetNTversion();
    /* return pMonitorInit as hMonitor */
    *phMonitor = (PHANDLE)pMonitorInit;
    return &mon2;
} 

MONITORUI mui = {
    sizeof(MONITORUI),
    rcAddPortUI,
    rcConfigurePortUI,
    rcDeletePortUI
};

PMONITORUI WINAPI 
InitializePrintMonitorUI(VOID)
{
#ifdef DEBUG_REDMON
    syslog(TEXT("InitializePrintMonitorUI\r\n"));
#endif
    return &mui;
} 
#endif	/* NT50 */

#else	/* !UNICODE */
/* Windows 95 version */
BOOL WINAPI 
InitializeMonitorEx(LPTSTR pRegisterRoot, LPMONITOR pMonitor)
{
#ifdef DEBUG_REDMON
    syslog(TEXT("InitializeMonitorEx "));
    syslog(pRegisterRoot);
    syslog(TEXT("\r\n"));
#endif
#ifdef UNUSED
    wsprintf(buf, TEXT("InitializeMonitorEx: registrykey=%s pmonitor=0x%x"), 
		pRegisterRoot, pMonitor);
    MessageBox(NULL, buf, MONITORNAME, MB_OK);
#endif

    if (lstrlen(pRegisterRoot) + 1 > sizeof(rekey) / sizeof(TCHAR)) 
	return FALSE;

    lstrcpy(rekey, pRegisterRoot);

    pMonitor->pfnEnumPorts = rEnumPorts;
    pMonitor->pfnOpenPort = rOpenPort;
    pMonitor->pfnOpenPortEx = NULL;
    pMonitor->pfnStartDocPort = rStartDocPort;
    pMonitor->pfnWritePort = rWritePort;
    pMonitor->pfnReadPort = rReadPort;
    pMonitor->pfnEndDocPort = rEndDocPort;
    pMonitor->pfnClosePort = rClosePort;
    pMonitor->pfnAddPort = rAddPort;
    pMonitor->pfnConfigurePort = rConfigurePort;
    pMonitor->pfnDeletePort = rDeletePort;
    pMonitor->pfnGetPrinterDataFromPort = NULL;
    pMonitor->pfnSetPortTimeOuts = rSetPortTimeOuts;

    return TRUE;

}
#endif	/* !UNICODE */


/* DLL entry point for Borland C++ */
#ifdef __BORLANDC__
#pragma argsused
#endif
BOOL WINAPI _export
DllEntryPoint(HINSTANCE hInst, DWORD fdwReason, LPVOID lpReserved)
{
    hdll = hInst;
    DisableThreadLibraryCalls(hInst);
    return TRUE;
}

#ifdef __BORLANDC__
#pragma argsused
#endif
/* DLL entry point for Microsoft Visual C++ */
BOOL WINAPI
DllMain(HINSTANCE hInst, DWORD fdwReason, LPVOID lpReserved)
{
    return DllEntryPoint(hInst, fdwReason, lpReserved);
}



#ifdef MAKEEXE

#ifdef NT50
/* for testing Windows 2000 code on Windows NT 4, we create a 
 * MONITORREG structure */
LONG WINAPI CreateKey(HANDLE hcKey, LPCTSTR pszSubKey, DWORD dwOptions, 
	REGSAM samDesired, PSECURITY_ATTRIBUTES pSecurityAttributes, 
	PHANDLE phckResult, PDWORD pdwDisposition, HANDLE hSpooler)
{
    return RegCreateKeyEx(hcKey, pszSubKey, 0, 0, dwOptions,
		samDesired, pSecurityAttributes, (PHKEY)phckResult,
		pdwDisposition);
} 

LONG WINAPI OpenKey(HANDLE hcKey, LPCTSTR pszSubKey, REGSAM samDesired, 
	PHANDLE phkResult, HANDLE hSpooler)
{
    return RegOpenKeyEx(hcKey, pszSubKey, 0, samDesired, 
		(PHKEY)phkResult);
} 

LONG WINAPI CloseKey(HANDLE hcKey, HANDLE hSpooler)
{
    return RegCloseKey(hcKey);
} 

LONG WINAPI DeleteKey(HANDLE hcKey, LPCTSTR pszSubKey, HANDLE hSpooler) 
{
    return RegDeleteKey(hcKey, pszSubKey); 
}

LONG WINAPI EnumKey(HANDLE hcKey, DWORD dwIndex, LPTSTR pszName, PDWORD pcchName, 
    PFILETIME pftLastWriteTime, HANDLE hSpooler)
{
    return RegEnumKeyEx(hcKey, dwIndex, pszName, pcchName, 0, NULL, NULL,
		pftLastWriteTime);
}
 
LONG WINAPI QueryInfoKey(HANDLE hcKey, PDWORD pcSubKeys, PDWORD pcbKey, 
    PDWORD pcValues, PDWORD pcbValue, PDWORD pcbData, 
    PDWORD pcbSecurityDescriptor, PFILETIME pftLastWriteTime, HANDLE hSpooler)
{
    return RegQueryInfoKey(hcKey, NULL, NULL, 0,
	pcSubKeys, pcbKey, NULL,
	pcValues, pcbValue, pcbData, 
	pcbSecurityDescriptor, pftLastWriteTime);
}

LONG WINAPI SetValue(HANDLE hcKey, LPCTSTR pszValue, DWORD dwType, const BYTE* pData, 
    DWORD cbData, HANDLE hSpooler)
{
    return RegSetValueEx(hcKey, pszValue, 0, dwType,
		pData, cbData);
}

LONG WINAPI DeleteValue(HANDLE hcKey, LPCTSTR pszValue, HANDLE hSpooler)
{
    return RegDeleteValue(hcKey, pszValue); 
}

LONG WINAPI EnumValue(HANDLE hcKey, DWORD dwIndex, LPTSTR pszValue, PDWORD pcbValue, 
    PDWORD pType, PBYTE pData, PDWORD pcbData, HANDLE hSpooler)
{
    return RegEnumValue(hcKey, dwIndex, pszValue, pcbValue,
		NULL, pType, pData, pcbData);
}

LONG WINAPI QueryValue(HANDLE hcKey, LPCTSTR pszValue, PDWORD pType, PBYTE pData, 
    PDWORD pcbData, HANDLE hSpooler)
{
    return RegQueryValueEx(hcKey, pszValue, 0, pType, 
	    pData, pcbData);
}

MONITORREG mr = {
    sizeof(MONITORREG),
    CreateKey,
    OpenKey,
    CloseKey,
    DeleteKey,
    EnumKey,
    QueryInfoKey,
    SetValue,
    DeleteValue,
    EnumValue,
    QueryValue
};

MONITORINIT mi = {
    sizeof(MONITORINIT),
    NULL, 	/* hSpooler */
    NULL, 	/* hckRegistryRoot - needs updating */
    &mr,	/* pMonitorReg */
    TRUE,	/* bLocal */
};
#endif	/* NT50 */



BYTE pPorts[4096];
DWORD cbBuf, cbNeeded, cReturned;
TCHAR mess[MAXSTR];
#define QUICKBROWN "The quick brown fox jumps over the lazy dog."
/*
#define PSTEST "(c:/rjl/monitor/test.txt) (w) file\n dup (Hello, world\\n) writestring closefile\n(Hello, world\\n) print flush\n"
#define PSTEST "(c:/gstools/gs5.50/colorcir.ps) run flush\n"
#define PSTEST "(d:/data/src/a20.ps) run flush\n"
*/
#define PSTEST "(d:/rjl/src/a20.ps) run flush\n"

#ifdef NT50
/* test Windows 2000 monitor on Nt4.0 */
int PASCAL 
WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpszCmdLine, int cmdShow)
{
    LONG rc;
    BOOL flag;
    DWORD dwError;
    DWORD written;
    HANDLE hport;
    PORT_INFO_2 *pi2;
    PORT_INFO_1 *pi1;
    DOC_INFO_1 dci1;
    int i;
    LPMONITOR2 pmon;
    HANDLE hMonitor;
    HANDLE hXcv;
    TCHAR monitorname[256];
    TCHAR mess[256];
    TCHAR portname[MAXSTR];
    hdll = hInstance;
    rc = RegOpenKeyEx(HKEY_LOCAL_MACHINE, 
/*
	TEXT("System\\CurrentControlSet\\control\\Print\\Monitors\\Redirected Port"),
*/
	TEXT("System\\CurrentControlSet\\Control\\Print\\Monitors\\Bardimm Plugin test"),
	0, KEY_ALL_ACCESS, (PHKEY)&(mi.hckRegistryRoot));
    pmon = InitializePrintMonitor2(&mi, &hMonitor);

    LoadString(hdll, IDS_MONITORNAME, monitorname, 
	sizeof(monitorname)/sizeof(TCHAR)-1);

    /* need test local version of XcvData which calls rsXcvDataPort directly */
    flag = rsXcvOpenPort(hMonitor, TEXT("RPT1:"), SERVER_ACCESS_ADMINISTER, &hXcv);
    /* interactive add port */
    dwError = cAddPortUI(hXcv, HWND_DESKTOP, TEXT("RPT1:"), portname);
    /* interactive configure port */
    dwError = cConfigurePortUI(hXcv, HWND_DESKTOP, TEXT("RPT1:"));
    flag = rsXcvClosePort(hXcv);

    cbBuf = 0;
    flag = rsEnumPorts(hMonitor, NULL, 2, pPorts, cbBuf, &cbNeeded, &cReturned);
    cbBuf = cbNeeded;
    flag = rsEnumPorts(hMonitor, NULL, 2, pPorts, cbBuf, &cbNeeded, &cReturned);
    pi2 = (PORT_INFO_2 *)pPorts;

    for (i=0; i<cReturned; i++) {
	wsprintf(mess, TEXT("\042%s\042 \042%s\042 \042%s\042 %d\n"), 
	   pi2[i].pPortName,
	   pi2[i].pMonitorName,
	   pi2[i].pDescription,
	   pi2[i].fPortType
	   );
        MessageBox(NULL, mess, TEXT("EXE for Redirect Monitor"), MB_OK);
    }

    flag = rsOpenPort(hMonitor, TEXT("RPT1:"), &hport);
    dci1.pDocName = TEXT("Test document");
    dci1.pOutputFile = NULL;
    dci1.pDatatype = NULL;
    flag = rStartDocPort(hport, TEXT("Apple LaserWriter II NT v47.0"), 1, 1, (LPBYTE)&dci1);
//    rWritePort(hport, (LPBYTE)&QUICKBROWN, strlen(QUICKBROWN), &written);
    flag = rWritePort(hport, (LPBYTE)&PSTEST, strlen(PSTEST), &written);
    flag = rWritePort(hport, (LPBYTE)&PSTEST, strlen(PSTEST), &written);
    flag = rEndDocPort(hport);
    flag = rClosePort(hport);

    flag = sDeletePort(hMonitor, TEXT("RPT2:"));
    flag = sDeletePort(hMonitor, TEXT("RPT3:"));
    flag = sDeletePort(hMonitor, TEXT("RPT4:"));

    RegCloseKey((HKEY)(mi.hckRegistryRoot));

    return 0;
}

#else
int PASCAL 
WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpszCmdLine, int cmdShow)
{
    LONG rc;
    DWORD written;
    HANDLE hport;
    PORT_INFO_2 *pi2;
    PORT_INFO_1 *pi1;
    DOC_INFO_1 dci1;
    int i;
#ifdef UNICODE
#ifdef NT50
    LPMONITOR2 pmon;
    HMONITOR hMonitor;
#else
    LPMONITOREX pmon;
#endif
#else
    MONITOR mon;
#endif
    TCHAR monitorname[256];
    TCHAR mess[256];
    hdll = hInstance;
#ifdef UNICODE
#ifdef NT50
    rc = RegOpenKeyEx(HKEY_LOCAL_MACHINE, 
	TEXT("System\\CurrentControlSet\\control\\Print\\Monitors\\Redirected Port"),
	0, samDesired, (PHKEY)&(mi.hckRegistryRoot));
    pmon = InitializePrintMonitor2(&mi, &hMonitor);
#else
    pmon = InitializePrintMonitor(TEXT("System\\CurrentControlSet\\control\\Print\\Monitors\\Redirected Port"));
#endif
#else
    InitializeMonitorEx(TEXT("System\\CurrentControlSet\\control\\Print\\Monitors\\Redirected Port"), &mon);
#endif

    LoadString(hdll, IDS_MONITORNAME, monitorname, 
	sizeof(monitorname)/sizeof(TCHAR)-1);

#ifdef UNUSED
    rAddPort(NULL, HWND_DESKTOP, monitorname);
    rAddPort(NULL, HWND_DESKTOP, monitorname);
#endif
    rAddPort(NULL, HWND_DESKTOP, monitorname);

#ifdef UNICODE
    pi2 = (PORT_INFO_2 *)malloc(sizeof(PORT_INFO_2));
    pi2->pPortName = TEXT("RPT7:");
    pi2->pMonitorName = MONITORNAME;
    pi2->pDescription = TEXT("Redirected Port 7");
    pi2->fPortType = PORT_TYPE_WRITE;
    pi2->Reserved = 0;
    rAddPortEx(NULL, 2, (PBYTE)pi2, TEXT("Redirected Port"));
/*
    rDeletePort(NULL, HWND_DESKTOP, TEXT("RPT7:"));
*/

    pi1 = (PORT_INFO_1 *)malloc(sizeof(PORT_INFO_1));
    pi1->pName = TEXT("RPT8:");
    rAddPortEx(NULL, 1, (PBYTE)pi1, TEXT("Redirected Port"));
    rDeletePort(NULL, HWND_DESKTOP, TEXT("RPT8:"));
    free(pi2);
#endif
    rConfigurePort(NULL, HWND_DESKTOP, TEXT("RPT1:"));

    cbBuf = 0;
    rEnumPorts(NULL, 2, pPorts, cbBuf, &cbNeeded, &cReturned);
    cbBuf = cbNeeded;
    rEnumPorts(NULL, 2, pPorts, cbBuf, &cbNeeded, &cReturned);
    pi2 = (PORT_INFO_2 *)pPorts;

    for (i=0; i<cReturned; i++) {
	wsprintf(mess, TEXT("\042%s\042 \042%s\042 \042%s\042 %d\n"), 
	   pi2[i].pPortName,
	   pi2[i].pMonitorName,
	   pi2[i].pDescription,
	   pi2[i].fPortType
	   );
        MessageBox(NULL, mess, TEXT("EXE for Redirect Monitor"), MB_OK);
    }
#ifdef UNUSED
#endif

    rOpenPort(TEXT("RPT1:"), &hport);
    dci1.pDocName = TEXT("Test document");
    dci1.pOutputFile = NULL;
    dci1.pDatatype = NULL;
#ifdef UNICODE
    rStartDocPort(hport, TEXT("Apple LaserWriter II NT v47.0"), 1, 1, (LPBYTE)&dci1);
#else
    rStartDocPort(hport, TEXT("Apple LaserWriter II NT"), 1, 1, (LPBYTE)&dci1);
#endif
//    rWritePort(hport, (LPBYTE)&QUICKBROWN, strlen(QUICKBROWN), &written);
    rWritePort(hport, (LPBYTE)&PSTEST, strlen(PSTEST), &written);
    rWritePort(hport, (LPBYTE)&PSTEST, strlen(PSTEST), &written);
    rEndDocPort(hport);
    rClosePort(hport);

    rDeletePort(NULL, HWND_DESKTOP, TEXT("RPT2:"));
    rDeletePort(NULL, HWND_DESKTOP, TEXT("RPT3:"));
    rDeletePort(NULL, HWND_DESKTOP, TEXT("RPT4:"));

    return 0;
}
#endif	/* ! NT50 */

#endif	/* MAKEEXE */

/* end of portmon.c */

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?