194 lines
3.8 KiB
C
194 lines
3.8 KiB
C
/*++
|
|
|
|
Copyright (C) Microsoft Corporation, 1994 - 1999
|
|
|
|
Module Name :
|
|
|
|
parsimp.h
|
|
|
|
Abstract:
|
|
|
|
Type definitions and data for a simple parallel class driver.
|
|
|
|
Author:
|
|
|
|
Norbert P. Kusters 4-Feb-1994
|
|
|
|
Revision History:
|
|
|
|
--*/
|
|
|
|
#ifdef POOL_TAGGING
|
|
#ifdef ExAllocatePool
|
|
#undef ExAllocatePool
|
|
#endif
|
|
|
|
#define ExAllocatePool(a,b) ExAllocatePoolWithTag(a,b,'ParV')
|
|
#endif
|
|
|
|
#define PARALLEL_DATA_OFFSET 0
|
|
#define PARALLEL_STATUS_OFFSET 1
|
|
#define PARALLEL_CONTROL_OFFSET 2
|
|
#define PARALLEL_REGISTER_SPAN 3
|
|
|
|
typedef struct _DEVICE_EXTENSION {
|
|
|
|
//
|
|
// Points to the device object that contains
|
|
// this device extension.
|
|
//
|
|
PDEVICE_OBJECT DeviceObject;
|
|
|
|
//
|
|
// Points to the port device object that this class device is
|
|
// connected to.
|
|
//
|
|
PDEVICE_OBJECT PortDeviceObject;
|
|
|
|
//
|
|
// Keeps track of whether or not we actually own the
|
|
// parallel hardware
|
|
//
|
|
BOOLEAN PortOwned;
|
|
|
|
BOOLEAN spare[3]; // force to DWORD alignment
|
|
|
|
//
|
|
// Enforce exclusive Create/Open - 1 == either handle open or Create/Open in process
|
|
// 0 == no handle open to device
|
|
//
|
|
ULONG CreateOpenLock;
|
|
|
|
//
|
|
// This holds the result of the get parallel port info
|
|
// request to the port driver.
|
|
//
|
|
PHYSICAL_ADDRESS OriginalController;
|
|
PUCHAR Controller;
|
|
ULONG SpanOfController;
|
|
PPARALLEL_FREE_ROUTINE FreePort;
|
|
PVOID FreePortContext;
|
|
|
|
//
|
|
// Records whether we actually created the symbolic link name
|
|
// at driver load time and the symbolic link itself. If we didn't
|
|
// create it, we won't try to destroy it when we unload.
|
|
//
|
|
BOOLEAN CreatedSymbolicLink;
|
|
UNICODE_STRING SymbolicLinkName;
|
|
|
|
#ifdef INTERRUPT_NEEDED
|
|
|
|
//
|
|
// Set 'IgnoreInterrupts' to TRUE unless the port is owned by
|
|
// this device.
|
|
//
|
|
|
|
BOOLEAN IgnoreInterrupts;
|
|
PKINTERRUPT InterruptObject;
|
|
|
|
//
|
|
// Keep the interrupt level alloc and free routines.
|
|
//
|
|
|
|
PPARALLEL_TRY_ALLOCATE_ROUTINE TryAllocatePortAtInterruptLevel;
|
|
PVOID TryAllocateContext;
|
|
|
|
#endif
|
|
|
|
#ifdef TIMEOUT_ALLOCS
|
|
|
|
//
|
|
// This timer is used to timeout allocate requests that are sent
|
|
// to the port device.
|
|
//
|
|
KTIMER AllocTimer;
|
|
KDPC AllocTimerDpc;
|
|
LARGE_INTEGER AllocTimeout;
|
|
|
|
//
|
|
// This variable is used to indicate outstanding references
|
|
// to the current irp. This solves the contention problem between
|
|
// the timer DPC and the completion routine. Access using
|
|
// 'ControlLock'.
|
|
//
|
|
|
|
#define IRP_REF_TIMER 1
|
|
#define IRP_REF_COMPLETION_ROUTINE 2
|
|
|
|
LONG CurrentIrpRefCount;
|
|
KSPIN_LOCK ControlLock;
|
|
|
|
//
|
|
// Indicates that the current request timed out.
|
|
//
|
|
BOOLEAN TimedOut;
|
|
|
|
#endif
|
|
|
|
//
|
|
// Name of the parport device that we use when opening a FILE
|
|
//
|
|
UNICODE_STRING ParPortName;
|
|
PFILE_OBJECT ParPortFileObject;
|
|
|
|
} DEVICE_EXTENSION, *PDEVICE_EXTENSION;
|
|
|
|
#ifdef INTERRUPT_NEEDED
|
|
|
|
BOOLEAN
|
|
ParInterruptService(
|
|
IN PKINTERRUPT Interrupt,
|
|
IN OUT PVOID Extension
|
|
);
|
|
|
|
VOID
|
|
ParDpcForIsr(
|
|
IN PKDPC Dpc,
|
|
IN PDEVICE_OBJECT DeviceObject,
|
|
IN PIRP Irp,
|
|
IN PVOID Extension
|
|
);
|
|
|
|
VOID
|
|
ParDeferredPortCheck(
|
|
IN PVOID Extension
|
|
);
|
|
|
|
#endif
|
|
|
|
#ifdef TIMEOUT_ALLOCS
|
|
|
|
VOID
|
|
ParAllocTimerDpc(
|
|
IN PKDPC Dpc,
|
|
IN PVOID Extension,
|
|
IN PVOID SystemArgument1,
|
|
IN PVOID SystemArgument2
|
|
);
|
|
|
|
#endif
|
|
|
|
NTSTATUS
|
|
ParCreateOpen(
|
|
IN PDEVICE_OBJECT DeviceObject,
|
|
IN PIRP Irp
|
|
);
|
|
|
|
NTSTATUS
|
|
ParClose(
|
|
IN PDEVICE_OBJECT DeviceObject,
|
|
IN PIRP Irp
|
|
);
|
|
|
|
NTSTATUS
|
|
ParDeviceControl(
|
|
IN PDEVICE_OBJECT DeviceObject,
|
|
IN PIRP Irp
|
|
);
|
|
|
|
VOID
|
|
ParUnload(
|
|
IN PDRIVER_OBJECT DriverObject
|
|
);
|