#define FILE_DEVICE_KRNLDRVR 0x80ff #define NT_DEVICE_NAME L"\\Device\\IRQGEN0" #define DOS_DEVICE_NAME L"\\DosDevices\\IRQGEN" #define ERROR_MESSAGE L"IRQGen: Error Message Test" #define IOCTL_IRQGEN_INIT_GEN_DRIVER CTL_CODE(FILE_DEVICE_KRNLDRVR, 0x801, METHOD_BUFFERED, FILE_ANY_ACCESS) #define IOCTL_IRQGEN_DETECT_IRQ CTL_CODE(FILE_DEVICE_KRNLDRVR, 0x802, METHOD_BUFFERED, FILE_ANY_ACCESS) #define IOCTL_IRQGEN_SEND_EOI CTL_CODE(FILE_DEVICE_KRNLDRVR, 0x803, METHOD_BUFFERED, FILE_ANY_ACCESS) #define IOCTL_IRQGEN_ABORT CTL_CODE(FILE_DEVICE_KRNLDRVR, 0x804, METHOD_BUFFERED, FILE_ANY_ACCESS) #define WRITE_TO_CLEAR 0 #define READ_TO_CLEAR 1 typedef struct _IRQGEN_DEVICE_EXTENSION { PDEVICE_OBJECT DeviceObject; PKINTERRUPT InterruptObject; BOOLEAN InterruptOccurred; BOOLEAN InterruptRequested; BOOLEAN InterruptConnected; UCHAR IRQ; PIRP PendingIrp; BOOLEAN HasPendingIrp; ULONG BaseAddress; UCHAR Operation; USHORT ClearOffset; } IRQGEN_DEVICE_EXTENSION, *PIRQGEN_DEVICE_EXTENSION; #pragma pack(push) #pragma pack(2) typedef struct _IRQGEN_INIT_DATA { unsigned long BaseAddress; unsigned short IRQ; short BusType; unsigned short BusNumber; unsigned short ClearOffset; unsigned short Operation; unsigned long Reserved1; unsigned long Reserved2; } IRQGEN_INIT_DATA, *PIRQGEN_INIT_DATA; #pragma pack(pop) BOOLEAN IRQGenInterruptServiceRoutine( IN PKINTERRUPT Interrupt, IN OUT PVOID Context ); VOID IRQGenDpcForIsrRoutine( IN PKDPC Dpc, IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp, IN PVOID Context ); NTSTATUS IRQGenOpenClose( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp ); VOID IRQGenUnload( IN PDRIVER_OBJECT DriverObject ); NTSTATUS IRQGenDeviceControl( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp ); VOID IRQGenCancelIrp( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp );