📄 parport.h
字号:
//
DEVICE_POWER_STATE DeviceState;
SYSTEM_POWER_STATE SystemState;
FAST_MUTEX ExtensionFastMutex;
FAST_MUTEX OpenCloseMutex;
KEVENT FdoThreadEvent; // polling for printers thread waits w/timeout on this event
WMILIB_CONTEXT WmiLibContext;
PARPORT_WMI_ALLOC_FREE_COUNTS WmiPortAllocFreeCounts;
BOOLEAN CheckedForGenericEpp; // did we check for Generic (via the ECR) EPP capability?
BOOLEAN FdoWaitingOnPort;
BOOLEAN spare[2];
// Used to increase our confidence that this is a ParPort extension
ULONG Signature2;
} FDO_EXTENSION, *PFDO_EXTENSION;
typedef struct _PDO_EXTENSION {
COMMON_EXTENSION;
ULONG DeviceStateFlags; // Device State - See Device State Flags above
ULONG DeviceType; // - deprecated, use DevType in COMMON_EXTENSION - PAR_DEVTYPE_FDO=0x1, PODO=0x2, or PDO=0x4
enum _PdoType PdoType;
PDEVICE_OBJECT Fdo; // Points to our FDO (bus driver/parent device)
PCHAR Mfg; // MFG field from device's IEEE 1284 ID string
PCHAR Mdl; // MDL field from device's IEEE 1284 ID string
PCHAR Cid; // CID (Compatible ID) field from device's IEEE 1284 ID string
PWSTR PdoName; // name used in call to IoCreateDevice
PWSTR SymLinkName; // name used in call to IoCreateUnprotectedSymbolicLink
LIST_ENTRY DevDeletionList; // used by driver to create list of PDOs to delete on Driver Unload
// UCHAR DaisyChainId; // 0..3 if PdoTypeDaisyChain, ignored otherwise
UCHAR Ieee1284_3DeviceId; // PDO - 0..3 is 1284.3 Daisy Chain device, 4 is End-Of-Chain Device, 5 is Legacy Zip
BOOLEAN IsPdo; // TRUE == this is either a PODO or a PDO - use DeviceIdString[0] to distinguish
BOOLEAN EndOfChain; // PODO - TRUE==NOT a .3 daisy chain dev - deprecated, use Ieee1284_3DeviceId==4 instead
BOOLEAN PodoRegForWMI; // has this PODO registered for WMI callbacks?
PDEVICE_OBJECT ParClassFdo; // P[O]DO - points to the ParClass FDO
PDEVICE_OBJECT ParClassPdo; // FDO - points to first P[O]DO in list of ParClass created PODOs and PDOs
PDEVICE_OBJECT Next; // P[O]DO - points to the next DO in the list of ParClass ejected P[O]DOs
PDEVICE_OBJECT PortDeviceObject; // P[O]DO - points to the associated ParPort device object
PFILE_OBJECT PortDeviceFileObject;// P[O]DO - referenced pointer to a FILE created against PortDeviceObject
UNICODE_STRING PortSymbolicLinkName;// P[O]DO - Sym link name of the assoc ParPort device - used to open a FILE
PDEVICE_OBJECT PhysicalDeviceObject;// FDO - The PDO passed to ParPnPAddDevice
PDEVICE_OBJECT ParentDeviceObject; // FDO - parent DO returned by IoAttachDeviceToDeviceStack
PIRP CurrentOpIrp; // IRP that our thread is currently processing
PVOID NotificationHandle; // PlugPlay Notification Handle
ULONG Event22Delay; // time in microseconds to delay prior to setting event 22 in IEEE 1284 Termination
ULONG TimerStart; // initial value used for countdown when starting an operation
BOOLEAN CreatedSymbolicLink; // P[O]DO - did we create a Symbolic Link for this device?
BOOLEAN UsePIWriteLoop; // P[O]DO - do we want to use processor independant write loop?
BOOLEAN ParPortDeviceGone; // Is our ParPort device object gone, possibly surprise removed?
BOOLEAN RegForPptRemovalRelations; // Are we registered for ParPort removal relations?
UCHAR Ieee1284Flags; // is device Stl older 1284.3 spec device?
BOOLEAN DeleteOnRemoveOk; // True means that it is OK to call IoDeleteDevice during IRP_MN_REMOVE_DEVICE processing
// - FDO sets this to True during QDR/BusRelations processing if it detects that the hardware
// is no longer present.
USHORT IdxForwardProtocol; // see afpForward[] in ieee1284.c
USHORT IdxReverseProtocol; // see arpReverse[] in ieee1284.c
ULONG CurrentEvent; // IEEE 1284 event - see IEEE 1284-1994 spec
P1284_PHASE CurrentPhase; // see parallel.h for enum def - PHASE_UNKNOWN, ..., PHASE_INTERRUPT_HOST
P1284_HW_MODE PortHWMode; // see parallel.h for enum def - HW_MODE_COMPATIBILITY, ..., HW_MODE_CONFIGURATION
FAST_MUTEX OpenCloseMutex; // protect manipulation of OpenCloseRefCount
FAST_MUTEX DevObjListMutex; // protect manipulation of list of ParClass ejected DOs
LIST_ENTRY WorkQueue; // Queue of irps waiting to be processed.
KSEMAPHORE RequestSemaphore;// dispatch routines use this to tell device worker thread that there is work to do
//
// PARALLEL_PORT_INFORMATION returned by IOCTL_INTERNAL_GET_PARALLEL_PORT_INFO
//
PHYSICAL_ADDRESS OriginalController;
PUCHAR Controller;
PUCHAR EcrController;
ULONG SpanOfController;
PPARALLEL_TRY_ALLOCATE_ROUTINE TryAllocatePort; // nonblocking callback to allocate ParPort device
PPARALLEL_FREE_ROUTINE FreePort; // callback to free ParPort device
PPARALLEL_QUERY_WAITERS_ROUTINE QueryNumWaiters; // callback to query number of waiters in port allocation queue
PVOID PortContext; // context for callbacks to ParPort
//
// subset of PARALLEL_PNP_INFORMATION returned by IOCTL_INTERNAL_GET_PARALLEL_PNP_INFO
//
ULONG HardwareCapabilities;
PPARALLEL_SET_CHIP_MODE TrySetChipMode;
PPARALLEL_CLEAR_CHIP_MODE ClearChipMode;
PPARALLEL_TRY_SELECT_ROUTINE TrySelectDevice;
PPARALLEL_DESELECT_ROUTINE DeselectDevice;
ULONG FifoDepth;
ULONG FifoWidth;
BOOLEAN bAllocated; // have we allocated associated ParPort device?
// Note: during some PnP processing we may have the port
// for a short duration without setting this value to TRUE
ULONG BusyDelay; // number of microseconds to wait after strobing a byte before checking the BUSY line.
BOOLEAN BusyDelayDetermined;// Indicates if the BusyDelay parameter has been computed yet.
PWORK_QUEUE_ITEM DeferredWorkItem; // Holds the work item used to defer printer initialization
// If the registry entry by the same name is set, run the parallel
// thread at the priority we used for NT 3.5 - this solves some
// cases where a dos app spinning for input in the foreground is
// starving the parallel thread
BOOLEAN UseNT35Priority;
ULONG InitializationTimeout;// timeout in seconds to wait for device to respond to an initialization request
// - default == 15 seconds
// - value overridden by registry entry of same name
// - we will spin for max amount if no device attached
LARGE_INTEGER AbsoluteOneSecond;// constants that are cheaper to put here rather
LARGE_INTEGER OneSecond; // than in bss
//
// IEEE 1284 Mode support
//
PPROTOCOL_READ_ROUTINE fnRead; // Current pointer to a valid read funtion
PPROTOCOL_WRITE_ROUTINE fnWrite; // Current pointer to a valid write Funtion
BOOLEAN Connected; // are we currently negotiated into a 1284 mode?
BOOLEAN AllocatedByLockPort; // are we currently allocated via IOCTL_INTERNAL_LOCK_PORT?
USHORT spare4[2];
LARGE_INTEGER IdleTimeout; // how long do we hold the port on the caller's behalf following an operation?
USHORT ProtocolData[FAMILY_MAX];
UCHAR ForwardInterfaceAddress;
UCHAR ReverseInterfaceAddress;
BOOLEAN SetForwardAddress;
BOOLEAN SetReverseAddress;
FAST_MUTEX LockPortMutex;
DEVICE_POWER_STATE DeviceState;// Current Device Power State
SYSTEM_POWER_STATE SystemState;// Current System Power State
ULONG spare2;
BOOLEAN bShadowBuffer;
Queue ShadowBuffer;
ULONG spare3;
BOOLEAN bSynchWrites; // TRUE if ECP HW writes should be synchronous
BOOLEAN bFirstByteTimeout; // TRUE if bus just reversed, means give the
// device some time to respond with some data
BOOLEAN bIsHostRecoverSupported; // Set via IOCTL_PAR_ECP_HOST_RECOVERY.
// HostRecovery will not be utilized unless this bit is set
KEVENT PauseEvent; // PnP dispatch routine uses this to pause worker thread during
// during QUERY_STOP, STOP, and QUERY_REMOVE states
USHORT ProtocolModesSupported;
USHORT BadProtocolModes;
PARALLEL_SAFETY ModeSafety;
BOOLEAN IsIeeeTerminateOk;
DOT3DL_PCTL P12843DL;
// WMI
PARALLEL_WMI_LOG_INFO log;
WMILIB_CONTEXT WmiLibContext;
LONG WmiRegistrationCount; // number of times this device has registered with WMI
// PnP Query ID results
UCHAR DeviceIdString[MAX_ID_SIZE]; // IEEE 1284 DeviceID string massaged/checksum'd to match INF form
UCHAR DeviceDescription[MAX_ID_SIZE]; // "Manufacturer<SPACE>Model" from IEEE 1284 DeviceID string
ULONG dummy; // dummy word to force RemoveLock to QuadWord alignment
PVOID HwProfileChangeNotificationHandle;
ULONG Signature2; // keep this the last member in extension
} PDO_EXTENSION, *PPDO_EXTENSION;
typedef struct _SYNCHRONIZED_COUNT_CONTEXT {
PLONG Count;
LONG NewCount;
} SYNCHRONIZED_COUNT_CONTEXT, *PSYNCHRONIZED_COUNT_CONTEXT;
typedef struct _SYNCHRONIZED_LIST_CONTEXT {
PLIST_ENTRY List;
PLIST_ENTRY NewEntry;
} SYNCHRONIZED_LIST_CONTEXT, *PSYNCHRONIZED_LIST_CONTEXT;
typedef struct _SYNCHRONIZED_DISCONNECT_CONTEXT {
PFDO_EXTENSION Extension;
PPARALLEL_INTERRUPT_SERVICE_ROUTINE IsrInfo;
} SYNCHRONIZED_DISCONNECT_CONTEXT, *PSYNCHRONIZED_DISCONNECT_CONTEXT;
typedef struct _ISR_LIST_ENTRY {
LIST_ENTRY ListEntry;
PKSERVICE_ROUTINE ServiceRoutine;
PVOID ServiceContext;
PPARALLEL_DEFERRED_ROUTINE DeferredPortCheckRoutine;
PVOID CheckContext;
} ISR_LIST_ENTRY, *PISR_LIST_ENTRY;
typedef struct _REMOVAL_RELATIONS_LIST_ENTRY {
LIST_ENTRY ListEntry;
PDEVICE_OBJECT DeviceObject;
ULONG Flags;
UNICODE_STRING DeviceName;
} REMOVAL_RELATIONS_LIST_ENTRY, *PREMOVAL_RELATIONS_LIST_ENTRY;
// former ecp.h follows:
#define DEFAULT_ECP_CHANNEL 0
#define ParTestEcpWrite(X) \
(X->CurrentPhase != PHASE_FORWARD_IDLE && X->CurrentPhase != PHASE_FORWARD_XFER) \
? STATUS_IO_DEVICE_ERROR : STATUS_SUCCESS
// ==================================================================
// The following RECOVER codes are used for Hewlett-Packard devices.
// Do not remove any of the error codes. These recover codes are
// used to quickly get the host and periph back to a known state.
// When using a recover code, add a comment where it is used at...
#define RECOVER_0 0 // Reserved - not used anywhere
#define RECOVER_1 1 // ECP_Terminate
#define RECOVER_2 2 // SLP_SetupPhase init
#define RECOVER_3 3 // SLP_FTP init DCR
#define RECOVER_4 4 // SLP_FTP init DSR
#define RECOVER_5 5 // SLP_FTP data xfer DCR
#define RECOVER_6 6 // SLP_FRP init DCR
#define RECOVER_7 7 // SLP_FRP init DSR
#define RECOVER_8 8 // SLP_FRP state 38 DCR
#define RECOVER_9 9 // SLP_FRP state 39 DCR
#define RECOVER_10 10 // SLP_FRP state 40 DSR
#define RECOVER_11 11 // SLP_RTP init DCR
#define RECOVER_12 12 // SLP_RTP init DSR
#define RECOVER_13 13 // SLP_RTP state 43 DCR
#define RECOVER_14 14 // SLP_RFP init DCR
#define RECOVER_15 15 // SLP_RFP init DSR
#define RECOVER_16 16 // SLP_RFP state 47- DCR
#define RECOVER_17 17 // SLP_RFP state 47 DCR
#define RECOVER_18 18 // SLP_RFP state 48 DSR
#define RECOVER_19 19 // SLP_RFP state 49 DSR
#define RECOVER_20 20 // ZIP_EmptyFifo DCR
#define RECOVER_21 21 // ZIP_FTP init DCR
#define RECOVER_22 22 // ZIP_FTP init DSR
#define RECOVER_23 23 // ZIP_FTP data xfer DCR
#define RECOVER_24 24 // ZIP_FRP init DSR
#define RECOVER_25 25 // ZIP_FRP init DCR
#define RECOVER_26 26 // ZIP_FRP state 38 DCR
#define RECOVER_27 27 // ZIP_FRP state 39 DCR
#define RECOVER_28 28 // ZIP_FRP state 40 DSR
#define RECOVER_29 29 // ZIP_FRP state 41 DCR
#define RECOVER_30 30 // ZIP_RTP init DSR
#define RECOVER_31 31 // ZIP_RTP init DCR
#define RECOVER_32 32 // ZIP_RFP init DSR
#define RECOVER_33 33 // ZIP_RFP init DCR
#define RECOVER_34 34 // ZIP_RFP state 47- DCR
#define RECOVER_35 35 // ZIP_RFP state 47 DCR
#define RECOVER_36 36 // ZIP_RFP state 48 DSR
#define RECOVER_37 37 // ZIP_RFP state 49 DSR
#define RECOVER_38 38 // ZIP_RFP state 49+ DCR
#define RECOVER_39 39 // Slippy_Terminate
#define RECOVER_40 40 // ZIP_SCA init DCR
#define RECOVER_41 41 // ZIP_SCA init DSR
#define RECOVER_42 42 // SLP_SCA init DCR
#define RECOVER_43 43 // SLP_SCA init DSR
#define RECOVER_44 44 // ZIP_SP init DCR
#define RECOVER_45 45 // SIP_FRP init DSR
#define RECOVER_46 46 // SIP_FRP init DCR
#define RECOVER_47 47 // SIP_FRP state 38 DCR
#define RECOVER_48 48 // SIP_FRP state 39 DCR
#define RECOVER_49 49 // SIP_FRP state 40 DSR
#define RECOVER_50 50 // SIP_RTP init DCR
#define RECOVER_51 51 // SIP_RFP init DSR
#define RECOVER_52 52 // SIP_RFP state 43 DCR
// former ecp.h preceeds
// former hwecp.h follows
//--------------------------------------------------------------------------
// Printer status constants. Seem to only be used by hwecp
//--------------------------------------------------------------------------
#define CHKPRNOK 0xDF // DSR value indicating printer ok.
#define CHKPRNOFF1 0x87 // DSR value indicating printer off.
#define CHKPRNOFF2 0x4F // DSR value indicating printer off.
#define CHKNOCABLE 0x7F // DSR value indicating no cable.
#define CHKPRNOFLIN 0xCF // DSR value indicating printer offline.
#define CHKNOPAPER 0xEF // DSR value indicating out of paper.
#define CHKPAPERJAM 0xC7 // DSR value indicating paper jam.
// former hwecp.h preceeds
// former parclass.h follows
#define REQUEST_DEVICE_ID TRUE
#define HAVE_PORT_KEEP_PORT TRUE
// enable scans for Legacy Zip?
extern ULONG ParEnableLegacyZip;
#define PAR_LGZIP_PSEUDO_1284_ID_STRING "MFG:IMG;CMD:;MDL:VP0;CLS:SCSIADAPTER;DES:IOMEGA PARALLEL PORT"
extern PCHAR ParLegacyZipPseudoId;
#define USE_PAR3QUERYDEVICEID 1
extern LARGE_INTEGER AcquirePortTimeout; // timeout for IOCTL_INTERNAL_PARALLEL_PORT_ALLOCATE
extern ULONG g_NumPorts; // used to generate N in \Device\ParallelN ClassName
extern UNICODE_STRING RegistryPath; // copy of the registry path passed to DriverEntry()
extern ULONG DumpDevExtTable;
// Driver Globals
extern ULONG SppNoRaiseIrql; // 0 == original raise IRQL behavior in SPP
// !0 == new behavior - disable raise IRQL
// and insert some KeDelayExecutionThread
// calls while waiting for peripheral response
extern ULONG DefaultModes; // Upper USHORT is Reverse Default Mode, Lower is Forward Default Mode
// if == 0, or invalid, then use default of Nibble/Centronics
extern ULONG WarmPollPeriod; // time between polls for printers (in seconds)
extern BOOLEAN PowerStateIsAC;
extern PCALLBACK_OBJECT PowerStateCallbackObject;
extern PVOID PowerStateCallbackRegistration;
#define PAR_NO_FAST_CALLS 1
#if PAR_NO_FAST_CALLS
VOID
ParCompleteRequest(
IN PIRP Irp,
IN CCHAR PriorityBoost
);
NTSTATUS
ParCallDriver(
IN PDEVICE_OBJECT DeviceObject,
IN OUT PIRP Irp
);
#else
#define ParCompleteRequest(a,b) IoCompleteRequest(a,b)
#define ParCallDriver(a,b) IoCallDriver(a,b)
#endif
extern const PHYSICAL_ADDRESS PhysicalZero;
//
// For the above directory, the serial port will
// use the following name as the suffix of the serial
// ports for that directory. It will also append
// a number onto the end of the name. That number
// will start at 1.
//
#define DEFAULT_PARALLEL_NAME L"LPT"
//
// This is the parallel class name.
//
#define DEFAULT_NT_SUFFIX L"Parallel"
#define PARALLEL_DATA_OFFSET 0
#define PARALLEL_STATUS_OFFSET 1
#define PARALLEL_CONTROL_OFFSET 2
#define PARALLEL_REGISTER_SPAN 3
//
// Ieee 1284 constants (Protocol Families)
//
#define FAMILY_NONE 0x0
#define FAMILY_REVERSE_NIBBLE 0x1
#define FAMILY_REVERSE_BYTE 0x2
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -