Some small bugfixes, added more PE relocation types (for WinCE mostly),
some console prototypes, -dll is useful for winelib too, regtest
compile fixed.

diff --git a/dlls/advapi32/security.c b/dlls/advapi32/security.c
index acce812..6fa62a5 100644
--- a/dlls/advapi32/security.c
+++ b/dlls/advapi32/security.c
@@ -266,7 +266,7 @@
 {
 	FIXME(advapi,"(%08x,%ld,%p,%ld,%p): stub\n",
 	      token,tokeninfoclass,tokeninfo,tokeninfolength,retlen);
-	return TRUE;
+	return FALSE;
 }
 
 /******************************************************************************
diff --git a/documentation/debugging b/documentation/debugging
index 43d7e98..b239b2b 100644
--- a/documentation/debugging
+++ b/documentation/debugging
@@ -136,17 +136,15 @@
   The best, freely available, disassembler for Win16 programs is
   Windows Codeback, archivename wcbxxx.zip, which usually can be found
   in the Cica-Mirror subdirectory on the WINE ftpsites. (See ANNOUNCE).
+
   Disassembling win32 programs is possible using the Windows Disassembler 32,
-  which can be found at http://www.winsite.com/ and mirrors by searching for
-  w32dsm87.zip. This file used to be available under the name w32dasm.zip.
-  The shareware version does not allow saving of disassembly listings.
+  archivename something like w32dsm87.zip (or similar) on ftp.winsite.com
+  and mirrors.  The shareware version does not allow saving of disassembly
+  listings.
+  You can also use the newer (and in the full version better) Interactive
+  Disassembler (IDA) from the ftp sites mentioned at the end of the document.
 
-  [It also has a bug, it disassembles the dll and immediately after that
-   crashes, leaving a very large file caled 'winsys' in the directory of the
-   disassembled file. This file contains nothing of value (just the disassembly)
-   and can be safely deleted.]
-
-  Understanding disassembled code is just a question of exercise.
+  Understanding disassembled code is mostly a question of exercise.
 
   Most code out there uses standard C function entries (for it is usually 
   written in C). Win16 function entries usually look like that:
diff --git a/include/peexe.h b/include/peexe.h
index 8e07683..2a728ee 100644
--- a/include/peexe.h
+++ b/include/peexe.h
@@ -406,13 +406,157 @@
 #define IMAGE_DEBUG_TYPE_OMAP_TO_SRC	7
 #define IMAGE_DEBUG_TYPE_OMAP_FROM_SRC	8
 
-
+/* generic relocation types */
 #define IMAGE_REL_BASED_ABSOLUTE 		0
 #define IMAGE_REL_BASED_HIGH			1
 #define IMAGE_REL_BASED_LOW			2
 #define IMAGE_REL_BASED_HIGHLOW			3
 #define IMAGE_REL_BASED_HIGHADJ			4
 #define IMAGE_REL_BASED_MIPS_JMPADDR		5
+#define IMAGE_REL_BASED_SECTION			6
+#define	IMAGE_REL_BASED_REL32			7
+#define IMAGE_REL_BASED_MIPS_JMPADDR16		9
+#define IMAGE_REL_BASED_IA64_IMM64		9 /* yes, 9 too */
+#define IMAGE_REL_BASED_DIR64			10
+#define IMAGE_REL_BASED_HIGH3ADJ		11
+
+/* I386 relocation types */
+#define	IMAGE_REL_I386_ABSOLUTE			0
+#define	IMAGE_REL_I386_DIR16			1
+#define	IMAGE_REL_I386_REL16			2
+#define	IMAGE_REL_I386_DIR32			6
+#define	IMAGE_REL_I386_DIR32NB			7
+#define	IMAGE_REL_I386_SEG12			9
+#define	IMAGE_REL_I386_SECTION			10
+#define	IMAGE_REL_I386_SECREL			11
+#define	IMAGE_REL_I386_REL32			20
+
+/* MIPS relocation types */
+#define IMAGE_REL_MIPS_ABSOLUTE		0x0000
+#define IMAGE_REL_MIPS_REFHALF		0x0001
+#define IMAGE_REL_MIPS_REFWORD		0x0002
+#define IMAGE_REL_MIPS_JMPADDR		0x0003
+#define IMAGE_REL_MIPS_REFHI		0x0004
+#define IMAGE_REL_MIPS_REFLO		0x0005
+#define IMAGE_REL_MIPS_GPREL		0x0006
+#define IMAGE_REL_MIPS_LITERAL		0x0007
+#define IMAGE_REL_MIPS_SECTION		0x000A
+#define IMAGE_REL_MIPS_SECREL		0x000B
+#define IMAGE_REL_MIPS_SECRELLO		0x000C
+#define IMAGE_REL_MIPS_SECRELHI		0x000D
+#define	IMAGE_REL_MIPS_JMPADDR16	0x0010
+#define IMAGE_REL_MIPS_REFWORDNB	0x0022
+#define IMAGE_REL_MIPS_PAIR		0x0025
+
+/* ALPHA relocation types */
+#define IMAGE_REL_ALPHA_ABSOLUTE	0x0000
+#define IMAGE_REL_ALPHA_REFLONG		0x0001
+#define IMAGE_REL_ALPHA_REFQUAD		0x0002
+#define IMAGE_REL_ALPHA_GPREL32		0x0003
+#define IMAGE_REL_ALPHA_LITERAL		0x0004
+#define IMAGE_REL_ALPHA_LITUSE		0x0005
+#define IMAGE_REL_ALPHA_GPDISP		0x0006
+#define IMAGE_REL_ALPHA_BRADDR		0x0007
+#define IMAGE_REL_ALPHA_HINT		0x0008
+#define IMAGE_REL_ALPHA_INLINE_REFLONG	0x0009
+#define IMAGE_REL_ALPHA_REFHI		0x000A
+#define IMAGE_REL_ALPHA_REFLO		0x000B
+#define IMAGE_REL_ALPHA_PAIR		0x000C
+#define IMAGE_REL_ALPHA_MATCH		0x000D
+#define IMAGE_REL_ALPHA_SECTION		0x000E
+#define IMAGE_REL_ALPHA_SECREL		0x000F
+#define IMAGE_REL_ALPHA_REFLONGNB	0x0010
+#define IMAGE_REL_ALPHA_SECRELLO	0x0011
+#define IMAGE_REL_ALPHA_SECRELHI	0x0012
+#define IMAGE_REL_ALPHA_REFQ3		0x0013
+#define IMAGE_REL_ALPHA_REFQ2		0x0014
+#define IMAGE_REL_ALPHA_REFQ1		0x0015
+#define IMAGE_REL_ALPHA_GPRELLO		0x0016
+#define IMAGE_REL_ALPHA_GPRELHI		0x0017
+
+/* PowerPC relocation types */
+#define IMAGE_REL_PPC_ABSOLUTE          0x0000
+#define IMAGE_REL_PPC_ADDR64            0x0001
+#define IMAGE_REL_PPC_ADDR32            0x0002
+#define IMAGE_REL_PPC_ADDR24            0x0003
+#define IMAGE_REL_PPC_ADDR16            0x0004
+#define IMAGE_REL_PPC_ADDR14            0x0005
+#define IMAGE_REL_PPC_REL24             0x0006
+#define IMAGE_REL_PPC_REL14             0x0007
+#define IMAGE_REL_PPC_TOCREL16          0x0008
+#define IMAGE_REL_PPC_TOCREL14          0x0009
+#define IMAGE_REL_PPC_ADDR32NB          0x000A
+#define IMAGE_REL_PPC_SECREL            0x000B
+#define IMAGE_REL_PPC_SECTION           0x000C
+#define IMAGE_REL_PPC_IFGLUE            0x000D
+#define IMAGE_REL_PPC_IMGLUE            0x000E
+#define IMAGE_REL_PPC_SECREL16          0x000F
+#define IMAGE_REL_PPC_REFHI             0x0010
+#define IMAGE_REL_PPC_REFLO             0x0011
+#define IMAGE_REL_PPC_PAIR              0x0012
+#define IMAGE_REL_PPC_SECRELLO          0x0013
+#define IMAGE_REL_PPC_SECRELHI          0x0014
+#define IMAGE_REL_PPC_GPREL		0x0015
+#define IMAGE_REL_PPC_TYPEMASK          0x00FF
+/* modifier bits */
+#define IMAGE_REL_PPC_NEG               0x0100
+#define IMAGE_REL_PPC_BRTAKEN           0x0200
+#define IMAGE_REL_PPC_BRNTAKEN          0x0400
+#define IMAGE_REL_PPC_TOCDEFN           0x0800
+
+/* SH3 ? relocation type */
+#define IMAGE_REL_SH3_ABSOLUTE          0x0000
+#define IMAGE_REL_SH3_DIRECT16          0x0001
+#define IMAGE_REL_SH3_DIRECT32          0x0002
+#define IMAGE_REL_SH3_DIRECT8           0x0003
+#define IMAGE_REL_SH3_DIRECT8_WORD      0x0004
+#define IMAGE_REL_SH3_DIRECT8_LONG      0x0005
+#define IMAGE_REL_SH3_DIRECT4           0x0006
+#define IMAGE_REL_SH3_DIRECT4_WORD      0x0007
+#define IMAGE_REL_SH3_DIRECT4_LONG      0x0008
+#define IMAGE_REL_SH3_PCREL8_WORD       0x0009
+#define IMAGE_REL_SH3_PCREL8_LONG       0x000A
+#define IMAGE_REL_SH3_PCREL12_WORD      0x000B
+#define IMAGE_REL_SH3_STARTOF_SECTION   0x000C
+#define IMAGE_REL_SH3_SIZEOF_SECTION    0x000D
+#define IMAGE_REL_SH3_SECTION           0x000E
+#define IMAGE_REL_SH3_SECREL            0x000F
+#define IMAGE_REL_SH3_DIRECT32_NB       0x0010
+
+/* ARM (Archimedes?) relocation types */
+#define IMAGE_REL_ARM_ABSOLUTE		0x0000
+#define IMAGE_REL_ARM_ADDR32		0x0001
+#define IMAGE_REL_ARM_ADDR32NB		0x0002
+#define IMAGE_REL_ARM_BRANCH24		0x0003
+#define IMAGE_REL_ARM_BRANCH11		0x0004
+#define IMAGE_REL_ARM_SECTION		0x000E
+#define IMAGE_REL_ARM_SECREL		0x000F
+
+/* IA64 relocation types */
+#define IMAGE_REL_IA64_ABSOLUTE		0x0000
+#define IMAGE_REL_IA64_IMM14		0x0001
+#define IMAGE_REL_IA64_IMM22		0x0002
+#define IMAGE_REL_IA64_IMM64		0x0003
+#define IMAGE_REL_IA64_DIR32		0x0004
+#define IMAGE_REL_IA64_DIR64		0x0005
+#define IMAGE_REL_IA64_PCREL21B		0x0006
+#define IMAGE_REL_IA64_PCREL21M		0x0007
+#define IMAGE_REL_IA64_PCREL21F		0x0008
+#define IMAGE_REL_IA64_GPREL22		0x0009
+#define IMAGE_REL_IA64_LTOFF22		0x000A
+#define IMAGE_REL_IA64_SECTION		0x000B
+#define IMAGE_REL_IA64_SECREL22		0x000C
+#define IMAGE_REL_IA64_SECREL64I	0x000D
+#define IMAGE_REL_IA64_SECREL32		0x000E
+#define IMAGE_REL_IA64_LTOFF64		0x000F
+#define IMAGE_REL_IA64_DIR32NB		0x0010
+#define IMAGE_REL_IA64_RESERVED_11	0x0011
+#define IMAGE_REL_IA64_RESERVED_12	0x0012
+#define IMAGE_REL_IA64_RESERVED_13	0x0013
+#define IMAGE_REL_IA64_RESERVED_14	0x0014
+#define IMAGE_REL_IA64_RESERVED_15	0x0015
+#define IMAGE_REL_IA64_RESERVED_16	0x0016
+#define IMAGE_REL_IA64_ADDEND		0x001F
 
 /*
  * This is the structure that appears at the very start of a .DBG file.
diff --git a/include/wincon.h b/include/wincon.h
index b04d7413..af07b33 100644
--- a/include/wincon.h
+++ b/include/wincon.h
@@ -142,6 +142,30 @@
 BOOL32 WINAPI WriteConsoleOutput32A( HANDLE32 hConsoleOutput, LPCHAR_INFO lpBuffer, COORD dwBufferSize, COORD dwBufferCoord, LPSMALL_RECT lpWriteRegion);
 BOOL32 WINAPI WriteConsoleOutput32W( HANDLE32 hConsoleOutput, LPCHAR_INFO lpBuffer, COORD dwBufferSize, COORD dwBufferCoord, LPSMALL_RECT lpWriteRegion);
 #define WriteConsoleOutput WINELIB_NAME_AW(WriteConsoleOutput)
+BOOL32 WINAPI WriteConsoleInput32A( HANDLE32 handle, INPUT_RECORD *buffer,
+                                    DWORD count, LPDWORD written );
+BOOL32 WINAPI WriteConsoleInput32W( HANDLE32 handle, INPUT_RECORD *buffer,
+                                    DWORD count, LPDWORD written );
+#define WriteConsoleInput WINELIB_NAME_AW(WriteConsoleInput)
+BOOL32 WINAPI PeekConsoleInput32A( HANDLE32 handle, LPINPUT_RECORD buffer,
+                                   DWORD count, LPDWORD read );
+BOOL32 WINAPI PeekConsoleInput32W( HANDLE32 handle, LPINPUT_RECORD buffer,
+                                   DWORD count, LPDWORD read );
+#define PeekConsoleInput WINELIB_NAME_AW(PeekConsoleInput)
+BOOL32 WINAPI ReadConsole32A(	HANDLE32 hConsoleInput, LPVOID lpBuffer,
+				DWORD nNumberOfCharsToRead,
+	  			LPDWORD lpNumberOfCharsRead, LPVOID lpReserved);
+BOOL32 WINAPI ReadConsole32W(	HANDLE32 hConsoleInput, LPVOID lpBuffer,
+				DWORD nNumberOfCharsToRead,
+	  			LPDWORD lpNumberOfCharsRead, LPVOID lpReserved);
+#define ReadConsole WINELIB_NAME_AW(ReadConsole)
+BOOL32 WINAPI ReadConsoleInput32A(HANDLE32 hConsoleInput,
+				  LPINPUT_RECORD lpBuffer, DWORD nLength,
+				  LPDWORD lpNumberOfEventsRead);
+BOOL32 WINAPI ReadConsoleInput32W(HANDLE32 hConsoleInput,
+				  LPINPUT_RECORD lpBuffer, DWORD nLength,
+				  LPDWORD lpNumberOfEventsRead);
+#define ReadConsoleInput WINELIB_NAME_AW(ReadConsoleInput)
 
 #ifdef __WINE__
 extern HANDLE32 CONSOLE_OpenHandle( BOOL32 output, DWORD access, LPSECURITY_ATTRIBUTES sa );
diff --git a/programs/regtest/regtest.c b/programs/regtest/regtest.c
index 09aa2a4..84ebecd 100644
--- a/programs/regtest/regtest.c
+++ b/programs/regtest/regtest.c
@@ -23,7 +23,7 @@
 /* True this when security is implemented */
 #define CHECK_SAM FALSE
 
