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 + -
显示快捷键?