📄 parallel.h
字号:
/*++
Copyright (c) 1993-1998 Microsoft Corporation
Module Name:
parallel.h
Abstract:
This file defines the services supplied by the ParPort driver.
Author:
norbertk
Revision History:
--*/
#ifndef _PARALLEL_
#define _PARALLEL_
#include <ntddpar.h>
//
// Define the parallel port device name strings.
//
#define DD_PARALLEL_PORT_BASE_NAME_U L"ParallelPort"
//
// IEEE 1284.3 Daisy Chain (DC) Device ID's range from 0 to 3. Devices
// are identified based on their connection order in the daisy chain
// relative to the other 1284.3 DC devices. Device 0 is the 1284.3 DC
// device that is closest to host port.
//
#define IEEE_1284_3_DAISY_CHAIN_MAX_ID 3
//
// NtDeviceIoControlFile internal IoControlCode values for parallel device.
//
// Legacy - acquires entire parallel "bus"
#define IOCTL_INTERNAL_PARALLEL_PORT_ALLOCATE CTL_CODE(FILE_DEVICE_PARALLEL_PORT, 11, METHOD_BUFFERED, FILE_ANY_ACCESS)
#define IOCTL_INTERNAL_GET_PARALLEL_PORT_INFO CTL_CODE(FILE_DEVICE_PARALLEL_PORT, 12, METHOD_BUFFERED, FILE_ANY_ACCESS)
#define IOCTL_INTERNAL_PARALLEL_CONNECT_INTERRUPT CTL_CODE(FILE_DEVICE_PARALLEL_PORT, 13, METHOD_BUFFERED, FILE_ANY_ACCESS)
#define IOCTL_INTERNAL_PARALLEL_DISCONNECT_INTERRUPT CTL_CODE(FILE_DEVICE_PARALLEL_PORT, 14, METHOD_BUFFERED, FILE_ANY_ACCESS)
#define IOCTL_INTERNAL_RELEASE_PARALLEL_PORT_INFO CTL_CODE(FILE_DEVICE_PARALLEL_PORT, 15, METHOD_BUFFERED, FILE_ANY_ACCESS)
#define IOCTL_INTERNAL_GET_MORE_PARALLEL_PORT_INFO CTL_CODE(FILE_DEVICE_PARALLEL_PORT, 17, METHOD_BUFFERED, FILE_ANY_ACCESS)
// Saves current chipset mode - puts the chipset into Specified mode (implemented in filter)
#define IOCTL_INTERNAL_PARCHIP_CONNECT CTL_CODE(FILE_DEVICE_PARALLEL_PORT, 18, METHOD_BUFFERED, FILE_ANY_ACCESS)
#define IOCTL_INTERNAL_PARALLEL_SET_CHIP_MODE CTL_CODE(FILE_DEVICE_PARALLEL_PORT, 19, METHOD_BUFFERED, FILE_ANY_ACCESS)
#define IOCTL_INTERNAL_PARALLEL_CLEAR_CHIP_MODE CTL_CODE(FILE_DEVICE_PARALLEL_PORT, 20, METHOD_BUFFERED, FILE_ANY_ACCESS)
// New parport IOCTLs
#define IOCTL_INTERNAL_GET_PARALLEL_PNP_INFO CTL_CODE(FILE_DEVICE_PARALLEL_PORT, 21, METHOD_BUFFERED, FILE_ANY_ACCESS)
#define IOCTL_INTERNAL_INIT_1284_3_BUS CTL_CODE(FILE_DEVICE_PARALLEL_PORT, 22, METHOD_BUFFERED, FILE_ANY_ACCESS)
// Takes a flat namespace Id for the device, also acquires the port
#define IOCTL_INTERNAL_SELECT_DEVICE CTL_CODE(FILE_DEVICE_PARALLEL_PORT, 23, METHOD_BUFFERED, FILE_ANY_ACCESS)
// Takes a flat namespace Id for the device, also releases the port
#define IOCTL_INTERNAL_DESELECT_DEVICE CTL_CODE(FILE_DEVICE_PARALLEL_PORT, 24, METHOD_BUFFERED, FILE_ANY_ACCESS)
// New parclass IOCTLs
#define IOCTL_INTERNAL_PARCLASS_CONNECT CTL_CODE(FILE_DEVICE_PARALLEL_PORT, 30, METHOD_BUFFERED, FILE_ANY_ACCESS)
#define IOCTL_INTERNAL_PARCLASS_DISCONNECT CTL_CODE(FILE_DEVICE_PARALLEL_PORT, 31, METHOD_BUFFERED, FILE_ANY_ACCESS)
#define IOCTL_INTERNAL_DISCONNECT_IDLE CTL_CODE(FILE_DEVICE_PARALLEL_PORT, 32, METHOD_BUFFERED, FILE_ANY_ACCESS)
#define IOCTL_INTERNAL_LOCK_PORT CTL_CODE(FILE_DEVICE_PARALLEL_PORT, 37, METHOD_BUFFERED, FILE_ANY_ACCESS)
#define IOCTL_INTERNAL_UNLOCK_PORT CTL_CODE(FILE_DEVICE_PARALLEL_PORT, 38, METHOD_BUFFERED, FILE_ANY_ACCESS)
// IOCTL version of call to ParPort's FreePort function
#define IOCTL_INTERNAL_PARALLEL_PORT_FREE CTL_CODE(FILE_DEVICE_PARALLEL_PORT, 40, METHOD_BUFFERED, FILE_ANY_ACCESS)
// IOCTLs for IEEE1284.3
#define IOCTL_INTERNAL_PARDOT3_CONNECT CTL_CODE(FILE_DEVICE_PARALLEL_PORT, 41, METHOD_BUFFERED, FILE_ANY_ACCESS)
#define IOCTL_INTERNAL_PARDOT3_DISCONNECT CTL_CODE(FILE_DEVICE_PARALLEL_PORT, 42, METHOD_BUFFERED, FILE_ANY_ACCESS)
#define IOCTL_INTERNAL_PARDOT3_RESET CTL_CODE(FILE_DEVICE_PARALLEL_PORT, 43, METHOD_BUFFERED, FILE_ANY_ACCESS)
#define IOCTL_INTERNAL_PARDOT3_SIGNAL CTL_CODE(FILE_DEVICE_PARALLEL_PORT, 44, METHOD_BUFFERED, FILE_ANY_ACCESS)
//
// IOCTLs for registering/unregistering for ParPort's RemovalRelations
//
// - A device object should register for removal relations with a
// parport device if the device is physically connected to the
// parallel port.
//
// - Parport will report all devices that have registered with it for
// removal relations in response to a PnP QUERY_DEVICE_RELATIONS of
// type RemovalRelations. This allows PnP to remove all device stacks
// that depend on the parport device prior to removing the parport
// device itself.
//
// - The single Input parameter is a PARPORT_REMOVAL_RELATIONS
// structure that is defined below
//
#define IOCTL_INTERNAL_REGISTER_FOR_REMOVAL_RELATIONS CTL_CODE(FILE_DEVICE_PARALLEL_PORT, 50, METHOD_BUFFERED, FILE_ANY_ACCESS)
#define IOCTL_INTERNAL_UNREGISTER_FOR_REMOVAL_RELATIONS CTL_CODE(FILE_DEVICE_PARALLEL_PORT, 51, METHOD_BUFFERED, FILE_ANY_ACCESS)
typedef struct _PARPORT_REMOVAL_RELATIONS {
PDEVICE_OBJECT DeviceObject; // device object that is registering w/Parport
ULONG Flags; // Flags - reserved - set to 0 for now
PUNICODE_STRING DeviceName; // DeviceName identifier of device registering for removal relations - used for debugging
// - printed in parport's debug spew - convention is to use same DeviceName that was passed to
// IoCreateDevice
} PARPORT_REMOVAL_RELATIONS, *PPARPORT_REMOVAL_RELATIONS;
// Define 1284.3 command qualifiers
#define MODE_LEN_1284_3 7 // # of magic sequence bytes
static UCHAR ModeQualifier[MODE_LEN_1284_3] = { 0xAA, 0x55, 0x00, 0xFF, 0x87, 0x78, 0xFF };
#define LEGACYZIP_MODE_LEN 3
static UCHAR LegacyZipModeQualifier[LEGACYZIP_MODE_LEN] = { 0x00, 0x3c, 0x20 };
typedef enum {
P12843DL_OFF,
P12843DL_DOT3_DL,
P12843DL_MLC_DL,
P12843DL_DOT4_DL
} P12843_DL_MODES;
// Define 1284.3 Commands
#define CPP_ASSIGN_ADDR 0x00
#define CPP_SELECT 0xE0
#define CPP_DESELECT 0x30
#define CPP_QUERY_INT 0x08
#define CPP_DISABLE_INT 0x40
#define CPP_ENABLE_INT 0x48
#define CPP_CLEAR_INT_LAT 0x50
#define CPP_SET_INT_LAT 0x58
#define CPP_COMMAND_FILTER 0xF8
typedef
BOOLEAN
(*PPARALLEL_TRY_ALLOCATE_ROUTINE) (
IN PVOID TryAllocateContext
);
typedef
VOID
(*PPARALLEL_FREE_ROUTINE) (
IN PVOID FreeContext
);
typedef
ULONG
(*PPARALLEL_QUERY_WAITERS_ROUTINE) (
IN PVOID QueryAllocsContext
);
typedef
NTSTATUS
(*PPARALLEL_SET_CHIP_MODE) (
IN PVOID SetChipContext,
IN UCHAR ChipMode
);
typedef
NTSTATUS
(*PPARALLEL_CLEAR_CHIP_MODE) (
IN PVOID ClearChipContext,
IN UCHAR ChipMode
);
typedef
NTSTATUS
(*PPARALLEL_TRY_SELECT_ROUTINE) (
IN PVOID TrySelectContext,
IN PVOID TrySelectCommand
);
typedef
NTSTATUS
(*PPARALLEL_DESELECT_ROUTINE) (
IN PVOID DeselectContext,
IN PVOID DeselectCommand
);
typedef
NTSTATUS
(*PPARCHIP_SET_CHIP_MODE) (
IN PVOID SetChipContext,
IN UCHAR ChipMode
);
typedef
NTSTATUS
(*PPARCHIP_CLEAR_CHIP_MODE) (
IN PVOID ClearChipContext,
IN UCHAR ChipMode
);
//
// Hardware Capabilities
//
#define PPT_NO_HARDWARE_PRESENT 0x00000000
#define PPT_ECP_PRESENT 0x00000001
#define PPT_EPP_PRESENT 0x00000002
#define PPT_EPP_32_PRESENT 0x00000004
#define PPT_BYTE_PRESENT 0x00000008
#define PPT_BIDI_PRESENT 0x00000008 // deprecated - will be removed soon! dvdf
#define PPT_1284_3_PRESENT 0x00000010
// Added DVDR 10-6-98
// Structure passed to the ParChip Filter when calling it
// with the IOCTL_INTERNAL_CHIP_FILTER_CONNECT ioctl
typedef struct _PARALLEL_PARCHIP_INFO {
PUCHAR Controller;
PUCHAR EcrController;
ULONG HardwareModes;
PPARCHIP_SET_CHIP_MODE ParChipSetMode;
PPARCHIP_CLEAR_CHIP_MODE ParChipClearMode;
PVOID Context;
BOOLEAN success;
} PARALLEL_PARCHIP_INFO, *PPARALLEL_PARCHIP_INFO;
// End Added by DVDR 10-6-1998
typedef struct _PARALLEL_PORT_INFORMATION {
PHYSICAL_ADDRESS OriginalController;
PUCHAR Controller;
ULONG SpanOfController;
PPARALLEL_TRY_ALLOCATE_ROUTINE TryAllocatePort; // nonblocking callback to allocate port
PPARALLEL_FREE_ROUTINE FreePort; // callback to free port
PPARALLEL_QUERY_WAITERS_ROUTINE QueryNumWaiters; // callback to query number of waiters for port allocation
PVOID Context; // context for callbacks to ParPort device
} PARALLEL_PORT_INFORMATION, *PPARALLEL_PORT_INFORMATION;
typedef struct _PARALLEL_PNP_INFORMATION {
PHYSICAL_ADDRESS OriginalEcpController;
PUCHAR EcpController;
ULONG SpanOfEcpController;
ULONG PortNumber; // deprecated - do not use
ULONG HardwareCapabilities;
PPARALLEL_SET_CHIP_MODE TrySetChipMode;
PPARALLEL_CLEAR_CHIP_MODE ClearChipMode;
ULONG FifoDepth;
ULONG FifoWidth;
PHYSICAL_ADDRESS EppControllerPhysicalAddress;
ULONG SpanOfEppController;
ULONG Ieee1284_3DeviceCount; // number of .3 daisy chain devices connected to this ParPort
PPARALLEL_TRY_SELECT_ROUTINE TrySelectDevice;
PPARALLEL_DESELECT_ROUTINE DeselectDevice;
PVOID Context;
ULONG CurrentMode;
PWSTR PortName; // symbolic link name for legacy device object
} PARALLEL_PNP_INFORMATION, *PPARALLEL_PNP_INFORMATION;
// Start Added by DVDR 2-19-1998
//
// PARALLEL_1284_COMMAND CommandFlags
//
// this flag is deprecated - use 1284.3 daisy chain ID == 4 to indicate End-Of-Chain device
#define PAR_END_OF_CHAIN_DEVICE ((ULONG)0x00000001) // The target device for this command
// is an End-Of-Chain device, the
// contents of the ID field are
// undefined and should be ignored
#define PAR_HAVE_PORT_KEEP_PORT ((ULONG)0x00000002) // Indicates that the requesting driver
// has previously acquired the parallel port
// and does is not ready to release it yet.
//
// On a SELECT_DEVICE ParPort should NOT
// try to acquire the port before selecting
// the device.
//
// On a DESELECT_DEVICE ParPort should NOT
// free the port after deselecting the device.
#define PAR_LEGACY_ZIP_DRIVE ((ULONG)0x00000004) // The target device for this command
// is a Legacy Iomega Zip drive, the
// contents of the ID field are
// undefined and should be ignored
#define PAR_LEGACY_ZIP_DRIVE_STD_MODE ((ULONG)0x00000010) // The target device for these commands
#define PAR_LEGACY_ZIP_DRIVE_EPP_MODE ((ULONG)0x00000020) // are a Legacy Iomega Zip drive, the
// contents of the ID field are
// undefined and should be ignored
// This will select the Zip into DISK or EPP Mode
#define DOT3_END_OF_CHAIN_ID 4 // this ID used in a 1284.3 SELECT or DESELECT means the End-Of-Chain device
#define DOT3_LEGACY_ZIP_ID 5 // this ID used in a 1284.3 SELECT or DESELECT means Legacy Zip drive
//
// The following structure is passed in on an
// IOCTL_INTERNAL_SELECT_DEVICE and on an
// IOCTL_INTERNAL_DESELECT_DEVICE
typedef struct _PARALLEL_1284_COMMAND {
UCHAR ID; // 0..3 for 1284.3 daisy chain device, 4 for End-Of-Chain device, 5 for Legacy Zip
UCHAR Port; // reserved ( set == 0 )
ULONG CommandFlags; // see above
} PARALLEL_1284_COMMAND, *PPARALLEL_1284_COMMAND;
//
// Hardware Modes
//
#define INITIAL_MODE 0x00000000
// Disable Parchip and ECR arbitrator
// 0 - Parchip and ecr arbritrator is off
// 1 - Parchip and ecr arbitrator is on
#define PARCHIP_ECR_ARBITRATOR 1
//
// The following structure is passed in on an
// IOCTL_INTERNAL_PARALLEL_SET_CHIP_MODE and on an
// IOCTL_INTERNAL_PARALLEL_CLEAR_CHIP_MODE
//
typedef struct _PARALLEL_CHIP_MODE {
UCHAR ModeFlags;
BOOLEAN success;
} PARALLEL_CHIP_MODE, *PPARALLEL_CHIP_MODE;
// End Added by DVDR 2-19-1998
//
// The following structure is passed in on an
// IOCTL_INTERNAL_PARALLEL_CONNECT_INTERRUPT and on an
// IOCTL_INTERNAL_PARALLEL_DISCONNECT_INTERRUPT request.
//
typedef
VOID
(*PPARALLEL_DEFERRED_ROUTINE) (
IN PVOID DeferredContext
);
typedef struct _PARALLEL_INTERRUPT_SERVICE_ROUTINE {
PKSERVICE_ROUTINE InterruptServiceRoutine;
PVOID InterruptServiceContext;
PPARALLEL_DEFERRED_ROUTINE DeferredPortCheckRoutine; /* OPTIONAL */
PVOID DeferredPortCheckContext; /* OPTIONAL */
} PARALLEL_INTERRUPT_SERVICE_ROUTINE, *PPARALLEL_INTERRUPT_SERVICE_ROUTINE;
//
// The following structure is returned on an
// IOCTL_INTERNAL_PARALLEL_CONNECT_INTERRUPT request;
//
typedef struct _PARALLEL_INTERRUPT_INFORMATION {
PKINTERRUPT InterruptObject;
PPARALLEL_TRY_ALLOCATE_ROUTINE TryAllocatePortAtInterruptLevel;
PPARALLEL_FREE_ROUTINE FreePortFromInterruptLevel;
PVOID Context;
} PARALLEL_INTERRUPT_INFORMATION, *PPARALLEL_INTERRUPT_INFORMATION;
//
// The following structure is returned on an
// IOCTL_INTERNAL_GET_MORE_PARALLEL_PORT_INFO.
//
typedef struct _MORE_PARALLEL_PORT_INFORMATION {
INTERFACE_TYPE InterfaceType;
ULONG BusNumber;
ULONG InterruptLevel;
ULONG InterruptVector;
KAFFINITY InterruptAffinity;
KINTERRUPT_MODE InterruptMode;
} MORE_PARALLEL_PORT_INFORMATION, *PMORE_PARALLEL_PORT_INFORMATION;
typedef enum {
SAFE_MODE,
UNSAFE_MODE // Available only through kernel. Your driver
// will be humiliated if you choose UNSAFE_MODE and
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -