// Declarations for AIO16 driver //DBG is always defined, but it's 1 or 0 with checked or free build #if DBG #define DBGONLY(_X_) _X_ #define DbgPrintLine() DbgPrint("%d\n", __LINE__) #define KOH "AIO16 - " #else #define DBGONLY(_X_) #define DbgPrintLine() #endif #ifndef DRIVER_H #define DRIVER_H #define DRIVERNAME "AIO16" // for use in messages #define LDRIVERNAME L"AIO16" // for use in UNICODE string constants #define FIFOSIZE (FIFOHALF * 2) #define FIFOHALF 1024 #define FIFOQUAR (FIFOHALF / 2) /////////////////////////////////////////////////////////////////////////////// // Device extension structure enum DEVSTATE { STOPPED, // device stopped WORKING, // started and working PENDINGSTOP, // stop pending PENDINGREMOVE, // remove pending SURPRISEREMOVED, // removed by surprise REMOVED, // removed }; typedef struct _TRATIONAL { USHORT Numerator, Denominator; } TRATIONAL, *PRATIONAL; typedef struct _DEVICE_EXTENSION { PDEVICE_OBJECT DeviceObject; // device object this extension belongs to PDEVICE_OBJECT LowerDeviceObject; // next lower driver in same stack PDEVICE_OBJECT Pdo; // the PDO IO_REMOVE_LOCK RemoveLock; // removal control locking structure UNICODE_STRING ifname; // interface name DEVSTATE state; // current state of device DEVSTATE prevstate; // state prior to removal query DEVICE_POWER_STATE devpower; // current device power state SYSTEM_POWER_STATE syspower; // current system power state DEVICE_CAPABILITIES devcaps; // copy of most recent device capabilities PIRP PendingAcqIRP, PendingReadIRP; LIST_ENTRY PendingIoctlList; // listing of pending async IOCTLs KSPIN_LOCK IoctlListLock; // spin lock to guard PendingIoctlList NTSTATUS IoctlAbortStatus; // status being used to abort pending IOCTLs LONG handles; // # open handles PKINTERRUPT InterruptObject; // address of interrupt object PUCHAR portbase; // I/O port base address ULONG nports; // number of assigned ports BOOLEAN mappedport; // true if we mapped port addr in StartDevice BOOLEAN busy; // true if device busy with a request ULONG DataLength, DataNext; ULONG ReadLast, ReadReq; TRATIONAL *AcquiredData; KSPIN_LOCK ReadLock, AcqBufferLock; ULONG NextData; USHORT Base; BOOLEAN Initialized; UCHAR Jumpers; union { ULONG Calculated; struct { USHORT Word4Mult; USHORT Base; } ; } GainFactor; UCHAR MultiMode; ULONG SuckAmt, MultiCt; } DEVICE_EXTENSION, *PDEVICE_EXTENSION; //Jumper masks #define jpADC16SE 0x01 #define jpADCBip 0x02 #define jpADC5V 0x04 #define jpDAC5V 0x10 //.DLL-to-.SYS buffer format typedef struct _AIO16NT_BUFFER { ULONG Addr; ULONG Data; ULONG ExData; } AIO16NT_BUFFER, *PAIO16NT_BUFFER; //PIOCTLInternalHandler function pointer type typedef NTSTATUS (*PIOCTLInternalHandler)(PDEVICE_EXTENSION pDX, PAIO16NT_BUFFER pIOBuffer); //sbitd() utility pseudofunction(returns the serial byte representation of that bit of Data) #define sbitd(Data, Bit) (UCHAR)((Data & (1 << Bit)) ? 0x81 : 0x01) /////////////////////////////////////////////////////////////////////////////// // Global functions VOID RemoveDevice(IN PDEVICE_OBJECT fdo); NTSTATUS CompleteRequest(IN PIRP Irp, IN NTSTATUS status, IN ULONG_PTR info); NTSTATUS CompleteRequest(IN PIRP Irp, IN NTSTATUS status); NTSTATUS ForwardAndWait(IN PDEVICE_OBJECT fdo, IN PIRP Irp); NTSTATUS SendDeviceSetPower(PDEVICE_EXTENSION fdo, DEVICE_POWER_STATE state, BOOLEAN wait = FALSE); VOID SendAsyncNotification(PVOID context); VOID EnableAllInterfaces(PDEVICE_EXTENSION pdx, BOOLEAN enable); VOID DeregisterAllInterfaces(PDEVICE_EXTENSION pdx); VOID AbortPendingIoctls(PDEVICE_EXTENSION pdx, NTSTATUS status); VOID CleanupControlRequests(PDEVICE_EXTENSION pdx, NTSTATUS status, PFILE_OBJECT fop); PIRP UncacheControlRequest(PDEVICE_EXTENSION pdx, PIRP* pIrp); NTSTATUS StartDevice(PDEVICE_OBJECT fdo, PCM_PARTIAL_RESOURCE_LIST raw, PCM_PARTIAL_RESOURCE_LIST translated); VOID StopDevice(PDEVICE_OBJECT fdo, BOOLEAN oktouch = FALSE); VOID DpcForIsr(PKDPC Dpc, PDEVICE_OBJECT fdo, PIRP junk, PDEVICE_EXTENSION pdx); // I/O request handlers NTSTATUS DispatchCreate(PDEVICE_OBJECT fdo, PIRP Irp); NTSTATUS DispatchClose(PDEVICE_OBJECT fdo, PIRP Irp); NTSTATUS DispatchControl(PDEVICE_OBJECT fdo, PIRP Irp); NTSTATUS DispatchPower(PDEVICE_OBJECT fdo, PIRP Irp); NTSTATUS DispatchPnp(PDEVICE_OBJECT fdo, PIRP Irp); extern BOOLEAN win98; extern UNICODE_STRING servkey; #endif // DRIVER_H