Voodoo 1 GlideXP x64 Experimental Build 1121
============================================

Release Date: 16th September 2006

Website: http://www.users.on.net/triforce/glidexp/

WTF?
----
WTF you are probably asking yourself looking at this release. A new 'GlideXP' 
branded release is probably not something that people were expecting, espcially
not Voodoo 1 and definatley not for Windows XP x64.


What is it?
-----------

Voodoo 1 GlideXP x64 is a set of drivers to allow Voodoo 1 cards function in 
Windows XP x64. Well that's the theory. GlideXP x64 contains an all new 64 bit
Kernel driver (fxvoodoo.sys) that the 32 Bit user mode Glide dlls interface 
with.

The Glide dlls included in this package are original 3dfx NT4 Glide DLLs. These
are NOT the latest Voodoo 1 DLLs. The latest ones (Glide2 2.48 and Glide3 3.04)
from the Quake 3 driver kit crash instantly. Feel free to try other NT4 version
drivers your luck will probably vary. Note you can not use Win9x Glide drivers. 
You must use NT4 Glide drivers


How it works?
-------------

It works by reimplimenting the kernel services used by the NT4 Glide drivers. 

Getting into technical details, the Glide drivers are User Mode drivers that
attempt to directly access the hardware. This isn't possible in NT because the
in and out instructions are privledged. So under NT a service is installed that
Glide uses instead of the in and out instructions.

Additionally, a second service is used to memory map the Voodoo card into the 
virtual address space of the usermode process. This can only be done in Kernel 
mode so a service is required for this too. 

The interface used by the Glide driverse can be seen in the file 
swlibs/newpci/pcilib/fxnt.c from the Open Sourced Glide drivers. I cringed when
I saw the name of the DosDevice names used by the Drivers, GpdDev and MAPMEM. 
Yes these ARE the names, and yes they are the same as the DDK examples and yes 
the defines are the same but in some places the code acts differently. GG 3dfx.

The original NT4 drivers used a different service to perform both operations 
(cause the code was based on the DDK examples with few changes). I decided to 
reimplement them both into a single driver service (for future developments)

This is a bit different to the Win9x Glide drivers. They use in and out 
instructions and use a vxd to perform the memory mapping. The file from the 
Open Source drivers with this interface is swlibs/newpci/pcilib/fxvxd.c. 

For all operating system, the Glide driver itself probes all PCI devices to 
figure out if there is a Voodoo device installed, rather than using operating
system services to do that. This is obviously a huge problem. See the 
Known Issues section.


Driver Versions Included
------------------------
FXVoodoo.sys - 5.2.0.1121   (64 bit)
fxoem2x.dll  - 2.53.0.24764 (32 bit)
Glide2x.dll  - 2.46.0.23963 (32 bit)
Glide3x.dll  - 3.2.0.40607  (32 bit)


Voodoo 2?
---------

FXVoodoo.sys should in theory work just fine with a Voodoo 2. You'll need to 
obtain fxoem2x.dll, Glide2x.dll, Glide3x.dll and perhaps 3dfxSpl2.dll and 
3dfxSpl3.dll from a Voodoo 2 driver kit if needed, then do some inf 
modifications. In the inf you should need to do is uncomment a few lines and
comment out the Voodoo 3D device line to be good to go.

A note, I do not have a Voodoo 2 so it's untested but should work if the Glide 
dlls cooperate.


What about Voodoo Banshee/3/4/5?
--------------------------------

Nope not a chance. Banshee and newer Glide drivers interface the hardware 
through GDI and DirectDraw and get the 2D driver to initialize 3D mode instead
of interfacing directly with the hardware. 

While it would be possible to modify Glide to directly access the hardware (DOS
Glide already does this) and use FXVoodoo.sys to access the hardware, it would
ultimately be rather pointless. It will be rather impossible to get these AGP 
cards will work in modern systems, and there is no pass through so you're going
to need a different monitor or use an external switching box. The effort or 
re-engineering the H3/H5 Glide drivers wouldn't be worth the effort.


Source?
-------

Sorry folks, not with this release. Not yet anyway. I want to clean up the code
before I release it... I don't think people really want to be looking at a file
full of example code.

Compatilibty
------------

Unknown.

I've only tested this in Windows XP x64 on an nForce3 250 system with an 
Althon 64 3500+ and 1 GB of memory. In general things seem ok in all the 
programs I tested, except for issues noted below.


Known Issues
------------

* The FXVoodoo.sys driver opens up some potential security holes. It allows any
  usermode program to arbitrarily map memory from any PCI device and read from
  and write to system ports. This is exactly the same as the existing 32 bit 
  drivers. If you are concerned about this problem, then do not install this 
  driver. A future driver will close these holes as much as possible but there
  is only so much that can be done to retain compatibility with the binary 
  Glide2x and Glide3x drivers.

* In testing, I've found the 32 bit usermode Glide drviers can be quite 
  unstable on my system. I am unsure of the exact reason why. The driver seems 
  to get stuck in an infinite loop. If a debugger as attached and the EIP is 
  set to out of the loop, the program can continue functioning, till it gets 
  stuck again. I am looking into compiling my own Glide2x dll and finding where
  this problem is and fixing it. It may be a problem only effecting me. I don't
  know.

* No OpenGL driver has been included. If you want to use OpenGL with a Voodoo 1
  you're a nutcase so I'm not going to bother to distribute a driver. If you 
  really need OpenGL then you can get an OpenGL driver from another package 
  from elsewhere and test things out. No promises whether it will work or not.

* MSR stuff (Write combining) is not implemented. I have no idea how that stuff
  works so I don't know where to being implementing it. See the file
  swlibs/newpci/pcilib/fxmsr.c in the Open Sourced Glide Sources for some 
  details as well as fxnt.c.


The Future
----------

If I manage to get the Glide2x sources to compile which shouldn't be too hard 
then I'll probably release a new set of drivers with issues fixed. I don't have
Glide3x sources for Voodoo 1 (only got them for Voodoo 2 and newer) so any 
problems fixed will only be fixed in Glide2x. It shouldn't be too much of a 
problem considering few programs used Glide3x.

Something I'd like to change is stop Glide from probing all PCI devices to 
workout where a Voodoo is. Instead I want to change it so it uses a WMD driver
interface and uses that to know how many devices are available.

Perhaps I should even back port the 64 bit driver back to 32 bit to close the
various security holes among other problems.

Bug Reporting
-------------

This is released unsupported. I don't want to know of any problems with it.


Contact Details
---------------

Name: Ryan Nunn (Colourless)
Email: colourless@hidden-waters.com
WWW: http://www.users.on.net/triforce/glidexp/