-#define ERROR(s,d) fprintf(stderr, "%s:#%d(Status=%ld)\n", __FUNCTION__,s,d)
+#define xERROR(s,d) fprintf(stderr, "%s:#%d(Status=%ld)\n", __FUNCTION__,s,d)
 
 /*
  * NOTES: These individual routines are listed in alphabetical order.
@@ -40,14 +40,14 @@
     long lSts;
 
     lSts = RegCloseKey((HKEY)2);
-    if (lSts != ERROR_INVALID_HANDLE) ERROR(1,lSts);
+    if (lSts != ERROR_INVALID_HANDLE) xERROR(1,lSts);
 
     lSts = RegCloseKey(HKEY_LOCAL_MACHINE);
-    if (lSts != ERROR_SUCCESS) ERROR(2,lSts);
+    if (lSts != ERROR_SUCCESS) xERROR(2,lSts);
 
     /* Check twice just for kicks */
     lSts = RegCloseKey(HKEY_LOCAL_MACHINE);
-    if (lSts != ERROR_SUCCESS) ERROR(3,lSts);
+    if (lSts != ERROR_SUCCESS) xERROR(3,lSts);
 }
 
 /******************************************************************************
@@ -59,14 +59,14 @@
     HKEY hkey;
 
     lSts = RegConnectRegistry("",(HKEY)2,&hkey);
-    if (lSts != ERROR_SUCCESS) ERROR(1,lSts);
+    if (lSts != ERROR_SUCCESS) xERROR(1,lSts);
 
     lSts = RegConnectRegistry("",HKEY_LOCAL_MACHINE,&hkey);
-    if (lSts != ERROR_SUCCESS) ERROR(2,lSts);
+    if (lSts != ERROR_SUCCESS) xERROR(2,lSts);
 
 #if TOO_SLOW
     lSts = RegConnectRegistry("\\\\regtest",HKEY_LOCAL_MACHINE,&hkey);
-    if (lSts != ERROR_BAD_NETPATH) ERROR(3,lSts);
+    if (lSts != ERROR_BAD_NETPATH) xERROR(3,lSts);
 #endif
 }
 
@@ -79,22 +79,22 @@
     HKEY hkey;
 
     lSts = RegCreateKey((HKEY)2,"",&hkey);
-    if (lSts != ERROR_BADKEY) ERROR(1,lSts);
+    if (lSts != ERROR_BADKEY) xERROR(1,lSts);
 
     lSts = RegCreateKey(HKEY_LOCAL_MACHINE,"",&hkey);
-    if (lSts != ERROR_SUCCESS) ERROR(2,lSts);
+    if (lSts != ERROR_SUCCESS) xERROR(2,lSts);
     RegCloseKey(hkey);
 
     lSts = RegCreateKey(HKEY_LOCAL_MACHINE,"\\asdf",&hkey);
-    if (lSts != ERROR_BAD_PATHNAME) ERROR(3,lSts);
+    if (lSts != ERROR_BAD_PATHNAME) xERROR(3,lSts);
 
 #if 0
     lSts = RegCreateKey(HKEY_LOCAL_MACHINE,"asdf\\",&hkey);
-    if (lSts != ERROR_INVALID_PARAMETER) ERROR(4,lSts);
+    if (lSts != ERROR_INVALID_PARAMETER) xERROR(4,lSts);
 #endif
 
     lSts = RegCreateKey(HKEY_LOCAL_MACHINE,"\\asdf\\",&hkey);
-    if (lSts != ERROR_BAD_PATHNAME) ERROR(5,lSts);
+    if (lSts != ERROR_BAD_PATHNAME) xERROR(5,lSts);
 }
 
 /******************************************************************************
@@ -107,19 +107,19 @@
     DWORD dwDisp;
 
     lSts = RegCreateKeyEx((HKEY)2,"",0,"",0,0,NULL,&hkey,&dwDisp);
-    if (lSts != ERROR_INVALID_HANDLE) ERROR(1,lSts);
+    if (lSts != ERROR_INVALID_HANDLE) xERROR(1,lSts);
 
     lSts = RegCreateKeyEx(HKEY_LOCAL_MACHINE,"regtest",0,"",0,0,NULL,&hkey,
                           &dwDisp);
-    if (lSts != ERROR_INVALID_PARAMETER) ERROR(2,lSts);
+    if (lSts != ERROR_INVALID_PARAMETER) xERROR(2,lSts);
 
     lSts = RegCreateKeyEx(HKEY_LOCAL_MACHINE,"regtest",0,"asdf",0,
                           KEY_ALL_ACCESS,NULL,&hkey,&dwDisp);
-    if (lSts != ERROR_INVALID_PARAMETER) ERROR(3,lSts);
+    if (lSts != ERROR_INVALID_PARAMETER) xERROR(3,lSts);
 
     lSts = RegCreateKeyEx(HKEY_LOCAL_MACHINE,"regtest",0,"",0,
                           KEY_ALL_ACCESS,NULL,&hkey,&dwDisp);
-    if (lSts != ERROR_INVALID_PARAMETER) ERROR(4,lSts);
+    if (lSts != ERROR_INVALID_PARAMETER) xERROR(4,lSts);
 
 }
 
@@ -131,14 +131,14 @@
     long lSts;
 
     lSts = RegDeleteKey((HKEY)2, "asdf");
-    if (lSts != ERROR_INVALID_HANDLE) ERROR(1,lSts);
+    if (lSts != ERROR_INVALID_HANDLE) xERROR(1,lSts);
 
     lSts = RegDeleteKey(HKEY_CURRENT_USER, "asdf");
-    if (lSts != ERROR_FILE_NOT_FOUND) ERROR(2,lSts);
+    if (lSts != ERROR_FILE_NOT_FOUND) xERROR(2,lSts);
 
 #if CHECK_SAM
     lSts = RegDeleteKey(HKEY_CURRENT_USER, "");
-    if (lSts != ERROR_ACCESS_DENIED) ERROR(3,lSts);
+    if (lSts != ERROR_ACCESS_DENIED) xERROR(3,lSts);
 #endif
 }
 
@@ -150,16 +150,16 @@
     long lSts;
 
     lSts = RegDeleteValue((HKEY)2, "asdf");
-    if (lSts != ERROR_INVALID_HANDLE) ERROR(1,lSts);
+    if (lSts != ERROR_INVALID_HANDLE) xERROR(1,lSts);
 
     lSts = RegDeleteValue(HKEY_CURRENT_USER, "");
-    if (lSts != ERROR_FILE_NOT_FOUND) ERROR(2,lSts);
+    if (lSts != ERROR_FILE_NOT_FOUND) xERROR(2,lSts);
 
     lSts = RegDeleteValue(HKEY_CURRENT_USER, "asdf");
-    if (lSts != ERROR_FILE_NOT_FOUND) ERROR(3,lSts);
+    if (lSts != ERROR_FILE_NOT_FOUND) xERROR(3,lSts);
 
     lSts = RegDeleteValue(HKEY_CURRENT_USER, "\\asdf");
-    if (lSts != ERROR_FILE_NOT_FOUND) ERROR(4,lSts);
+    if (lSts != ERROR_FILE_NOT_FOUND) xERROR(4,lSts);
 }
 
 /******************************************************************************
@@ -175,13 +175,13 @@
     sVal = (char *)malloc(lVal * sizeof(char));
 
     lSts = RegEnumKey((HKEY)2,3,sVal,lVal);
-    if (lSts != ERROR_INVALID_HANDLE) ERROR(1,lSts);
+    if (lSts != ERROR_INVALID_HANDLE) xERROR(1,lSts);
 
     lSts = RegEnumKey(HKEY_CURRENT_USER,-1,sVal,lVal);
-    if (lSts != ERROR_NO_MORE_ITEMS) ERROR(2,lSts);
+    if (lSts != ERROR_NO_MORE_ITEMS) xERROR(2,lSts);
 
     lSts = RegEnumKey(HKEY_CURRENT_USER,0,sVal,lVal);
-    if (lSts != ERROR_MORE_DATA) ERROR(3,lSts);
+    if (lSts != ERROR_MORE_DATA) xERROR(3,lSts);
 }
 
 /******************************************************************************
@@ -202,13 +202,13 @@
     sClass = (char *)malloc(lLen2 * sizeof(char));
 
     lSts = RegEnumKeyEx((HKEY)2,0,sVal,&lLen1,0,sClass,&lLen2,&ft);
-    if (lSts != ERROR_INVALID_HANDLE) ERROR(1,lSts);
+    if (lSts != ERROR_INVALID_HANDLE) xERROR(1,lSts);
 
     lSts = RegEnumKeyEx(HKEY_LOCAL_MACHINE,0,sVal,&lLen1,0,sClass,&lLen2,&ft);
-    if (lSts != ERROR_MORE_DATA) ERROR(2,lSts);
+    if (lSts != ERROR_MORE_DATA) xERROR(2,lSts);
 
     lSts = RegEnumKeyEx(HKEY_LOCAL_MACHINE,0,sVal,&lLen1,0,sClass,&lLen2,&ft);
-    if (lSts != ERROR_MORE_DATA) ERROR(3,lSts);
+    if (lSts != ERROR_MORE_DATA) xERROR(3,lSts);
 }
 
 /******************************************************************************
@@ -229,19 +229,19 @@
     bVal = (char *)malloc(lLen1 * sizeof(char));
 
     lSts = RegEnumValue((HKEY)2,-1,sVal,&lVal,0,&lType,NULL,&lLen1);
-    if (lSts != ERROR_INVALID_HANDLE) ERROR(1,lSts);
+    if (lSts != ERROR_INVALID_HANDLE) xERROR(1,lSts);
 
     lSts = RegEnumValue(HKEY_LOCAL_MACHINE,-1,sVal,&lVal,0,&lType,NULL,&lLen1);
-    if (lSts != ERROR_NO_MORE_ITEMS) ERROR(2,lSts);
+    if (lSts != ERROR_NO_MORE_ITEMS) xERROR(2,lSts);
 
     lSts = RegEnumValue(HKEY_LOCAL_MACHINE,0,sVal,&lVal,0,&lType,NULL,&lLen1);
-    if (lSts != ERROR_SUCCESS) ERROR(3,lSts);
+    if (lSts != ERROR_SUCCESS) xERROR(3,lSts);
 
     lSts = RegEnumValue(HKEY_LOCAL_MACHINE,0,sVal,&lVal,0,NULL,NULL,&lLen1);
-    if (lSts != ERROR_SUCCESS) ERROR(4,lSts);
+    if (lSts != ERROR_SUCCESS) xERROR(4,lSts);
 
     lSts = RegEnumValue(HKEY_LOCAL_MACHINE,1,sVal,&lVal,0,&lType,bVal,&lLen1);
-    if (lSts != ERROR_NO_MORE_ITEMS) ERROR(5,lSts);
+    if (lSts != ERROR_NO_MORE_ITEMS) xERROR(5,lSts);
 }
 
 /******************************************************************************
@@ -252,10 +252,10 @@
     long lSts;
 
     lSts = RegFlushKey((HKEY)2);
-    if (lSts != ERROR_INVALID_HANDLE) ERROR(1,lSts);
+    if (lSts != ERROR_INVALID_HANDLE) xERROR(1,lSts);
 
     lSts = RegFlushKey(HKEY_LOCAL_MACHINE);
-    if (lSts != ERROR_SUCCESS) ERROR(2,lSts);
+    if (lSts != ERROR_SUCCESS) xERROR(2,lSts);
 }
 
 /******************************************************************************
@@ -271,14 +271,14 @@
     lLen = sizeof(sd);
     si = 0;
     lSts = RegGetKeySecurity((HKEY)2,si,&sd,&lLen);
-    if (lSts != ERROR_INVALID_HANDLE) ERROR(1,lSts);
+    if (lSts != ERROR_INVALID_HANDLE) xERROR(1,lSts);
 
     lSts = RegGetKeySecurity(HKEY_LOCAL_MACHINE,si,&sd,&lLen);
-    if (lSts != ERROR_INSUFFICIENT_BUFFER) ERROR(2,lSts);
+    if (lSts != ERROR_INSUFFICIENT_BUFFER) xERROR(2,lSts);
 
     si = GROUP_SECURITY_INFORMATION;
     lSts = RegGetKeySecurity(HKEY_LOCAL_MACHINE,si,&sd,&lLen);
-    if (lSts != ERROR_SUCCESS) ERROR(3,lSts);
+    if (lSts != ERROR_SUCCESS) xERROR(3,lSts);
 }
 
 /******************************************************************************
@@ -289,23 +289,23 @@
     long lSts;
 
     lSts = RegLoadKey((HKEY)2,"","");
-    if (lSts != ERROR_INVALID_PARAMETER) ERROR(1,lSts);
+    if (lSts != ERROR_INVALID_PARAMETER) xERROR(1,lSts);
 
     lSts = RegLoadKey(HKEY_CURRENT_USER,"","");
-    if (lSts != ERROR_INVALID_PARAMETER) ERROR(2,lSts);
+    if (lSts != ERROR_INVALID_PARAMETER) xERROR(2,lSts);
 
     lSts = RegLoadKey(HKEY_CURRENT_USER,"regtest","");
-    if (lSts != ERROR_INVALID_PARAMETER) ERROR(3,lSts);
+    if (lSts != ERROR_INVALID_PARAMETER) xERROR(3,lSts);
 
     lSts = RegLoadKey(HKEY_CURRENT_USER,"\\regtest","");
-    if (lSts != ERROR_INVALID_PARAMETER) ERROR(4,lSts);
+    if (lSts != ERROR_INVALID_PARAMETER) xERROR(4,lSts);
 
 #if CHECK_SAM
     lSts = RegLoadKey(HKEY_CURRENT_USER,"regtest","regtest.dat");
-    if (lSts != ERROR_PRIVILEGE_NOT_HELD) ERROR(5,lSts);
+    if (lSts != ERROR_PRIVILEGE_NOT_HELD) xERROR(5,lSts);
 
     lSts = RegLoadKey(HKEY_CURRENT_USER,"\\regtest","regtest.dat");
-    if (lSts != ERROR_PRIVILEGE_NOT_HELD) ERROR(6,lSts);
+    if (lSts != ERROR_PRIVILEGE_NOT_HELD) xERROR(6,lSts);
 #endif
 }
 
@@ -320,14 +320,14 @@
     hEvent = (HANDLE)0;
 
     lSts = RegNotifyChangeKeyValue((HKEY)2, TRUE, REG_NOTIFY_CHANGE_NAME, 0, 0);
-    if (lSts != ERROR_INVALID_HANDLE) ERROR(1,lSts);
+    if (lSts != ERROR_INVALID_HANDLE) xERROR(1,lSts);
 
     lSts = RegNotifyChangeKeyValue(HKEY_CURRENT_USER, TRUE, REG_NOTIFY_CHANGE_NAME, 0, 1);
-    if (lSts != ERROR_INVALID_PARAMETER) ERROR(2,lSts);
+    if (lSts != ERROR_INVALID_PARAMETER) xERROR(2,lSts);
 
     hEvent = (HANDLE)HKEY_CURRENT_USER;
     lSts = RegNotifyChangeKeyValue(HKEY_CURRENT_USER, TRUE, REG_NOTIFY_CHANGE_NAME, hEvent, 1);
-    if (lSts != ERROR_INVALID_HANDLE) ERROR(3,lSts);
+    if (lSts != ERROR_INVALID_HANDLE) xERROR(3,lSts);
 }
 
 /******************************************************************************
@@ -339,17 +339,17 @@
     HKEY hkey;
 
     lSts = RegOpenKey((HKEY)72, "",&hkey);
-    if (lSts != ERROR_SUCCESS) ERROR(1,lSts);
+    if (lSts != ERROR_SUCCESS) xERROR(1,lSts);
     RegCloseKey(hkey);
 
     lSts = RegOpenKey((HKEY)2, "regtest",&hkey);
-    if (lSts != ERROR_INVALID_HANDLE) ERROR(2,lSts);
+    if (lSts != ERROR_INVALID_HANDLE) xERROR(2,lSts);
 
     lSts = RegOpenKey(HKEY_CURRENT_USER, "regtest",&hkey);
-    if (lSts != ERROR_FILE_NOT_FOUND) ERROR(3,lSts);
+    if (lSts != ERROR_FILE_NOT_FOUND) xERROR(3,lSts);
 
     lSts = RegOpenKey(HKEY_CURRENT_USER, "\\regtest",&hkey);
-    if (lSts != ERROR_BAD_PATHNAME) ERROR(4,lSts);
+    if (lSts != ERROR_BAD_PATHNAME) xERROR(4,lSts);
 }
 
 /******************************************************************************
@@ -361,16 +361,16 @@
     HKEY hkey;
 
     lSts = RegOpenKeyEx((HKEY)2,"",0,KEY_ALL_ACCESS,&hkey);
-    if (lSts != ERROR_INVALID_HANDLE) ERROR(1,lSts);
+    if (lSts != ERROR_INVALID_HANDLE) xERROR(1,lSts);
 
     lSts = RegOpenKeyEx(HKEY_CURRENT_USER,"\\regtest",0,KEY_ALL_ACCESS,&hkey);
-    if (lSts != ERROR_BAD_PATHNAME) ERROR(2,lSts);
+    if (lSts != ERROR_BAD_PATHNAME) xERROR(2,lSts);
 
     lSts = RegOpenKeyEx(HKEY_CURRENT_USER,"regtest",0,0,&hkey);
-    if (lSts != ERROR_FILE_NOT_FOUND) ERROR(3,lSts);
+    if (lSts != ERROR_FILE_NOT_FOUND) xERROR(3,lSts);
 
     lSts = RegOpenKeyEx(HKEY_CURRENT_USER,"regtest\\",0,0,&hkey);
-    if (lSts != ERROR_FILE_NOT_FOUND) ERROR(4,lSts);
+    if (lSts != ERROR_FILE_NOT_FOUND) xERROR(4,lSts);
 }
 
 /******************************************************************************
@@ -396,12 +396,12 @@
     lSts = RegQueryInfoKey((HKEY)2,sClass,&lClass,0,&lSubKeys,&lMaxSubLen,
                            &lMaxClassLen,&lValues,&lMaxValNameLen,&lMaxValLen,
                            &lSecDescLen, &ft);
-    if (lSts != ERROR_INVALID_HANDLE) ERROR(1,lSts);
+    if (lSts != ERROR_INVALID_HANDLE) xERROR(1,lSts);
 
     lSts = RegQueryInfoKey(HKEY_CURRENT_USER,sClass,&lClass,0,&lSubKeys,
                            &lMaxSubLen,&lMaxClassLen,&lValues,&lMaxValNameLen,
                            &lMaxValLen,&lSecDescLen, &ft);
-    if (lSts != ERROR_SUCCESS) ERROR(2,lSts);
+    if (lSts != ERROR_SUCCESS) xERROR(2,lSts);
 }
 
 /******************************************************************************
@@ -417,16 +417,16 @@
     lLen = strlen(sVal);
 
     lSts = RegQueryValue((HKEY)2,"",NULL,&lLen);
-    if (lSts != ERROR_INVALID_HANDLE) ERROR(1,lSts);
+    if (lSts != ERROR_INVALID_HANDLE) xERROR(1,lSts);
 
     lSts = RegQueryValue(HKEY_CURRENT_USER,"",NULL,&lLen);
-    if (lSts != ERROR_SUCCESS) ERROR(2,lSts);
+    if (lSts != ERROR_SUCCESS) xERROR(2,lSts);
 
     lSts = RegQueryValue(HKEY_CURRENT_USER,"\\regtest",NULL,&lLen);
-    if (lSts != ERROR_BAD_PATHNAME) ERROR(3,lSts);
+    if (lSts != ERROR_BAD_PATHNAME) xERROR(3,lSts);
 
     lSts = RegQueryValue(HKEY_CURRENT_USER,"",sVal,&lLen);
-    if (lSts != ERROR_SUCCESS) ERROR(4,lSts);
+    if (lSts != ERROR_SUCCESS) xERROR(4,lSts);
 }
 
 /******************************************************************************
@@ -443,13 +443,13 @@
     sVal = (char *)malloc(lLen * sizeof(char));
 
     lSts = RegQueryValueEx((HKEY)2,"",0,&lType,sVal,&lLen);
-    if (lSts != ERROR_INVALID_HANDLE) ERROR(1,lSts);
+    if (lSts != ERROR_INVALID_HANDLE) xERROR(1,lSts);
 
     lSts = RegQueryValueEx(HKEY_CURRENT_USER,"",(LPDWORD)1,&lType,sVal,&lLen);
-    if (lSts != ERROR_INVALID_PARAMETER) ERROR(2,lSts);
+    if (lSts != ERROR_INVALID_PARAMETER) xERROR(2,lSts);
 
     lSts = RegQueryValueEx(HKEY_LOCAL_MACHINE,"",0,&lType,sVal,&lLen);
-    if (lSts != ERROR_SUCCESS) ERROR(3,lSts);
+    if (lSts != ERROR_SUCCESS) xERROR(3,lSts);
 }
 
 /******************************************************************************
@@ -460,14 +460,14 @@
     long lSts;
 
     lSts = RegReplaceKey((HKEY)2,"","","");
-    if (lSts != ERROR_INVALID_HANDLE) ERROR(1,lSts);
+    if (lSts != ERROR_INVALID_HANDLE) xERROR(1,lSts);
 
 #if CHECK_SAM
     lSts = RegReplaceKey(HKEY_LOCAL_MACHINE,"","","");
-    if (lSts != ERROR_ACCESS_DENIED) ERROR(2,lSts);
+    if (lSts != ERROR_ACCESS_DENIED) xERROR(2,lSts);
 
     lSts = RegReplaceKey(HKEY_LOCAL_MACHINE,"Software","","");
-    if (lSts != ERROR_ACCESS_DENIED) ERROR(3,lSts);
+    if (lSts != ERROR_ACCESS_DENIED) xERROR(3,lSts);
 #endif
 }
 
@@ -479,13 +479,13 @@
     long lSts;
 
     lSts = RegRestoreKey((HKEY)2,"",0);
-    if (lSts != ERROR_INVALID_PARAMETER) ERROR(1,lSts);
+    if (lSts != ERROR_INVALID_PARAMETER) xERROR(1,lSts);
 
     lSts = RegRestoreKey(HKEY_LOCAL_MACHINE,"",0);
-    if (lSts != ERROR_INVALID_PARAMETER) ERROR(2,lSts);
+    if (lSts != ERROR_INVALID_PARAMETER) xERROR(2,lSts);
 
     lSts = RegRestoreKey(HKEY_LOCAL_MACHINE,"a.a",0);
-    if (lSts != ERROR_FILE_NOT_FOUND) ERROR(3,lSts);
+    if (lSts != ERROR_FILE_NOT_FOUND) xERROR(3,lSts);
 }
 
 /******************************************************************************
@@ -496,14 +496,14 @@
     long lSts;
 
     lSts = RegSaveKey((HKEY)2,"",NULL);
-    if (lSts != ERROR_INVALID_PARAMETER) ERROR(1,lSts);
+    if (lSts != ERROR_INVALID_PARAMETER) xERROR(1,lSts);
 
     lSts = RegSaveKey(HKEY_LOCAL_MACHINE,"",NULL);
-    if (lSts != ERROR_INVALID_PARAMETER) ERROR(2,lSts);
+    if (lSts != ERROR_INVALID_PARAMETER) xERROR(2,lSts);
 
 #if CHECK_SAM
     lSts = RegSaveKey(HKEY_LOCAL_MACHINE,"a.a",NULL);
-    if (lSts != ERROR_PRIVILEGE_NOT_HELD) ERROR(3,lSts);
+    if (lSts != ERROR_PRIVILEGE_NOT_HELD) xERROR(3,lSts);
 #endif
 }
 
@@ -516,16 +516,16 @@
     SECURITY_DESCRIPTOR sd;
 
     lSts = RegSetKeySecurity((HKEY)2,0,NULL);
-    if (lSts != ERROR_INVALID_PARAMETER) ERROR(1,lSts);
+    if (lSts != ERROR_INVALID_PARAMETER) xERROR(1,lSts);
 
     lSts = RegSetKeySecurity(HKEY_LOCAL_MACHINE,0,NULL);
-    if (lSts != ERROR_INVALID_PARAMETER) ERROR(2,lSts);
+    if (lSts != ERROR_INVALID_PARAMETER) xERROR(2,lSts);
 
     lSts = RegSetKeySecurity(HKEY_LOCAL_MACHINE,OWNER_SECURITY_INFORMATION,NULL);
-    if (lSts != ERROR_INVALID_PARAMETER) ERROR(3,lSts);
+    if (lSts != ERROR_INVALID_PARAMETER) xERROR(3,lSts);
 
     lSts = RegSetKeySecurity(HKEY_LOCAL_MACHINE,OWNER_SECURITY_INFORMATION,&sd);
-    if (lSts != ERROR_INVALID_PARAMETER) ERROR(4,lSts);
+    if (lSts != ERROR_INVALID_PARAMETER) xERROR(4,lSts);
 }
 
 /******************************************************************************
@@ -539,22 +539,22 @@
 
 #if MAKE_NT_CRASH
     lSts = RegSetValue((HKEY)2,"",0,NULL,0);
-    if (lSts != ERROR_INVALID_PARAMETER) ERROR(1,lSts);
+    if (lSts != ERROR_INVALID_PARAMETER) xERROR(1,lSts);
 #endif
 
 #if MAKE_NT_CRASH
     lSts = RegSetValue((HKEY)2,"regtest",0,NULL,0);
-    if (lSts != ERROR_INVALID_PARAMETER) ERROR(2,lSts);
+    if (lSts != ERROR_INVALID_PARAMETER) xERROR(2,lSts);
 #endif
 
 #if MAKE_NT_CRASH
     lSts = RegSetValue((HKEY)2,"regtest",REG_SZ,NULL,0);
-    if (lSts != ERROR_INVALID_HANDLE) ERROR(3,lSts);
+    if (lSts != ERROR_INVALID_HANDLE) xERROR(3,lSts);
 #endif
 
 #if MAKE_NT_CRASH
     lSts = RegSetValue(HKEY_LOCAL_MACHINE,"regtest",REG_SZ,NULL,0);
-    if (lSts != ERROR_INVALID_HANDLE) ERROR(4,lSts);
+    if (lSts != ERROR_INVALID_HANDLE) xERROR(4,lSts);
 #endif
 }
 
@@ -566,10 +566,10 @@
     long lSts;
 
     lSts = RegSetValueEx((HKEY)2,"",0,0,NULL,0);
-    if (lSts != ERROR_INVALID_HANDLE) ERROR(1,lSts);
+    if (lSts != ERROR_INVALID_HANDLE) xERROR(1,lSts);
 
     lSts = RegSetValueEx(HKEY_LOCAL_MACHINE,"",0,0,NULL,0);
-    if (lSts != ERROR_SUCCESS) ERROR(2,lSts);
+    if (lSts != ERROR_SUCCESS) xERROR(2,lSts);
 }
 
 /******************************************************************************
@@ -583,13 +583,13 @@
 
 #if CHECK_SAM
     lSts = RegUnLoadKey((HKEY)2,"");
-    if (lSts != ERROR_PRIVILEGE_NOT_HELD) ERROR(1,lSts);
+    if (lSts != ERROR_PRIVILEGE_NOT_HELD) xERROR(1,lSts);
 
     lSts = RegUnLoadKey(HKEY_LOCAL_MACHINE,"");
-    if (lSts != ERROR_PRIVILEGE_NOT_HELD) ERROR(2,lSts);
+    if (lSts != ERROR_PRIVILEGE_NOT_HELD) xERROR(2,lSts);
 
     lSts = RegUnLoadKey(HKEY_LOCAL_MACHINE,"\\regtest");
-    if (lSts != ERROR_PRIVILEGE_NOT_HELD) ERROR(3,lSts);
+    if (lSts != ERROR_PRIVILEGE_NOT_HELD) xERROR(3,lSts);
 #endif
 }
 
@@ -602,14 +602,14 @@
     long lSts;
 
     lSts = RegCreateKey(HKEY_CURRENT_USER,"regtest",&hkey);
-    if (lSts != ERROR_SUCCESS) ERROR(1,lSts);
+    if (lSts != ERROR_SUCCESS) xERROR(1,lSts);
 
 /*    fprintf(stderr, " hkey=0x%x\n", hkey); */
 
     lSts = RegDeleteKey(HKEY_CURRENT_USER, "regtest");
