00001 extern "C" {
00002 #include <WDM.h>
00003 }
00004 #include "Unicode.h"
00005
00006 enum DRIVER_STATE {Stopped, Started, Removed};
00007
00008 typedef struct _DEVICE_EXTENSION {
00009 PDEVICE_OBJECT pDevice;
00010 PDEVICE_OBJECT pLowerDevice;
00011 ULONG DeviceNumber;
00012 CUString ustrDeviceName;
00013 CUString ustrSymLinkName;
00014 PUCHAR deviceBuffer;
00015 ULONG deviceBufferSize;
00016 ULONG xferCount;
00017 ULONG maxXferCount;
00018 PUCHAR portBase;
00019 ULONG portLength;
00020 KIRQL IRQL;
00021 ULONG Vector;
00022 KAFFINITY Affinity;
00023 PKINTERRUPT pIntObj;
00024 BOOLEAN bInterruptExpected;
00025 DRIVER_STATE state;
00026 } DEVICE_EXTENSION, *PDEVICE_EXTENSION;
00027
00028 #define DATA_REG 0
00029 #define STATUS_REG 1
00030 #define CONTROL_REG 2
00031
00032
00033
00034
00035 #define STS_NOT_IRQ 0x04 // 0 Int requested
00036 #define STS_NOT_ERR 0x08 // 0 Error
00037 #define STS_SELCTD 0x10 // 1 Selected
00038 #define STS_PE 0x20 // 1 Paper empty
00039 #define STS_NOT_ACK 0x40 // 0 Acknowledge
00040 #define STS_NOT_BSY 0x80 // 0 Printer busy
00041
00042
00043
00044
00045 #define CTL_STROBE 0x01 // 1 Strobe data
00046 #define CTL_AUTOLF 0x02 // 1 Auto line feed
00047 #define CTL_NOT_RST 0x04 // 0 Reset printer
00048 #define CTL_SELECT 0x08 // 1 Select printer
00049 #define CTL_INTENB 0x10 // 1 Interrupt enable
00050 #define CTL_DEFAULT 0xC0 // (ungenutzte Bits setzen)
00051
00052
00053
00054
00055
00056 #define ReadStatus( pDevExt ) \
00057 (READ_PORT_UCHAR( \
00058 pDevExt->portBase + STATUS_REG ))
00059
00060 #define ReadControl( pDevExt ) \
00061 (READ_PORT_UCHAR( \
00062 pDevExt->PortBase + CONTROL_REG ))
00063
00064 #define WriteControl( pDevExt, bData ) \
00065 (WRITE_PORT_UCHAR( \
00066 pDevExt->portBase + CONTROL_REG, bData ))
00067
00068 #define WriteData( pDevExt, bData ) \
00069 (WRITE_PORT_UCHAR( \
00070 pDevExt->portBase + DATA_REG, bData ))
00071
00072
00074
00082 extern "C" NTSTATUS DriverEntry (PDRIVER_OBJECT pDriverObject, \
00083 PUNICODE_STRING pRegistryPath);
00084 static VOID DriverUnload (IN PDRIVER_OBJECT pDriverObject);
00085
00086
00087 static NTSTATUS DispatchCreate (IN PDEVICE_OBJECT pDevObj, IN PIRP pIrp);
00088 static NTSTATUS DispatchClose (IN PDEVICE_OBJECT pDevObj, IN PIRP pIrp);
00089 static NTSTATUS DispatchWrite (IN PDEVICE_OBJECT pDevObj, IN PIRP pIrp);
00090 static NTSTATUS DispatchRead (IN PDEVICE_OBJECT pDevObj, IN PIRP pIrp);
00091
00092
00093 static VOID StartIo(IN PDEVICE_OBJECT pDevObj, IN PIRP pIrp);
00094 static BOOLEAN Isr (IN PKINTERRUPT pIntObj, IN PVOID pServiceContext);
00095 static VOID DpcForIsr(IN PKDPC pDpc, IN PDEVICE_OBJECT pDevObj, IN PIRP pIrp, IN PVOID pContext);
00096
00097
00098 static NTSTATUS AddDevice (IN PDRIVER_OBJECT pDriverObject, IN PDEVICE_OBJECT pPdo);
00099
00100 static NTSTATUS DispPnp(IN PDEVICE_OBJECT pDO, IN PIRP pIrp);
00101 static NTSTATUS PassDownPnP(IN PDEVICE_OBJECT pDO, IN PIRP pIrp );
00102
00103 static NTSTATUS HandleStartDevice(IN PDEVICE_OBJECT pDO, IN PIRP pIrp);
00104 static NTSTATUS HandleStopDevice(IN PDEVICE_OBJECT pDO, IN PIRP pIrp );
00105
00106 static NTSTATUS HandleRemoveDevice(IN PDEVICE_OBJECT pDO, IN PIRP pIrp);