kernel32: Make krnl386.exe into a stand-alone 16-bit module.
diff --git a/.gitignore b/.gitignore
index 1cf31f1..6a63858 100644
--- a/.gitignore
+++ b/.gitignore
@@ -58,7 +58,6 @@
 dlls/kernel32/nls/winerr_nor.mc.rc
 dlls/kernel32/nls/winerr_plk.mc.rc
 dlls/kernel32/nls/winerr_ptg.mc.rc
-dlls/krnl386.exe16
 dlls/libd3dx9.def
 dlls/libwinspool.def
 dlls/libxinput.def
diff --git a/configure b/configure
index e0ae0d2..c8c1def 100755
--- a/configure
+++ b/configure
@@ -15122,6 +15122,14 @@
 ac_config_files="$ac_config_files dlls/keyboard.drv16/Makefile"
 
 ALL_MAKEFILES="$ALL_MAKEFILES \\
+	dlls/krnl386.exe16/Makefile"
+test "x$enable_win16" != xno && ALL_DLL_DIRS="$ALL_DLL_DIRS \\
+	krnl386.exe16"
+ALL_MAKEFILE_DEPENDS="$ALL_MAKEFILE_DEPENDS
+dlls/krnl386.exe16/Makefile: dlls/krnl386.exe16/Makefile.in dlls/Makedll.rules"
+ac_config_files="$ac_config_files dlls/krnl386.exe16/Makefile"
+
+ALL_MAKEFILES="$ALL_MAKEFILES \\
 	dlls/loadperf/Makefile"
 test "x$enable_loadperf" != xno && ALL_DLL_DIRS="$ALL_DLL_DIRS \\
 	loadperf"
@@ -18924,6 +18932,7 @@
     "dlls/kernel32/Makefile") CONFIG_FILES="$CONFIG_FILES dlls/kernel32/Makefile" ;;
     "dlls/kernel32/tests/Makefile") CONFIG_FILES="$CONFIG_FILES dlls/kernel32/tests/Makefile" ;;
     "dlls/keyboard.drv16/Makefile") CONFIG_FILES="$CONFIG_FILES dlls/keyboard.drv16/Makefile" ;;
+    "dlls/krnl386.exe16/Makefile") CONFIG_FILES="$CONFIG_FILES dlls/krnl386.exe16/Makefile" ;;
     "dlls/loadperf/Makefile") CONFIG_FILES="$CONFIG_FILES dlls/loadperf/Makefile" ;;
     "dlls/localspl/Makefile") CONFIG_FILES="$CONFIG_FILES dlls/localspl/Makefile" ;;
     "dlls/localspl/tests/Makefile") CONFIG_FILES="$CONFIG_FILES dlls/localspl/tests/Makefile" ;;
diff --git a/configure.ac b/configure.ac
index 9178306..184c70d 100644
--- a/configure.ac
+++ b/configure.ac
@@ -2305,6 +2305,7 @@
 WINE_CONFIG_MAKEFILE([dlls/kernel32/Makefile],[dlls/Makedll.rules],[dlls],[ALL_DLL_DIRS])
 WINE_CONFIG_MAKEFILE([dlls/kernel32/tests/Makefile],[dlls/Maketest.rules],[dlls],[ALL_TEST_DIRS],[enable_tests])
 WINE_CONFIG_MAKEFILE([dlls/keyboard.drv16/Makefile],[dlls/Makedll.rules],[dlls],[ALL_DLL_DIRS],[enable_win16])
+WINE_CONFIG_MAKEFILE([dlls/krnl386.exe16/Makefile],[dlls/Makedll.rules],[dlls],[ALL_DLL_DIRS],[enable_win16])
 WINE_CONFIG_MAKEFILE([dlls/loadperf/Makefile],[dlls/Makedll.rules],[dlls],[ALL_DLL_DIRS])
 WINE_CONFIG_MAKEFILE([dlls/localspl/Makefile],[dlls/Makedll.rules],[dlls],[ALL_DLL_DIRS])
 WINE_CONFIG_MAKEFILE([dlls/localspl/tests/Makefile],[dlls/Maketest.rules],[dlls],[ALL_TEST_DIRS],[enable_tests])
diff --git a/dlls/Makefile.in b/dlls/Makefile.in
index 8e44eb0..13b3cbf 100644
--- a/dlls/Makefile.in
+++ b/dlls/Makefile.in
@@ -18,7 +18,6 @@
 # 16-bit dlls
 
 WIN16_FILES = \
-	krnl386.exe16 \
 	wprocs.dll16
 
 @MAKE_RULES@
@@ -29,9 +28,6 @@
 
 # Placeholders for 16-bit libraries
 
-krnl386.exe16:
-	echo "kernel32.dll" >$@
-
 wprocs.dll16:
 	echo "winedos.dll" >$@
 
diff --git a/dlls/kernel32/Makefile.in b/dlls/kernel32/Makefile.in
index df97736..fbf3f2d 100644
--- a/dlls/kernel32/Makefile.in
+++ b/dlls/kernel32/Makefile.in
@@ -9,8 +9,6 @@
 EXTRALIBS = @COREFOUNDATIONLIB@ @LIBPOLL@
 EXTRADLLFLAGS = -Wb,-F,KERNEL32.dll -Wl,--image-base,0x7b800000
 
-SPEC_SRCS16 = krnl386.exe.spec
-
 C_SRCS = \
 	actctx.c \
 	atom.c \
@@ -20,64 +18,38 @@
 	console.c \
 	cpu.c \
 	debugger.c \
-	dosmem.c \
 	editline.c \
 	environ.c \
 	except.c \
 	fiber.c \
 	file.c \
-	file16.c \
 	format_msg.c \
-	global16.c \
 	heap.c \
-	instr.c \
 	kernel_main.c \
 	lcformat.c \
-	local16.c \
 	locale.c \
 	lzexpand.c \
 	module.c \
-	ne_module.c \
-	ne_segment.c \
 	oldconfig.c \
 	path.c \
 	powermgnt.c \
 	process.c \
 	profile.c \
-	relay16.c \
 	resource.c \
-	resource16.c \
-	selector.c \
-	snoop16.c \
 	string.c \
 	sync.c \
-	syslevel.c \
 	tape.c \
-	task.c \
 	thread.c \
-	thunk.c \
 	time.c \
 	toolhelp.c \
-	utthunk.c \
 	version.c \
 	virtual.c \
-	volume.c \
-	vxd.c \
-	wowthunk.c
-
-C_SRCS16 = \
-	atom16.c \
-	error16.c \
-	kernel16.c \
-	registry16.c
+	volume.c
 
 RC_SRCS = \
 	locale_rc.rc \
 	version.rc
 
-RC_SRCS16 = \
-	version16.rc
-
 MC_SRCS = \
 	nls/winerr_deu.mc \
 	nls/winerr_enu.mc \
@@ -90,20 +62,8 @@
 	nls/winerr_plk.mc \
 	nls/winerr_ptg.mc
 
-EXTRA_OBJS   = relay16asm.o
 EXTRASUBDIRS = nls
 
 @MAKE_DLL_RULES@
 
-relay16asm.o: $(WINEBUILD)
-	$(WINEBUILD) $(WINEBUILDFLAGS) -o $@ --relay16
-
-# Special rules for 16-bit resource and spec files
-
-krnl386.exe.spec.o: krnl386.exe.spec version16.res
-	$(WINEBUILD) $(WINEBUILDFLAGS) --dll -o $@ --dll-name kernel --main-module $(MODULE) --res version16.res --export $(SRCDIR)/krnl386.exe.spec
-
-version16.res: version16.rc
-	$(LDPATH) $(RC16) $(RC16FLAGS) -fo$@ $(SRCDIR)/version16.rc
-
 @DEPENDENCIES@  # everything below this line is overwritten by make depend
diff --git a/dlls/kernel32/file.c b/dlls/kernel32/file.c
index 5c7ba20..edec6b0 100644
--- a/dlls/kernel32/file.c
+++ b/dlls/kernel32/file.c
@@ -40,7 +40,6 @@
 #include "winternl.h"
 #include "winioctl.h"
 #include "wincon.h"
-#include "wine/winbase16.h"
 #include "kernel_private.h"
 
 #include "wine/exception.h"
@@ -1363,7 +1362,13 @@
                            options, NULL, 0 );
     if (status)
     {
-        if (vxd_name && vxd_name[0] && (ret = VXD_Open( vxd_name, access, sa ))) goto done;
+        if (vxd_name && vxd_name[0])
+        {
+            static HANDLE (*vxd_open)(LPCWSTR,DWORD,SECURITY_ATTRIBUTES*);
+            if (!vxd_open) vxd_open = (void *)GetProcAddress( GetModuleHandleA("krnl386.exe16"),
+                                                              "__wine_vxd_open" );
+            if (vxd_open && (ret = vxd_open( vxd_name, access, sa ))) goto done;
+        }
 
         WARN("Unable to create file %s (status %x)\n", debugstr_w(filename), status);
         ret = INVALID_HANDLE_VALUE;
@@ -2345,7 +2350,13 @@
 
     if (HIWORD( dwIoControlCode ) == 0 && (GetVersion() & 0x80000000))
     {
-        DeviceIoProc proc = VXD_get_proc( hDevice );
+        typedef BOOL (WINAPI *DeviceIoProc)(DWORD, LPVOID, DWORD, LPVOID, DWORD, LPDWORD, LPOVERLAPPED);
+        static DeviceIoProc (*vxd_get_proc)(HANDLE);
+        DeviceIoProc proc = NULL;
+
+        if (!vxd_get_proc) vxd_get_proc = (void *)GetProcAddress( GetModuleHandleA("krnl386.exe16"),
+                                                                  "__wine_vxd_get_proc" );
+        if (vxd_get_proc) proc = vxd_get_proc( hDevice );
         if (proc) return proc( dwIoControlCode, lpvInBuffer, cbInBuffer,
                                lpvOutBuffer, cbOutBuffer, lpcbBytesReturned, lpOverlapped );
     }
diff --git a/dlls/kernel32/kernel32.spec b/dlls/kernel32/kernel32.spec
index bab25a0..f381017 100644
--- a/dlls/kernel32/kernel32.spec
+++ b/dlls/kernel32/kernel32.spec
@@ -8,128 +8,128 @@
 # - code generated by the MS Thunk Compiler
 # - symbols exported by the Oct 94 beta version of kernel32.dll
 
-  1 stdcall -noname -i386 -register VxDCall0(long) VxDCall
-  2 stdcall -noname -i386 -register VxDCall1(long) VxDCall
-  3 stdcall -noname -i386 -register VxDCall2(long) VxDCall
-  4 stdcall -noname -i386 -register VxDCall3(long) VxDCall
-  5 stdcall -noname -i386 -register VxDCall4(long) VxDCall
-  6 stdcall -noname -i386 -register VxDCall5(long) VxDCall
-  7 stdcall -noname -i386 -register VxDCall6(long) VxDCall
-  8 stdcall -noname -i386 -register VxDCall7(long) VxDCall
-  9 stdcall -noname -i386 -register VxDCall8(long) VxDCall
- 10 stdcall -noname -i386 k32CharToOemA(str ptr)
- 11 stdcall -noname -i386 k32CharToOemBuffA(str ptr long)
- 12 stdcall -noname -i386 k32OemToCharA(ptr ptr)
- 13 stdcall -noname -i386 k32OemToCharBuffA(ptr ptr long)
- 14 stdcall -noname -i386 k32LoadStringA(long long ptr long)
- 15 varargs -noname -i386 k32wsprintfA(str str)
- 16 stdcall -noname -i386 k32wvsprintfA(ptr str ptr)
- 17 stdcall -noname -i386 -register CommonUnimpStub()
- 18 stdcall -noname GetProcessDword(long long)
- 19 stub -noname ThunkTheTemplateHandle
- 20 stdcall -noname DosFileHandleToWin32Handle(long)
- 21 stdcall -noname Win32HandleToDosFileHandle(long)
- 22 stdcall -noname DisposeLZ32Handle(long)
- 23 stub -noname GDIReallyCares
- 24 stdcall -noname GlobalAlloc16(long long)
- 25 stdcall -noname GlobalLock16(long)
- 26 stdcall -noname GlobalUnlock16(long)
- 27 stdcall -noname GlobalFix16(long)
- 28 stdcall -noname GlobalUnfix16(long)
- 29 stdcall -noname GlobalWire16(long)
- 30 stdcall -noname GlobalUnWire16(long)
- 31 stdcall -noname GlobalFree16(long)
- 32 stdcall -noname GlobalSize16(long)
- 33 stdcall -noname -i386 HouseCleanLogicallyDeadHandles()
- 34 stdcall -noname -i386 GetWin16DOSEnv()
- 35 stdcall -noname LoadLibrary16(str)
- 36 stdcall -noname FreeLibrary16(long)
- 37 stdcall -noname GetProcAddress16(long str) WIN32_GetProcAddress16
- 38 stdcall -noname -i386 -register AllocMappedBuffer()
- 39 stdcall -noname -i386 -register FreeMappedBuffer()
- 40 stdcall -noname -i386 -register OT_32ThkLSF()
- 41 stdcall -noname -i386 ThunkInitLSF(long str long str str)
- 42 stdcall -noname -i386 -register LogApiThkLSF(str)
- 43 stdcall -noname -i386 ThunkInitLS(long str long str str)
- 44 stdcall -noname -i386 -register LogApiThkSL(str)
- 45 stdcall -noname -i386 -register Common32ThkLS()
- 46 stdcall -noname -i386 ThunkInitSL(long str long str str)
- 47 stdcall -noname -i386 -register LogCBThkSL(str)
- 48 stdcall -noname ReleaseThunkLock(ptr)
- 49 stdcall -noname RestoreThunkLock(long)
+  1 stdcall -noname -i386 -register VxDCall0(long) krnl386.exe16.VxDCall0
+  2 stdcall -noname -i386 -register VxDCall1(long) krnl386.exe16.VxDCall1
+  3 stdcall -noname -i386 -register VxDCall2(long) krnl386.exe16.VxDCall2
+  4 stdcall -noname -i386 -register VxDCall3(long) krnl386.exe16.VxDCall3
+  5 stdcall -noname -i386 -register VxDCall4(long) krnl386.exe16.VxDCall4
+  6 stdcall -noname -i386 -register VxDCall5(long) krnl386.exe16.VxDCall5
+  7 stdcall -noname -i386 -register VxDCall6(long) krnl386.exe16.VxDCall6
+  8 stdcall -noname -i386 -register VxDCall7(long) krnl386.exe16.VxDCall7
+  9 stdcall -noname -i386 -register VxDCall8(long) krnl386.exe16.VxDCall8
+ 10 stdcall -noname -i386 k32CharToOemA(str ptr) krnl386.exe16.k32CharToOemA
+ 11 stdcall -noname -i386 k32CharToOemBuffA(str ptr long) krnl386.exe16.k32CharToOemBuffA
+ 12 stdcall -noname -i386 k32OemToCharA(ptr ptr) krnl386.exe16.k32OemToCharA
+ 13 stdcall -noname -i386 k32OemToCharBuffA(ptr ptr long) krnl386.exe16.k32OemToCharBuffA
+ 14 stdcall -noname -i386 k32LoadStringA(long long ptr long) krnl386.exe16.k32LoadStringA
+ 15 varargs -noname -i386 k32wsprintfA(str str) krnl386.exe16.k32wsprintfA
+ 16 stdcall -noname -i386 k32wvsprintfA(ptr str ptr) krnl386.exe16.k32wvsprintfA
+ 17 stdcall -noname -i386 -register CommonUnimpStub() krnl386.exe16.CommonUnimpStub
+ 18 stdcall -noname -i386 GetProcessDword(long long) krnl386.exe16.GetProcessDword
+ 19 stub -noname -i386 ThunkTheTemplateHandle
+ 20 stdcall -noname -i386 DosFileHandleToWin32Handle(long) krnl386.exe16.DosFileHandleToWin32Handle
+ 21 stdcall -noname -i386 Win32HandleToDosFileHandle(long) krnl386.exe16.Win32HandleToDosFileHandle
+ 22 stdcall -noname -i386 DisposeLZ32Handle(long) krnl386.exe16.DisposeLZ32Handle
+ 23 stub -noname -i386 GDIReallyCares
+ 24 stdcall -noname -i386 GlobalAlloc16(long long) krnl386.exe16.GlobalAlloc16
+ 25 stdcall -noname -i386 GlobalLock16(long) krnl386.exe16.GlobalLock16
+ 26 stdcall -noname -i386 GlobalUnlock16(long) krnl386.exe16.GlobalUnlock16
+ 27 stdcall -noname -i386 GlobalFix16(long) krnl386.exe16.GlobalFix16
+ 28 stdcall -noname -i386 GlobalUnfix16(long) krnl386.exe16.GlobalUnfix16
+ 29 stdcall -noname -i386 GlobalWire16(long) krnl386.exe16.GlobalWire16
+ 30 stdcall -noname -i386 GlobalUnWire16(long) krnl386.exe16.GlobalUnWire16
+ 31 stdcall -noname -i386 GlobalFree16(long) krnl386.exe16.GlobalFree16
+ 32 stdcall -noname -i386 GlobalSize16(long) krnl386.exe16.GlobalSize16
+ 33 stdcall -noname -i386 HouseCleanLogicallyDeadHandles() krnl386.exe16.HouseCleanLogicallyDeadHandles
+ 34 stdcall -noname -i386 GetWin16DOSEnv() krnl386.exe16.GetWin16DOSEnv
+ 35 stdcall -noname -i386 LoadLibrary16(str) krnl386.exe16.LoadLibrary16
+ 36 stdcall -noname -i386 FreeLibrary16(long) krnl386.exe16.FreeLibrary16
+ 37 stdcall -noname -i386 GetProcAddress16(long str) krnl386.exe16.GetProcAddress16
+ 38 stdcall -noname -i386 -register AllocMappedBuffer() krnl386.exe16.AllocMappedBuffer
+ 39 stdcall -noname -i386 -register FreeMappedBuffer() krnl386.exe16.FreeMappedBuffer
+ 40 stdcall -noname -i386 -register OT_32ThkLSF() krnl386.exe16.OT_32ThkLSF
+ 41 stdcall -noname -i386 ThunkInitLSF(long str long str str) krnl386.exe16.ThunkInitLSF
+ 42 stdcall -noname -i386 -register LogApiThkLSF(str) krnl386.exe16.LogApiThkLSF
+ 43 stdcall -noname -i386 ThunkInitLS(long str long str str) krnl386.exe16.ThunkInitLS
+ 44 stdcall -noname -i386 -register LogApiThkSL(str) krnl386.exe16.LogApiThkSL
+ 45 stdcall -noname -i386 -register Common32ThkLS() krnl386.exe16.Common32ThkLS
+ 46 stdcall -noname -i386 ThunkInitSL(long str long str str) krnl386.exe16.ThunkInitSL
+ 47 stdcall -noname -i386 -register LogCBThkSL(str) krnl386.exe16.LogCBThkSL
+ 48 stdcall -noname -i386 ReleaseThunkLock(ptr) krnl386.exe16.ReleaseThunkLock
+ 49 stdcall -noname -i386 RestoreThunkLock(long) krnl386.exe16.RestoreThunkLock
 
- 51 stdcall -noname -i386 -register W32S_BackTo32()
- 52 stdcall -noname -i386 GetThunkBuff()
- 53 stdcall -noname -i386 GetThunkStuff(str str)
- 54 stdcall -noname K32WOWCallback16(long long)
- 55 stdcall -noname K32WOWCallback16Ex(ptr long long ptr ptr)
- 56 stdcall -noname K32WOWGetVDMPointer(long long long)
- 57 stdcall -noname K32WOWHandle32(long long)
- 58 stdcall -noname K32WOWHandle16(long long)
- 59 stdcall -noname K32WOWGlobalAlloc16(long long)
- 60 stdcall -noname K32WOWGlobalLock16(long)
- 61 stdcall -noname K32WOWGlobalUnlock16(long)
- 62 stdcall -noname K32WOWGlobalFree16(long)
- 63 stdcall -noname K32WOWGlobalAllocLock16(long long ptr)
- 64 stdcall -noname K32WOWGlobalUnlockFree16(long)
- 65 stdcall -noname K32WOWGlobalLockSize16(long ptr)
- 66 stdcall -noname K32WOWYield16()
- 67 stdcall -noname K32WOWDirectedYield16(long)
- 68 stdcall -noname K32WOWGetVDMPointerFix(long long long)
- 69 stdcall -noname K32WOWGetVDMPointerUnfix(long)
- 70 stdcall -noname K32WOWGetDescriptor(long long)
- 71 stub -noname IsThreadId
- 72 stdcall -noname -arch=win32 -ret64 K32RtlLargeIntegerAdd(long long long long) ntdll.RtlLargeIntegerAdd
- 73 stdcall -noname -arch=win32 -ret64 K32RtlEnlargedIntegerMultiply(long long) ntdll.RtlEnlargedIntegerMultiply
- 74 stdcall -noname -arch=win32 -ret64 K32RtlEnlargedUnsignedMultiply(long long) ntdll.RtlEnlargedUnsignedMultiply
- 75 stdcall -noname -arch=win32 K32RtlEnlargedUnsignedDivide(long long long ptr) ntdll.RtlEnlargedUnsignedDivide
- 76 stdcall -noname -arch=win32 -ret64 K32RtlExtendedLargeIntegerDivide(long long long ptr) ntdll.RtlExtendedLargeIntegerDivide
- 77 stdcall -noname -arch=win32 -ret64 K32RtlExtendedMagicDivide(long long long long long) ntdll.RtlExtendedMagicDivide
- 78 stdcall -noname -arch=win32 -ret64 K32RtlExtendedIntegerMultiply(long long long) ntdll.RtlExtendedIntegerMultiply
- 79 stdcall -noname -arch=win32 -ret64 K32RtlLargeIntegerShiftLeft(long long long) ntdll.RtlLargeIntegerShiftLeft
- 80 stdcall -noname -arch=win32 -ret64 K32RtlLargeIntegerShiftRight(long long long) ntdll.RtlLargeIntegerShiftRight
- 81 stdcall -noname -arch=win32 -ret64 K32RtlLargeIntegerArithmeticShift(long long long) ntdll.RtlLargeIntegerArithmeticShift
- 82 stdcall -noname -arch=win32 -ret64 K32RtlLargeIntegerNegate(long long) ntdll.RtlLargeIntegerNegate
- 83 stdcall -noname -arch=win32 -ret64 K32RtlLargeIntegerSubtract(long long long long) ntdll.RtlLargeIntegerSubtract
- 84 stdcall -noname -arch=win32 -ret64 K32RtlConvertLongToLargeInteger(long) ntdll.RtlConvertLongToLargeInteger
- 85 stdcall -noname -arch=win32 -ret64 K32RtlConvertUlongToLargeInteger(long) ntdll.RtlConvertUlongToLargeInteger
- 86 stdcall @(ptr) _KERNEL32_86
- 87 stdcall -noname -i386 SSOnBigStack()
- 88 varargs -noname -i386 SSCall(long long ptr)
- 89 stdcall -noname -i386 -register FT_PrologPrime()
- 90 stdcall -noname -i386 -register QT_ThunkPrime()
- 91 stdcall -noname -i386 PK16FNF(ptr)
- 92 stdcall -noname -i386 GetPK16SysVar()
- 93 stdcall -noname GetpWin16Lock(ptr)
- 94 stdcall -noname _CheckNotSysLevel(ptr)
- 95 stdcall -noname _ConfirmSysLevel(ptr)
- 96 stdcall -noname _ConfirmWin16Lock()
- 97 stdcall -noname _EnterSysLevel(ptr)
- 98 stdcall -noname _LeaveSysLevel(ptr)
- 99 stdcall -i386 @(long) _KERNEL32_99
-100 stdcall -i386 @(long long long) _KERNEL32_100
-101 stub @
-102 stub @
-103 stub @
-104 stub @
-105 stub @
-106 stub @
-107 stub @
-108 stub @
-109 stub @
-110 stub @
-111 stub @
-112 stub @
-113 stub @
-114 stub @
-115 stub @
-116 stub @
-117 stub @
+ 51 stdcall -noname -i386 -register W32S_BackTo32() krnl386.exe16.W32S_BackTo32
+ 52 stdcall -noname -i386 GetThunkBuff() krnl386.exe16.GetThunkBuff
+ 53 stdcall -noname -i386 GetThunkStuff(str str) krnl386.exe16.GetThunkStuff
+ 54 stdcall -noname -i386 K32WOWCallback16(long long) krnl386.exe16.K32WOWCallback16
+ 55 stdcall -noname -i386 K32WOWCallback16Ex(ptr long long ptr ptr) krnl386.exe16.K32WOWCallback16Ex
+ 56 stdcall -noname -i386 K32WOWGetVDMPointer(long long long) krnl386.exe16.K32WOWGetVDMPointer
+ 57 stdcall -noname -i386 K32WOWHandle32(long long) krnl386.exe16.K32WOWHandle32
+ 58 stdcall -noname -i386 K32WOWHandle16(long long) krnl386.exe16.K32WOWHandle16
+ 59 stdcall -noname -i386 K32WOWGlobalAlloc16(long long) krnl386.exe16.K32WOWGlobalAlloc16
+ 60 stdcall -noname -i386 K32WOWGlobalLock16(long) krnl386.exe16.K32WOWGlobalLock16
+ 61 stdcall -noname -i386 K32WOWGlobalUnlock16(long) krnl386.exe16.K32WOWGlobalUnlock16
+ 62 stdcall -noname -i386 K32WOWGlobalFree16(long) krnl386.exe16.K32WOWGlobalFree16
+ 63 stdcall -noname -i386 K32WOWGlobalAllocLock16(long long ptr) krnl386.exe16.K32WOWGlobalAllocLock16
+ 64 stdcall -noname -i386 K32WOWGlobalUnlockFree16(long) krnl386.exe16.K32WOWGlobalUnlockFree16
+ 65 stdcall -noname -i386 K32WOWGlobalLockSize16(long ptr) krnl386.exe16.K32WOWGlobalLockSize16
+ 66 stdcall -noname -i386 K32WOWYield16() krnl386.exe16.K32WOWYield16
+ 67 stdcall -noname -i386 K32WOWDirectedYield16(long) krnl386.exe16.K32WOWDirectedYield16
+ 68 stdcall -noname -i386 K32WOWGetVDMPointerFix(long long long) krnl386.exe16.K32WOWGetVDMPointerFix
+ 69 stdcall -noname -i386 K32WOWGetVDMPointerUnfix(long) krnl386.exe16.K32WOWGetVDMPointerUnfix
+ 70 stdcall -noname -i386 K32WOWGetDescriptor(long long) krnl386.exe16.K32WOWGetDescriptor
+ 71 stub -noname -i386 IsThreadId
+ 72 stdcall -noname -i386 -ret64 K32RtlLargeIntegerAdd(long long long long) ntdll.RtlLargeIntegerAdd
+ 73 stdcall -noname -i386 -ret64 K32RtlEnlargedIntegerMultiply(long long) ntdll.RtlEnlargedIntegerMultiply
+ 74 stdcall -noname -i386 -ret64 K32RtlEnlargedUnsignedMultiply(long long) ntdll.RtlEnlargedUnsignedMultiply
+ 75 stdcall -noname -i386 K32RtlEnlargedUnsignedDivide(long long long ptr) ntdll.RtlEnlargedUnsignedDivide
+ 76 stdcall -noname -i386 -ret64 K32RtlExtendedLargeIntegerDivide(long long long ptr) ntdll.RtlExtendedLargeIntegerDivide
+ 77 stdcall -noname -i386 -ret64 K32RtlExtendedMagicDivide(long long long long long) ntdll.RtlExtendedMagicDivide
+ 78 stdcall -noname -i386 -ret64 K32RtlExtendedIntegerMultiply(long long long) ntdll.RtlExtendedIntegerMultiply
+ 79 stdcall -noname -i386 -ret64 K32RtlLargeIntegerShiftLeft(long long long) ntdll.RtlLargeIntegerShiftLeft
+ 80 stdcall -noname -i386 -ret64 K32RtlLargeIntegerShiftRight(long long long) ntdll.RtlLargeIntegerShiftRight
+ 81 stdcall -noname -i386 -ret64 K32RtlLargeIntegerArithmeticShift(long long long) ntdll.RtlLargeIntegerArithmeticShift
+ 82 stdcall -noname -i386 -ret64 K32RtlLargeIntegerNegate(long long) ntdll.RtlLargeIntegerNegate
+ 83 stdcall -noname -i386 -ret64 K32RtlLargeIntegerSubtract(long long long long) ntdll.RtlLargeIntegerSubtract
+ 84 stdcall -noname -i386 -ret64 K32RtlConvertLongToLargeInteger(long) ntdll.RtlConvertLongToLargeInteger
+ 85 stdcall -noname -i386 -ret64 K32RtlConvertUlongToLargeInteger(long) ntdll.RtlConvertUlongToLargeInteger
+ 86 stdcall -i386 @(ptr) krnl386.exe16._KERNEL32_86
+ 87 stdcall -noname -i386 SSOnBigStack() krnl386.exe16.SSOnBigStack
+ 88 varargs -noname -i386 SSCall(long long ptr) krnl386.exe16.SSCall
+ 89 stdcall -noname -i386 -register FT_PrologPrime() krnl386.exe16.FT_PrologPrime
+ 90 stdcall -noname -i386 -register QT_ThunkPrime() krnl386.exe16.QT_ThunkPrime
+ 91 stdcall -noname -i386 PK16FNF(ptr) krnl386.exe16.PK16FNF
+ 92 stdcall -noname -i386 GetPK16SysVar() krnl386.exe16.GetPK16SysVar
+ 93 stdcall -noname -i386 GetpWin16Lock(ptr) krnl386.exe16.GetpWin16Lock
+ 94 stdcall -noname -i386 _CheckNotSysLevel(ptr) krnl386.exe16._CheckNotSysLevel
+ 95 stdcall -noname -i386 _ConfirmSysLevel(ptr) krnl386.exe16._ConfirmSysLevel
+ 96 stdcall -noname -i386 _ConfirmWin16Lock() krnl386.exe16._ConfirmWin16Lock
+ 97 stdcall -noname -i386 _EnterSysLevel(ptr) krnl386.exe16._EnterSysLevel
+ 98 stdcall -noname -i386 _LeaveSysLevel(ptr) krnl386.exe16._LeaveSysLevel
+ 99 stdcall -i386 @(long) krnl386.exe16._KERNEL32_99
+100 stdcall -i386 @(long long long) krnl386.exe16._KERNEL32_100
+101 stub -i386 @
+102 stub -i386 @
+103 stub -i386 @
+104 stub -i386 @
+105 stub -i386 @
+106 stub -i386 @
+107 stub -i386 @
+108 stub -i386 @
+109 stub -i386 @
+110 stub -i386 @
+111 stub -i386 @
+112 stub -i386 @
+113 stub -i386 @
+114 stub -i386 @
+115 stub -i386 @
+116 stub -i386 @
+117 stub -i386 @
 
-119 stub @
-120 stub @
-121 stub @
-122 stub @
+119 stub -i386 @
+120 stub -i386 @
+121 stub -i386 @
+122 stub -i386 @
 
 # functions exported by name, ordinal doesn't matter
 
@@ -144,7 +144,7 @@
 @ stdcall AddVectoredExceptionHandler(long ptr) ntdll.RtlAddVectoredExceptionHandler
 @ stdcall AllocConsole()
 @ stub -i386 AllocLSCallback
-@ stdcall -i386 AllocSLCallback(ptr ptr)
+@ stdcall -i386 AllocSLCallback(ptr ptr) krnl386.exe16.AllocSLCallback
 @ stub AllocateUserPhysicalPages
 @ stdcall AreFileApisANSI()
 @ stdcall AssignProcessToJobObject(ptr ptr)
@@ -341,23 +341,23 @@
 @ stub ExpungeConsoleCommandHistoryA
 @ stub ExpungeConsoleCommandHistoryW
 @ stub ExtendVirtualBuffer
-@ stdcall -i386 -norelay FT_Exit0()
-@ stdcall -i386 -norelay FT_Exit12()
-@ stdcall -i386 -norelay FT_Exit16()
-@ stdcall -i386 -norelay FT_Exit20()
-@ stdcall -i386 -norelay FT_Exit24()
-@ stdcall -i386 -norelay FT_Exit28()
-@ stdcall -i386 -norelay FT_Exit32()
-@ stdcall -i386 -norelay FT_Exit36()
-@ stdcall -i386 -norelay FT_Exit40()
-@ stdcall -i386 -norelay FT_Exit44()
-@ stdcall -i386 -norelay FT_Exit48()
-@ stdcall -i386 -norelay FT_Exit4()
-@ stdcall -i386 -norelay FT_Exit52()
-@ stdcall -i386 -norelay FT_Exit56()
-@ stdcall -i386 -norelay FT_Exit8()
-@ stdcall -i386 -register FT_Prolog()
-@ stdcall -i386 -register FT_Thunk()
+@ stdcall -i386 -norelay FT_Exit0() krnl386.exe16.FT_Exit0
+@ stdcall -i386 -norelay FT_Exit12() krnl386.exe16.FT_Exit12
+@ stdcall -i386 -norelay FT_Exit16() krnl386.exe16.FT_Exit16
+@ stdcall -i386 -norelay FT_Exit20() krnl386.exe16.FT_Exit20
+@ stdcall -i386 -norelay FT_Exit24() krnl386.exe16.FT_Exit24
+@ stdcall -i386 -norelay FT_Exit28() krnl386.exe16.FT_Exit28
+@ stdcall -i386 -norelay FT_Exit32() krnl386.exe16.FT_Exit32
+@ stdcall -i386 -norelay FT_Exit36() krnl386.exe16.FT_Exit36
+@ stdcall -i386 -norelay FT_Exit40() krnl386.exe16.FT_Exit40
+@ stdcall -i386 -norelay FT_Exit44() krnl386.exe16.FT_Exit44
+@ stdcall -i386 -norelay FT_Exit48() krnl386.exe16.FT_Exit48
+@ stdcall -i386 -norelay FT_Exit4() krnl386.exe16.FT_Exit4
+@ stdcall -i386 -norelay FT_Exit52() krnl386.exe16.FT_Exit52
+@ stdcall -i386 -norelay FT_Exit56() krnl386.exe16.FT_Exit56
+@ stdcall -i386 -norelay FT_Exit8() krnl386.exe16.FT_Exit8
+@ stdcall -i386 -register FT_Prolog() krnl386.exe16.FT_Prolog
+@ stdcall -i386 -register FT_Thunk() krnl386.exe16.FT_Thunk
 @ stdcall FatalAppExitA(long str)
 @ stdcall FatalAppExitW(long wstr)
 @ stdcall FatalExit(long)
@@ -412,15 +412,15 @@
 @ stdcall FreeConsole()
 @ stdcall FreeEnvironmentStringsA(ptr)
 @ stdcall FreeEnvironmentStringsW(ptr)
-@ stub FreeLSCallback
+@ stub -i386 FreeLSCallback
 @ stdcall FreeLibrary(long)
 @ stdcall FreeLibraryAndExitThread(long long)
 @ stdcall FreeResource(long)
-@ stdcall -i386 FreeSLCallback(long)
+@ stdcall -i386 FreeSLCallback(long) krnl386.exe16.FreeSLCallback
 @ stub FreeUserPhysicalPages
 @ stub FreeVirtualBuffer
 @ stdcall GenerateConsoleCtrlEvent(long long)
-@ stdcall -i386 Get16DLLAddress(long str)
+@ stdcall -i386 Get16DLLAddress(long str) krnl386.exe16.Get16DLLAddress
 @ stdcall GetACP()
 @ stdcall GetAtomNameA(long ptr long)
 @ stdcall GetAtomNameW(long ptr long)
@@ -536,8 +536,8 @@
 @ stdcall GetGeoInfoW(long long ptr long long)
 @ stdcall GetHandleContext(long)
 @ stdcall GetHandleInformation(long ptr)
-@ stub GetLSCallbackTarget
-@ stub GetLSCallbackTemplate
+@ stub -i386 GetLSCallbackTarget
+@ stub -i386 GetLSCallbackTemplate
 @ stdcall GetLargestConsoleWindowSize(long)
 @ stdcall GetLastError()
 @ stub GetLinguistLangSize
@@ -608,8 +608,8 @@
 @ stdcall GetProfileStringA(str str str ptr long)
 @ stdcall GetProfileStringW(wstr wstr wstr ptr long)
 @ stdcall GetQueuedCompletionStatus(long ptr ptr ptr long)
-@ stub GetSLCallbackTarget
-@ stub GetSLCallbackTemplate
+@ stub -i386 GetSLCallbackTarget
+@ stub -i386 GetSLCallbackTemplate
 @ stdcall GetShortPathNameA(str ptr long)
 @ stdcall GetShortPathNameW(wstr ptr long)
 @ stdcall GetStartupInfoA(ptr)
@@ -744,18 +744,18 @@
 @ stdcall IsDBCSLeadByte(long)
 @ stdcall IsDBCSLeadByteEx(long long)
 @ stdcall IsDebuggerPresent()
-@ stub IsLSCallback
+@ stub -i386 IsLSCallback
 @ stdcall IsProcessInJob(long long ptr)
 @ stdcall IsProcessorFeaturePresent(long)
-@ stub IsSLCallback
+@ stub -i386 IsSLCallback
 @ stdcall IsSystemResumeAutomatic()
 @ stdcall IsValidCodePage(long)
 @ stdcall IsValidLanguageGroup(long long)
 @ stdcall IsValidLocale(long long)
 # @ stub IsValidUILanguage
 @ stdcall IsWow64Process(ptr ptr)
-@ stdcall -i386 -register K32Thk1632Epilog()
-@ stdcall -i386 -register K32Thk1632Prolog()
+@ stdcall -i386 -register K32Thk1632Epilog() krnl386.exe16.K32Thk1632Epilog
+@ stdcall -i386 -register K32Thk1632Prolog() krnl386.exe16.K32Thk1632Prolog
 @ stdcall LCIDToLocaleName(long ptr long long)
 @ stdcall LCMapStringA(long long str long ptr long)
 @ stdcall LCMapStringW(long long wstr long ptr long)
@@ -793,15 +793,15 @@
 @ stdcall LockFileEx(long long long long long ptr)
 @ stdcall LockResource(long)
 @ stdcall MakeCriticalSectionGlobal(ptr)
-@ stdcall -i386 -norelay MapHInstLS()
-@ stdcall -i386 -norelay MapHInstLS_PN()
-@ stdcall -i386 -norelay MapHInstSL()
-@ stdcall -i386 -norelay MapHInstSL_PN()
-@ stdcall MapHModuleLS(long)
-@ stdcall MapHModuleSL(long)
-@ stdcall MapLS(ptr)
-@ stdcall MapSL(long)
-@ stdcall MapSLFix(long)
+@ stdcall -i386 -norelay MapHInstLS() krnl386.exe16.MapHInstLS
+@ stdcall -i386 -norelay MapHInstLS_PN() krnl386.exe16.MapHInstLS_PN
+@ stdcall -i386 -norelay MapHInstSL() krnl386.exe16.MapHInstSL
+@ stdcall -i386 -norelay MapHInstSL_PN() krnl386.exe16.MapHInstSL_PN
+@ stdcall -i386 MapHModuleLS(long) krnl386.exe16.MapHModuleLS
+@ stdcall -i386 MapHModuleSL(long) krnl386.exe16.MapHModuleSL
+@ stdcall -i386 MapLS(ptr) krnl386.exe16.MapLS
+@ stdcall -i386 MapSL(long) krnl386.exe16.MapSL
+@ stdcall -i386 MapSLFix(long) krnl386.exe16.MapSLFix
 # @ stub MapUserPhysicalPages
 # @ stub MapUserPhysicalPagesScatter
 @ stdcall MapViewOfFile(long long long long long)
@@ -841,7 +841,7 @@
 @ stdcall OpenSemaphoreA(long long str)
 @ stdcall OpenSemaphoreW(long long wstr)
 @ stdcall OpenThread(long long long)
-@ stdcall OpenVxDHandle(long)
+@ stdcall -i386 OpenVxDHandle(long)
 @ stdcall OpenWaitableTimerA(long long str)
 @ stdcall OpenWaitableTimerW(long long wstr)
 @ stdcall OutputDebugStringA(str)
@@ -853,8 +853,8 @@
 @ stdcall PrepareTape(ptr long long)
 @ stub PrivCopyFileExW
 @ stub PrivMoveFileIdentityW
-@ stdcall PrivateFreeLibrary(long)
-@ stdcall PrivateLoadLibrary(str)
+@ stdcall -i386 PrivateFreeLibrary(long) krnl386.exe16.PrivateFreeLibrary
+@ stdcall -i386 PrivateLoadLibrary(str) krnl386.exe16.PrivateLoadLibrary
 @ stdcall Process32First (ptr ptr)
 @ stdcall Process32FirstW (ptr ptr)
 @ stdcall Process32Next (ptr ptr)
@@ -862,7 +862,7 @@
 @ stdcall ProcessIdToSessionId(long ptr)
 @ stdcall PulseEvent(long)
 @ stdcall PurgeComm(long long)
-@ stdcall -i386 -register QT_Thunk()
+@ stdcall -i386 -register QT_Thunk() krnl386.exe16.QT_Thunk
 @ stdcall QueryActCtxW(long ptr ptr long ptr long ptr)
 @ stdcall QueryDepthSList(ptr) ntdll.RtlQueryDepthSList
 @ stdcall QueryDosDeviceA(str ptr long)
@@ -934,26 +934,26 @@
 @ stdcall -arch=x86_64 RtlUnwindEx(long long ptr long ptr) ntdll.RtlUnwindEx
 @ stdcall -arch=x86_64 RtlVirtualUnwind(long long long ptr ptr ptr ptr ptr) ntdll.RtlVirtualUnwind
 @ stdcall RtlZeroMemory(ptr long) ntdll.RtlZeroMemory
-@ stdcall -i386 -norelay SMapLS()
-@ stdcall -i386 -norelay SMapLS_IP_EBP_12()
-@ stdcall -i386 -norelay SMapLS_IP_EBP_16()
-@ stdcall -i386 -norelay SMapLS_IP_EBP_20()
-@ stdcall -i386 -norelay SMapLS_IP_EBP_24()
-@ stdcall -i386 -norelay SMapLS_IP_EBP_28()
-@ stdcall -i386 -norelay SMapLS_IP_EBP_32()
-@ stdcall -i386 -norelay SMapLS_IP_EBP_36()
-@ stdcall -i386 -norelay SMapLS_IP_EBP_40()
-@ stdcall -i386 -norelay SMapLS_IP_EBP_8()
-@ stdcall -i386 -norelay SUnMapLS()
-@ stdcall -i386 -norelay SUnMapLS_IP_EBP_12()
-@ stdcall -i386 -norelay SUnMapLS_IP_EBP_16()
-@ stdcall -i386 -norelay SUnMapLS_IP_EBP_20()
-@ stdcall -i386 -norelay SUnMapLS_IP_EBP_24()
-@ stdcall -i386 -norelay SUnMapLS_IP_EBP_28()
-@ stdcall -i386 -norelay SUnMapLS_IP_EBP_32()
-@ stdcall -i386 -norelay SUnMapLS_IP_EBP_36()
-@ stdcall -i386 -norelay SUnMapLS_IP_EBP_40()
-@ stdcall -i386 -norelay SUnMapLS_IP_EBP_8()
+@ stdcall -i386 -norelay SMapLS() krnl386.exe16.SMapLS
+@ stdcall -i386 -norelay SMapLS_IP_EBP_12() krnl386.exe16.SMapLS_IP_EBP_12
+@ stdcall -i386 -norelay SMapLS_IP_EBP_16() krnl386.exe16.SMapLS_IP_EBP_16
+@ stdcall -i386 -norelay SMapLS_IP_EBP_20() krnl386.exe16.SMapLS_IP_EBP_20
+@ stdcall -i386 -norelay SMapLS_IP_EBP_24() krnl386.exe16.SMapLS_IP_EBP_24
+@ stdcall -i386 -norelay SMapLS_IP_EBP_28() krnl386.exe16.SMapLS_IP_EBP_28
+@ stdcall -i386 -norelay SMapLS_IP_EBP_32() krnl386.exe16.SMapLS_IP_EBP_32
+@ stdcall -i386 -norelay SMapLS_IP_EBP_36() krnl386.exe16.SMapLS_IP_EBP_36
+@ stdcall -i386 -norelay SMapLS_IP_EBP_40() krnl386.exe16.SMapLS_IP_EBP_40
+@ stdcall -i386 -norelay SMapLS_IP_EBP_8() krnl386.exe16.SMapLS_IP_EBP_8
+@ stdcall -i386 -norelay SUnMapLS() krnl386.exe16.SUnMapLS
+@ stdcall -i386 -norelay SUnMapLS_IP_EBP_12() krnl386.exe16.SUnMapLS_IP_EBP_12
+@ stdcall -i386 -norelay SUnMapLS_IP_EBP_16() krnl386.exe16.SUnMapLS_IP_EBP_16
+@ stdcall -i386 -norelay SUnMapLS_IP_EBP_20() krnl386.exe16.SUnMapLS_IP_EBP_20
+@ stdcall -i386 -norelay SUnMapLS_IP_EBP_24() krnl386.exe16.SUnMapLS_IP_EBP_24
+@ stdcall -i386 -norelay SUnMapLS_IP_EBP_28() krnl386.exe16.SUnMapLS_IP_EBP_28
+@ stdcall -i386 -norelay SUnMapLS_IP_EBP_32() krnl386.exe16.SUnMapLS_IP_EBP_32
+@ stdcall -i386 -norelay SUnMapLS_IP_EBP_36() krnl386.exe16.SUnMapLS_IP_EBP_36
+@ stdcall -i386 -norelay SUnMapLS_IP_EBP_40() krnl386.exe16.SUnMapLS_IP_EBP_40
+@ stdcall -i386 -norelay SUnMapLS_IP_EBP_8() krnl386.exe16.SUnMapLS_IP_EBP_8
 @ stdcall ScrollConsoleScreenBufferA(long ptr ptr ptr ptr)
 @ stdcall ScrollConsoleScreenBufferW(long ptr ptr ptr ptr)
 @ stdcall SearchPathA(str str str long ptr ptr)
@@ -1088,7 +1088,7 @@
 @ stdcall TermsrvAppInstallMode()
 @ stdcall Thread32First(long ptr)
 @ stdcall Thread32Next(long ptr)
-@ stdcall -i386 ThunkConnect32(ptr str str str ptr ptr)
+@ stdcall -i386 ThunkConnect32(ptr str str str ptr ptr) krnl386.exe16.ThunkConnect32
 @ stdcall TlsAlloc()
 @ stub TlsAllocInternal
 @ stdcall TlsFree(long)
@@ -1101,10 +1101,10 @@
 @ stub TrimVirtualBuffer
 @ stdcall TryEnterCriticalSection(ptr) ntdll.RtlTryEnterCriticalSection
 @ stdcall TzSpecificLocalTimeToSystemTime(ptr ptr ptr)
-@ stdcall -i386 UTRegister(long str str str ptr ptr ptr)
-@ stdcall -i386 UTUnRegister(long)
-@ stdcall UnMapLS(long)
-@ stdcall -i386 -norelay UnMapSLFixArray(long long)
+@ stdcall -i386 UTRegister(long str str str ptr ptr ptr) krnl386.exe16.UTRegister
+@ stdcall -i386 UTUnRegister(long) krnl386.exe16.UTUnRegister
+@ stdcall -i386 UnMapLS(long) krnl386.exe16.UnMapLS
+@ stdcall -i386 -norelay UnMapSLFixArray(long long) krnl386.exe16.UnMapSLFixArray
 @ stdcall UnhandledExceptionFilter(ptr)
 @ stdcall UninitializeCriticalSection(ptr)
 @ stdcall UnlockFile(long long long long long)
@@ -1210,47 +1210,47 @@
 ################################################################
 # Wine extensions: Win16 functions that are needed by other dlls
 #
-@ stdcall _lclose16(long)
-@ stdcall AllocCStoDSAlias16(long)
-@ stdcall AllocSelectorArray16(long)
-@ stdcall ConvertDialog32To16(ptr long ptr)
-@ stdcall FarGetOwner16(long)
-@ stdcall FarSetOwner16(long long)
-@ stdcall FindResource16(long str str)
-@ stdcall FreeResource16(long)
-@ stdcall FreeSelector16(long)
-@ stdcall GetCurrentPDB16()
-@ stdcall GetCurrentTask()
-@ stdcall GetDOSEnvironment16()
-@ stdcall GetExePtr(long)
-@ stdcall GetExpWinVer16(long)
-@ stdcall GetModuleHandle16(str)
-@ stdcall GetSelectorLimit16(long)
-@ stdcall GlobalDOSAlloc16(long)
-@ stdcall GlobalDOSFree16(long)
-@ stdcall GlobalFlags16(long)
-@ stdcall GlobalReAlloc16(long long long)
-@ stdcall InitTask16(ptr)
-@ stdcall IsBadReadPtr16(long long)
-@ stdcall IsTask16(long)
-@ stdcall LoadModule16(str long)
-@ stdcall LoadResource16(long long)
-@ stdcall LocalAlloc16(long long)
-@ stdcall LocalInit16(long long long)
-@ stdcall LocalLock16(long)
-@ stdcall LocalUnlock16(long)
-@ stdcall LocalReAlloc16(long long long)
-@ stdcall LocalFree16(long)
-@ stdcall LocalSize16(long)
-@ stdcall LocalCompact16(long)
-@ stdcall LocalCountFree16()
-@ stdcall LocalHeapSize16()
-@ stdcall LockResource16(long)
-@ stdcall SelectorAccessRights16(long long long)
-@ stdcall SetSelectorBase(long long)
-@ stdcall SetSelectorLimit16(long long)
-@ stdcall SizeofResource16(long long)
-@ stdcall WinExec16(str long)
+@ stdcall -i386 _lclose16(long) krnl386.exe16._lclose16
+@ stdcall -i386 AllocCStoDSAlias16(long) krnl386.exe16.AllocCStoDSAlias16
+@ stdcall -i386 AllocSelectorArray16(long) krnl386.exe16.AllocSelectorArray16
+@ stdcall -i386 ConvertDialog32To16(ptr long ptr) krnl386.exe16.ConvertDialog32To16
+@ stdcall -i386 FarGetOwner16(long) krnl386.exe16.FarGetOwner16
+@ stdcall -i386 FarSetOwner16(long long) krnl386.exe16.FarSetOwner16
+@ stdcall -i386 FindResource16(long str str) krnl386.exe16.FindResource16
+@ stdcall -i386 FreeResource16(long) krnl386.exe16.FreeResource16
+@ stdcall -i386 FreeSelector16(long) krnl386.exe16.FreeSelector16
+@ stdcall -i386 GetCurrentPDB16() krnl386.exe16.GetCurrentPDB16
+@ stdcall -i386 GetCurrentTask() krnl386.exe16.GetCurrentTask
+@ stdcall -i386 GetDOSEnvironment16() krnl386.exe16.GetDOSEnvironment16
+@ stdcall -i386 GetExePtr(long) krnl386.exe16.GetExePtr
+@ stdcall -i386 GetExpWinVer16(long) krnl386.exe16.GetExpWinVer16
+@ stdcall -i386 GetModuleHandle16(str) krnl386.exe16.GetModuleHandle16
+@ stdcall -i386 GetSelectorLimit16(long) krnl386.exe16.GetSelectorLimit16
+@ stdcall -i386 GlobalDOSAlloc16(long) krnl386.exe16.GlobalDOSAlloc16
+@ stdcall -i386 GlobalDOSFree16(long) krnl386.exe16.GlobalDOSFree16
+@ stdcall -i386 GlobalFlags16(long) krnl386.exe16.GlobalFlags16
+@ stdcall -i386 GlobalReAlloc16(long long long) krnl386.exe16.GlobalReAlloc16
+@ stdcall -i386 InitTask16(ptr) krnl386.exe16.InitTask16
+@ stdcall -i386 IsBadReadPtr16(long long) krnl386.exe16.IsBadReadPtr16
+@ stdcall -i386 IsTask16(long) krnl386.exe16.IsTask16
+@ stdcall -i386 LoadModule16(str long) krnl386.exe16.LoadModule16
+@ stdcall -i386 LoadResource16(long long) krnl386.exe16.LoadResource16
+@ stdcall -i386 LocalAlloc16(long long) krnl386.exe16.LocalAlloc16
+@ stdcall -i386 LocalInit16(long long long) krnl386.exe16.LocalInit16
+@ stdcall -i386 LocalLock16(long) krnl386.exe16.LocalLock16
+@ stdcall -i386 LocalUnlock16(long) krnl386.exe16.LocalUnlock16
+@ stdcall -i386 LocalReAlloc16(long long long) krnl386.exe16.LocalReAlloc16
+@ stdcall -i386 LocalFree16(long) krnl386.exe16.LocalFree16
+@ stdcall -i386 LocalSize16(long) krnl386.exe16.LocalSize16
+@ stdcall -i386 LocalCompact16(long) krnl386.exe16.LocalCompact16
+@ stdcall -i386 LocalCountFree16() krnl386.exe16.LocalCountFree16
+@ stdcall -i386 LocalHeapSize16() krnl386.exe16.LocalHeapSize16
+@ stdcall -i386 LockResource16(long) krnl386.exe16.LockResource16
+@ stdcall -i386 SelectorAccessRights16(long long long) krnl386.exe16.SelectorAccessRights16
+@ stdcall -i386 SetSelectorBase(long long) krnl386.exe16.SetSelectorBase
+@ stdcall -i386 SetSelectorLimit16(long long) krnl386.exe16.SetSelectorLimit16
+@ stdcall -i386 SizeofResource16(long long) krnl386.exe16.SizeofResource16
+@ stdcall -i386 WinExec16(str long) krnl386.exe16.WinExec16
 
 ################################################################
 # Wine internal extensions
@@ -1258,11 +1258,11 @@
 # All functions must be prefixed with '__wine_' (for internal functions)
 # or 'wine_' (for user-visible functions) to avoid namespace conflicts.
 
-# 16-bit relays
+# 16-bit relays (for backwards compatibility)
 @ cdecl -i386 __wine_dll_register_16(ptr str)
 @ cdecl -i386 __wine_dll_unregister_16(ptr)
-@ varargs -i386 -private __wine_call_from_16_regs()
-@ cdecl -i386 __wine_emulate_instruction(ptr ptr)
+@ stub -i386 __wine_call_from_16_regs
+@ cdecl -i386 __wine_emulate_instruction(ptr ptr) krnl386.exe16.__wine_emulate_instruction
 
 # Unix files
 @ cdecl wine_get_unix_file_name(wstr)
diff --git a/dlls/kernel32/kernel_main.c b/dlls/kernel32/kernel_main.c
index f0b0443..28bb97d 100644
--- a/dlls/kernel32/kernel_main.c
+++ b/dlls/kernel32/kernel_main.c
@@ -33,10 +33,8 @@
 #include "winternl.h"
 #include "wownt32.h"
 
-#include "wine/winbase16.h"
 #include "wine/library.h"
 #include "kernel_private.h"
-#include "kernel16_private.h"
 #include "console_private.h"
 #include "wine/debug.h"
 
@@ -47,32 +45,6 @@
 static ULONGLONG server_start_time;
 
 /***********************************************************************
- *           KERNEL thread initialisation routine
- */
-static void thread_attach(void)
-{
-    /* allocate the 16-bit stack (FIXME: should be done lazily) */
-    HGLOBAL16 hstack = WOWGlobalAlloc16( GMEM_FIXED, 0x10000 );
-    kernel_get_thread_data()->stack_sel = GlobalHandleToSel16( hstack );
-    NtCurrentTeb()->WOW32Reserved = (void *)MAKESEGPTR( kernel_get_thread_data()->stack_sel,
-                                                        0x10000 - sizeof(STACK16FRAME) );
-    memset( (char *)GlobalLock16(hstack) + 0x10000 - sizeof(STACK16FRAME), 0, sizeof(STACK16FRAME) );
-}
-
-
-/***********************************************************************
- *           KERNEL thread finalisation routine
- */
-static void thread_detach(void)
-{
-    /* free the 16-bit stack */
-    WOWGlobalFree16( kernel_get_thread_data()->stack_sel );
-    NtCurrentTeb()->WOW32Reserved = 0;
-    if (NtCurrentTeb()->Tib.SubSystemTib) TASK_ExitTask();
-}
-
-
-/***********************************************************************
  *           set_entry_point
  */
 static void set_entry_point( HMODULE module, const char *name, DWORD rva )
@@ -156,8 +128,6 @@
     {
         /* create the shared heap for broken win95 native dlls */
         HeapCreate( HEAP_SHARED, 0, 0 );
-        /* setup emulation of protected instructions from 32-bit code */
-        RtlAddVectoredExceptionHandler( TRUE, INSTR_vectored_handler );
     }
 #endif
 
@@ -176,10 +146,7 @@
      * TBD when not using wineserver handles for console handles
      */
 
-    /* Create 16-bit task */
-    LoadLibrary16( "krnl386.exe" );
-    thread_attach();
-    TASK_CreateMainTask();
+    LoadLibraryA( "krnl386.exe16" );
     return TRUE;
 }
 
@@ -191,13 +158,8 @@
     switch(reason)
     {
     case DLL_PROCESS_ATTACH:
+        DisableThreadLibraryCalls( hinst );
         return process_attach( hinst );
-    case DLL_THREAD_ATTACH:
-        thread_attach();
-        break;
-    case DLL_THREAD_DETACH:
-        thread_detach();
-        break;
     case DLL_PROCESS_DETACH:
         WritePrivateProfileSectionW( NULL, NULL, NULL );
         break;
diff --git a/dlls/kernel32/kernel_private.h b/dlls/kernel32/kernel_private.h
index df753d7..4b295e7 100644
--- a/dlls/kernel32/kernel_private.h
+++ b/dlls/kernel32/kernel_private.h
@@ -85,11 +85,6 @@
 
 extern BOOL NLS_IsUnicodeOnlyLcid(LCID);
 
-/* vxd.c */
-typedef BOOL (WINAPI *DeviceIoProc)(DWORD, LPVOID, DWORD, LPVOID, DWORD, LPDWORD, LPOVERLAPPED);
-extern DeviceIoProc VXD_get_proc( HANDLE handle );
-extern HANDLE VXD_Open( LPCWSTR filename, DWORD access, LPSECURITY_ATTRIBUTES sa );
-
 /* environ.c */
 extern void ENV_CopyStartupInformation(void);
 
diff --git a/dlls/kernel32/module.c b/dlls/kernel32/module.c
index 76e1b0f..aaa5551 100644
--- a/dlls/kernel32/module.c
+++ b/dlls/kernel32/module.c
@@ -1065,3 +1065,28 @@
     RaiseException( EXCEPTION_WINE_STUB, EH_NONCONTINUABLE, 2, args );
     return NULL;
 }
