Added support for implementing VxDs as separate dlls and loading them
on demand.
Moved all the DeviceIoControl code into the respective VxD dlls.

diff --git a/configure b/configure
index 753f2aa..c2f8f81 100755
--- a/configure
+++ b/configure
@@ -19116,7 +19116,7 @@
 MAKE_PROG_RULES=programs/Makeprog.rules
 
 
-                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            ac_config_files="$ac_config_files Make.rules dlls/Makedll.rules dlls/Maketest.rules libs/Makelib.rules programs/Makeprog.rules Makefile dlls/Makefile dlls/advapi32/Makefile dlls/advapi32/tests/Makefile dlls/avicap32/Makefile dlls/avifil32/Makefile dlls/cabinet/Makefile dlls/capi2032/Makefile dlls/cfgmgr32/Makefile dlls/comcat/Makefile dlls/comctl32/Makefile dlls/comctl32/tests/Makefile dlls/commdlg/Makefile dlls/crtdll/Makefile dlls/crypt32/Makefile dlls/ctl3d/Makefile dlls/d3d8/Makefile dlls/d3d9/Makefile dlls/d3dim/Makefile dlls/d3dx8/Makefile dlls/dciman32/Makefile dlls/ddraw/Makefile dlls/ddraw/tests/Makefile dlls/devenum/Makefile dlls/dinput/Makefile dlls/dinput8/Makefile dlls/dmband/Makefile dlls/dmcompos/Makefile dlls/dmime/Makefile dlls/dmloader/Makefile dlls/dmscript/Makefile dlls/dmstyle/Makefile dlls/dmsynth/Makefile dlls/dmusic/Makefile dlls/dmusic32/Makefile dlls/dplay/Makefile dlls/dplayx/Makefile dlls/dpnhpast/Makefile dlls/dsound/Makefile dlls/dsound/tests/Makefile dlls/dswave/Makefile dlls/dxguid/Makefile dlls/gdi/Makefile dlls/gdi/tests/Makefile dlls/glu32/Makefile dlls/glut32/Makefile dlls/iccvid/Makefile dlls/icmp/Makefile dlls/imagehlp/Makefile dlls/imm32/Makefile dlls/iphlpapi/Makefile dlls/iphlpapi/tests/Makefile dlls/kernel/Makefile dlls/kernel/tests/Makefile dlls/lzexpand/Makefile dlls/mapi32/Makefile dlls/mpr/Makefile dlls/msacm/Makefile dlls/msacm/imaadp32/Makefile dlls/msacm/msadp32/Makefile dlls/msacm/msg711/Makefile dlls/msacm/winemp3/Makefile dlls/msdmo/Makefile dlls/mshtml/Makefile dlls/msi/Makefile dlls/msimg32/Makefile dlls/msisys/Makefile dlls/msnet32/Makefile dlls/msvcrt/Makefile dlls/msvcrt/tests/Makefile dlls/msvcrt20/Makefile dlls/msvcrt40/Makefile dlls/msvcrtd/Makefile dlls/msvidc32/Makefile dlls/msvideo/Makefile dlls/msvideo/msrle32/Makefile dlls/mswsock/Makefile dlls/netapi32/Makefile dlls/netapi32/tests/Makefile dlls/newdev/Makefile dlls/ntdll/Makefile dlls/ntdll/tests/Makefile dlls/odbc32/Makefile dlls/ole32/Makefile dlls/oleacc/Makefile dlls/oleaut32/Makefile dlls/oleaut32/tests/Makefile dlls/olecli/Makefile dlls/oledlg/Makefile dlls/olepro32/Makefile dlls/olesvr/Makefile dlls/opengl32/Makefile dlls/psapi/Makefile dlls/qcap/Makefile dlls/quartz/Makefile dlls/rasapi32/Makefile dlls/richedit/Makefile dlls/rpcrt4/Makefile dlls/rpcrt4/tests/Makefile dlls/rsabase/Makefile dlls/serialui/Makefile dlls/setupapi/Makefile dlls/shdocvw/Makefile dlls/shell32/Makefile dlls/shell32/tests/Makefile dlls/shfolder/Makefile dlls/shlwapi/Makefile dlls/shlwapi/tests/Makefile dlls/snmpapi/Makefile dlls/sti/Makefile dlls/tapi32/Makefile dlls/ttydrv/Makefile dlls/twain/Makefile dlls/unicows/Makefile dlls/url/Makefile dlls/urlmon/Makefile dlls/urlmon/tests/Makefile dlls/user/Makefile dlls/user/tests/Makefile dlls/uuid/Makefile dlls/uxtheme/Makefile dlls/version/Makefile dlls/win32s/Makefile dlls/winaspi/Makefile dlls/wined3d/Makefile dlls/winedos/Makefile dlls/wineps/Makefile dlls/wininet/Makefile dlls/wininet/tests/Makefile dlls/winmm/Makefile dlls/winmm/joystick/Makefile dlls/winmm/mcianim/Makefile dlls/winmm/mciavi/Makefile dlls/winmm/mcicda/Makefile dlls/winmm/mciseq/Makefile dlls/winmm/mciwave/Makefile dlls/winmm/midimap/Makefile dlls/winmm/tests/Makefile dlls/winmm/wavemap/Makefile dlls/winmm/winealsa/Makefile dlls/winmm/winearts/Makefile dlls/winmm/wineaudioio/Makefile dlls/winmm/winejack/Makefile dlls/winmm/winenas/Makefile dlls/winmm/wineoss/Makefile dlls/winnls/Makefile dlls/winsock/Makefile dlls/winsock/tests/Makefile dlls/winspool/Makefile dlls/winspool/tests/Makefile dlls/wintab32/Makefile dlls/wintrust/Makefile dlls/wow32/Makefile dlls/wsock32/Makefile dlls/x11drv/Makefile documentation/Makefile include/Makefile libs/Makefile libs/port/Makefile libs/unicode/Makefile libs/wine/Makefile libs/wpp/Makefile loader/Makefile programs/Makefile programs/avitools/Makefile programs/clock/Makefile programs/cmdlgtst/Makefile programs/control/Makefile programs/expand/Makefile programs/notepad/Makefile programs/progman/Makefile programs/regedit/Makefile programs/regsvr32/Makefile programs/rpcss/Makefile programs/rundll32/Makefile programs/start/Makefile programs/uninstaller/Makefile programs/view/Makefile programs/wcmd/Makefile programs/wineboot/Makefile programs/winebrowser/Makefile programs/winecfg/Makefile programs/wineconsole/Makefile programs/winedbg/Makefile programs/winefile/Makefile programs/winemenubuilder/Makefile programs/winemine/Makefile programs/winepath/Makefile programs/winetest/Makefile programs/winevdm/Makefile programs/winhelp/Makefile programs/winver/Makefile server/Makefile tools/Makefile tools/widl/Makefile tools/winapi/Makefile tools/winebuild/Makefile tools/winedump/Makefile tools/winegcc/Makefile tools/wmc/Makefile tools/wrc/Makefile"
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            ac_config_files="$ac_config_files Make.rules dlls/Makedll.rules dlls/Maketest.rules libs/Makelib.rules programs/Makeprog.rules Makefile dlls/Makefile dlls/advapi32/Makefile dlls/advapi32/tests/Makefile dlls/avicap32/Makefile dlls/avifil32/Makefile dlls/cabinet/Makefile dlls/capi2032/Makefile dlls/cfgmgr32/Makefile dlls/comcat/Makefile dlls/comctl32/Makefile dlls/comctl32/tests/Makefile dlls/commdlg/Makefile dlls/crtdll/Makefile dlls/crypt32/Makefile dlls/ctl3d/Makefile dlls/d3d8/Makefile dlls/d3d9/Makefile dlls/d3dim/Makefile dlls/d3dx8/Makefile dlls/dciman32/Makefile dlls/ddraw/Makefile dlls/ddraw/tests/Makefile dlls/devenum/Makefile dlls/dinput/Makefile dlls/dinput8/Makefile dlls/dmband/Makefile dlls/dmcompos/Makefile dlls/dmime/Makefile dlls/dmloader/Makefile dlls/dmscript/Makefile dlls/dmstyle/Makefile dlls/dmsynth/Makefile dlls/dmusic/Makefile dlls/dmusic32/Makefile dlls/dplay/Makefile dlls/dplayx/Makefile dlls/dpnhpast/Makefile dlls/dsound/Makefile dlls/dsound/tests/Makefile dlls/dswave/Makefile dlls/dxguid/Makefile dlls/gdi/Makefile dlls/gdi/tests/Makefile dlls/glu32/Makefile dlls/glut32/Makefile dlls/iccvid/Makefile dlls/icmp/Makefile dlls/ifsmgr.vxd/Makefile dlls/imagehlp/Makefile dlls/imm32/Makefile dlls/iphlpapi/Makefile dlls/iphlpapi/tests/Makefile dlls/kernel/Makefile dlls/kernel/tests/Makefile dlls/lzexpand/Makefile dlls/mapi32/Makefile dlls/mmdevldr.vxd/Makefile dlls/monodebg.vxd/Makefile dlls/mpr/Makefile dlls/msacm/Makefile dlls/msacm/imaadp32/Makefile dlls/msacm/msadp32/Makefile dlls/msacm/msg711/Makefile dlls/msacm/winemp3/Makefile dlls/msdmo/Makefile dlls/mshtml/Makefile dlls/msi/Makefile dlls/msimg32/Makefile dlls/msisys/Makefile dlls/msnet32/Makefile dlls/msvcrt/Makefile dlls/msvcrt/tests/Makefile dlls/msvcrt20/Makefile dlls/msvcrt40/Makefile dlls/msvcrtd/Makefile dlls/msvidc32/Makefile dlls/msvideo/Makefile dlls/msvideo/msrle32/Makefile dlls/mswsock/Makefile dlls/netapi32/Makefile dlls/netapi32/tests/Makefile dlls/newdev/Makefile dlls/ntdll/Makefile dlls/ntdll/tests/Makefile dlls/odbc32/Makefile dlls/ole32/Makefile dlls/oleacc/Makefile dlls/oleaut32/Makefile dlls/oleaut32/tests/Makefile dlls/olecli/Makefile dlls/oledlg/Makefile dlls/olepro32/Makefile dlls/olesvr/Makefile dlls/opengl32/Makefile dlls/psapi/Makefile dlls/qcap/Makefile dlls/quartz/Makefile dlls/rasapi32/Makefile dlls/richedit/Makefile dlls/rpcrt4/Makefile dlls/rpcrt4/tests/Makefile dlls/rsabase/Makefile dlls/serialui/Makefile dlls/setupapi/Makefile dlls/shdocvw/Makefile dlls/shell32/Makefile dlls/shell32/tests/Makefile dlls/shfolder/Makefile dlls/shlwapi/Makefile dlls/shlwapi/tests/Makefile dlls/snmpapi/Makefile dlls/sti/Makefile dlls/tapi32/Makefile dlls/ttydrv/Makefile dlls/twain/Makefile dlls/unicows/Makefile dlls/url/Makefile dlls/urlmon/Makefile dlls/urlmon/tests/Makefile dlls/user/Makefile dlls/user/tests/Makefile dlls/uuid/Makefile dlls/uxtheme/Makefile dlls/vdhcp.vxd/Makefile dlls/version/Makefile dlls/vnb.vxd/Makefile dlls/vnetbios.vxd/Makefile dlls/vtdapi.vxd/Makefile dlls/vwin32.vxd/Makefile dlls/win32s/Makefile dlls/winaspi/Makefile dlls/wined3d/Makefile dlls/winedos/Makefile dlls/wineps/Makefile dlls/wininet/Makefile dlls/wininet/tests/Makefile dlls/winmm/Makefile dlls/winmm/joystick/Makefile dlls/winmm/mcianim/Makefile dlls/winmm/mciavi/Makefile dlls/winmm/mcicda/Makefile dlls/winmm/mciseq/Makefile dlls/winmm/mciwave/Makefile dlls/winmm/midimap/Makefile dlls/winmm/tests/Makefile dlls/winmm/wavemap/Makefile dlls/winmm/winealsa/Makefile dlls/winmm/winearts/Makefile dlls/winmm/wineaudioio/Makefile dlls/winmm/winejack/Makefile dlls/winmm/winenas/Makefile dlls/winmm/wineoss/Makefile dlls/winnls/Makefile dlls/winsock/Makefile dlls/winsock/tests/Makefile dlls/winspool/Makefile dlls/winspool/tests/Makefile dlls/wintab32/Makefile dlls/wintrust/Makefile dlls/wow32/Makefile dlls/wsock32/Makefile dlls/x11drv/Makefile documentation/Makefile include/Makefile libs/Makefile libs/port/Makefile libs/unicode/Makefile libs/wine/Makefile libs/wpp/Makefile loader/Makefile programs/Makefile programs/avitools/Makefile programs/clock/Makefile programs/cmdlgtst/Makefile programs/control/Makefile programs/expand/Makefile programs/notepad/Makefile programs/progman/Makefile programs/regedit/Makefile programs/regsvr32/Makefile programs/rpcss/Makefile programs/rundll32/Makefile programs/start/Makefile programs/uninstaller/Makefile programs/view/Makefile programs/wcmd/Makefile programs/wineboot/Makefile programs/winebrowser/Makefile programs/winecfg/Makefile programs/wineconsole/Makefile programs/winedbg/Makefile programs/winefile/Makefile programs/winemenubuilder/Makefile programs/winemine/Makefile programs/winepath/Makefile programs/winetest/Makefile programs/winevdm/Makefile programs/winhelp/Makefile programs/winver/Makefile server/Makefile tools/Makefile tools/widl/Makefile tools/winapi/Makefile tools/winebuild/Makefile tools/winedump/Makefile tools/winegcc/Makefile tools/wmc/Makefile tools/wrc/Makefile"
 
 
 cat >confcache <<\_ACEOF
@@ -19700,6 +19700,7 @@
   "dlls/glut32/Makefile" ) CONFIG_FILES="$CONFIG_FILES dlls/glut32/Makefile" ;;
   "dlls/iccvid/Makefile" ) CONFIG_FILES="$CONFIG_FILES dlls/iccvid/Makefile" ;;
   "dlls/icmp/Makefile" ) CONFIG_FILES="$CONFIG_FILES dlls/icmp/Makefile" ;;
+  "dlls/ifsmgr.vxd/Makefile" ) CONFIG_FILES="$CONFIG_FILES dlls/ifsmgr.vxd/Makefile" ;;
   "dlls/imagehlp/Makefile" ) CONFIG_FILES="$CONFIG_FILES dlls/imagehlp/Makefile" ;;
   "dlls/imm32/Makefile" ) CONFIG_FILES="$CONFIG_FILES dlls/imm32/Makefile" ;;
   "dlls/iphlpapi/Makefile" ) CONFIG_FILES="$CONFIG_FILES dlls/iphlpapi/Makefile" ;;
@@ -19708,6 +19709,8 @@
   "dlls/kernel/tests/Makefile" ) CONFIG_FILES="$CONFIG_FILES dlls/kernel/tests/Makefile" ;;
   "dlls/lzexpand/Makefile" ) CONFIG_FILES="$CONFIG_FILES dlls/lzexpand/Makefile" ;;
   "dlls/mapi32/Makefile" ) CONFIG_FILES="$CONFIG_FILES dlls/mapi32/Makefile" ;;
+  "dlls/mmdevldr.vxd/Makefile" ) CONFIG_FILES="$CONFIG_FILES dlls/mmdevldr.vxd/Makefile" ;;
+  "dlls/monodebg.vxd/Makefile" ) CONFIG_FILES="$CONFIG_FILES dlls/monodebg.vxd/Makefile" ;;
   "dlls/mpr/Makefile" ) CONFIG_FILES="$CONFIG_FILES dlls/mpr/Makefile" ;;
   "dlls/msacm/Makefile" ) CONFIG_FILES="$CONFIG_FILES dlls/msacm/Makefile" ;;
   "dlls/msacm/imaadp32/Makefile" ) CONFIG_FILES="$CONFIG_FILES dlls/msacm/imaadp32/Makefile" ;;
@@ -19773,7 +19776,12 @@
   "dlls/user/tests/Makefile" ) CONFIG_FILES="$CONFIG_FILES dlls/user/tests/Makefile" ;;
   "dlls/uuid/Makefile" ) CONFIG_FILES="$CONFIG_FILES dlls/uuid/Makefile" ;;
   "dlls/uxtheme/Makefile" ) CONFIG_FILES="$CONFIG_FILES dlls/uxtheme/Makefile" ;;
+  "dlls/vdhcp.vxd/Makefile" ) CONFIG_FILES="$CONFIG_FILES dlls/vdhcp.vxd/Makefile" ;;
   "dlls/version/Makefile" ) CONFIG_FILES="$CONFIG_FILES dlls/version/Makefile" ;;
+  "dlls/vnb.vxd/Makefile" ) CONFIG_FILES="$CONFIG_FILES dlls/vnb.vxd/Makefile" ;;
+  "dlls/vnetbios.vxd/Makefile" ) CONFIG_FILES="$CONFIG_FILES dlls/vnetbios.vxd/Makefile" ;;
+  "dlls/vtdapi.vxd/Makefile" ) CONFIG_FILES="$CONFIG_FILES dlls/vtdapi.vxd/Makefile" ;;
+  "dlls/vwin32.vxd/Makefile" ) CONFIG_FILES="$CONFIG_FILES dlls/vwin32.vxd/Makefile" ;;
   "dlls/win32s/Makefile" ) CONFIG_FILES="$CONFIG_FILES dlls/win32s/Makefile" ;;
   "dlls/winaspi/Makefile" ) CONFIG_FILES="$CONFIG_FILES dlls/winaspi/Makefile" ;;
   "dlls/wined3d/Makefile" ) CONFIG_FILES="$CONFIG_FILES dlls/wined3d/Makefile" ;;
diff --git a/configure.ac b/configure.ac
index e22ba9e..e7c77dd 100644
--- a/configure.ac
+++ b/configure.ac
@@ -1513,6 +1513,7 @@
 dlls/glut32/Makefile
 dlls/iccvid/Makefile
 dlls/icmp/Makefile
+dlls/ifsmgr.vxd/Makefile
 dlls/imagehlp/Makefile
 dlls/imm32/Makefile
 dlls/iphlpapi/Makefile
@@ -1521,6 +1522,8 @@
 dlls/kernel/tests/Makefile
 dlls/lzexpand/Makefile
 dlls/mapi32/Makefile
+dlls/mmdevldr.vxd/Makefile
+dlls/monodebg.vxd/Makefile
 dlls/mpr/Makefile
 dlls/msacm/Makefile
 dlls/msacm/imaadp32/Makefile
@@ -1586,7 +1589,12 @@
 dlls/user/tests/Makefile
 dlls/uuid/Makefile
 dlls/uxtheme/Makefile
+dlls/vdhcp.vxd/Makefile
 dlls/version/Makefile
+dlls/vnb.vxd/Makefile
+dlls/vnetbios.vxd/Makefile
+dlls/vtdapi.vxd/Makefile
+dlls/vwin32.vxd/Makefile
 dlls/win32s/Makefile
 dlls/winaspi/Makefile
 dlls/wined3d/Makefile
diff --git a/dlls/Makefile.in b/dlls/Makefile.in
index 1a7870d..a6abe53 100644
--- a/dlls/Makefile.in
+++ b/dlls/Makefile.in
@@ -50,12 +50,15 @@
 	gdi \
 	iccvid \
 	icmp \
+	ifsmgr.vxd \
 	imagehlp \
 	imm32 \
 	iphlpapi \
 	kernel \
 	lzexpand \
 	mapi32 \
+	mmdevldr.vxd \
+	monodebg.vxd \
 	mpr \
 	msacm \
 	msacm/imaadp32 \
@@ -110,7 +113,12 @@
 	urlmon \
 	user \
 	uxtheme \
+	vdhcp.vxd \
 	version \
+	vnb.vxd \
+	vnetbios.vxd \
+	vtdapi.vxd \
+	vwin32.vxd \
 	win32s \
 	winaspi \
 	winedos \
@@ -248,6 +256,7 @@
 	gdi32.dll$(DLLEXT) \
 	iccvid.dll$(DLLEXT) \
 	icmp.dll$(DLLEXT) \
+	ifsmgr.vxd$(DLLEXT) \
 	imaadp32.acm$(DLLEXT) \
 	imagehlp.dll$(DLLEXT) \
 	imm32.dll$(DLLEXT) \
@@ -264,6 +273,8 @@
 	mciseq.drv$(DLLEXT) \
 	mciwave.drv$(DLLEXT) \
 	midimap.drv$(DLLEXT) \
+	mmdevldr.vxd$(DLLEXT) \
+	monodebg.vxd$(DLLEXT) \
 	mpr.dll$(DLLEXT) \
 	msacm.drv$(DLLEXT) \
 	msacm32.dll$(DLLEXT) \
@@ -317,7 +328,12 @@
 	urlmon.dll$(DLLEXT) \
 	user32.dll$(DLLEXT) \
 	uxtheme.dll$(DLLEXT) \
+	vdhcp.vxd$(DLLEXT) \
 	version.dll$(DLLEXT) \
+	vnb.vxd$(DLLEXT) \
+	vnetbios.vxd$(DLLEXT) \
+	vtdapi.vxd$(DLLEXT) \
+	vwin32.vxd$(DLLEXT) \
 	w32skrnl.dll$(DLLEXT) \
 	winealsa.drv$(DLLEXT) \
 	winearts.drv$(DLLEXT) \
@@ -477,6 +493,9 @@
 icmp.dll$(DLLEXT): icmp/icmp.dll$(DLLEXT)
 	$(RM) $@ && $(LN_S) icmp/icmp.dll$(DLLEXT) $@
 
+ifsmgr.vxd$(DLLEXT): ifsmgr.vxd/ifsmgr.vxd$(DLLEXT)
+	$(RM) $@ && $(LN_S) ifsmgr.vxd/ifsmgr.vxd$(DLLEXT) $@
+
 imaadp32.acm$(DLLEXT): msacm/imaadp32/imaadp32.acm$(DLLEXT)
 	$(RM) $@ && $(LN_S) msacm/imaadp32/imaadp32.acm$(DLLEXT) $@
 
@@ -530,6 +549,12 @@
 midimap.drv$(DLLEXT): winmm/midimap/midimap.drv$(DLLEXT)
 	$(RM) $@ && $(LN_S) winmm/midimap/midimap.drv$(DLLEXT) $@
 
+mmdevldr.vxd$(DLLEXT): mmdevldr.vxd/mmdevldr.vxd$(DLLEXT)
+	$(RM) $@ && $(LN_S) mmdevldr.vxd/mmdevldr.vxd$(DLLEXT) $@
+
+monodebg.vxd$(DLLEXT): monodebg.vxd/monodebg.vxd$(DLLEXT)
+	$(RM) $@ && $(LN_S) monodebg.vxd/monodebg.vxd$(DLLEXT) $@
+
 mpr.dll$(DLLEXT): mpr/mpr.dll$(DLLEXT)
 	$(RM) $@ && $(LN_S) mpr/mpr.dll$(DLLEXT) $@
 
@@ -725,12 +750,27 @@
 uxtheme.dll$(DLLEXT): uxtheme/uxtheme.dll$(DLLEXT)
 	$(RM) $@ && $(LN_S) uxtheme/uxtheme.dll$(DLLEXT) $@
 
+vdhcp.vxd$(DLLEXT): vdhcp.vxd/vdhcp.vxd$(DLLEXT)
+	$(RM) $@ && $(LN_S) vdhcp.vxd/vdhcp.vxd$(DLLEXT) $@
+
 version.dll$(DLLEXT): version/version.dll$(DLLEXT)
 	$(RM) $@ && $(LN_S) version/version.dll$(DLLEXT) $@
 
 ver.dll$(DLLEXT) : version.dll$(DLLEXT)
 	$(RM) $@ && $(LN_S) version.dll$(DLLEXT) $@
 
+vnb.vxd$(DLLEXT): vnb.vxd/vnb.vxd$(DLLEXT)
+	$(RM) $@ && $(LN_S) vnb.vxd/vnb.vxd$(DLLEXT) $@
+
+vnetbios.vxd$(DLLEXT): vnetbios.vxd/vnetbios.vxd$(DLLEXT)
+	$(RM) $@ && $(LN_S) vnetbios.vxd/vnetbios.vxd$(DLLEXT) $@
+
+vtdapi.vxd$(DLLEXT): vtdapi.vxd/vtdapi.vxd$(DLLEXT)
+	$(RM) $@ && $(LN_S) vtdapi.vxd/vtdapi.vxd$(DLLEXT) $@
+
+vwin32.vxd$(DLLEXT): vwin32.vxd/vwin32.vxd$(DLLEXT)
+	$(RM) $@ && $(LN_S) vwin32.vxd/vwin32.vxd$(DLLEXT) $@
+
 w32skrnl.dll$(DLLEXT): win32s/w32skrnl.dll$(DLLEXT)
 	$(RM) $@ && $(LN_S) win32s/w32skrnl.dll$(DLLEXT) $@
 
@@ -1667,6 +1707,7 @@
 glut32/glut32.dll$(DLLEXT): glut32
 iccvid/iccvid.dll$(DLLEXT): iccvid
 icmp/icmp.dll$(DLLEXT): icmp
+ifsmgr.vxd/ifsmgr.vxd$(DLLEXT): ifsmgr.vxd
 msacm/imaadp32/imaadp32.acm$(DLLEXT): msacm/imaadp32
 imagehlp/imagehlp.dll$(DLLEXT): imagehlp
 imm32/imm32.dll$(DLLEXT): imm32
@@ -1681,6 +1722,8 @@
 winmm/mciseq/mciseq.drv$(DLLEXT): winmm/mciseq
 winmm/mciwave/mciwave.drv$(DLLEXT): winmm/mciwave
 winmm/midimap/midimap.drv$(DLLEXT): winmm/midimap
+mmdevldr.vxd/mmdevldr.vxd$(DLLEXT): mmdevldr.vxd
+monodebg.vxd/monodebg.vxd$(DLLEXT): monodebg.vxd
 mpr/mpr.dll$(DLLEXT): mpr
 winmm/wavemap/msacm.drv$(DLLEXT): winmm/wavemap
 msacm/msacm32.dll$(DLLEXT): msacm
@@ -1735,7 +1778,12 @@
 urlmon/urlmon.dll$(DLLEXT): urlmon
 user/user32.dll$(DLLEXT): user
 uxtheme/uxtheme.dll$(DLLEXT): uxtheme
+vdhcp.vxd/vdhcp.vxd$(DLLEXT): vdhcp.vxd
 version/version.dll$(DLLEXT): version
+vnb.vxd/vnb.vxd$(DLLEXT): vnb.vxd
+vnetbios.vxd/vnetbios.vxd$(DLLEXT): vnetbios.vxd
+vtdapi.vxd/vtdapi.vxd$(DLLEXT): vtdapi.vxd
+vwin32.vxd/vwin32.vxd$(DLLEXT): vwin32.vxd
 win32s/w32skrnl.dll$(DLLEXT): win32s
 winmm/winealsa/winealsa.drv$(DLLEXT): winmm/winealsa
 winmm/winearts/winearts.drv$(DLLEXT): winmm/winearts
diff --git a/dlls/ifsmgr.vxd/.cvsignore b/dlls/ifsmgr.vxd/.cvsignore
new file mode 100644
index 0000000..b37643c
--- /dev/null
+++ b/dlls/ifsmgr.vxd/.cvsignore
@@ -0,0 +1,3 @@
+Makefile
+ifsmgr.vxd.dbg.c
+ifsmgr.vxd.spec.c
diff --git a/dlls/ifsmgr.vxd/Makefile.in b/dlls/ifsmgr.vxd/Makefile.in
new file mode 100644
index 0000000..74c2ade
--- /dev/null
+++ b/dlls/ifsmgr.vxd/Makefile.in
@@ -0,0 +1,13 @@
+TOPSRCDIR = @top_srcdir@
+TOPOBJDIR = ../..
+SRCDIR    = @srcdir@
+VPATH     = @srcdir@
+MODULE    = ifsmgr.vxd
+IMPORTS   = winedos kernel32
+
+C_SRCS = \
+	ifsmgr.c
+
+@MAKE_DLL_RULES@
+
+### Dependencies:
diff --git a/dlls/ifsmgr.vxd/ifsmgr.c b/dlls/ifsmgr.vxd/ifsmgr.c
new file mode 100644
index 0000000..57bf22f
--- /dev/null
+++ b/dlls/ifsmgr.vxd/ifsmgr.c
@@ -0,0 +1,152 @@
+/*
+ * IFSMGR VxD implementation
+ *
+ * Copyright 1998 Marcus Meissner
+ * Copyright 1998 Ulrich Weigand
+ * Copyright 1998 Patrik Stridvall
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ */
+
+/* NOTES
+ *   These ioctls are used by 'MSNET32.DLL'.
+ *
+ *   I have been unable to uncover any documentation about the ioctls so
+ *   the implementation of the cases IFS_IOCTL_21 and IFS_IOCTL_2F are
+ *   based on reasonable guesses on information found in the Windows 95 DDK.
+ */
+
+#include <stdarg.h>
+
+#include "windef.h"
+#include "winbase.h"
+#include "wine/debug.h"
+
+WINE_DEFAULT_DEBUG_CHANNEL(vxd);
+
+extern void WINAPI CallBuiltinHandler( CONTEXT86 *context, BYTE intnum );  /* from winedos */
+
+/*
+ * IFSMgr DeviceIO service
+ */
+
+#define IFS_IOCTL_21                100
+#define IFS_IOCTL_2F                101
+#define IFS_IOCTL_GET_RES           102
+#define IFS_IOCTL_GET_NETPRO_NAME_A 103
+
+struct win32apireq {
+        unsigned long   ar_proid;
+        unsigned long   ar_eax;
+        unsigned long   ar_ebx;
+        unsigned long   ar_ecx;
+        unsigned long   ar_edx;
+        unsigned long   ar_esi;
+        unsigned long   ar_edi;
+        unsigned long   ar_ebp;
+        unsigned short  ar_error;
+        unsigned short  ar_pad;
+};
+
+static void win32apieq_2_CONTEXT(struct win32apireq *pIn,CONTEXT86 *pCxt)
+{
+        memset(pCxt,0,sizeof(*pCxt));
+
+        pCxt->ContextFlags=CONTEXT86_INTEGER|CONTEXT86_CONTROL;
+        pCxt->Eax = pIn->ar_eax;
+        pCxt->Ebx = pIn->ar_ebx;
+        pCxt->Ecx = pIn->ar_ecx;
+        pCxt->Edx = pIn->ar_edx;
+        pCxt->Esi = pIn->ar_esi;
+        pCxt->Edi = pIn->ar_edi;
+
+        /* FIXME: Only partial CONTEXT86_CONTROL */
+        pCxt->Ebp = pIn->ar_ebp;
+
+        /* FIXME: pIn->ar_proid ignored */
+        /* FIXME: pIn->ar_error ignored */
+        /* FIXME: pIn->ar_pad ignored */
+}
+
+static void CONTEXT_2_win32apieq(CONTEXT86 *pCxt,struct win32apireq *pOut)
+{
+        memset(pOut,0,sizeof(struct win32apireq));
+
+        pOut->ar_eax = pCxt->Eax;
+        pOut->ar_ebx = pCxt->Ebx;
+        pOut->ar_ecx = pCxt->Ecx;
+        pOut->ar_edx = pCxt->Edx;
+        pOut->ar_esi = pCxt->Esi;
+        pOut->ar_edi = pCxt->Edi;
+
+        /* FIXME: Only partial CONTEXT86_CONTROL */
+        pOut->ar_ebp = pCxt->Ebp;
+
+        /* FIXME: pOut->ar_proid ignored */
+        /* FIXME: pOut->ar_error ignored */
+        /* FIXME: pOut->ar_pad ignored */
+}
+
+/***********************************************************************
+ *           DeviceIoControl   (IFSMGR.VXD.@)
+ */
+BOOL WINAPI IFSMGR_DeviceIoControl(DWORD dwIoControlCode, LPVOID lpvInBuffer, DWORD cbInBuffer,
+                                  LPVOID lpvOutBuffer, DWORD cbOutBuffer,
+                                  LPDWORD lpcbBytesReturned,
+                                  LPOVERLAPPED lpOverlapped)
+{
+    TRACE("(%ld,%p,%ld,%p,%ld,%p,%p): stub\n",
+          dwIoControlCode, lpvInBuffer,cbInBuffer, lpvOutBuffer,cbOutBuffer,
+          lpcbBytesReturned, lpOverlapped);
+
+    switch (dwIoControlCode)
+    {
+    case IFS_IOCTL_21:
+    case IFS_IOCTL_2F:
+        {
+            CONTEXT86 cxt;
+            struct win32apireq *pIn=(struct win32apireq *) lpvInBuffer;
+            struct win32apireq *pOut=(struct win32apireq *) lpvOutBuffer;
+
+            TRACE( "Control '%s': "
+                   "proid=0x%08lx, eax=0x%08lx, ebx=0x%08lx, ecx=0x%08lx, "
+                   "edx=0x%08lx, esi=0x%08lx, edi=0x%08lx, ebp=0x%08lx, "
+                   "error=0x%04x, pad=0x%04x\n",
+                   (dwIoControlCode==IFS_IOCTL_21)?"IFS_IOCTL_21":"IFS_IOCTL_2F",
+                   pIn->ar_proid, pIn->ar_eax, pIn->ar_ebx, pIn->ar_ecx,
+                   pIn->ar_edx, pIn->ar_esi, pIn->ar_edi, pIn->ar_ebp,
+                   pIn->ar_error, pIn->ar_pad );
+
+            win32apieq_2_CONTEXT(pIn,&cxt);
+
+            if(dwIoControlCode==IFS_IOCTL_21)
+                CallBuiltinHandler( &cxt, 0x21 );
+            else
+                CallBuiltinHandler( &cxt, 0x2f );
+
+            CONTEXT_2_win32apieq(&cxt,pOut);
+            return TRUE;
+        }
+    case IFS_IOCTL_GET_RES:
+        FIXME( "Control 'IFS_IOCTL_GET_RES' not implemented\n");
+        return FALSE;
+    case IFS_IOCTL_GET_NETPRO_NAME_A:
+        FIXME( "Control 'IFS_IOCTL_GET_NETPRO_NAME_A' not implemented\n");
+        return FALSE;
+    default:
+        FIXME( "Control %ld not implemented\n", dwIoControlCode);
+        return FALSE;
+    }
+}
diff --git a/dlls/ifsmgr.vxd/ifsmgr.vxd.spec b/dlls/ifsmgr.vxd/ifsmgr.vxd.spec
new file mode 100644
index 0000000..ae208de
--- /dev/null
+++ b/dlls/ifsmgr.vxd/ifsmgr.vxd.spec
@@ -0,0 +1 @@
+@ stdcall DeviceIoControl(long ptr long ptr long ptr ptr) IFSMGR_DeviceIoControl
diff --git a/dlls/kernel/device.c b/dlls/kernel/device.c
index 4cff62f..9c34dcc 100644
--- a/dlls/kernel/device.c
+++ b/dlls/kernel/device.c
@@ -24,19 +24,7 @@
 #include "wine/port.h"
 
 #include <stdlib.h>
-#ifdef HAVE_UNISTD_H
-# include <unistd.h>
-#endif
 #include <sys/types.h>
-#ifdef HAVE_SYS_SOCKET_H
-# include <sys/socket.h>
-#endif
-#ifdef HAVE_NETINET_IN_H
-# include <netinet/in.h>
-#endif
-#ifdef HAVE_ARPA_INET_H
-# include <arpa/inet.h>
-#endif
 #include <string.h>
 #include <stdarg.h>
 #include <time.h>
@@ -48,82 +36,13 @@
 #include "winerror.h"
 #include "winnls.h"
 #include "file.h"
-#include "winioctl.h"
-#include "winnt.h"
-#include "iphlpapi.h"
 #include "kernel_private.h"
 #include "wine/server.h"
+#include "wine/unicode.h"
 #include "wine/debug.h"
 
 WINE_DEFAULT_DEBUG_CHANNEL(file);
 
-#ifndef INADDR_NONE
-#define INADDR_NONE ~0UL
-#endif
-
-static BOOL DeviceIo_VTDAPI(DWORD dwIoControlCode,
-			      LPVOID lpvInBuffer, DWORD cbInBuffer,
-			      LPVOID lpvOutBuffer, DWORD cbOutBuffer,
-			      LPDWORD lpcbBytesReturned,
-			      LPOVERLAPPED lpOverlapped);
-static BOOL DeviceIo_MONODEBG(DWORD dwIoControlCode,
-			      LPVOID lpvInBuffer, DWORD cbInBuffer,
-			      LPVOID lpvOutBuffer, DWORD cbOutBuffer,
-			      LPDWORD lpcbBytesReturned,
-			      LPOVERLAPPED lpOverlapped);
-static BOOL DeviceIo_MMDEVLDR(DWORD dwIoControlCode,
-			      LPVOID lpvInBuffer, DWORD cbInBuffer,
-			      LPVOID lpvOutBuffer, DWORD cbOutBuffer,
-			      LPDWORD lpcbBytesReturned,
-			      LPOVERLAPPED lpOverlapped);
-
-static BOOL DeviceIo_IFSMgr(DWORD dwIoControlCode,
-			      LPVOID lpvInBuffer, DWORD cbInBuffer,
-			      LPVOID lpvOutBuffer, DWORD cbOutBuffer,
-			      LPDWORD lpcbBytesReturned,
-			      LPOVERLAPPED lpOverlapped);
-
-static BOOL DeviceIo_VCD(DWORD dwIoControlCode,
-			      LPVOID lpvInBuffer, DWORD cbInBuffer,
-			      LPVOID lpvOutBuffer, DWORD cbOutBuffer,
-			      LPDWORD lpcbBytesReturned,
-			      LPOVERLAPPED lpOverlapped);
-
-static BOOL DeviceIo_VWin32(DWORD dwIoControlCode,
-			      LPVOID lpvInBuffer, DWORD cbInBuffer,
-			      LPVOID lpvOutBuffer, DWORD cbOutBuffer,
-			      LPDWORD lpcbBytesReturned,
-			      LPOVERLAPPED lpOverlapped);
-
-static BOOL DeviceIo_DHCP(DWORD dwIoControlCode,
-			      LPVOID lpvInBuffer, DWORD cbInBuffer,
-			      LPVOID lpvOutBuffer, DWORD cbOutBuffer,
-			      LPDWORD lpcbBytesReturned,
-			      LPOVERLAPPED lpOverlapped);
-
-static BOOL DeviceIo_PCCARD (DWORD dwIoControlCode,
-			      LPVOID lpvInBuffer, DWORD cbInBuffer,
-			      LPVOID lpvOutBuffer, DWORD cbOutBuffer,
-			      LPDWORD lpcbBytesReturned,
-			      LPOVERLAPPED lpOverlapped);
-
-static BOOL DeviceIo_HASP (DWORD dwIoControlCode,
-			      LPVOID lpvInBuffer, DWORD cbInBuffer,
-			      LPVOID lpvOutBuffer, DWORD cbOutBuffer,
-			      LPDWORD lpcbBytesReturned,
-			      LPOVERLAPPED lpOverlapped);
-
-static BOOL DeviceIo_NetBIOS(DWORD dwIoControlCode,
-			      LPVOID lpvInBuffer, DWORD cbInBuffer,
-			      LPVOID lpvOutBuffer, DWORD cbOutBuffer,
-			      LPDWORD lpcbBytesReturned,
-			      LPOVERLAPPED lpOverlapped);
-
-static BOOL DeviceIo_VNB(DWORD dwIoControlCode,
-			      LPVOID lpvInBuffer, DWORD cbInBuffer,
-			      LPVOID lpvOutBuffer, DWORD cbOutBuffer,
-			      LPDWORD lpcbBytesReturned,
-			      LPOVERLAPPED lpOverlapped);
 
 /*
  * VxD names are taken from the Win95 DDK
@@ -133,152 +52,171 @@
 {
     LPCSTR  name;
     WORD    id;
+    HMODULE module;
     BOOL  (*deviceio)(DWORD, LPVOID, DWORD,
                         LPVOID, DWORD, LPDWORD, LPOVERLAPPED);
 };
 
-static const struct VxDInfo VxDList[] =
+static struct VxDInfo VxDList[] =
 {
     /* Standard VxD IDs */
