380 lines
7.7 KiB
C
380 lines
7.7 KiB
C
|
/*****
|
|||
|
AppleTalk Print Monitor
|
|||
|
|
|||
|
(c) Microsoft 1992, all rights reserved
|
|||
|
|
|||
|
FILE NAME: atalkmon.h
|
|||
|
|
|||
|
DESCRIPTION: This is the interface to the main module for
|
|||
|
the AppleTalk Print Monitor.
|
|||
|
|
|||
|
AUTHOR: Frank D. Byrum
|
|||
|
|
|||
|
MODIFICATION HISTORY:
|
|||
|
|
|||
|
date who description
|
|||
|
|
|||
|
26-Aug-92 frankb Initial version
|
|||
|
*****/
|
|||
|
|
|||
|
#define APPLETALK_SERVICE_NAME TEXT("AppleTalk")
|
|||
|
|
|||
|
|
|||
|
/***** REGISTRY USAGE
|
|||
|
|
|||
|
AppleTalk port information is kept in the registry using the
|
|||
|
registry API of Win32. The monitor is installed by creating
|
|||
|
a registry key, "AppleTalk Printers" at
|
|||
|
|
|||
|
HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Print\Monitors
|
|||
|
|
|||
|
This key is refered to as the AppleTalk Monitor root key. Two
|
|||
|
subkey of this root key are created. "Options" contains registry
|
|||
|
values for configuration options for the monitor on a global
|
|||
|
scale, and "Ports" contains subkeys for each AppleTalk printer
|
|||
|
defined.
|
|||
|
|
|||
|
The name of the port subkey is the port name for the printer
|
|||
|
as viewed in the NT Print Manager port list. This key contains
|
|||
|
a number of values describing the port, including:
|
|||
|
|
|||
|
REG_DWORD: TimeOut Number of miliseconds to wait for writes to
|
|||
|
the printer to complete
|
|||
|
|
|||
|
REG_DWORD: ConfigFlags Set of flags describing configuration of the
|
|||
|
port. Currently only includes the flag
|
|||
|
indicating the printer is captured.
|
|||
|
|
|||
|
REG_BINARY: NBP Name NBP name of the printer as an NBP_NAME structure
|
|||
|
|
|||
|
The "Options" subkey contains a number of registry values, including:
|
|||
|
|
|||
|
REG_DWORD: DebugLevel
|
|||
|
REG_DWORD: DebugSystems
|
|||
|
REG_SZ: LogFile
|
|||
|
|
|||
|
*****/
|
|||
|
|
|||
|
#define PRINTER_ENUM_BUFFER_SIZE 1024
|
|||
|
#define GENERIC_BUFFER_SIZE 512
|
|||
|
#define STATUS_BUFFER_SIZE 100
|
|||
|
|
|||
|
//
|
|||
|
// registry keys
|
|||
|
//
|
|||
|
|
|||
|
#define ATALKMON_PORTS_SUBKEY TEXT("\\Ports")
|
|||
|
#define ATALKMON_OPTIONS_SUBKEY TEXT("Options")
|
|||
|
|
|||
|
//
|
|||
|
// registry value names
|
|||
|
//
|
|||
|
|
|||
|
#define ATALKMON_CONFIGFLAGS_VALUE "Configuration Flags"
|
|||
|
#define ATALKMON_ZONENAME_VALUE "Zone Name"
|
|||
|
#define ATALKMON_PORTNAME_VALUE "Port Name"
|
|||
|
#define ATALKMON_PORT_CAPTURED "Port Captured"
|
|||
|
|
|||
|
#define ATALKMON_FILTER_VALUE TEXT("Filter")
|
|||
|
#define ATALKMON_LOGFILE_VALUE TEXT("LogFile")
|
|||
|
|
|||
|
//
|
|||
|
// config flags
|
|||
|
//
|
|||
|
|
|||
|
#define SFM_PORT_CAPTURED 0x00000001
|
|||
|
#define SFM_PORT_IN_USE 0x00000002
|
|||
|
#define SFM_PORT_POST_READ 0x00000004
|
|||
|
#define SFM_PORT_OPEN 0x00000008
|
|||
|
#define SFM_PORT_CLOSE_PENDING 0x00000010
|
|||
|
#define SFM_PORT_IS_SPOOLER 0x00000020
|
|||
|
|
|||
|
|
|||
|
//
|
|||
|
// job flags
|
|||
|
//
|
|||
|
|
|||
|
#define SFM_JOB_FIRST_WRITE 0x00000001
|
|||
|
#define SFM_JOB_FILTER 0x00000002
|
|||
|
#define SFM_JOB_DISCONNECTED 0x00000004
|
|||
|
#define SFM_JOB_OPEN_PENDING 0x00000008
|
|||
|
#define SFM_JOB_ERROR 0x00000010
|
|||
|
|
|||
|
//
|
|||
|
// Various timeout values.
|
|||
|
//
|
|||
|
#define ATALKMON_DEFAULT_TIMEOUT 5000
|
|||
|
#define ATALKMON_DEFAULT_TIMEOUT_SEC 5
|
|||
|
#define CONFIG_TIMEOUT (5*60*1000)
|
|||
|
|
|||
|
//
|
|||
|
// filter characters
|
|||
|
//
|
|||
|
|
|||
|
#define CTRL_C 0x03
|
|||
|
#define CTRL_D 0x04
|
|||
|
#define CTRL_S 0x13
|
|||
|
#define CTRL_Q 0x11
|
|||
|
#define CTRL_T 0x14
|
|||
|
#define CR 0x0d
|
|||
|
|
|||
|
//
|
|||
|
// postscript commands to instruct the printer to ignore ctrl-c (\0x003), ctrl-d (\004),
|
|||
|
// ctrl-q (\021), ctrl-s (\023), ctrl-t (\024) and escape (\033) characters.
|
|||
|
// The last part (/@PJL { currentfile .... bind def) is dual-mode printer specific stuff:
|
|||
|
// it tells it to ignore anything starting with /@PJL. This last part is based on the
|
|||
|
// assumption that no postscript implementation ever uses anything starting with @PJL as
|
|||
|
// a valid command - it's a pretty safe assumption, but something to remember.
|
|||
|
//
|
|||
|
#define PS_HEADER "(\033) cvn {} def\r\n/@PJL { currentfile 256 string readline pop pop } bind def\r\n"
|
|||
|
#define SIZE_PS_HEADER (sizeof(PS_HEADER) - 1)
|
|||
|
|
|||
|
#define PJL_ENDING_COMMAND "\033%-12345X@PJL EOJ\n\033%-12345X"
|
|||
|
#define PJL_ENDING_COMMAND_LEN (sizeof(PJL_ENDING_COMMAND) - 1)
|
|||
|
|
|||
|
//
|
|||
|
// NBP types
|
|||
|
//
|
|||
|
|
|||
|
#define ATALKMON_RELEASED_TYPE "LaserWriter"
|
|||
|
|
|||
|
#define ATALKMON_CAPTURED_TYPE " LaserWriter"
|
|||
|
|
|||
|
#define PAP_QUANTUM_SIZE 512
|
|||
|
#define PAP_DEFAULT_QUANTUM 8
|
|||
|
#define PAP_DEFAULT_BUFFER (PAP_DEFAULT_QUANTUM*PAP_QUANTUM_SIZE)
|
|||
|
|
|||
|
|
|||
|
//
|
|||
|
// Data structures used.
|
|||
|
//
|
|||
|
|
|||
|
typedef struct _ATALKPORT
|
|||
|
{
|
|||
|
struct _ATALKPORT * pNext;
|
|||
|
|
|||
|
// Get/Set is protected by hmutexPortList.
|
|||
|
DWORD fPortFlags;
|
|||
|
|
|||
|
// These flags do not need mutual exclusion since only the current
|
|||
|
// job will look at them. There will be no contention.
|
|||
|
DWORD fJobFlags;
|
|||
|
|
|||
|
HANDLE hmutexPort;
|
|||
|
HANDLE hPrinter;
|
|||
|
DWORD dwJobId;
|
|||
|
SOCKET sockQuery;
|
|||
|
SOCKET sockIo;
|
|||
|
SOCKET sockStatus;
|
|||
|
WSH_NBP_NAME nbpPortName;
|
|||
|
WSH_ATALK_ADDRESS wshatPrinterAddress;
|
|||
|
DWORD OnlyOneByteAsCtrlD;
|
|||
|
WCHAR pPortName[(MAX_ENTITY+1)*2];
|
|||
|
UCHAR pReadBuffer[PAP_DEFAULT_BUFFER];
|
|||
|
} ATALKPORT;
|
|||
|
|
|||
|
typedef ATALKPORT * PATALKPORT;
|
|||
|
typedef SOCKET * PSOCKET;
|
|||
|
|
|||
|
typedef struct _TOKENLIST
|
|||
|
{
|
|||
|
LPSTR pszToken;
|
|||
|
DWORD dwError;
|
|||
|
DWORD dwStatus;
|
|||
|
} TOKENLIST, *PTOKENLIST;
|
|||
|
|
|||
|
|
|||
|
//
|
|||
|
//***** GLOBAL VARIABLES
|
|||
|
//
|
|||
|
|
|||
|
#ifdef ALLOCATE
|
|||
|
|
|||
|
HANDLE hInst;
|
|||
|
HKEY hkeyPorts = NULL;
|
|||
|
HANDLE hmutexPortList = NULL;
|
|||
|
HANDLE hmutexDeleteList= NULL;
|
|||
|
HANDLE hmutexBlt = NULL;
|
|||
|
HANDLE hmutexJob = NULL;
|
|||
|
PATALKPORT pPortList = NULL;
|
|||
|
PATALKPORT pDeleteList = NULL;
|
|||
|
HANDLE hEventLog = NULL;
|
|||
|
HANDLE hevConfigChange = NULL;
|
|||
|
HANDLE hevPrimeRead = NULL;
|
|||
|
HANDLE hCapturePrinterThread = INVALID_HANDLE_VALUE;
|
|||
|
HANDLE hReadThread = INVALID_HANDLE_VALUE;
|
|||
|
BOOL boolExitThread = FALSE, Filter = TRUE;
|
|||
|
CHAR chComputerName[MAX_ENTITY+1];
|
|||
|
WCHAR wchBusy[STATUS_BUFFER_SIZE];
|
|||
|
WCHAR wchPrinting[STATUS_BUFFER_SIZE];
|
|||
|
WCHAR wchPrinterError[STATUS_BUFFER_SIZE];
|
|||
|
WCHAR wchPrinterOffline[STATUS_BUFFER_SIZE];
|
|||
|
WCHAR wchDllName[STATUS_BUFFER_SIZE];
|
|||
|
WCHAR wchPortDescription[STATUS_BUFFER_SIZE];
|
|||
|
|
|||
|
#ifdef DEBUG_MONITOR
|
|||
|
|
|||
|
HANDLE hLogFile = INVALID_HANDLE_VALUE ;
|
|||
|
|
|||
|
#endif
|
|||
|
|
|||
|
#else
|
|||
|
|
|||
|
extern HANDLE hInst;
|
|||
|
extern HKEY hkeyPorts;
|
|||
|
extern HANDLE hmutexPortList;
|
|||
|
extern HANDLE hmutexDeleteList;
|
|||
|
extern HANDLE hmutexBlt;
|
|||
|
extern HANDLE hmutexJob;
|
|||
|
extern PATALKPORT pPortList;
|
|||
|
extern PATALKPORT pDeleteList;
|
|||
|
extern HANDLE hEventLog;
|
|||
|
extern HANDLE hevConfigChange;
|
|||
|
extern HANDLE hevPrimeRead;
|
|||
|
extern HANDLE hCapturePrinterThread;
|
|||
|
extern HANDLE hReadThread;
|
|||
|
extern BOOL boolExitThread, Filter;
|
|||
|
extern CHAR chComputerName[];
|
|||
|
extern WCHAR wchBusy[];
|
|||
|
extern WCHAR wchPrinting[];
|
|||
|
extern WCHAR wchPrinterError[];
|
|||
|
extern WCHAR wchPrinterOffline[];
|
|||
|
extern WCHAR wchDllName[];
|
|||
|
extern WCHAR wchPortDescription[];
|
|||
|
|
|||
|
#ifdef DEBUG_MONITOR
|
|||
|
|
|||
|
extern HANDLE hLogFile;
|
|||
|
|
|||
|
#endif
|
|||
|
|
|||
|
#endif
|
|||
|
|
|||
|
#ifdef DEBUG_MONITOR
|
|||
|
|
|||
|
VOID
|
|||
|
DbgPrintf(
|
|||
|
char *Format,
|
|||
|
...
|
|||
|
);
|
|||
|
|
|||
|
#define DBGPRINT(args) DbgPrintf args
|
|||
|
|
|||
|
#else
|
|||
|
|
|||
|
#define DBGPRINT(args)
|
|||
|
|
|||
|
#endif
|
|||
|
|
|||
|
|
|||
|
//***** FUNCTION PROTOTYPES
|
|||
|
|
|||
|
DWORD
|
|||
|
CapturePrinterThread(
|
|||
|
IN LPVOID pParameterBlock
|
|||
|
);
|
|||
|
|
|||
|
DWORD
|
|||
|
ReadThread(
|
|||
|
IN LPVOID pParameterBlock
|
|||
|
);
|
|||
|
|
|||
|
DWORD
|
|||
|
CaptureAtalkPrinter(
|
|||
|
IN SOCKET sock,
|
|||
|
IN PWSH_ATALK_ADDRESS pAddress,
|
|||
|
IN BOOL fCapture
|
|||
|
);
|
|||
|
|
|||
|
DWORD
|
|||
|
TransactPrinter(
|
|||
|
IN SOCKET sock,
|
|||
|
IN PWSH_ATALK_ADDRESS pAddress,
|
|||
|
IN LPBYTE pRequest,
|
|||
|
IN DWORD cbRequest,
|
|||
|
IN LPBYTE pResponse,
|
|||
|
IN DWORD cbResponse
|
|||
|
);
|
|||
|
|
|||
|
VOID
|
|||
|
ParseAndSetPrinterStatus(
|
|||
|
IN PATALKPORT pPort
|
|||
|
);
|
|||
|
|
|||
|
DWORD
|
|||
|
ConnectToPrinter(
|
|||
|
IN PATALKPORT pPort,
|
|||
|
IN DWORD dwTimeout
|
|||
|
);
|
|||
|
|
|||
|
DWORD
|
|||
|
SetPrinterStatus(
|
|||
|
IN PATALKPORT pPort,
|
|||
|
IN LPWSTR lpwsStatus
|
|||
|
);
|
|||
|
|
|||
|
PATALKPORT
|
|||
|
AllocAndInitializePort(
|
|||
|
VOID
|
|||
|
);
|
|||
|
|
|||
|
VOID
|
|||
|
FreeAppleTalkPort(
|
|||
|
IN PATALKPORT pNewPort
|
|||
|
);
|
|||
|
|
|||
|
DWORD
|
|||
|
LoadAtalkmonRegistry(
|
|||
|
IN HKEY hkeyPorts
|
|||
|
);
|
|||
|
|
|||
|
DWORD
|
|||
|
CreateRegistryPort(
|
|||
|
IN PATALKPORT pNewPort
|
|||
|
);
|
|||
|
|
|||
|
DWORD
|
|||
|
SetRegistryInfo(
|
|||
|
IN PATALKPORT pWalker
|
|||
|
);
|
|||
|
|
|||
|
DWORD
|
|||
|
WinSockNbpLookup(
|
|||
|
SOCKET sQuerySocket,
|
|||
|
PCHAR pchZone,
|
|||
|
PCHAR pchType,
|
|||
|
PCHAR pchObject,
|
|||
|
PWSH_NBP_TUPLE pTuples,
|
|||
|
DWORD cbTuples,
|
|||
|
PDWORD pcTuplesFound);
|
|||
|
|
|||
|
DWORD
|
|||
|
OpenAndBindAppleTalkSocket(
|
|||
|
IN PSOCKET pSocket
|
|||
|
);
|
|||
|
|
|||
|
DWORD
|
|||
|
CapturePrinter(
|
|||
|
IN PATALKPORT pPort,
|
|||
|
IN BOOL fCapture
|
|||
|
);
|
|||
|
|
|||
|
DWORD
|
|||
|
IsSpooler(
|
|||
|
IN PWSH_ATALK_ADDRESS pAddress,
|
|||
|
IN OUT BOOL * pfSpooler
|
|||
|
);
|
|||
|
|
|||
|
VOID
|
|||
|
GetAndSetPrinterStatus(
|
|||
|
IN PATALKPORT pPort
|
|||
|
);
|
|||
|
|
|||
|
BOOLEAN
|
|||
|
IsJobFromMac(
|
|||
|
IN PATALKPORT pPort
|
|||
|
);
|
|||
|
|
|||
|
|
|||
|
|