+
+
+#ifdef __i386__
+
+/***********************************************************************
+ *           __wine_dll_register_16 (KERNEL32.@)
+ *
+ * No longer used.
+ */
+void __wine_dll_register_16( const IMAGE_DOS_HEADER *header, const char *file_name )
+{
+    ERR( "loading old style 16-bit dll %s no longer supported\n", file_name );
+}
+
+
+/***********************************************************************
+ *           __wine_dll_unregister_16 (KERNEL32.@)
+ *
+ * No longer used.
+ */
+void __wine_dll_unregister_16( const IMAGE_DOS_HEADER *header )
+{
+}
+
+#endif
diff --git a/dlls/krnl386.exe16/Makefile.in b/dlls/krnl386.exe16/Makefile.in
new file mode 100644
index 0000000..e055628
--- /dev/null
+++ b/dlls/krnl386.exe16/Makefile.in
@@ -0,0 +1,42 @@
+TOPSRCDIR = @top_srcdir@
+TOPOBJDIR = ../..
+SRCDIR    = @srcdir@
+VPATH     = @srcdir@
+MODULE    = krnl386.exe16
+IMPORTS   = kernel32 ntdll
+EXTRADLLFLAGS = -Wb,--subsystem,win16,--dll-name,kernel
+EXTRARCFLAGS  = -O res16
+
+C_SRCS = \
+	atom.c \
+	dosmem.c \
+	error.c \
+	file.c \
+	global.c \
+	instr.c \
+	kernel.c \
+	local.c \
+	ne_module.c \
+	ne_segment.c \
+	registry.c \
+	relay.c \
+	resource.c \
+	selector.c \
+	snoop.c \
+	syslevel.c \
+	task.c \
+	thunk.c \
+	utthunk.c \
+	vxd.c \
+	wowthunk.c
+
+RC_SRCS = version.rc
+
+EXTRA_OBJS = relay16asm.o
+
+@MAKE_DLL_RULES@
+
+relay16asm.o: $(WINEBUILD)
+	$(WINEBUILD) $(WINEBUILDFLAGS) -o $@ --relay16
+
+@DEPENDENCIES@  # everything below this line is overwritten by make depend
diff --git a/dlls/kernel32/atom16.c b/dlls/krnl386.exe16/atom.c
similarity index 100%
rename from dlls/kernel32/atom16.c
rename to dlls/krnl386.exe16/atom.c
diff --git a/dlls/kernel32/dosmem.c b/dlls/krnl386.exe16/dosmem.c
similarity index 100%
rename from dlls/kernel32/dosmem.c
rename to dlls/krnl386.exe16/dosmem.c
diff --git a/dlls/kernel32/error16.c b/dlls/krnl386.exe16/error.c
similarity index 100%
rename from dlls/kernel32/error16.c
rename to dlls/krnl386.exe16/error.c
diff --git a/dlls/kernel32/file16.c b/dlls/krnl386.exe16/file.c
similarity index 100%
rename from dlls/kernel32/file16.c
rename to dlls/krnl386.exe16/file.c
diff --git a/dlls/kernel32/global16.c b/dlls/krnl386.exe16/global.c
similarity index 100%
rename from dlls/kernel32/global16.c
rename to dlls/krnl386.exe16/global.c
diff --git a/dlls/kernel32/instr.c b/dlls/krnl386.exe16/instr.c
similarity index 99%
rename from dlls/kernel32/instr.c
rename to dlls/krnl386.exe16/instr.c
index c3aea2d..8fe4e99 100644
--- a/dlls/kernel32/instr.c
+++ b/dlls/krnl386.exe16/instr.c
@@ -23,8 +23,6 @@
 #include "config.h"
 #include "wine/port.h"
 
-#ifdef __i386__
-
 #include <stdarg.h>
 
 #include "windef.h"
@@ -922,5 +920,3 @@
     FIXME("(DosProc=%p): stub\n", DosProc);
     return NULL;
 }
-
-#endif  /* __i386__ */
diff --git a/dlls/kernel32/kernel16.c b/dlls/krnl386.exe16/kernel.c
similarity index 93%
rename from dlls/kernel32/kernel16.c
rename to dlls/krnl386.exe16/kernel.c
index fabe2d8..b6fbbcb 100644
--- a/dlls/kernel32/kernel16.c
+++ b/dlls/krnl386.exe16/kernel.c
@@ -36,6 +36,53 @@
 
 static DWORD process_dword;
 
+/***********************************************************************
+ *           KERNEL thread initialisation routine
+ */
+static void thread_attach(void)
+{
+    /* allocate the 16-bit stack (FIXME: should be done lazily) */
+    HGLOBAL16 hstack = WOWGlobalAlloc16( GMEM_FIXED, 0x10000 );
+    kernel_get_thread_data()->stack_sel = GlobalHandleToSel16( hstack );
+    NtCurrentTeb()->WOW32Reserved = (void *)MAKESEGPTR( kernel_get_thread_data()->stack_sel,
+                                                        0x10000 - sizeof(STACK16FRAME) );
+    memset( (char *)GlobalLock16(hstack) + 0x10000 - sizeof(STACK16FRAME), 0, sizeof(STACK16FRAME) );
+}
+
+
+/***********************************************************************
+ *           KERNEL thread finalisation routine
+ */
+static void thread_detach(void)
+{
+    /* free the 16-bit stack */
+    WOWGlobalFree16( kernel_get_thread_data()->stack_sel );
+    NtCurrentTeb()->WOW32Reserved = 0;
+    if (NtCurrentTeb()->Tib.SubSystemTib) TASK_ExitTask();
+}
+
+
+/**************************************************************************
+ *		DllMain
+ */
+BOOL WINAPI DllMain( HINSTANCE hinst, DWORD reason, LPVOID reserved )
+{
+    switch(reason)
+    {
+    case DLL_PROCESS_ATTACH:
+        LoadLibrary16( "krnl386.exe" );
+        /* fall through */
+    case DLL_THREAD_ATTACH:
+        thread_attach();
+        break;
+    case DLL_THREAD_DETACH:
+        thread_detach();
+        break;
+    }
+    return TRUE;
+}
+
+
 /**************************************************************************
  *		DllEntryPoint   (KERNEL.669)
  */