-    { "VMM",      0x0001, NULL },
-    { "DEBUG",    0x0002, NULL },
-    { "VPICD",    0x0003, NULL },
-    { "VDMAD",    0x0004, NULL },
-    { "VTD",      0x0005, NULL },
-    { "V86MMGR",  0x0006, NULL },
-    { "PAGESWAP", 0x0007, NULL },
-    { "PARITY",   0x0008, NULL },
-    { "REBOOT",   0x0009, NULL },
-    { "VDD",      0x000A, NULL },
-    { "VSD",      0x000B, NULL },
-    { "VMD",      0x000C, NULL },
-    { "VKD",      0x000D, NULL },
-    { "VCD",      0x000E, DeviceIo_VCD },
-    { "VPD",      0x000F, NULL },
-    { "BLOCKDEV", 0x0010, NULL },
-    { "VMCPD",    0x0011, NULL },
-    { "EBIOS",    0x0012, NULL },
-    { "BIOSXLAT", 0x0013, NULL },
-    { "VNETBIOS", 0x0014, DeviceIo_NetBIOS },
-    { "DOSMGR",   0x0015, NULL },
-    { "WINLOAD",  0x0016, NULL },
-    { "SHELL",    0x0017, NULL },
-    { "VMPOLL",   0x0018, NULL },
-    { "VPROD",    0x0019, NULL },
-    { "DOSNET",   0x001A, NULL },
-    { "VFD",      0x001B, NULL },
-    { "VDD2",     0x001C, NULL },
-    { "WINDEBUG", 0x001D, NULL },
-    { "TSRLOAD",  0x001E, NULL },
-    { "BIOSHOOK", 0x001F, NULL },
-    { "INT13",    0x0020, NULL },
-    { "PAGEFILE", 0x0021, NULL },
-    { "SCSI",     0x0022, NULL },
-    { "MCA_POS",  0x0023, NULL },
-    { "SCSIFD",   0x0024, NULL },
-    { "VPEND",    0x0025, NULL },
-    { "VPOWERD",  0x0026, NULL },
-    { "VXDLDR",   0x0027, NULL },
-    { "NDIS",     0x0028, NULL },
-    { "BIOS_EXT", 0x0029, NULL },
-    { "VWIN32",   0x002A, DeviceIo_VWin32 },
-    { "VCOMM",    0x002B, NULL },
-    { "SPOOLER",  0x002C, NULL },
-    { "WIN32S",   0x002D, NULL },
-    { "DEBUGCMD", 0x002E, NULL },
+    { "VMM",      0x0001, NULL, NULL },
+    { "DEBUG",    0x0002, NULL, NULL },
+    { "VPICD",    0x0003, NULL, NULL },
+    { "VDMAD",    0x0004, NULL, NULL },
+    { "VTD",      0x0005, NULL, NULL },
+    { "V86MMGR",  0x0006, NULL, NULL },
+    { "PAGESWAP", 0x0007, NULL, NULL },
+    { "PARITY",   0x0008, NULL, NULL },
+    { "REBOOT",   0x0009, NULL, NULL },
+    { "VDD",      0x000A, NULL, NULL },
+    { "VSD",      0x000B, NULL, NULL },
+    { "VMD",      0x000C, NULL, NULL },
+    { "VKD",      0x000D, NULL, NULL },
+    { "VCD",      0x000E, NULL, NULL },
+    { "VPD",      0x000F, NULL, NULL },
+    { "BLOCKDEV", 0x0010, NULL, NULL },
+    { "VMCPD",    0x0011, NULL, NULL },
+    { "EBIOS",    0x0012, NULL, NULL },
+    { "BIOSXLAT", 0x0013, NULL, NULL },
+    { "VNETBIOS", 0x0014, NULL, NULL },
+    { "DOSMGR",   0x0015, NULL, NULL },
+    { "WINLOAD",  0x0016, NULL, NULL },
+    { "SHELL",    0x0017, NULL, NULL },
+    { "VMPOLL",   0x0018, NULL, NULL },
+    { "VPROD",    0x0019, NULL, NULL },
+    { "DOSNET",   0x001A, NULL, NULL },
+    { "VFD",      0x001B, NULL, NULL },
+    { "VDD2",     0x001C, NULL, NULL },
+    { "WINDEBUG", 0x001D, NULL, NULL },
+    { "TSRLOAD",  0x001E, NULL, NULL },
+    { "BIOSHOOK", 0x001F, NULL, NULL },
+    { "INT13",    0x0020, NULL, NULL },
+    { "PAGEFILE", 0x0021, NULL, NULL },
+    { "SCSI",     0x0022, NULL, NULL },
+    { "MCA_POS",  0x0023, NULL, NULL },
+    { "SCSIFD",   0x0024, NULL, NULL },
+    { "VPEND",    0x0025, NULL, NULL },
+    { "VPOWERD",  0x0026, NULL, NULL },
+    { "VXDLDR",   0x0027, NULL, NULL },
+    { "NDIS",     0x0028, NULL, NULL },
+    { "BIOS_EXT", 0x0029, NULL, NULL },
+    { "VWIN32",   0x002A, NULL, NULL },
+    { "VCOMM",    0x002B, NULL, NULL },
+    { "SPOOLER",  0x002C, NULL, NULL },
+    { "WIN32S",   0x002D, NULL, NULL },
+    { "DEBUGCMD", 0x002E, NULL, NULL },
 
-    { "VNB",      0x0031, DeviceIo_VNB },
-    { "SERVER",   0x0032, NULL },
-    { "CONFIGMG", 0x0033, NULL },
-    { "DWCFGMG",  0x0034, NULL },
-    { "SCSIPORT", 0x0035, NULL },
-    { "VFBACKUP", 0x0036, NULL },
-    { "ENABLE",   0x0037, NULL },
-    { "VCOND",    0x0038, NULL },
+    { "VNB",      0x0031, NULL, NULL },
+    { "SERVER",   0x0032, NULL, NULL },
+    { "CONFIGMG", 0x0033, NULL, NULL },
+    { "DWCFGMG",  0x0034, NULL, NULL },
+    { "SCSIPORT", 0x0035, NULL, NULL },
+    { "VFBACKUP", 0x0036, NULL, NULL },
+    { "ENABLE",   0x0037, NULL, NULL },
+    { "VCOND",    0x0038, NULL, NULL },
 
-    { "EFAX",     0x003A, NULL },
-    { "DSVXD",    0x003B, NULL },
-    { "ISAPNP",   0x003C, NULL },
-    { "BIOS",     0x003D, NULL },
-    { "WINSOCK",  0x003E, NULL },
-    { "WSOCK",    0x003E, NULL },
-    { "WSIPX",    0x003F, NULL },
-    { "IFSMgr",   0x0040, DeviceIo_IFSMgr },
-    { "VCDFSD",   0x0041, NULL },
-    { "MRCI2",    0x0042, NULL },
-    { "PCI",      0x0043, NULL },
-    { "PELOADER", 0x0044, NULL },
-    { "EISA",     0x0045, NULL },
-    { "DRAGCLI",  0x0046, NULL },
-    { "DRAGSRV",  0x0047, NULL },
-    { "PERF",     0x0048, NULL },
-    { "AWREDIR",  0x0049, NULL },
+    { "EFAX",     0x003A, NULL, NULL },
+    { "DSVXD",    0x003B, NULL, NULL },
+    { "ISAPNP",   0x003C, NULL, NULL },
+    { "BIOS",     0x003D, NULL, NULL },
+    { "WINSOCK",  0x003E, NULL, NULL },
+    { "WSOCK",    0x003E, NULL, NULL },
+    { "WSIPX",    0x003F, NULL, NULL },
+    { "IFSMgr",   0x0040, NULL, NULL },
+    { "VCDFSD",   0x0041, NULL, NULL },
+    { "MRCI2",    0x0042, NULL, NULL },
+    { "PCI",      0x0043, NULL, NULL },
+    { "PELOADER", 0x0044, NULL, NULL },
+    { "EISA",     0x0045, NULL, NULL },
+    { "DRAGCLI",  0x0046, NULL, NULL },
+    { "DRAGSRV",  0x0047, NULL, NULL },
+    { "PERF",     0x0048, NULL, NULL },
+    { "AWREDIR",  0x0049, NULL, NULL },
 
     /* Far East support */
-    { "ETEN",     0x0060, NULL },
-    { "CHBIOS",   0x0061, NULL },
-    { "VMSGD",    0x0062, NULL },
-    { "VPPID",    0x0063, NULL },
-    { "VIME",     0x0064, NULL },
-    { "VHBIOSD",  0x0065, NULL },
+    { "ETEN",     0x0060, NULL, NULL },
+    { "CHBIOS",   0x0061, NULL, NULL },
+    { "VMSGD",    0x0062, NULL, NULL },
+    { "VPPID",    0x0063, NULL, NULL },
+    { "VIME",     0x0064, NULL, NULL },
+    { "VHBIOSD",  0x0065, NULL, NULL },
 
     /* Multimedia OEM IDs */
-    { "VTDAPI",   0x0442, DeviceIo_VTDAPI },
-    { "MMDEVLDR", 0x044A, DeviceIo_MMDEVLDR },
+    { "VTDAPI",   0x0442, NULL, NULL },
+    { "MMDEVLDR", 0x044A, NULL, NULL },
 
     /* Network Device IDs */
-    { "VNetSup",  0x0480, NULL },
-    { "VRedir",   0x0481, NULL },
-    { "VBrowse",  0x0482, NULL },
-    { "VSHARE",   0x0483, NULL },
-    { "IFSMgr",   0x0484, NULL },
-    { "MEMPROBE", 0x0485, NULL },
-    { "VFAT",     0x0486, NULL },
-    { "NWLINK",   0x0487, NULL },
-    { "VNWLINK",  0x0487, NULL },
-    { "NWSUP",    0x0487, NULL },
-    { "VTDI",     0x0488, NULL },
-    { "VIP",      0x0489, NULL },
-    { "VTCP",     0x048A, NULL },
-    { "VCache",   0x048B, NULL },
-    { "VUDP",     0x048C, NULL },
-    { "VAsync",   0x048D, NULL },
-    { "NWREDIR",  0x048E, NULL },
-    { "STAT80",   0x048F, NULL },
-    { "SCSIPORT", 0x0490, NULL },
-    { "FILESEC",  0x0491, NULL },
-    { "NWSERVER", 0x0492, NULL },
-    { "SECPROV",  0x0493, NULL },
-    { "NSCL",     0x0494, NULL },
-    { "WSTCP",    0x0495, NULL },
-    { "NDIS2SUP", 0x0496, NULL },
-    { "MSODISUP", 0x0497, NULL },
-    { "Splitter", 0x0498, NULL },
-    { "PPP",      0x0499, NULL },
-    { "VDHCP",    0x049A, DeviceIo_DHCP },
-    { "VNBT",     0x049B, NULL },
-    { "LOGGER",   0x049D, NULL },
-    { "EFILTER",  0x049E, NULL },
-    { "FFILTER",  0x049F, NULL },
-    { "TFILTER",  0x04A0, NULL },
-    { "AFILTER",  0x04A1, NULL },
-    { "IRLAMP",   0x04A2, NULL },
+    { "VNetSup",  0x0480, NULL, NULL },
+    { "VRedir",   0x0481, NULL, NULL },
+    { "VBrowse",  0x0482, NULL, NULL },
+    { "VSHARE",   0x0483, NULL, NULL },
+    { "IFSMgr",   0x0484, NULL, NULL },
+    { "MEMPROBE", 0x0485, NULL, NULL },
+    { "VFAT",     0x0486, NULL, NULL },
+    { "NWLINK",   0x0487, NULL, NULL },
+    { "VNWLINK",  0x0487, NULL, NULL },
+    { "NWSUP",    0x0487, NULL, NULL },
+    { "VTDI",     0x0488, NULL, NULL },
+    { "VIP",      0x0489, NULL, NULL },
+    { "VTCP",     0x048A, NULL, NULL },
+    { "VCache",   0x048B, NULL, NULL },
+    { "VUDP",     0x048C, NULL, NULL },
+    { "VAsync",   0x048D, NULL, NULL },
+    { "NWREDIR",  0x048E, NULL, NULL },
+    { "STAT80",   0x048F, NULL, NULL },
+    { "SCSIPORT", 0x0490, NULL, NULL },
+    { "FILESEC",  0x0491, NULL, NULL },
+    { "NWSERVER", 0x0492, NULL, NULL },
+    { "SECPROV",  0x0493, NULL, NULL },
+    { "NSCL",     0x0494, NULL, NULL },
+    { "WSTCP",    0x0495, NULL, NULL },
+    { "NDIS2SUP", 0x0496, NULL, NULL },
+    { "MSODISUP", 0x0497, NULL, NULL },
+    { "Splitter", 0x0498, NULL, NULL },
+    { "PPP",      0x0499, NULL, NULL },
+    { "VDHCP",    0x049A, NULL, NULL },
+    { "VNBT",     0x049B, NULL, NULL },
+    { "LOGGER",   0x049D, NULL, NULL },
+    { "EFILTER",  0x049E, NULL, NULL },
+    { "FFILTER",  0x049F, NULL, NULL },
+    { "TFILTER",  0x04A0, NULL, NULL },
+    { "AFILTER",  0x04A1, NULL, NULL },
+    { "IRLAMP",   0x04A2, NULL, NULL },
 
-    { "PCCARD",   0x097C, DeviceIo_PCCARD },
-    { "HASP95",   0x3721, DeviceIo_HASP },
+    { "PCCARD",   0x097C, NULL, NULL },
+    { "HASP95",   0x3721, NULL, NULL },
 
     /* WINE additions, ids unknown */
-    { "MONODEBG.VXD", 0x4242, DeviceIo_MONODEBG },
+    { "MONODEBG", 0x4242, NULL, NULL },
 
-    { NULL,       0,      NULL }
+    { NULL,       0,      NULL, NULL }
 };
 
+
 HANDLE DEVICE_Open( LPCWSTR filenameW, DWORD access, LPSECURITY_ATTRIBUTES sa )
 {
-    const struct VxDInfo *info;
-    char filename[MAX_PATH];
+    static const WCHAR dotVxDW[] = {'.','v','x','d',0};
+    struct VxDInfo *info;
+    WCHAR *p, buffer[16];
+    char filename[32];
 
-    if (!WideCharToMultiByte(CP_ACP, 0, filenameW, -1, filename, MAX_PATH, NULL, NULL))
+    if (strlenW( filenameW ) >= sizeof(buffer)/sizeof(WCHAR) - 4 ||
+        strchrW( filenameW, '/' ) || strchrW( filenameW, '\\' ))
+    {
+        SetLastError( ERROR_FILE_NOT_FOUND );
+        return 0;
+    }
+    strcpyW( buffer, filenameW );
+    p = strchrW( buffer, '.' );
+    if (!p) strcatW( buffer, dotVxDW );
+    else if (strcmpiW( p, dotVxDW ))  /* existing extension has to be .vxd */
+    {
+        SetLastError( ERROR_FILE_NOT_FOUND );
+        return 0;
+    }
+
+    if (!WideCharToMultiByte(CP_ACP, 0, buffer, -1, filename, sizeof(filename), NULL, NULL))
     {
         SetLastError( ERROR_FILE_NOT_FOUND );
         return 0;
@@ -286,7 +224,15 @@
 
     for (info = VxDList; info->name; info++)
         if (!strncasecmp( info->name, filename, strlen(info->name) ))
+        {
+            if (!info->module)
+            {
+                info->module = LoadLibraryW( buffer );
+                if (info->module)
+                    info->deviceio = (void *)GetProcAddress( info->module, "DeviceIoControl" );
+            }
             return FILE_CreateDevice( info->id | 0x10000, access, sa );
+        }
 
     FIXME( "Unknown/unsupported VxD %s. Try setting Windows version to 'nt40' or 'win31'.\n",
            filename);
@@ -402,647 +348,3 @@
 	}
    	return FALSE;
 }
