00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00020
00021 #include "config.h"
00022
00025 #define DVRH_USE_PARPORT_ECP_ADDR 1
00026
00027 #include <parallel.h>
00028
00030 #define DBG_PROGNAME "CBM4WIN.SYS"
00031
00032 #include "cbmioctl.h"
00033 #include "memtags.h"
00034 #include "util.h"
00035 #include "queue.h"
00036 #include "cbmlog.h"
00037
00039 #define CBMDEVICENAME L"\\DosDevices\\opencbm"
00040
00042 typedef
00043 struct _ARCH_DEVICE_EXTENSION {
00044
00045
00046
00048 PDEVICE_OBJECT Fdo;
00049
00051 BOOLEAN IsNT4;
00052
00058 ULONG HandleEcpEppMyself;
00059
00065 UNICODE_STRING DeviceName;
00066
00068 QUEUE IrpQueue;
00069
00071 PFILE_OBJECT ParallelPortFileObject;
00072
00074 PDEVICE_OBJECT ParallelPortFdo;
00075
00077 PPARALLEL_PORT_INFORMATION PortInfo;
00078
00080 PARALLEL_INTERRUPT_SERVICE_ROUTINE Pisr;
00081
00083 PARALLEL_INTERRUPT_INFORMATION Pii;
00084
00087 KEVENT EventWaitForListener;
00088
00090 BOOLEAN ParallelPortIsLocked;
00091
00093 BOOLEAN ParallelPortLock;
00094
00096 BOOLEAN ParallelPortAllocated;
00097
00099 BOOLEAN ParallelPortModeSet;
00100
00102 BOOLEAN ParallelPortAllocatedInterrupt;
00103
00107 BOOLEAN DoNotReleaseBus;
00108
00110 HANDLE ThreadHandle;
00111
00113 PKTHREAD Thread;
00114
00116 BOOLEAN QuitThread;
00117
00119 KIRQL IecBlockIrqPreviousIrql;
00120
00122 #if DBG
00123 LONG IecBlockIrqUsageCount;
00124 #endif
00125
00126 } ARCH_DEVICE_EXTENSION;
00127
00128 extern VOID
00129 DriverUnload(IN PDRIVER_OBJECT DriverObject);
00130
00131 extern NTSTATUS
00132 DriverCommonInit(IN PDRIVER_OBJECT Driverobject, IN PUNICODE_STRING RegistryPath);
00133
00134 extern VOID
00135 DriverCommonUninit(VOID);
00136
00137 extern NTSTATUS
00138 AddDeviceCommonInit(IN PDEVICE_OBJECT Fdo, IN PUNICODE_STRING DeviceName, IN PCWSTR ParallelPortName);
00139
00140 extern NTSTATUS
00141 cbm_install(IN PDEVICE_EXTENSION Pdx, OUT PCBMT_I_INSTALL_OUT ReturnBuffer, IN OUT PULONG ReturnLength);
00142
00143 extern NTSTATUS
00144 cbm_lock(IN PDEVICE_EXTENSION Pdx);
00145
00146 extern NTSTATUS
00147 cbm_unlock(IN PDEVICE_EXTENSION Pdx);
00148
00149 extern NTSTATUS
00150 cbm_lock_parport(IN PDEVICE_EXTENSION Pdx);
00151
00152 extern NTSTATUS
00153 cbm_unlock_parport(IN PDEVICE_EXTENSION Pdx);
00154
00155 #if DBG
00156 extern NTSTATUS
00157 cbm_dbg_readbuffer(IN PDEVICE_EXTENSION Pdx, OUT PCHAR ReturnBuffer, IN OUT PULONG ReturnLength);
00158 #endif // #if DBG
00159
00160 extern VOID
00161 cbm_init_registry(IN PUNICODE_STRING RegistryPath, IN PDEVICE_EXTENSION Pdx);
00162
00163 extern NTSTATUS
00164 cbm_startio(IN PDEVICE_OBJECT Fdo, IN PIRP Irp);
00165
00166 extern NTSTATUS
00167 cbm_createopenclose(IN PDEVICE_OBJECT Fdo, IN PIRP Irp);
00168
00169 extern NTSTATUS
00170 cbm_readwrite(IN PDEVICE_OBJECT Fdo, IN PIRP Irp);
00171
00172 extern NTSTATUS
00173 cbm_execute_readwrite(IN PDEVICE_EXTENSION Pdx, IN PIRP Irp);
00174
00175 extern NTSTATUS
00176 cbm_execute_createopen(IN PDEVICE_EXTENSION Pdx, IN PIRP Irp);
00177
00178 extern NTSTATUS
00179 cbm_cleanup(IN PDEVICE_OBJECT Fdo, IN PIRP Irp);
00180
00181 extern NTSTATUS
00182 cbm_execute_close(IN PDEVICE_EXTENSION Pdx, IN PIRP Irp);
00183
00184 extern NTSTATUS
00185 cbm_devicecontrol(IN PDEVICE_OBJECT Fdo, IN PIRP Irp);
00186
00187 extern NTSTATUS
00188 cbm_execute_devicecontrol(IN PDEVICE_EXTENSION Pdx, IN PIRP Irp);
00189
00190 extern BOOLEAN
00191 cbm_isr(IN PKINTERRUPT Interrupt, IN PVOID Pdx);
00192
00193 extern VOID
00194 cbm_thread(IN PVOID Context);
00195
00196 extern NTSTATUS
00197 cbm_start_thread(IN PDEVICE_EXTENSION Pdx);
00198
00199 extern VOID
00200 cbm_stop_thread(IN PDEVICE_EXTENSION Pdx);
00201
00202 #ifndef PENUMERATE_DEFINED
00203
00204 typedef PVOID PENUMERATE;
00205 #endif
00206
00207 extern NTSTATUS
00208 ParPortEnumerateOpen(PENUMERATE *EnumStruct);
00209
00210 extern NTSTATUS
00211 ParPortEnumerate(PENUMERATE EnumStruct, PCWSTR *DriverName);
00212
00213 extern VOID
00214 ParPortEnumerateClose(PENUMERATE EnumStruct);
00215
00216 extern NTSTATUS
00217 ParPortInit(PUNICODE_STRING ParallelPortName, PDEVICE_EXTENSION Pdx);
00218
00219 extern NTSTATUS
00220 ParPortDeinit(PDEVICE_EXTENSION Pdx);
00221
00222 extern NTSTATUS
00223 ParPortAllocate(PDEVICE_EXTENSION Pdx);
00224
00225 extern NTSTATUS
00226 ParPortFree(PDEVICE_EXTENSION Pdx);
00227
00228 extern NTSTATUS
00229 ParPortSetMode(PDEVICE_EXTENSION Pdx);
00230
00231 extern NTSTATUS
00232 ParPortUnsetMode(PDEVICE_EXTENSION Pdx);
00233
00234 extern NTSTATUS
00235 ParPortSetModeWdm(PDEVICE_EXTENSION Pdx);
00236
00237 extern NTSTATUS
00238 ParPortUnsetModeWdm(PDEVICE_EXTENSION Pdx);
00239
00240 extern NTSTATUS
00241 ParPortAllocInterrupt(PDEVICE_EXTENSION Pdx, PKSERVICE_ROUTINE Isr);
00242
00243 extern NTSTATUS
00244 ParPortFreeInterrupt(PDEVICE_EXTENSION Pdx);
00245
00246 extern NTSTATUS
00247 ParPortAllowInterruptIoctl(PDEVICE_EXTENSION Pdx);
00248
00249 extern NTSTATUS
00250 cbm_registry_open_for_read(OUT PHANDLE HandleKey, IN PUNICODE_STRING Path);
00251
00252 extern NTSTATUS
00253 cbm_registry_open_hardwarekey(OUT PHANDLE HandleKey, OUT PDEVICE_OBJECT *Pdo,
00254 IN PDEVICE_EXTENSION Pdx);
00255
00256 extern NTSTATUS
00257 cbm_registry_close(IN HANDLE HandleKey);
00258
00259 extern NTSTATUS
00260 cbm_registry_close_hardwarekey(IN HANDLE HandleKey, IN PDEVICE_OBJECT Pdo);
00261
00262 extern NTSTATUS
00263 cbm_registry_read_ulong(IN HANDLE HandleKey, IN PCWSTR KeyName, OUT PULONG Value);
00264
00265 extern NTSTATUS
00266 cbm_registry_write_ulong(IN HANDLE HandleKey, IN PCWSTR KeyName, IN ULONG Value);
00267
00268 extern NTSTATUS
00269 CbmOpenDeviceRegistryKey(IN PDEVICE_OBJECT a, IN ULONG b, IN ACCESS_MASK c, OUT PHANDLE d);
00270
00271 extern ULONG
00272 CbmGetCurrentProcessorNumber(VOID);
00273
00274 extern ULONG
00275 CbmGetNumberProcessors(VOID);
00276
00277 extern VOID
00278 CLI(VOID);
00279
00280 extern VOID
00281 STI(VOID);