@@ -48,6 +95,9 @@
     if (done) return TRUE;
     done = 1;
 
+    /* setup emulation of protected instructions from 32-bit code */
+    if (GetVersion() & 0x80000000) RtlAddVectoredExceptionHandler( TRUE, INSTR_vectored_handler );
+
     /* Initialize 16-bit thunking entry points */
     if (!WOWTHUNK_Init()) return FALSE;
 
@@ -68,6 +118,7 @@
 
     /* Initialize KERNEL.THHOOK */
     TASK_InstallTHHook(MapSL((SEGPTR)GetProcAddress16( inst, (LPCSTR)332 )));
+    TASK_CreateMainTask();
 
     /* Initialize the real-mode selector entry points */
 #define SET_ENTRY_POINT( num, addr ) \
diff --git a/dlls/kernel32/kernel16_private.h b/dlls/krnl386.exe16/kernel16_private.h
similarity index 99%
rename from dlls/kernel32/kernel16_private.h
rename to dlls/krnl386.exe16/kernel16_private.h
index 0509471..4c739a5 100644
--- a/dlls/kernel32/kernel16_private.h
+++ b/dlls/krnl386.exe16/kernel16_private.h
@@ -290,7 +290,6 @@
     return (struct kernel_thread_data *)NtCurrentTeb()->SystemReserved1;
 }
 
