#define FILE_DEVICE_KRNLDRVR 0x80ff #define NT_DEVICE_NAME L"\\Device\\IRQGENM0" #define DOS_DEVICE_NAME L"\\DosDevices\\IRQGENM" #define ERROR_MESSAGE L"IRQGenM: Error Message Test" #define IOCTL_IRQGENM_INIT_GEN_DRIVER CTL_CODE(FILE_DEVICE_KRNLDRVR, 0x801, METHOD_BUFFERED, FILE_ANY_ACCESS) #define IOCTL_IRQGENM_DETECT_IRQ CTL_CODE(FILE_DEVICE_KRNLDRVR, 0x802, METHOD_BUFFERED, FILE_ANY_ACCESS) #define IOCTL_IRQGENM_SEND_EOI CTL_CODE(FILE_DEVICE_KRNLDRVR, 0x803, METHOD_BUFFERED, FILE_ANY_ACCESS) #define IOCTL_IRQGENM_DISCONNECT_IRQ CTL_CODE(FILE_DEVICE_KRNLDRVR, 0x804, METHOD_BUFFERED, FILE_ANY_ACCESS) #define IOCTL_IRQGENM_ABORT CTL_CODE(FILE_DEVICE_KRNLDRVR, 0x805, METHOD_BUFFERED, FILE_ANY_ACCESS) #define WRITE_TO_CLEAR 0 #define READ_TO_CLEAR 1 typedef struct _IRQGENM_DEVICE_EXTENSION { PDEVICE_OBJECT DeviceObject; PKINTERRUPT InterruptObject[16]; BOOLEAN InterruptOccurred[16]; BOOLEAN InterruptRequested[16]; BOOLEAN InterruptConnected[16]; PIRP PendingIrp[16]; BOOLEAN HasPendingIrp[16]; ULONG BaseAddress[16]; UCHAR Operation[16]; USHORT ClearOffset[16]; } IRQGENM_DEVICE_EXTENSION, *PIRQGENM_DEVICE_EXTENSION; typedef struct _IRQGENM_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; } IRQGENM_INIT_DATA, *PIRQGENM_INIT_DATA; BOOLEAN IRQGENMInterruptServiceRoutine( IN PKINTERRUPT Interrupt, IN OUT PVOID Context ); VOID IRQGENMDpcForIsrRoutine( IN PKDPC Dpc, IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp, IN PVOID Context ); NTSTATUS IRQGENMOpenClose( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp ); VOID IRQGENMUnload( IN PDRIVER_OBJECT DriverObject ); NTSTATUS IRQGENMDeviceControl( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp ); NTSTATUS IRQGENMInitDriver( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp ); NTSTATUS IRQGENMDetectIRQ( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp ); NTSTATUS IRQGENMAbort( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp ); NTSTATUS IRQGENMSendEOI( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp ); NTSTATUS IRQGENMDisconnectIRQ( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp ); VOID IRQGENMCancelIrp( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp );