|  | The entire archive was pulled from here: | 
|  | Dr. Dobb's Journal, http://www.ddj.com/ftp/1996/1996.05/directio.zip | 
|  | It contained some other snippets too, but as they are not useful here | 
|  | I don't include them here. | 
|  |  | 
|  | chris | 
|  |  | 
|  | Following is the original readme of the archive: | 
|  | ----------------------------------------------------------------------------- | 
|  |  | 
|  |  | 
|  | Author: Dale Roberts, Direct I/O and Windows NT | 
|  |  | 
|  |  | 
|  | Here are two helpful hints to get you going with GIVEIO.  The first | 
|  | section below mentions the INSTDRV utility that is provided with the | 
|  | Microsoft DDK. If you do not have access to the DDK, you can use Paula | 
|  | Tomlinson's program LOADDRV instead.  She describes it in her May 1995 | 
|  | article in Windows/DOS Developer's Journal (now Windows Developer's | 
|  | Journal).  You can get the program from their FTP site at: | 
|  |  | 
|  | ftp://ftp.mfi.com/pub/windev/1995/may95.zip. | 
|  |  | 
|  |  | 
|  | ------------------------------------------------------------------ | 
|  | Device Driver Installation Made Easy | 
|  |  | 
|  | The Microsoft NT Device Driver Kit documentation implies in several | 
|  | places that there are several steps involved in installing a device driver | 
|  | and making it accessible to a Win32 application.  It explains that you | 
|  | should edit the registry manually and then reboot the system.  But | 
|  | device drivers are dynamically loadable and unloadable in NT, and the | 
|  | DDK comes with a very handy utility called INSTDRV that | 
|  | demonstrates this facility in a very practical manner. | 
|  |  | 
|  | INSTDRV is a console application that will register, load, and start a | 
|  | kernel mode device driver.  It does not require you to edit the registry | 
|  | manually or reboot the computer.  On the command line you simply | 
|  | give the name of your device driver and the complete path to the .SYS | 
|  | file (which does not need to be in the system's DRIVERS directory). | 
|  | After this command is executed, you will find that the driver has been | 
|  | registered with the system and appears in the Devices applet in the | 
|  | control panel.  If you give the word remove instead of the path, the | 
|  | driver is removed from the system and taken out of the driver database. | 
|  |  | 
|  | Once the driver is loaded and started, you can use the control panel's | 
|  | Devices applet to start and stop it, or you can use the net start and net | 
|  | stop commands (these are much faster) from a console window.  When | 
|  | a kernel mode device is stopped, it is in also unloaded from memory. | 
|  | The next time you start the device, a fresh copy of the driver is read | 
|  | from the hard drive, if it has been modified.  This makes it very | 
|  | convenient to develop device drivers, since you can go through the | 
|  | modify, stop, start cycle repeatedly without ever needing to reboot.  If | 
|  | you need your driver to load at boot time, you can go into the Devices | 
|  | applet and change its startup mode to boot. | 
|  |  | 
|  | The other component that is needed to make the driver visible to user | 
|  | mode applications, so they can use CreateFile() calls to access the | 
|  | driver, is registering the name in the DOS Devices name space.  This | 
|  | can be done, as documented in the DDK, by editing the registry | 
|  | manually and rebooting.  Or, much more simply, the kernel mode | 
|  | driver can call the IoCreateSymbolicLink() function to register the | 
|  | name itself.  The GIVEIO driver shown in Listing Four uses the later | 
|  | technique.  Once the name is registered, user mode applications can get | 
|  | a file handle to the device driver by calling CreateFile() with the driver | 
|  | name as the file parameter, but preceding the driver name with the | 
|  | special cookie \\.\.  The TESTIO application in Listing Five uses this | 
|  | technique. | 
|  |  | 
|  | ------------------------------------------------------------------ | 
|  | Quick Trick:  Using DEBUG With Port I/O | 
|  |  | 
|  | Sometimes you just need to do a quick I/O operation to a port.  In DOS, | 
|  | you could use the DEBUG program to accomplish this.  In NT, once | 
|  | you have the GIVEIO device driver up and running, you can once | 
|  | again use DEBUG for port I/O.  If you look at the source code for the | 
|  | test application, you'll see that all it does is open and close the GIVEIO | 
|  | device driver.  It uses the special cookie \\.\ before the driver name in | 
|  | order to access it.  Without modifying DEBUG, you can have it open | 
|  | this device driver by simply typing debug \\.\giveio in an NT console | 
|  | window.  You will get an error message complaining that the file | 
|  | \\.\giveio is not found, but it will give DEBUG I/O access anyway. | 
|  | Subsequent DOS applications that are run from this console window | 
|  | will also have I/O access. | 
|  |  | 
|  | WIN32 applications executed from this console window will still cause | 
|  | exceptions.  This is because DEBUG (and any other DOS application) | 
|  | runs in the context of the VDM (Virtual DOS Machine) process of the | 
|  | console box, whereas each WIN32 application gets its own process. | 
|  | The VDM process stays active as long as the console window is open, | 
|  | but each WIN32 application creates a brand new process with the | 
|  | IOPM offset initialized to point beyond the end of the TSS. |