-    if (lSts != ERROR_SUCCESS) ERROR(2,lSts);
+    if (lSts != ERROR_SUCCESS) xERROR(2,lSts);
     lSts = RegCloseKey(hkey);
-    if (lSts != ERROR_SUCCESS) ERROR(3,lSts);
+    if (lSts != ERROR_SUCCESS) xERROR(3,lSts);
 }
 
 
diff --git a/relay32/advapi32.spec b/relay32/advapi32.spec
index ef30c1a..0dbe83d 100644
--- a/relay32/advapi32.spec
+++ b/relay32/advapi32.spec
@@ -271,3 +271,5 @@
 0267 stub LsaICLookupSids
 0268 stub SystemFunction031
 0269 stub I_ScSetServiceBitsA
+0270 stub EnumServiceGroupA
+0271 stub EnumServiceGroupW
diff --git a/windows/x11drv/main.c b/windows/x11drv/main.c
index cd60551..60f6eeb 100644
--- a/windows/x11drv/main.c
+++ b/windows/x11drv/main.c
@@ -225,29 +225,16 @@
     }
   
   if (X11DRV_MAIN_GetResource( db, ".dll", &value))
-    {
-      /* Hack: store option value in Options to be retrieved */
-      /* later on inside the emulator code. */
-      if (!__winelib)
-	{
-	  if (Options.dllFlags)
-	    {
-	      /* don't overwrite previous value. Should we
-	       * automatically add the ',' between multiple DLLs ?
-	       */
-	      MSG("Only one -dll flag is allowed. Use ',' between multiple DLLs\n");
-	    }
-	  else
-	    {
-	      Options.dllFlags = xstrdup((char *)value.addr);
-	    }
-	}
-      else
-	{
-	  MSG("-dll not supported in Winelib\n" );
-	  exit(1);
-	}
-    }
+  {
+      if (Options.dllFlags)
+      {
+          /* don't overwrite previous value. Should we
+           * automatically add the ',' between multiple DLLs ?
+           */
+          MSG("Only one -dll flag is allowed. Use ',' between multiple DLLs\n");
+      }
+      else Options.dllFlags = xstrdup((char *)value.addr);
+  }
   
   if (X11DRV_MAIN_GetResource( db, ".winver", &value))
     VERSION_ParseWinVersion( (char*)value.addr );