-#ifdef __i386__
 #define DEFINE_REGS_ENTRYPOINT( name, args ) \
     __ASM_GLOBAL_FUNC( name, \
                        ".byte 0x68\n\t"  /* pushl $__regs_func */       \
@@ -298,6 +297,5 @@
                        ".byte 0x6a," #args "\n\t" /* pushl $args */     \
                        "call " __ASM_NAME("__wine_call_from_32_regs") "\n\t" \
                        "ret $(4*" #args ")" ) /* fake ret to make copy protections happy */
-#endif
 
 #endif  /* __WINE_KERNEL16_PRIVATE_H */
diff --git a/dlls/kernel32/krnl386.exe.spec b/dlls/krnl386.exe16/krnl386.exe16.spec
similarity index 71%
rename from dlls/kernel32/krnl386.exe.spec
rename to dlls/krnl386.exe16/krnl386.exe16.spec
index 60560c5..8e08ff5 100644
--- a/dlls/kernel32/krnl386.exe.spec
+++ b/dlls/krnl386.exe16/krnl386.exe16.spec
@@ -527,3 +527,207 @@
 # Win95 krnl386.exe also exports ordinals 802-864,
 # however, those seem to be only callback stubs that are
 # never called directly by other modules ...
+
+################################################################
+# 32-bit version of the various 16-bit functions exported by kernel32
+#
+@ stdcall -arch=win32 -register VxDCall0(long) VxDCall
+@ stdcall -arch=win32 -register VxDCall1(long) VxDCall
+@ stdcall -arch=win32 -register VxDCall2(long) VxDCall
+@ stdcall -arch=win32 -register VxDCall3(long) VxDCall
+@ stdcall -arch=win32 -register VxDCall4(long) VxDCall
+@ stdcall -arch=win32 -register VxDCall5(long) VxDCall
+@ stdcall -arch=win32 -register VxDCall6(long) VxDCall
+@ stdcall -arch=win32 -register VxDCall7(long) VxDCall
+@ stdcall -arch=win32 -register VxDCall8(long) VxDCall
+@ stdcall -arch=win32 k32CharToOemA(str ptr)
+@ stdcall -arch=win32 k32CharToOemBuffA(str ptr long)
+@ stdcall -arch=win32 k32OemToCharA(ptr ptr)
+@ stdcall -arch=win32 k32OemToCharBuffA(ptr ptr long)
+@ stdcall -arch=win32 k32LoadStringA(long long ptr long)
+@ varargs -arch=win32 k32wsprintfA(str str)
+@ stdcall -arch=win32 k32wvsprintfA(ptr str ptr)
+@ stdcall -arch=win32 -register CommonUnimpStub()
+@ stdcall -arch=win32 GetProcessDword16(long long)
+@ stdcall -arch=win32 DosFileHandleToWin32Handle(long)
+@ stdcall -arch=win32 Win32HandleToDosFileHandle(long)
+@ stdcall -arch=win32 DisposeLZ32Handle(long)
+@ stdcall -arch=win32 GlobalAlloc16(long long)
+@ stdcall -arch=win32 GlobalLock16(long)
+@ stdcall -arch=win32 GlobalUnlock16(long)
+@ stdcall -arch=win32 GlobalFix16(long)
+@ stdcall -arch=win32 GlobalUnfix16(long)
+@ stdcall -arch=win32 GlobalWire16(long)
+@ stdcall -arch=win32 GlobalUnWire16(long)
+@ stdcall -arch=win32 GlobalFree16(long)
+@ stdcall -arch=win32 GlobalSize16(long)
+@ stdcall -arch=win32 HouseCleanLogicallyDeadHandles()
+@ stdcall -arch=win32 GetWin16DOSEnv()
+@ stdcall -arch=win32 LoadLibrary16(str)
+@ stdcall -arch=win32 FreeLibrary16(long)
+@ stdcall -arch=win32 GetProcAddress16(long str) WIN32_GetProcAddress16
+@ stdcall -arch=win32 -register AllocMappedBuffer()
+@ stdcall -arch=win32 -register FreeMappedBuffer()
+@ stdcall -arch=win32 -register OT_32ThkLSF()
+@ stdcall -arch=win32 ThunkInitLSF(long str long str str)
+@ stdcall -arch=win32 -register LogApiThkLSF(str)
+@ stdcall -arch=win32 ThunkInitLS(long str long str str)
+@ stdcall -arch=win32 -register LogApiThkSL(str)
+@ stdcall -arch=win32 -register Common32ThkLS()
+@ stdcall -arch=win32 ThunkInitSL(long str long str str)
+@ stdcall -arch=win32 -register LogCBThkSL(str)
+@ stdcall -arch=win32 ReleaseThunkLock(ptr)
+@ stdcall -arch=win32 RestoreThunkLock(long)
+@ stdcall -arch=win32 -register W32S_BackTo32()
+@ stdcall -arch=win32 GetThunkBuff()
+@ stdcall -arch=win32 GetThunkStuff(str str)
+@ stdcall -arch=win32 K32WOWCallback16(long long)
+@ stdcall -arch=win32 K32WOWCallback16Ex(ptr long long ptr ptr)
+@ stdcall -arch=win32 K32WOWGetVDMPointer(long long long)
+@ stdcall -arch=win32 K32WOWHandle32(long long)
+@ stdcall -arch=win32 K32WOWHandle16(long long)
+@ stdcall -arch=win32 K32WOWGlobalAlloc16(long long)
+@ stdcall -arch=win32 K32WOWGlobalLock16(long)
+@ stdcall -arch=win32 K32WOWGlobalUnlock16(long)
+@ stdcall -arch=win32 K32WOWGlobalFree16(long)
+@ stdcall -arch=win32 K32WOWGlobalAllocLock16(long long ptr)
+@ stdcall -arch=win32 K32WOWGlobalUnlockFree16(long)
+@ stdcall -arch=win32 K32WOWGlobalLockSize16(long ptr)
+@ stdcall -arch=win32 K32WOWYield16()
+@ stdcall -arch=win32 K32WOWDirectedYield16(long)
+@ stdcall -arch=win32 K32WOWGetVDMPointerFix(long long long)
+@ stdcall -arch=win32 K32WOWGetVDMPointerUnfix(long)
+@ stdcall -arch=win32 K32WOWGetDescriptor(long long)
+@ stdcall -arch=win32 _KERNEL32_86(ptr)
+@ stdcall -arch=win32 SSOnBigStack()
+@ varargs -arch=win32 SSCall(long long ptr)
+@ stdcall -arch=win32 -register FT_PrologPrime()
+@ stdcall -arch=win32 -register QT_ThunkPrime()
+@ stdcall -arch=win32 PK16FNF(ptr)
+@ stdcall -arch=win32 GetPK16SysVar()
+@ stdcall -arch=win32 GetpWin16Lock(ptr)
+@ stdcall -arch=win32 _CheckNotSysLevel(ptr)
+@ stdcall -arch=win32 _ConfirmSysLevel(ptr)
+@ stdcall -arch=win32 _ConfirmWin16Lock()
+@ stdcall -arch=win32 _EnterSysLevel(ptr)
+@ stdcall -arch=win32 _LeaveSysLevel(ptr)
+@ stdcall -arch=win32 _KERNEL32_99(long)
+@ stdcall -arch=win32 _KERNEL32_100(long long long)
+
+@ stdcall -arch=win32 AllocSLCallback(ptr ptr)
+@ stdcall -arch=win32 -norelay FT_Exit0()
+@ stdcall -arch=win32 -norelay FT_Exit12()
+@ stdcall -arch=win32 -norelay FT_Exit16()
+@ stdcall -arch=win32 -norelay FT_Exit20()
+@ stdcall -arch=win32 -norelay FT_Exit24()
+@ stdcall -arch=win32 -norelay FT_Exit28()
+@ stdcall -arch=win32 -norelay FT_Exit32()
+@ stdcall -arch=win32 -norelay FT_Exit36()
+@ stdcall -arch=win32 -norelay FT_Exit40()
+@ stdcall -arch=win32 -norelay FT_Exit44()
+@ stdcall -arch=win32 -norelay FT_Exit48()
+@ stdcall -arch=win32 -norelay FT_Exit4()
+@ stdcall -arch=win32 -norelay FT_Exit52()
+@ stdcall -arch=win32 -norelay FT_Exit56()
+@ stdcall -arch=win32 -norelay FT_Exit8()
+@ stdcall -arch=win32 -register FT_Prolog()
+@ stdcall -arch=win32 -register FT_Thunk()
+@ stdcall -arch=win32 FreeSLCallback(long)
+@ stdcall -arch=win32 Get16DLLAddress(long str)
+@ stdcall -arch=win32 -register K32Thk1632Epilog()
+@ stdcall -arch=win32 -register K32Thk1632Prolog()
+@ stdcall -arch=win32 -norelay MapHInstLS()
+@ stdcall -arch=win32 -norelay MapHInstLS_PN()
+@ stdcall -arch=win32 -norelay MapHInstSL()
+@ stdcall -arch=win32 -norelay MapHInstSL_PN()
+@ stdcall -arch=win32 MapHModuleLS(long)
+@ stdcall -arch=win32 MapHModuleSL(long)
+@ stdcall -arch=win32 MapLS(ptr)
+@ stdcall -arch=win32 MapSL(long)
+@ stdcall -arch=win32 MapSLFix(long)
+@ stdcall -arch=win32 PrivateFreeLibrary(long)
+@ stdcall -arch=win32 PrivateLoadLibrary(str)
+@ stdcall -arch=win32 -register QT_Thunk()
+@ stdcall -arch=win32 -norelay SMapLS()
+@ stdcall -arch=win32 -norelay SMapLS_IP_EBP_12()
+@ stdcall -arch=win32 -norelay SMapLS_IP_EBP_16()
+@ stdcall -arch=win32 -norelay SMapLS_IP_EBP_20()
+@ stdcall -arch=win32 -norelay SMapLS_IP_EBP_24()
+@ stdcall -arch=win32 -norelay SMapLS_IP_EBP_28()
+@ stdcall -arch=win32 -norelay SMapLS_IP_EBP_32()
+@ stdcall -arch=win32 -norelay SMapLS_IP_EBP_36()
+@ stdcall -arch=win32 -norelay SMapLS_IP_EBP_40()
+@ stdcall -arch=win32 -norelay SMapLS_IP_EBP_8()
+@ stdcall -arch=win32 -norelay SUnMapLS()
+@ stdcall -arch=win32 -norelay SUnMapLS_IP_EBP_12()
+@ stdcall -arch=win32 -norelay SUnMapLS_IP_EBP_16()
+@ stdcall -arch=win32 -norelay SUnMapLS_IP_EBP_20()
+@ stdcall -arch=win32 -norelay SUnMapLS_IP_EBP_24()
+@ stdcall -arch=win32 -norelay SUnMapLS_IP_EBP_28()
+@ stdcall -arch=win32 -norelay SUnMapLS_IP_EBP_32()
+@ stdcall -arch=win32 -norelay SUnMapLS_IP_EBP_36()
+@ stdcall -arch=win32 -norelay SUnMapLS_IP_EBP_40()
+@ stdcall -arch=win32 -norelay SUnMapLS_IP_EBP_8()
+@ stdcall -arch=win32 ThunkConnect32(ptr str str str ptr ptr)
+@ stdcall -arch=win32 UTRegister(long str str str ptr ptr ptr)
+@ stdcall -arch=win32 UTUnRegister(long)
+@ stdcall -arch=win32 UnMapLS(long)
+@ stdcall -arch=win32 -norelay UnMapSLFixArray(long long)
+@ stdcall -arch=win32 _lclose16(long)
+
+################################################################
+# 16-bit symbols not available from kernel32 but used by other 16-bit dlls
+#
+@ stdcall -arch=win32 AllocCStoDSAlias16(long)
+@ stdcall -arch=win32 AllocSelectorArray16(long)
+@ stdcall -arch=win32 ConvertDialog32To16(ptr long ptr)
+@ stdcall -arch=win32 FarGetOwner16(long)
+@ stdcall -arch=win32 FarSetOwner16(long long)
+@ stdcall -arch=win32 FindResource16(long str str)
+@ stdcall -arch=win32 FreeResource16(long)
+@ stdcall -arch=win32 FreeSelector16(long)
+@ stdcall -arch=win32 GetCurrentPDB16()
+@ stdcall -arch=win32 GetCurrentTask()
+@ stdcall -arch=win32 GetDOSEnvironment16()
+@ stdcall -arch=win32 GetExePtr(long)
+@ stdcall -arch=win32 GetExpWinVer16(long)
+@ stdcall -arch=win32 GetModuleHandle16(str)
+@ stdcall -arch=win32 GetSelectorLimit16(long)
+@ stdcall -arch=win32 GlobalDOSAlloc16(long)
+@ stdcall -arch=win32 GlobalDOSFree16(long)
+@ stdcall -arch=win32 GlobalFlags16(long)
+@ stdcall -arch=win32 GlobalReAlloc16(long long long)
+@ stdcall -arch=win32 InitTask16(ptr)
+@ stdcall -arch=win32 IsBadReadPtr16(long long)
+@ stdcall -arch=win32 IsTask16(long)
+@ stdcall -arch=win32 LoadModule16(str long)
+@ stdcall -arch=win32 LoadResource16(long long)
+@ stdcall -arch=win32 LocalAlloc16(long long)
+@ stdcall -arch=win32 LocalInit16(long long long)
+@ stdcall -arch=win32 LocalLock16(long)
+@ stdcall -arch=win32 LocalUnlock16(long)
+@ stdcall -arch=win32 LocalReAlloc16(long long long)
+@ stdcall -arch=win32 LocalFree16(long)
+@ stdcall -arch=win32 LocalSize16(long)
+@ stdcall -arch=win32 LocalCompact16(long)
+@ stdcall -arch=win32 LocalCountFree16()
+@ stdcall -arch=win32 LocalHeapSize16()
+@ stdcall -arch=win32 LockResource16(long)
+@ stdcall -arch=win32 SelectorAccessRights16(long long long)
+@ stdcall -arch=win32 SetSelectorBase(long long)
+@ stdcall -arch=win32 SetSelectorLimit16(long long)
+@ stdcall -arch=win32 SizeofResource16(long long)
+@ stdcall -arch=win32 WinExec16(str long)
+
+################################################################
+# Wine internal extensions
+#
+# All functions must be prefixed with '__wine_' (for internal functions)
+# or 'wine_' (for user-visible functions) to avoid namespace conflicts.
+
+# 16-bit relays
+@ cdecl -arch=win32 -private __wine_emulate_instruction(ptr ptr)
+
+# VxDs
+@ cdecl -arch=win32 -private __wine_vxd_open(wstr long ptr)
+@ cdecl -arch=win32 -private __wine_vxd_get_proc(long)
diff --git a/dlls/kernel32/local16.c b/dlls/krnl386.exe16/local.c
similarity index 100%
rename from dlls/kernel32/local16.c
rename to dlls/krnl386.exe16/local.c
diff --git a/dlls/kernel32/ne_module.c b/dlls/krnl386.exe16/ne_module.c
similarity index 99%
rename from dlls/kernel32/ne_module.c
rename to dlls/krnl386.exe16/ne_module.c
index 51e2eb5..82e4576 100644
--- a/dlls/kernel32/ne_module.c
+++ b/dlls/krnl386.exe16/ne_module.c
@@ -90,7 +90,6 @@
 /* patch all the flat cs references of the code segment if necessary */
 static inline void patch_code_segment( NE_MODULE *pModule )
 {
-#ifdef __i386__
     int i;
     CALLFROM16 *call;
     SEGTABLEENTRY *pSeg = NE_SEG_TABLE( pModule );
@@ -112,7 +111,6 @@
 
     if (TRACE_ON(relay))  /* patch relay functions to all point to relay_call_from_16 */
         for (i = 0; call[i].pushl == 0x68; i++) call[i].relay = relay_call_from_16;
-#endif
 }
 
 
@@ -2168,8 +2166,6 @@
     context->Eax = (DWORD)MapHModuleSL( context->Eax );
 }
 
