windows-nt/Source/XPSP1/NT/drivers/parallel/parvdm/parvdm.h
2020-09-26 16:20:57 +08:00

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
);