-
-/***********************************************************************
- *           DeviceIo_VTDAPI
- */
-static BOOL DeviceIo_VTDAPI(DWORD dwIoControlCode, LPVOID lpvInBuffer, DWORD cbInBuffer,
-			      LPVOID lpvOutBuffer, DWORD cbOutBuffer,
-			      LPDWORD lpcbBytesReturned,
-			      LPOVERLAPPED lpOverlapped)
-{
-    BOOL retv = TRUE;
-
-    switch (dwIoControlCode)
-    {
-    case 5:
-        if (lpvOutBuffer && (cbOutBuffer>=4))
-            *(DWORD*)lpvOutBuffer = GetTickCount();
-
-        if (lpcbBytesReturned)
-            *lpcbBytesReturned = 4;
-
-        break;
-
-    default:
-        FIXME( "Control %ld not implemented\n", dwIoControlCode);
-        retv = FALSE;
-        break;
-    }
-
-    return retv;
-}
-
-/***********************************************************************
- *           DeviceIo_IFSMgr
- * NOTES
- *   These ioctls are used by 'MSNET32.DLL'.
- *
- *   I have been unable to uncover any documentation about the ioctls so
- *   the implementation of the cases IFS_IOCTL_21 and IFS_IOCTL_2F are
- *   based on reasonable guesses on information found in the Windows 95 DDK.
- *
- */
-
-/*
- * IFSMgr DeviceIO service
- */
-
-#define IFS_IOCTL_21                100
-#define IFS_IOCTL_2F                101
-#define	IFS_IOCTL_GET_RES           102
-#define IFS_IOCTL_GET_NETPRO_NAME_A 103
-
-struct win32apireq {
-	unsigned long 	ar_proid;
-	unsigned long  	ar_eax;
-	unsigned long  	ar_ebx;
-	unsigned long  	ar_ecx;
-	unsigned long  	ar_edx;
-	unsigned long  	ar_esi;
-	unsigned long  	ar_edi;
-	unsigned long  	ar_ebp;
-	unsigned short 	ar_error;
-	unsigned short  ar_pad;
-};
-
-static void win32apieq_2_CONTEXT(struct win32apireq *pIn,CONTEXT86 *pCxt)
-{
-	memset(pCxt,0,sizeof(*pCxt));
-
-	pCxt->ContextFlags=CONTEXT86_INTEGER|CONTEXT86_CONTROL;
-	pCxt->Eax = pIn->ar_eax;
-	pCxt->Ebx = pIn->ar_ebx;
-	pCxt->Ecx = pIn->ar_ecx;
-	pCxt->Edx = pIn->ar_edx;
-	pCxt->Esi = pIn->ar_esi;
-	pCxt->Edi = pIn->ar_edi;
-
-	/* FIXME: Only partial CONTEXT86_CONTROL */
-	pCxt->Ebp = pIn->ar_ebp;
-
-	/* FIXME: pIn->ar_proid ignored */
-	/* FIXME: pIn->ar_error ignored */
-	/* FIXME: pIn->ar_pad ignored */
-}
-
-static void CONTEXT_2_win32apieq(CONTEXT86 *pCxt,struct win32apireq *pOut)
-{
-	memset(pOut,0,sizeof(struct win32apireq));
-
-	pOut->ar_eax = pCxt->Eax;
-	pOut->ar_ebx = pCxt->Ebx;
-	pOut->ar_ecx = pCxt->Ecx;
-	pOut->ar_edx = pCxt->Edx;
-	pOut->ar_esi = pCxt->Esi;
-	pOut->ar_edi = pCxt->Edi;
-
-	/* FIXME: Only partial CONTEXT86_CONTROL */
-	pOut->ar_ebp = pCxt->Ebp;
-
-	/* FIXME: pOut->ar_proid ignored */
-	/* FIXME: pOut->ar_error ignored */
-	/* FIXME: pOut->ar_pad ignored */
-}
-
-static BOOL DeviceIo_IFSMgr(DWORD dwIoControlCode, LPVOID lpvInBuffer, DWORD cbInBuffer,
-			      LPVOID lpvOutBuffer, DWORD cbOutBuffer,
-			      LPDWORD lpcbBytesReturned,
-			      LPOVERLAPPED lpOverlapped)
-{
-    BOOL retv = TRUE;
-	TRACE("(%ld,%p,%ld,%p,%ld,%p,%p): stub\n",
-			dwIoControlCode,
-			lpvInBuffer,cbInBuffer,
-			lpvOutBuffer,cbOutBuffer,
-			lpcbBytesReturned,
-			lpOverlapped);
-
-    switch (dwIoControlCode)
-    {
-	case IFS_IOCTL_21:
-	case IFS_IOCTL_2F:{
-		CONTEXT86 cxt;
-		struct win32apireq *pIn=(struct win32apireq *) lpvInBuffer;
-		struct win32apireq *pOut=(struct win32apireq *) lpvOutBuffer;
-
-		TRACE(
-			"Control '%s': "
-			"proid=0x%08lx, eax=0x%08lx, ebx=0x%08lx, ecx=0x%08lx, "
-			"edx=0x%08lx, esi=0x%08lx, edi=0x%08lx, ebp=0x%08lx, "
-			"error=0x%04x, pad=0x%04x\n",
-			(dwIoControlCode==IFS_IOCTL_21)?"IFS_IOCTL_21":"IFS_IOCTL_2F",
-			pIn->ar_proid, pIn->ar_eax, pIn->ar_ebx, pIn->ar_ecx,
-			pIn->ar_edx, pIn->ar_esi, pIn->ar_edi, pIn->ar_ebp,
-			pIn->ar_error, pIn->ar_pad
-		);
-
-		win32apieq_2_CONTEXT(pIn,&cxt);
-
-		if(dwIoControlCode==IFS_IOCTL_21)
-                    INSTR_CallBuiltinHandler( &cxt, 0x21 );
-                else
-                    INSTR_CallBuiltinHandler( &cxt, 0x2f );
-
-		CONTEXT_2_win32apieq(&cxt,pOut);
-
-        retv = TRUE;
-	} break;
-	case IFS_IOCTL_GET_RES:{
-        FIXME( "Control 'IFS_IOCTL_GET_RES' not implemented\n");
-        retv = FALSE;
-	} break;
-	case IFS_IOCTL_GET_NETPRO_NAME_A:{
-        FIXME( "Control 'IFS_IOCTL_GET_NETPRO_NAME_A' not implemented\n");
-        retv = FALSE;
-	} break;
-    default:
-        FIXME( "Control %ld not implemented\n", dwIoControlCode);
-        retv = FALSE;
-    }
-
-    return retv;
-}
-
-/***********************************************************************
- *           DeviceIo_VCD
- */
-static BOOL DeviceIo_VCD(DWORD dwIoControlCode,
-			      LPVOID lpvInBuffer, DWORD cbInBuffer,
-			      LPVOID lpvOutBuffer, DWORD cbOutBuffer,
-			      LPDWORD lpcbBytesReturned,
-			      LPOVERLAPPED lpOverlapped)
-{
-    BOOL retv = TRUE;
-
-    switch (dwIoControlCode)
-    {
-    case IOCTL_SERIAL_LSRMST_INSERT:
-    {
-        FIXME( "IOCTL_SERIAL_LSRMST_INSERT NIY !\n");
-        retv = FALSE;
-    }
-    break;
-
-    default:
-        FIXME( "Unknown Control %ld\n", dwIoControlCode);
-        retv = FALSE;
-        break;
-    }
-
-    return retv;
-}
-
-
-/***********************************************************************
- *           DeviceIo_VWin32
- */
-
-static void DIOCRegs_2_CONTEXT( DIOC_REGISTERS *pIn, CONTEXT86 *pCxt )
-{
-    memset( pCxt, 0, sizeof(*pCxt) );
-    /* Note: segment registers == 0 means that CTX_SEG_OFF_TO_LIN
-             will interpret 32-bit register contents as linear pointers */
-
-    pCxt->ContextFlags=CONTEXT86_INTEGER|CONTEXT86_CONTROL;
-    pCxt->Eax = pIn->reg_EAX;
-    pCxt->Ebx = pIn->reg_EBX;
-    pCxt->Ecx = pIn->reg_ECX;
-    pCxt->Edx = pIn->reg_EDX;
-    pCxt->Esi = pIn->reg_ESI;
-    pCxt->Edi = pIn->reg_EDI;
-
-    /* FIXME: Only partial CONTEXT86_CONTROL */
-
-    pCxt->EFlags = pIn->reg_Flags & ~0x00020000; /* clear vm86 mode */
-}
-
-static void CONTEXT_2_DIOCRegs( CONTEXT86 *pCxt, DIOC_REGISTERS *pOut )
-{
-    memset( pOut, 0, sizeof(DIOC_REGISTERS) );
-
-    pOut->reg_EAX = pCxt->Eax;
-    pOut->reg_EBX = pCxt->Ebx;
-    pOut->reg_ECX = pCxt->Ecx;
-    pOut->reg_EDX = pCxt->Edx;
-    pOut->reg_ESI = pCxt->Esi;
-    pOut->reg_EDI = pCxt->Edi;
-
-    /* FIXME: Only partial CONTEXT86_CONTROL */
-    pOut->reg_Flags = pCxt->EFlags;
-}
-
-#define DIOC_AH(regs) (((unsigned char*)&((regs)->reg_EAX))[1])
-#define DIOC_AL(regs) (((unsigned char*)&((regs)->reg_EAX))[0])
-#define DIOC_BH(regs) (((unsigned char*)&((regs)->reg_EBX))[1])
-#define DIOC_BL(regs) (((unsigned char*)&((regs)->reg_EBX))[0])
-#define DIOC_DH(regs) (((unsigned char*)&((regs)->reg_EDX))[1])
-#define DIOC_DL(regs) (((unsigned char*)&((regs)->reg_EDX))[0])
-
-#define DIOC_AX(regs) (((unsigned short*)&((regs)->reg_EAX))[0])
-#define DIOC_BX(regs) (((unsigned short*)&((regs)->reg_EBX))[0])
-#define DIOC_CX(regs) (((unsigned short*)&((regs)->reg_ECX))[0])
-#define DIOC_DX(regs) (((unsigned short*)&((regs)->reg_EDX))[0])
-
-#define DIOC_SET_CARRY(regs) (((regs)->reg_Flags)|=0x00000001)
-
-static BOOL DeviceIo_VWin32(DWORD dwIoControlCode,
-			      LPVOID lpvInBuffer, DWORD cbInBuffer,
-			      LPVOID lpvOutBuffer, DWORD cbOutBuffer,
-			      LPDWORD lpcbBytesReturned,
-			      LPOVERLAPPED lpOverlapped)
-{
-    BOOL retv = TRUE;
-
-    switch (dwIoControlCode)
-    {
-    case VWIN32_DIOC_DOS_IOCTL:
-    case 0x10: /* Int 0x21 call, call it VWIN_DIOC_INT21 ? */
-    case VWIN32_DIOC_DOS_INT13:
-    case VWIN32_DIOC_DOS_INT25:
-    case VWIN32_DIOC_DOS_INT26:
-    case 0x29: /* Int 0x31 call, call it VWIN_DIOC_INT31 ? */
-    case VWIN32_DIOC_DOS_DRIVEINFO:
-    {
-        CONTEXT86 cxt;
-        DIOC_REGISTERS *pIn  = (DIOC_REGISTERS *)lpvInBuffer;
-        DIOC_REGISTERS *pOut = (DIOC_REGISTERS *)lpvOutBuffer;
-        BYTE intnum = 0;
-
-        TRACE( "Control '%s': "
-               "eax=0x%08lx, ebx=0x%08lx, ecx=0x%08lx, "
-               "edx=0x%08lx, esi=0x%08lx, edi=0x%08lx \n",
-               (dwIoControlCode == VWIN32_DIOC_DOS_IOCTL)? "VWIN32_DIOC_DOS_IOCTL" :
-               (dwIoControlCode == VWIN32_DIOC_DOS_INT25)? "VWIN32_DIOC_DOS_INT25" :
-               (dwIoControlCode == VWIN32_DIOC_DOS_INT26)? "VWIN32_DIOC_DOS_INT26" :
-               (dwIoControlCode == VWIN32_DIOC_DOS_DRIVEINFO)? "VWIN32_DIOC_DOS_DRIVEINFO" :  "???",
-               pIn->reg_EAX, pIn->reg_EBX, pIn->reg_ECX,
-               pIn->reg_EDX, pIn->reg_ESI, pIn->reg_EDI );
-
-        DIOCRegs_2_CONTEXT( pIn, &cxt );
-
-        switch (dwIoControlCode)
-        {
-        case VWIN32_DIOC_DOS_IOCTL: /* Call int 21h */
-        case 0x10: /* Int 0x21 call, call it VWIN_DIOC_INT21 ? */
-        case VWIN32_DIOC_DOS_DRIVEINFO:        /* Call int 21h 730x */
-            intnum = 0x21;
-            break;
-        case VWIN32_DIOC_DOS_INT13:
-            intnum = 0x13;
-            break;
-        case VWIN32_DIOC_DOS_INT25: 
-            intnum = 0x25;
-            break;
-        case VWIN32_DIOC_DOS_INT26:
-            intnum = 0x26;
-            break;
-        case 0x29: /* Int 0x31 call, call it VWIN_DIOC_INT31 ? */
-            intnum = 0x31;
-            break;
-        }
-
-        INSTR_CallBuiltinHandler( &cxt, intnum );
-        CONTEXT_2_DIOCRegs( &cxt, pOut );
-    }
-    break;
-
-    case VWIN32_DIOC_SIMCTRLC:
-        FIXME( "Control VWIN32_DIOC_SIMCTRLC not implemented\n");
-        retv = FALSE;
-        break;
-
-    default:
-        FIXME( "Unknown Control %ld\n", dwIoControlCode);
-        retv = FALSE;
-        break;
-    }
-
-    return retv;
-}
-
-/* this is the main multimedia device loader */
-static BOOL DeviceIo_MMDEVLDR(DWORD dwIoControlCode,
-			      LPVOID lpvInBuffer, DWORD cbInBuffer,
-			      LPVOID lpvOutBuffer, DWORD cbOutBuffer,
-			      LPDWORD lpcbBytesReturned,
-			      LPOVERLAPPED lpOverlapped)
-{
-	FIXME("(%ld,%p,%ld,%p,%ld,%p,%p): stub\n",
-	    dwIoControlCode,
-	    lpvInBuffer,cbInBuffer,
-	    lpvOutBuffer,cbOutBuffer,
-	    lpcbBytesReturned,
-	    lpOverlapped
-	);
-	switch (dwIoControlCode) {
-	case 5:
-		/* Hmm. */
-		*(DWORD*)lpvOutBuffer=0;
-		*lpcbBytesReturned=4;
-		return TRUE;
-	}
-	return FALSE;
-}
-/* this is used by some Origin games */
-static BOOL DeviceIo_MONODEBG(DWORD dwIoControlCode,
-			      LPVOID lpvInBuffer, DWORD cbInBuffer,
-			      LPVOID lpvOutBuffer, DWORD cbOutBuffer,
-			      LPDWORD lpcbBytesReturned,
-			      LPOVERLAPPED lpOverlapped)
-{
-	switch (dwIoControlCode) {
-	case 1:	/* version */
-		*(LPDWORD)lpvOutBuffer = 0x20004; /* WC SecretOps */
-		break;
-	case 9: /* debug output */
-		ERR("MONODEBG: %s\n",debugstr_a(lpvInBuffer));
-		break;
-	default:
-		FIXME("(%ld,%p,%ld,%p,%ld,%p,%p): stub\n",
-			dwIoControlCode,
-			lpvInBuffer,cbInBuffer,
-			lpvOutBuffer,cbOutBuffer,
-			lpcbBytesReturned,
-			lpOverlapped
-		);
-		break;
-	}
-	return TRUE;
-}
-
-/* pccard */
-static BOOL DeviceIo_PCCARD (DWORD dwIoControlCode,
-			      LPVOID lpvInBuffer, DWORD cbInBuffer,
-			      LPVOID lpvOutBuffer, DWORD cbOutBuffer,
-			      LPDWORD lpcbBytesReturned,
-			      LPOVERLAPPED lpOverlapped)
-{
-	switch (dwIoControlCode) {
-	case 0x0000: /* PCCARD_Get_Version */
-	case 0x0001: /* PCCARD_Card_Services */
-	default:
-		FIXME( "(%ld,%p,%ld,%p,%ld,%p,%p): stub\n",
-			dwIoControlCode,
-			lpvInBuffer,cbInBuffer,
-			lpvOutBuffer,cbOutBuffer,
-			lpcbBytesReturned,
-			lpOverlapped
-		);
-		break;
-	}
-	return FALSE;
-}
-
-static BOOL DeviceIo_HASP(DWORD dwIoControlCode, LPVOID lpvInBuffer, DWORD cbInBuffer,
-			      LPVOID lpvOutBuffer, DWORD cbOutBuffer,
-			      LPDWORD lpcbBytesReturned,
-			      LPOVERLAPPED lpOverlapped)
-{
-    BOOL retv = TRUE;
-	FIXME("(%ld,%p,%ld,%p,%ld,%p,%p): stub\n",
-			dwIoControlCode,
-			lpvInBuffer,cbInBuffer,
-			lpvOutBuffer,cbOutBuffer,
-			lpcbBytesReturned,
-			lpOverlapped);
-
-    return retv;
-}
-
-typedef UCHAR (WINAPI *NetbiosFunc)(LPVOID);
-
-static BOOL DeviceIo_NetBIOS(DWORD dwIoControlCode,
-			      LPVOID lpvInBuffer, DWORD cbInBuffer,
-			      LPVOID lpvOutBuffer, DWORD cbOutBuffer,
-			      LPDWORD lpcbBytesReturned,
-			      LPOVERLAPPED lpOverlapped)
-{
-    static HMODULE netapi;
-    static NetbiosFunc pNetbios;
-
-    if (dwIoControlCode != 256)
-    {
-        FIXME("(%ld,%p,%ld,%p,%ld,%p,%p): stub\n",
-                dwIoControlCode,
-                lpvInBuffer,cbInBuffer,
-                lpvOutBuffer,cbOutBuffer,
-                lpcbBytesReturned,
-                lpOverlapped);
-    }
-    else
-    {
-        if (!pNetbios)
-        {
-            if (!netapi) netapi = LoadLibraryA("netapi32.dll");
-            if (netapi) pNetbios = (NetbiosFunc)GetProcAddress(netapi, "Netbios");
-        }
-        if (pNetbios)
-        {
-            pNetbios(lpvInBuffer);
-            return TRUE;
-        }
-    }
-    return FALSE;
-}
-
-static BOOL DeviceIo_DHCP(DWORD dwIoControlCode, LPVOID lpvInBuffer,
-                          DWORD cbInBuffer,
-                          LPVOID lpvOutBuffer, DWORD cbOutBuffer,
-                          LPDWORD lpcbBytesReturned,
-                          LPOVERLAPPED lpOverlapped)
-{
-    DWORD error;
-
-    switch (dwIoControlCode) {
-    case 1:
-    {
-        /* since IpReleaseAddress/IpRenewAddress are not implemented, say there
-         * are no DHCP adapters
-         */
-        error = ERROR_FILE_NOT_FOUND;
-        break;
-    }
-
-    /* FIXME: don't know what this means */
-    case 5:
-        if (lpcbBytesReturned)
-            *lpcbBytesReturned = sizeof(DWORD);
-        if (lpvOutBuffer && cbOutBuffer >= 4)
-        {
-            *(LPDWORD)lpvOutBuffer = 0;
-            error = NO_ERROR;
-        }
-        else
-            error = ERROR_BUFFER_OVERFLOW;
-        break;
-
-    default:
-        FIXME("(%ld,%p,%ld,%p,%ld,%p,%p): stub\n",
-                dwIoControlCode,
-                lpvInBuffer,cbInBuffer,
-                lpvOutBuffer,cbOutBuffer,
-                lpcbBytesReturned,
-                lpOverlapped);
-        error = ERROR_NOT_SUPPORTED;
-        break;
-    }
-    if (error)
-        SetLastError(error);
-    return error == NO_ERROR;
-}
-
-typedef DWORD (WINAPI *GetNetworkParamsFunc)(PFIXED_INFO, PDWORD);
-typedef DWORD (WINAPI *GetAdaptersInfoFunc)(PIP_ADAPTER_INFO, PDWORD);
-
-typedef struct _nbtInfo
-{
-    DWORD ip;
-    DWORD winsPrimary;
-    DWORD winsSecondary;
-    DWORD dnsPrimary;
-    DWORD dnsSecondary;
-    DWORD unk0;
-} nbtInfo;
-
-#define MAX_NBT_ENTRIES 7
-
-typedef struct _nbtTable
-{
-    DWORD   numEntries;
-    nbtInfo table[MAX_NBT_ENTRIES];
-    UCHAR   pad[6];
-    WORD    nodeType;
-    WORD    scopeLen;
-    char    scope[254];
-} nbtTable;
-
-static BOOL DeviceIo_VNB(DWORD dwIoControlCode,
-                         LPVOID lpvInBuffer, DWORD cbInBuffer,
-                         LPVOID lpvOutBuffer, DWORD cbOutBuffer,
-                         LPDWORD lpcbBytesReturned,
-                         LPOVERLAPPED lpOverlapped)
-{
-    static HMODULE iphlpapi;
-    static GetNetworkParamsFunc pGetNetworkParams;
-    static GetAdaptersInfoFunc pGetAdaptersInfo;
-    DWORD error;
-
-    switch (dwIoControlCode)
-    {
-        case 116:
-            if (lpcbBytesReturned)
-                *lpcbBytesReturned = sizeof(nbtTable);
-            if (!lpvOutBuffer || cbOutBuffer < sizeof(nbtTable))
-                error = ERROR_BUFFER_OVERFLOW;
-            else
-            {
-                nbtTable *info = (nbtTable *)lpvOutBuffer;
-
-                memset(info, 0, sizeof(nbtTable));
-                if (!iphlpapi)
-                {
-                    iphlpapi = LoadLibraryA("iphlpapi.dll");
-                    pGetNetworkParams = (GetNetworkParamsFunc)GetProcAddress(iphlpapi,"GetNetworkParams");
-                    pGetAdaptersInfo = (GetAdaptersInfoFunc)GetProcAddress(iphlpapi, "GetAdaptersInfo");
-                }
-                if (iphlpapi)
-                {
-                    DWORD size = 0;
-
-                    error = pGetNetworkParams(NULL, &size);
-                    if (ERROR_BUFFER_OVERFLOW == error)
-                    {
-                        PFIXED_INFO fixedInfo = (PFIXED_INFO)HeapAlloc(
-                         GetProcessHeap(), 0, size);
-
-                        error = pGetNetworkParams(fixedInfo, &size);
-                        if (NO_ERROR == error)
-                        {
-                            info->nodeType = (WORD)fixedInfo->NodeType;
-                            info->scopeLen = min(strlen(fixedInfo->ScopeId) + 1,
-                             sizeof(info->scope) - 2);
-                            memcpy(info->scope + 1, fixedInfo->ScopeId,
-                             info->scopeLen);
-                            info->scope[info->scopeLen + 1] = '\0';
-                            {
-                                /* convert into L2-encoded version */
-                                char *ptr, *lenPtr;
-
-                                for (ptr = info->scope + 1; *ptr &&
-                                 ptr - info->scope < sizeof(info->scope); )
-                                {
-                                    for (lenPtr = ptr - 1, *lenPtr = 0;
-                                     *ptr && *ptr != '.' &&
-                                     ptr - info->scope < sizeof(info->scope);
-                                     ptr++)
-                                        *lenPtr += 1;
-                                    ptr++;
-                                }
-                            }
-                            /* could set DNS servers here too, but since
-                             * ipconfig.exe and winipcfg.exe read these from the
-                             * registry, there's no point */
-                        }
-                        if (fixedInfo)
-                            HeapFree(GetProcessHeap(), 0, fixedInfo);
-                    }
-                    size = 0;
-                    error = pGetAdaptersInfo(NULL, &size);
-                    if (ERROR_BUFFER_OVERFLOW == error)
-                    {
-                        PIP_ADAPTER_INFO adapterInfo = (PIP_ADAPTER_INFO)
-                         HeapAlloc(GetProcessHeap(), 0, size);
-
-                        error = pGetAdaptersInfo(adapterInfo, &size);
-                        if (NO_ERROR == error)
-                        {
-                            PIP_ADAPTER_INFO ptr = adapterInfo;
-
-                            for (ptr = adapterInfo; ptr && info->numEntries <
-                             MAX_NBT_ENTRIES; ptr = ptr->Next)
-                            {
-                                unsigned long addr;
-
-                                addr = inet_addr(
-                                 ptr->IpAddressList.IpAddress.String);
-                                if (addr != 0 && addr != INADDR_NONE)
-                                    info->table[info->numEntries].ip =
-                                     ntohl(addr);
-                                addr = inet_addr(
-                                 ptr->PrimaryWinsServer.IpAddress.String);
-                                if (addr != 0 && addr != INADDR_NONE)
-                                    info->table[info->numEntries].winsPrimary
-                                     = ntohl(addr);
-                                addr = inet_addr(
-                                 ptr->SecondaryWinsServer.IpAddress.String);
-                                if (addr != 0 && addr != INADDR_NONE)
-                                    info->table[info->numEntries].winsSecondary
-                                     = ntohl(addr);
-                                info->numEntries++;
-                            }
-                        }
-                        if (adapterInfo)
-                            HeapFree(GetProcessHeap(), 0, adapterInfo);
-                    }
-                }
-                else
-                    error = GetLastError();
-            }
-            break;
-
-        case 119:
-            /* nbtstat.exe uses this, but the return seems to be a bunch of
-             * pointers, so it's not so easy to reverse engineer.  Fall through
-             * to unimplemented...
-             */
-        default:
-            FIXME( "Unimplemented control %ld for VxD device VNB\n",
-                               dwIoControlCode );
-            error = ERROR_NOT_SUPPORTED;
-            break;
-    }
-    if (error)
-        SetLastError(error);
-    return error == NO_ERROR;
-}
diff --git a/dlls/mmdevldr.vxd/.cvsignore b/dlls/mmdevldr.vxd/.cvsignore
new file mode 100644
index 0000000..389b026
--- /dev/null
+++ b/dlls/mmdevldr.vxd/.cvsignore
@@ -0,0 +1,3 @@
+Makefile
+mmdevldr.vxd.dbg.c
+mmdevldr.vxd.spec.c
diff --git a/dlls/mmdevldr.vxd/Makefile.in b/dlls/mmdevldr.vxd/Makefile.in
new file mode 100644
index 0000000..5d25b29
--- /dev/null
+++ b/dlls/mmdevldr.vxd/Makefile.in
@@ -0,0 +1,13 @@
+TOPSRCDIR = @top_srcdir@
+TOPOBJDIR = ../..
+SRCDIR    = @srcdir@
+VPATH     = @srcdir@
+MODULE    = mmdevldr.vxd
+IMPORTS   = kernel32
+
+C_SRCS = \
+	mmdevldr.c
+
+@MAKE_DLL_RULES@
+
+### Dependencies:
diff --git a/dlls/mmdevldr.vxd/mmdevldr.c b/dlls/mmdevldr.vxd/mmdevldr.c
new file mode 100644
index 0000000..f2358b8
--- /dev/null
+++ b/dlls/mmdevldr.vxd/mmdevldr.c
@@ -0,0 +1,57 @@
+/*
+ * MMDEVLDR VxD implementation
+ *
+ * Copyright 1998 Marcus Meissner
+ * Copyright 1998 Ulrich Weigand
+ * Copyright 1998 Patrik Stridvall
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ */
+
+#include <stdarg.h>
+#include "windef.h"
+#include "winbase.h"
+#include "wine/debug.h"
+
+WINE_DEFAULT_DEBUG_CHANNEL(vxd);
+
+
+/***********************************************************************
+ *           DeviceIoControl   (MMDEVLDR.VXD.@)
+ */
+BOOL WINAPI MMDEVLDR_DeviceIoControl(DWORD dwIoControlCode,
+                                     LPVOID lpvInBuffer, DWORD cbInBuffer,
+                                     LPVOID lpvOutBuffer, DWORD cbOutBuffer,
+                                     LPDWORD lpcbBytesReturned,
+                                     LPOVERLAPPED lpOverlapped)
+{
+    FIXME("(%ld,%p,%ld,%p,%ld,%p,%p): stub\n",
+          dwIoControlCode,
+          lpvInBuffer,cbInBuffer,
+          lpvOutBuffer,cbOutBuffer,
+          lpcbBytesReturned,
+          lpOverlapped );
+
+    switch (dwIoControlCode)
+    {
+    case 5:
+        /* Hmm. */
+        *(DWORD*)lpvOutBuffer=0;
+        *lpcbBytesReturned=sizeof(DWORD);
+        return TRUE;
+    default:
+        return FALSE;
+    }
+}
diff --git a/dlls/mmdevldr.vxd/mmdevldr.vxd.spec b/dlls/mmdevldr.vxd/mmdevldr.vxd.spec
new file mode 100644
index 0000000..4087117
--- /dev/null
+++ b/dlls/mmdevldr.vxd/mmdevldr.vxd.spec
@@ -0,0 +1 @@
+@ stdcall DeviceIoControl(long ptr long ptr long ptr ptr) MMDEVLDR_DeviceIoControl
diff --git a/dlls/monodebg.vxd/.cvsignore b/dlls/monodebg.vxd/.cvsignore
new file mode 100644
index 0000000..d91f661
--- /dev/null
+++ b/dlls/monodebg.vxd/.cvsignore
@@ -0,0 +1,3 @@
+Makefile
+monodebg.vxd.dbg.c
+monodebg.vxd.spec.c
diff --git a/dlls/monodebg.vxd/Makefile.in b/dlls/monodebg.vxd/Makefile.in
new file mode 100644
index 0000000..3227f5a
--- /dev/null
+++ b/dlls/monodebg.vxd/Makefile.in
@@ -0,0 +1,13 @@
+TOPSRCDIR = @top_srcdir@
+TOPOBJDIR = ../..
+SRCDIR    = @srcdir@
+VPATH     = @srcdir@
+MODULE    = monodebg.vxd
+IMPORTS   = kernel32
+
+C_SRCS = \
+	monodebg.c
+
+@MAKE_DLL_RULES@
+
+### Dependencies:
diff --git a/dlls/monodebg.vxd/monodebg.c b/dlls/monodebg.vxd/monodebg.c
new file mode 100644
index 0000000..8dacdaa
--- /dev/null
+++ b/dlls/monodebg.vxd/monodebg.c
@@ -0,0 +1,58 @@
+/*
+ * MONODEBG VxD implementation
+ *
+ * Copyright 1998 Marcus Meissner
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ */
+
+/* NOTE: this VxD is used by some Origin games */
+
+#include <stdarg.h>
+#include "windef.h"
+#include "winbase.h"
+#include "wine/debug.h"
+
+WINE_DEFAULT_DEBUG_CHANNEL(vxd);
+
+
+/***********************************************************************
+ *           DeviceIoControl   (MONODEBG.VXD.@)
+ */
+BOOL WINAPI MONODEBG_DeviceIoControl(DWORD dwIoControlCode,
+                                     LPVOID lpvInBuffer, DWORD cbInBuffer,
+                                     LPVOID lpvOutBuffer, DWORD cbOutBuffer,
+                                     LPDWORD lpcbBytesReturned,
+                                     LPOVERLAPPED lpOverlapped)
+{
+    switch (dwIoControlCode)
+    {
+    case 1:  /* version */
+        *(LPDWORD)lpvOutBuffer = 0x20004; /* WC SecretOps */
+        break;
+    case 9:  /* debug output */
+        ERR("%s\n",debugstr_a(lpvInBuffer));
+        break;
+    default:
+        FIXME("(%ld,%p,%ld,%p,%ld,%p,%p): stub\n",
+              dwIoControlCode,
+              lpvInBuffer,cbInBuffer,
+              lpvOutBuffer,cbOutBuffer,
+              lpcbBytesReturned,
+              lpOverlapped );
+        break;
+    }
+    return TRUE;
+}
diff --git a/dlls/monodebg.vxd/monodebg.vxd.spec b/dlls/monodebg.vxd/monodebg.vxd.spec
new file mode 100644
index 0000000..1690238
--- /dev/null
+++ b/dlls/monodebg.vxd/monodebg.vxd.spec
@@ -0,0 +1 @@
+@ stdcall DeviceIoControl(long ptr long ptr long ptr ptr) MONODEBG_DeviceIoControl
diff --git a/dlls/vdhcp.vxd/.cvsignore b/dlls/vdhcp.vxd/.cvsignore
new file mode 100644
index 0000000..d85f183
--- /dev/null
+++ b/dlls/vdhcp.vxd/.cvsignore
@@ -0,0 +1,3 @@
+Makefile
+vdhcp.vxd.dbg.c
+vdhcp.vxd.spec.c
diff --git a/dlls/vdhcp.vxd/Makefile.in b/dlls/vdhcp.vxd/Makefile.in
new file mode 100644
index 0000000..93da609
--- /dev/null
+++ b/dlls/vdhcp.vxd/Makefile.in
@@ -0,0 +1,13 @@
+TOPSRCDIR = @top_srcdir@
+TOPOBJDIR = ../..
+SRCDIR    = @srcdir@
+VPATH     = @srcdir@
+MODULE    = vdhcp.vxd
+IMPORTS   = kernel32
+
+C_SRCS = \
+	vdhcp.c
+
+@MAKE_DLL_RULES@
+
+### Dependencies:
diff --git a/dlls/vdhcp.vxd/vdhcp.c b/dlls/vdhcp.vxd/vdhcp.c
new file mode 100644
index 0000000..2a586f7
--- /dev/null
+++ b/dlls/vdhcp.vxd/vdhcp.c
@@ -0,0 +1,77 @@
+/*
+ * VDHCP VxD implementation
+ *
+ * Copyright 2003 Juan Lang
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ */
+
+#include <stdarg.h>
+#include "windef.h"
+#include "winbase.h"
+#include "wine/debug.h"
+
+WINE_DEFAULT_DEBUG_CHANNEL(vxd);
+
+
+/***********************************************************************
+ *           DeviceIoControl   (VDHCP.VXD.@)
+ */
+BOOL WINAPI VDHCP_DeviceIoControl(DWORD dwIoControlCode, LPVOID lpvInBuffer,
+                                  DWORD cbInBuffer,
+                                  LPVOID lpvOutBuffer, DWORD cbOutBuffer,
+                                  LPDWORD lpcbBytesReturned,
+                                  LPOVERLAPPED lpOverlapped)
+{
+    DWORD error;
+
+    switch (dwIoControlCode)
+    {
+    case 1:
+    {
+        /* since IpReleaseAddress/IpRenewAddress are not implemented, say there
+         * are no DHCP adapters
+         */
+        error = ERROR_FILE_NOT_FOUND;
+        break;
+    }
+
+    /* FIXME: don't know what this means */
+    case 5:
+        if (lpcbBytesReturned)
+            *lpcbBytesReturned = sizeof(DWORD);
+        if (lpvOutBuffer && cbOutBuffer >= sizeof(DWORD))
+        {
+            *(LPDWORD)lpvOutBuffer = 0;
+            error = NO_ERROR;
+        }
+        else
+            error = ERROR_BUFFER_OVERFLOW;
+        break;
+
+    default:
+        FIXME("(%ld,%p,%ld,%p,%ld,%p,%p): stub\n",
+                dwIoControlCode,
+                lpvInBuffer,cbInBuffer,
+                lpvOutBuffer,cbOutBuffer,
+                lpcbBytesReturned,
+                lpOverlapped);
+        error = ERROR_NOT_SUPPORTED;
+        break;
+    }
+    if (error)
+        SetLastError(error);
+    return error == NO_ERROR;
+}
diff --git a/dlls/vdhcp.vxd/vdhcp.vxd.spec b/dlls/vdhcp.vxd/vdhcp.vxd.spec
new file mode 100644
index 0000000..b231648
--- /dev/null
+++ b/dlls/vdhcp.vxd/vdhcp.vxd.spec
@@ -0,0 +1 @@
+@ stdcall DeviceIoControl(long ptr long ptr long ptr ptr) VDHCP_DeviceIoControl
diff --git a/dlls/vnb.vxd/.cvsignore b/dlls/vnb.vxd/.cvsignore
new file mode 100644
index 0000000..e0aac5a
--- /dev/null
+++ b/dlls/vnb.vxd/.cvsignore
@@ -0,0 +1,3 @@
+Makefile
+vnb.vxd.dbg.c
+vnb.vxd.spec.c
diff --git a/dlls/vnb.vxd/Makefile.in b/dlls/vnb.vxd/Makefile.in
new file mode 100644
index 0000000..d79caf1
--- /dev/null
+++ b/dlls/vnb.vxd/Makefile.in
@@ -0,0 +1,13 @@
+TOPSRCDIR = @top_srcdir@
+TOPOBJDIR = ../..
+SRCDIR    = @srcdir@
+VPATH     = @srcdir@
+MODULE    = vnb.vxd
+IMPORTS   = iphlpapi kernel32
+
+C_SRCS = \
+	vnb.c
+
+@MAKE_DLL_RULES@
+
+### Dependencies:
diff --git a/dlls/vnb.vxd/vnb.c b/dlls/vnb.vxd/vnb.c
new file mode 100644
index 0000000..9720c2b
--- /dev/null
+++ b/dlls/vnb.vxd/vnb.c
@@ -0,0 +1,182 @@
+/*
+ * VNB VxD implementation
+ *
+ * Copyright 2003 Juan Lang
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ */
+
+#include "config.h"
+
+#include <stdlib.h>
+#include <stdarg.h>
+#include <sys/types.h>
+#ifdef HAVE_SYS_SOCKET_H
+# include <sys/socket.h>
+#endif
+#ifdef HAVE_NETINET_IN_H
+# include <netinet/in.h>
+#endif
+#ifdef HAVE_ARPA_INET_H
+# include <arpa/inet.h>
+#endif
+#ifdef HAVE_UNISTD_H
+# include <unistd.h>
+#endif
+
+#include "windef.h"
+#include "winbase.h"
+#include "iphlpapi.h"
+#include "wine/debug.h"
+
+WINE_DEFAULT_DEBUG_CHANNEL(vxd);
+
+#ifndef INADDR_NONE
+#define INADDR_NONE ~0UL
+#endif
+
+typedef struct _nbtInfo
+{
+    DWORD ip;
+    DWORD winsPrimary;
+    DWORD winsSecondary;
+    DWORD dnsPrimary;
+    DWORD dnsSecondary;
+    DWORD unk0;
+} nbtInfo;
+
+#define MAX_NBT_ENTRIES 7
+
+typedef struct _nbtTable
+{
+    DWORD   numEntries;
+    nbtInfo table[MAX_NBT_ENTRIES];
+    UCHAR   pad[6];
+    WORD    nodeType;
+    WORD    scopeLen;
+    char    scope[254];
+} nbtTable;
+
+
+/***********************************************************************
+ *           DeviceIoControl   (VNB.VXD.@)
+ */
+BOOL WINAPI VNB_DeviceIoControl(DWORD dwIoControlCode,
+                                LPVOID lpvInBuffer, DWORD cbInBuffer,
+                                LPVOID lpvOutBuffer, DWORD cbOutBuffer,
+                                LPDWORD lpcbBytesReturned,
+                                LPOVERLAPPED lpOverlapped)
+{
+    DWORD error;
+
+    switch (dwIoControlCode)
+    {
+    case 116:
+        if (lpcbBytesReturned)
+            *lpcbBytesReturned = sizeof(nbtTable);
+        if (!lpvOutBuffer || cbOutBuffer < sizeof(nbtTable))
+            error = ERROR_BUFFER_OVERFLOW;
+        else
+        {
+            nbtTable *info = (nbtTable *)lpvOutBuffer;
+            DWORD size = 0;
+
+            memset(info, 0, sizeof(nbtTable));
+
+            error = GetNetworkParams(NULL, &size);
+            if (ERROR_BUFFER_OVERFLOW == error)
+            {
+                PFIXED_INFO fixedInfo = (PFIXED_INFO)HeapAlloc( GetProcessHeap(), 0, size);
+
+                error = GetNetworkParams(fixedInfo, &size);
+                if (NO_ERROR == error)
+                {
+                    info->nodeType = (WORD)fixedInfo->NodeType;
+                    info->scopeLen = min(strlen(fixedInfo->ScopeId) + 1,
+                                         sizeof(info->scope) - 2);
+                    memcpy(info->scope + 1, fixedInfo->ScopeId,
+                           info->scopeLen);
+                    info->scope[info->scopeLen + 1] = '\0';
+                    {
+                        /* convert into L2-encoded version */
+                        char *ptr, *lenPtr;
+
+                        for (ptr = info->scope + 1; *ptr &&
+                                 ptr - info->scope < sizeof(info->scope); )
+                        {
+                            for (lenPtr = ptr - 1, *lenPtr = 0;
+                                 *ptr && *ptr != '.' &&
+                                     ptr - info->scope < sizeof(info->scope);
+                                 ptr++)
+                                *lenPtr += 1;
+                            ptr++;
+                        }
+                    }
+                    /* could set DNS servers here too, but since
+                     * ipconfig.exe and winipcfg.exe read these from the
+                     * registry, there's no point */
+                }
+                if (fixedInfo)
+                    HeapFree(GetProcessHeap(), 0, fixedInfo);
+            }
+            size = 0;
+            error = GetAdaptersInfo(NULL, &size);
+            if (ERROR_BUFFER_OVERFLOW == error)
+            {
+                PIP_ADAPTER_INFO adapterInfo = HeapAlloc(GetProcessHeap(), 0, size);
+
+                error = GetAdaptersInfo(adapterInfo, &size);
+                if (NO_ERROR == error)
+                {
+                    PIP_ADAPTER_INFO ptr = adapterInfo;
+
+                    for (ptr = adapterInfo; ptr && info->numEntries <
+                             MAX_NBT_ENTRIES; ptr = ptr->Next)
+                    {
+                        unsigned long addr;
+
+                        addr = inet_addr(ptr->IpAddressList.IpAddress.String);
+                        if (addr != 0 && addr != INADDR_NONE)
+                            info->table[info->numEntries].ip = ntohl(addr);
+                        addr = inet_addr(ptr->PrimaryWinsServer.IpAddress.String);
+                        if (addr != 0 && addr != INADDR_NONE)
+                            info->table[info->numEntries].winsPrimary = ntohl(addr);
+                        addr = inet_addr(ptr->SecondaryWinsServer.IpAddress.String);
+                        if (addr != 0 && addr != INADDR_NONE)
+                            info->table[info->numEntries].winsSecondary = ntohl(addr);
+                        info->numEntries++;
+                    }
+                }
+                if (adapterInfo)
+                    HeapFree(GetProcessHeap(), 0, adapterInfo);
+            }
+        }
+        break;
+
+    case 119:
+        /* nbtstat.exe uses this, but the return seems to be a bunch of
+         * pointers, so it's not so easy to reverse engineer.  Fall through
+         * to unimplemented...
+         */
+    default:
+        FIXME( "Unimplemented control %ld for VxD device VNB\n",
+               dwIoControlCode );
+        error = ERROR_NOT_SUPPORTED;
+        break;
+    }
+    if (error)
+        SetLastError(error);
+    return error == NO_ERROR;
+}
diff --git a/dlls/vnb.vxd/vnb.vxd.spec b/dlls/vnb.vxd/vnb.vxd.spec
new file mode 100644
index 0000000..8189075
--- /dev/null
+++ b/dlls/vnb.vxd/vnb.vxd.spec
@@ -0,0 +1 @@
+@ stdcall DeviceIoControl(long ptr long ptr long ptr ptr) VNB_DeviceIoControl
diff --git a/dlls/vnetbios.vxd/.cvsignore b/dlls/vnetbios.vxd/.cvsignore
new file mode 100644
index 0000000..c590f86
--- /dev/null
+++ b/dlls/vnetbios.vxd/.cvsignore
@@ -0,0 +1,3 @@
+Makefile
+vnetbios.vxd.dbg.c
+vnetbios.vxd.spec.c
diff --git a/dlls/vnetbios.vxd/Makefile.in b/dlls/vnetbios.vxd/Makefile.in
new file mode 100644
index 0000000..db3c1fd
--- /dev/null
+++ b/dlls/vnetbios.vxd/Makefile.in
@@ -0,0 +1,13 @@
+TOPSRCDIR = @top_srcdir@
+TOPOBJDIR = ../..
+SRCDIR    = @srcdir@
+VPATH     = @srcdir@
+MODULE    = vnetbios.vxd
+IMPORTS   = netapi32 kernel32
+
+C_SRCS = \
+	vnetbios.c
+
+@MAKE_DLL_RULES@
+
+### Dependencies:
diff --git a/dlls/vnetbios.vxd/vnetbios.c b/dlls/vnetbios.vxd/vnetbios.c
new file mode 100644
index 0000000..2392599
--- /dev/null
+++ b/dlls/vnetbios.vxd/vnetbios.c
@@ -0,0 +1,47 @@
+/*
+ * VNETBIOS VxD implementation
+ *
+ * Copyright 2003 Juan Lang
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ */
+
+#include <stdarg.h>
+#include "windef.h"
+#include "winbase.h"
+#include "nb30.h"
+#include "wine/debug.h"
+
+WINE_DEFAULT_DEBUG_CHANNEL(vxd);
+
+/***********************************************************************
+ *           DeviceIoControl   (VNETBIOS.VXD.@)
+ */
+BOOL WINAPI VNETBIOS_DeviceIoControl( DWORD code, LPVOID lpvInBuffer, DWORD cbInBuffer,
+                                      LPVOID lpvOutBuffer, DWORD cbOutBuffer,
+                                      LPDWORD lpcbBytesReturned, LPOVERLAPPED lpOverlapped )
+{
+    switch(code)
+    {
+    case 256:
+        Netbios(lpvInBuffer);
+        return TRUE;
+    default:
+        FIXME("(%ld,%p,%ld,%p,%ld,%p,%p): stub\n",
+              code, lpvInBuffer,cbInBuffer, lpvOutBuffer,cbOutBuffer,
+              lpcbBytesReturned, lpOverlapped);
+        return FALSE;
+    }
+}
diff --git a/dlls/vnetbios.vxd/vnetbios.vxd.spec b/dlls/vnetbios.vxd/vnetbios.vxd.spec
new file mode 100644
index 0000000..15b59c4
--- /dev/null
+++ b/dlls/vnetbios.vxd/vnetbios.vxd.spec
@@ -0,0 +1 @@
+@ stdcall DeviceIoControl(long ptr long ptr long ptr ptr) VNETBIOS_DeviceIoControl
diff --git a/dlls/vtdapi.vxd/.cvsignore b/dlls/vtdapi.vxd/.cvsignore
new file mode 100644
index 0000000..fa8394d
--- /dev/null
+++ b/dlls/vtdapi.vxd/.cvsignore
@@ -0,0 +1,3 @@
+Makefile
+vtdapi.vxd.dbg.c
+vtdapi.vxd.spec.c
diff --git a/dlls/vtdapi.vxd/Makefile.in b/dlls/vtdapi.vxd/Makefile.in
new file mode 100644
index 0000000..7f57662
--- /dev/null
+++ b/dlls/vtdapi.vxd/Makefile.in
@@ -0,0 +1,13 @@
+TOPSRCDIR = @top_srcdir@
+TOPOBJDIR = ../..
+SRCDIR    = @srcdir@
+VPATH     = @srcdir@
+MODULE    = vtdapi.vxd
+IMPORTS   = kernel32
+
+C_SRCS = \
+	vtdapi.c
+
+@MAKE_DLL_RULES@
+
+### Dependencies:
diff --git a/dlls/vtdapi.vxd/vtdapi.c b/dlls/vtdapi.vxd/vtdapi.c
new file mode 100644
index 0000000..dc338f7
--- /dev/null
+++ b/dlls/vtdapi.vxd/vtdapi.c
@@ -0,0 +1,48 @@
+/*
+ * VTDAPI VxD implementation
+ *
+ * Copyright 1998 Marcus Meissner
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ */
+
+#include <stdarg.h>
+#include "windef.h"
+#include "winbase.h"
+#include "wine/debug.h"
+
+WINE_DEFAULT_DEBUG_CHANNEL(vxd);
+
+/***********************************************************************
+ *           DeviceIoControl   (VTDAPI.VXD.@)
+ */
+BOOL WINAPI VTDAPI_DeviceIoControl( DWORD code, LPVOID lpvInBuffer, DWORD cbInBuffer,
+                                    LPVOID lpvOutBuffer, DWORD cbOutBuffer,
+                                    LPDWORD lpcbBytesReturned, LPOVERLAPPED lpOverlapped )
+{
+    switch (code)
+    {
+    case 5:
+        if (lpvOutBuffer && (cbOutBuffer>=4))
+            *(DWORD*)lpvOutBuffer = GetTickCount();
+        if (lpcbBytesReturned)
+            *lpcbBytesReturned = sizeof(DWORD);
+        return TRUE;
+
+    default:
+        FIXME( "Control %ld not implemented\n", code);
+        return FALSE;
+    }
+}
diff --git a/dlls/vtdapi.vxd/vtdapi.vxd.spec b/dlls/vtdapi.vxd/vtdapi.vxd.spec
new file mode 100644
index 0000000..8a8bcf2
--- /dev/null
+++ b/dlls/vtdapi.vxd/vtdapi.vxd.spec
@@ -0,0 +1 @@
+@ stdcall DeviceIoControl(long ptr long ptr long ptr ptr) VTDAPI_DeviceIoControl
diff --git a/dlls/vwin32.vxd/.cvsignore b/dlls/vwin32.vxd/.cvsignore
new file mode 100644
index 0000000..cd1a9d3
--- /dev/null
+++ b/dlls/vwin32.vxd/.cvsignore
@@ -0,0 +1,3 @@
+Makefile
+vwin32.vxd.dbg.c
+vwin32.vxd.spec.c
diff --git a/dlls/vwin32.vxd/Makefile.in b/dlls/vwin32.vxd/Makefile.in
new file mode 100644
index 0000000..6f0dd53
--- /dev/null
+++ b/dlls/vwin32.vxd/Makefile.in
@@ -0,0 +1,13 @@
+TOPSRCDIR = @top_srcdir@
+TOPOBJDIR = ../..
+SRCDIR    = @srcdir@
+VPATH     = @srcdir@
+MODULE    = vwin32.vxd
+IMPORTS   = winedos kernel32
+
+C_SRCS = \
+	vwin32.c
+
+@MAKE_DLL_RULES@
+
+### Dependencies:
diff --git a/dlls/vwin32.vxd/vwin32.c b/dlls/vwin32.vxd/vwin32.c
new file mode 100644
index 0000000..adeccf9
--- /dev/null
+++ b/dlls/vwin32.vxd/vwin32.c
@@ -0,0 +1,152 @@
+/*
+ * VWIN32 VxD implementation
+ *
+ * Copyright 1998 Marcus Meissner
+ * Copyright 1998 Ulrich Weigand
+ * Copyright 1998 Patrik Stridvall
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ */
+
+#include <stdarg.h>
+
+#include "windef.h"
+#include "winbase.h"
+#include "winioctl.h"
+#include "wine/debug.h"
+
+WINE_DEFAULT_DEBUG_CHANNEL(vxd);
+
+extern void WINAPI CallBuiltinHandler( CONTEXT86 *context, BYTE intnum );  /* from winedos */
+
+
+static void DIOCRegs_2_CONTEXT( DIOC_REGISTERS *pIn, CONTEXT86 *pCxt )
+{
+    memset( pCxt, 0, sizeof(*pCxt) );
+    /* Note: segment registers == 0 means that CTX_SEG_OFF_TO_LIN
+             will interpret 32-bit register contents as linear pointers */
+
+    pCxt->ContextFlags=CONTEXT86_INTEGER|CONTEXT86_CONTROL;
+    pCxt->Eax = pIn->reg_EAX;
+    pCxt->Ebx = pIn->reg_EBX;
+    pCxt->Ecx = pIn->reg_ECX;
+    pCxt->Edx = pIn->reg_EDX;
+    pCxt->Esi = pIn->reg_ESI;
+    pCxt->Edi = pIn->reg_EDI;
+
+    /* FIXME: Only partial CONTEXT86_CONTROL */
+
+    pCxt->EFlags = pIn->reg_Flags & ~0x00020000; /* clear vm86 mode */
+}
+
+static void CONTEXT_2_DIOCRegs( CONTEXT86 *pCxt, DIOC_REGISTERS *pOut )
+{
+    memset( pOut, 0, sizeof(DIOC_REGISTERS) );
+
+    pOut->reg_EAX = pCxt->Eax;
+    pOut->reg_EBX = pCxt->Ebx;
+    pOut->reg_ECX = pCxt->Ecx;
+    pOut->reg_EDX = pCxt->Edx;
+    pOut->reg_ESI = pCxt->Esi;
+    pOut->reg_EDI = pCxt->Edi;
+
+    /* FIXME: Only partial CONTEXT86_CONTROL */
+    pOut->reg_Flags = pCxt->EFlags;
+}
+
+#define DIOC_AH(regs) (((unsigned char*)&((regs)->reg_EAX))[1])
+#define DIOC_AL(regs) (((unsigned char*)&((regs)->reg_EAX))[0])
+#define DIOC_BH(regs) (((unsigned char*)&((regs)->reg_EBX))[1])
+#define DIOC_BL(regs) (((unsigned char*)&((regs)->reg_EBX))[0])
+#define DIOC_DH(regs) (((unsigned char*)&((regs)->reg_EDX))[1])
+#define DIOC_DL(regs) (((unsigned char*)&((regs)->reg_EDX))[0])
+
+#define DIOC_AX(regs) (((unsigned short*)&((regs)->reg_EAX))[0])
+#define DIOC_BX(regs) (((unsigned short*)&((regs)->reg_EBX))[0])
+#define DIOC_CX(regs) (((unsigned short*)&((regs)->reg_ECX))[0])
+#define DIOC_DX(regs) (((unsigned short*)&((regs)->reg_EDX))[0])
+
+#define DIOC_SET_CARRY(regs) (((regs)->reg_Flags)|=0x00000001)
+
+/***********************************************************************
+ *           DeviceIoControl   (VWIN32.VXD.@)
+ */
+BOOL WINAPI VWIN32_DeviceIoControl(DWORD dwIoControlCode,
+                                   LPVOID lpvInBuffer, DWORD cbInBuffer,
+                                   LPVOID lpvOutBuffer, DWORD cbOutBuffer,
+                                   LPDWORD lpcbBytesReturned, LPOVERLAPPED lpOverlapped)
+{
+    switch (dwIoControlCode)
+    {
+    case VWIN32_DIOC_DOS_IOCTL:
+    case 0x10: /* Int 0x21 call, call it VWIN_DIOC_INT21 ? */
+    case VWIN32_DIOC_DOS_INT13:
+    case VWIN32_DIOC_DOS_INT25:
+    case VWIN32_DIOC_DOS_INT26:
+    case 0x29: /* Int 0x31 call, call it VWIN_DIOC_INT31 ? */
+    case VWIN32_DIOC_DOS_DRIVEINFO:
+        {
+            CONTEXT86 cxt;
+            DIOC_REGISTERS *pIn  = (DIOC_REGISTERS *)lpvInBuffer;
+            DIOC_REGISTERS *pOut = (DIOC_REGISTERS *)lpvOutBuffer;
+            BYTE intnum = 0;
+
+            TRACE( "Control '%s': "
+                   "eax=0x%08lx, ebx=0x%08lx, ecx=0x%08lx, "
+                   "edx=0x%08lx, esi=0x%08lx, edi=0x%08lx \n",
+                   (dwIoControlCode == VWIN32_DIOC_DOS_IOCTL)? "VWIN32_DIOC_DOS_IOCTL" :
+                   (dwIoControlCode == VWIN32_DIOC_DOS_INT25)? "VWIN32_DIOC_DOS_INT25" :
+                   (dwIoControlCode == VWIN32_DIOC_DOS_INT26)? "VWIN32_DIOC_DOS_INT26" :
+                   (dwIoControlCode == VWIN32_DIOC_DOS_DRIVEINFO)? "VWIN32_DIOC_DOS_DRIVEINFO" :  "???",
+                   pIn->reg_EAX, pIn->reg_EBX, pIn->reg_ECX,
+                   pIn->reg_EDX, pIn->reg_ESI, pIn->reg_EDI );
+
+            DIOCRegs_2_CONTEXT( pIn, &cxt );
+
+            switch (dwIoControlCode)
+            {
+            case VWIN32_DIOC_DOS_IOCTL: /* Call int 21h */
+            case 0x10: /* Int 0x21 call, call it VWIN_DIOC_INT21 ? */
+            case VWIN32_DIOC_DOS_DRIVEINFO:        /* Call int 21h 730x */
+                intnum = 0x21;
+                break;
+            case VWIN32_DIOC_DOS_INT13:
+                intnum = 0x13;
+                break;
+            case VWIN32_DIOC_DOS_INT25:
+                intnum = 0x25;
+                break;
+            case VWIN32_DIOC_DOS_INT26:
+                intnum = 0x26;
+                break;
+            case 0x29: /* Int 0x31 call, call it VWIN_DIOC_INT31 ? */
+                intnum = 0x31;
+                break;
+            }
+
+            CallBuiltinHandler( &cxt, intnum );
+            CONTEXT_2_DIOCRegs( &cxt, pOut );
+        }
+        return TRUE;
+
+    case VWIN32_DIOC_SIMCTRLC:
+        FIXME( "Control VWIN32_DIOC_SIMCTRLC not implemented\n");
+        return FALSE;
+
+    default:
+        FIXME( "Unknown Control %ld\n", dwIoControlCode);
+        return FALSE;
+    }
+}
diff --git a/dlls/vwin32.vxd/vwin32.vxd.spec b/dlls/vwin32.vxd/vwin32.vxd.spec
new file mode 100644
index 0000000..4a07ea1
--- /dev/null
+++ b/dlls/vwin32.vxd/vwin32.vxd.spec
@@ -0,0 +1 @@
+@ stdcall DeviceIoControl(long ptr long ptr long ptr ptr) VWIN32_DeviceIoControl