-#ifdef __i386__
-
 /***************************************************************************
  *		MapHInstLS			(KERNEL32.@)
  */
@@ -2205,5 +2201,3 @@
                    "pushl %eax\n\t"
                    "call " __ASM_NAME("MapHModuleSL") __ASM_STDCALL(4) "\n"
                    "1:\tret" )
-
-#endif  /* __i386__ */
diff --git a/dlls/kernel32/ne_segment.c b/dlls/krnl386.exe16/ne_segment.c
similarity index 100%
rename from dlls/kernel32/ne_segment.c
rename to dlls/krnl386.exe16/ne_segment.c
diff --git a/dlls/kernel32/registry16.c b/dlls/krnl386.exe16/registry.c
similarity index 100%
rename from dlls/kernel32/registry16.c
rename to dlls/krnl386.exe16/registry.c
diff --git a/dlls/kernel32/relay16.c b/dlls/krnl386.exe16/relay.c
similarity index 100%
rename from dlls/kernel32/relay16.c
rename to dlls/krnl386.exe16/relay.c
diff --git a/dlls/kernel32/resource16.c b/dlls/krnl386.exe16/resource.c
similarity index 100%
rename from dlls/kernel32/resource16.c
rename to dlls/krnl386.exe16/resource.c
diff --git a/dlls/kernel32/selector.c b/dlls/krnl386.exe16/selector.c
similarity index 99%
rename from dlls/kernel32/selector.c
rename to dlls/krnl386.exe16/selector.c
index 2142720..3d04d6e 100644
--- a/dlls/kernel32/selector.c
+++ b/dlls/krnl386.exe16/selector.c
@@ -89,11 +89,9 @@
 
     wine_ldt_get_entry( sel, &entry );
     if (wine_ldt_is_empty( &entry )) return sel;  /* error */
-#ifdef __i386__
     /* Check if we are freeing current %fs selector */
     if (!((wine_get_fs() ^ sel) & ~3))
         WARN("Freeing %%fs selector (%04x), not good.\n", wine_get_fs() );
-#endif  /* __i386__ */
     wine_ldt_free_entries( sel, 1 );
     return 0;
 }
@@ -523,7 +521,6 @@
     return MapSL(sptr);
 }
 
-#ifdef __i386__
 
 /***********************************************************************
  *           UnMapSLFixArray   (KERNEL32.@)
@@ -618,5 +615,3 @@
 DEFINE_SUnMapLS(32)
 DEFINE_SUnMapLS(36)
 DEFINE_SUnMapLS(40)
-
-#endif  /* __i386__ */
diff --git a/dlls/kernel32/snoop16.c b/dlls/krnl386.exe16/snoop.c
similarity index 96%
rename from dlls/kernel32/snoop16.c
rename to dlls/krnl386.exe16/snoop.c
index c6c3032..42fa8d1 100644
--- a/dlls/kernel32/snoop16.c
+++ b/dlls/krnl386.exe16/snoop.c
@@ -36,8 +36,6 @@
 
 WINE_DEFAULT_DEBUG_CHANNEL(snoop);
 
-#ifdef __i386__
-
 #include "pshpack1.h"
 
 static void WINAPI SNOOP16_Entry(FARPROC proc, LPBYTE args, CONTEXT86 *context);
@@ -343,13 +341,3 @@
                 HIWORD(ret->origreturn),LOWORD(ret->origreturn));
 	ret->origreturn = NULL; /* mark as empty */
 }
-#else	/* !__i386__ */
-void SNOOP16_RegisterDLL(HMODULE16 hModule,LPCSTR name) {
-	if (!TRACE_ON(snoop)) return;
-	FIXME("snooping works only on i386 for now.\n");
-}
-
-FARPROC16 SNOOP16_GetProcAddress16(HMODULE16 hmod,DWORD ordinal,FARPROC16 origfun) {
-	return origfun;
-}
-#endif	/* !__i386__ */
diff --git a/dlls/kernel32/syslevel.c b/dlls/krnl386.exe16/syslevel.c
similarity index 99%
rename from dlls/kernel32/syslevel.c
rename to dlls/krnl386.exe16/syslevel.c
index b37ec7b..88b7ea9 100644
--- a/dlls/kernel32/syslevel.c
+++ b/dlls/krnl386.exe16/syslevel.c
@@ -108,9 +108,7 @@
     TRACE("(%p, level %d): thread %x count after  %d\n",
           lock, lock->level, GetCurrentThreadId(), thread_data->sys_count[lock->level] );
 
-#ifdef __i386__
     if (lock == &Win16Mutex) CallTo16_TebSelector = wine_get_fs();
-#endif
 }
 
 /************************************************************************
diff --git a/dlls/kernel32/task.c b/dlls/krnl386.exe16/task.c
similarity index 100%
rename from dlls/kernel32/task.c
rename to dlls/krnl386.exe16/task.c
diff --git a/dlls/kernel32/thunk.c b/dlls/krnl386.exe16/thunk.c
similarity index 99%
rename from dlls/kernel32/thunk.c
rename to dlls/krnl386.exe16/thunk.c
index fc9c3b4..2f8562c 100644
--- a/dlls/kernel32/thunk.c
+++ b/dlls/krnl386.exe16/thunk.c
@@ -31,8 +31,6 @@
 # include <unistd.h>
 #endif
 
-#ifdef __i386__
-
 #include "windef.h"
 #include "winbase.h"
 #include "winerror.h"
@@ -2538,5 +2536,3 @@
         DPRINTF(") calling address was 0x%08x\n",calladdr);
         return 0;
 }
-
-#endif /* __i386__ */
diff --git a/dlls/kernel32/utthunk.c b/dlls/krnl386.exe16/utthunk.c
similarity index 99%
rename from dlls/kernel32/utthunk.c
rename to dlls/krnl386.exe16/utthunk.c
index d3333a2..a1889fa 100644
--- a/dlls/kernel32/utthunk.c
+++ b/dlls/krnl386.exe16/utthunk.c
@@ -18,8 +18,6 @@
  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
  */
 
-#ifdef __i386__
-
 #include <stdarg.h>
 
 #include "wine/winbase16.h"
@@ -325,5 +323,3 @@
     FIXME("(%08x, %08x, %08x, %08x): stub\n", x1, x2, x3, x4 );
     return 0;
 }
-
-#endif /* __i386__ */
diff --git a/dlls/kernel32/version16.rc b/dlls/krnl386.exe16/version.rc
similarity index 100%
rename from dlls/kernel32/version16.rc
rename to dlls/krnl386.exe16/version.rc
diff --git a/dlls/kernel32/vxd.c b/dlls/krnl386.exe16/vxd.c
similarity index 96%
rename from dlls/kernel32/vxd.c
rename to dlls/krnl386.exe16/vxd.c
index d7b05a8..a420805 100644
--- a/dlls/kernel32/vxd.c
+++ b/dlls/krnl386.exe16/vxd.c
@@ -134,7 +134,7 @@
 }
 
 /* retrieve the DeviceIoControl function for a Vxd given a file handle */
-DeviceIoProc VXD_get_proc( HANDLE handle )
+DeviceIoProc __wine_vxd_get_proc( HANDLE handle )
 {
     DeviceIoProc ret = NULL;
     int status, i;
@@ -171,7 +171,7 @@
 
 
 /* load a VxD and return a file handle to it */
-HANDLE VXD_Open( LPCWSTR filenameW, DWORD access, SECURITY_ATTRIBUTES *sa )
+HANDLE __wine_vxd_open( LPCWSTR filenameW, DWORD access, SECURITY_ATTRIBUTES *sa )
 {
     static const WCHAR dotVxDW[] = {'.','v','x','d',0};
     int i;
@@ -179,12 +179,6 @@
     HMODULE module;
     WCHAR *p, name[16];
 
-    if (!(GetVersion() & 0x80000000))  /* there are no VxDs on NT */
-    {
-        SetLastError( ERROR_FILE_NOT_FOUND );
-        return 0;
-    }
-
     /* normalize the filename */
 
     if (strlenW( filenameW ) >= sizeof(name)/sizeof(WCHAR) - 4 ||
diff --git a/dlls/kernel32/wowthunk.c b/dlls/krnl386.exe16/wowthunk.c
similarity index 98%
rename from dlls/kernel32/wowthunk.c
rename to dlls/krnl386.exe16/wowthunk.c
index 5dbb4ee..6b24373 100644
--- a/dlls/kernel32/wowthunk.c
+++ b/dlls/krnl386.exe16/wowthunk.c
@@ -37,9 +37,6 @@
 #include "wine/debug.h"
 
 WINE_DEFAULT_DEBUG_CHANNEL(thunk);
-
-#ifdef __i386__
-
 WINE_DECLARE_DEBUG_CHANNEL(relay);
 WINE_DECLARE_DEBUG_CHANNEL(snoop);
 
@@ -301,16 +298,6 @@
 }
 
 
-#else  /* __i386__ */
-
-BOOL WOWTHUNK_Init(void)
-{
-    return TRUE;
-}
-
-#endif  /* __i386__ */
-
-
 /*
  *  32-bit WOW routines (in WOW32, but actually forwarded to KERNEL32)
  */
@@ -535,7 +522,6 @@
 BOOL WINAPI K32WOWCallback16Ex( DWORD vpfn16, DWORD dwFlags,
                                 DWORD cbArgs, LPVOID pArgs, LPDWORD pdwRetCode )
 {
-#ifdef __i386__
     /*
      * Arguments must be prepared in the correct order by the caller
      * (both for PASCAL and CDECL calling convention), so we simply
@@ -674,9 +660,6 @@
             SYSLEVEL_CheckNotLevel( 2 );
         }
     }
-#else
-    assert(0);  /* cannot call to 16-bit on non-Intel architectures */
-#endif  /* __i386__ */
 
     return TRUE;  /* success */
 }