Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/mono/mono.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDick Porter <dick@acm.org>2001-11-09 19:39:50 +0300
committerDick Porter <dick@acm.org>2001-11-09 19:39:50 +0300
commitf93100c06316b0f435b2d77f48388b0b00bdee29 (patch)
tree0dc8576a3a0e8121bc382935cdd759654dd1aa97
parent9c047b806d22fc7ff71b8536b2c2aec23d9a27c0 (diff)
2001-11-09 Dick Porter <dick@ximian.com>
* configure.in: Try and get large file support, but it's not fatal if it's not there (the io-layer just ignores the high word in that case.) Check for windows builds, and only bother to look for pthreads and large files if we're not building for cygwin or native win32. Not having pthread support on Posix systems is now a fatal error. * autogen.sh: Fix ACLOCAL_FLAGS - it wasn't being passed to aclocal 2001-11-08 Dick Porter <dick@ximian.com> * Initial checkin. This is a library emulating the win32 threading and IO API. 2001-11-09 Dick Porter <dick@ximian.com> * Makefile.am (mint_LDADD): Don't need THREAD_LIBS any more 2001-11-09 Dick Porter <dick@ximian.com> * Makefile.am (testjit_LDADD): Don't need THREAD_LIBS any more 2001-11-09 Dick Porter <dick@ximian.com> * Makefile.am (pedump_LDADD): Don't need THREAD_LIBS any more svn path=/trunk/mono/; revision=1310
-rw-r--r--ChangeLog13
-rw-r--r--acconfig.h3
-rwxr-xr-xautogen.sh4
-rw-r--r--configure.in108
-rw-r--r--mono/Makefile.am2
-rw-r--r--mono/interpreter/ChangeLog4
-rw-r--r--mono/interpreter/Makefile.am1
-rw-r--r--mono/io-layer/ChangeLog7
-rw-r--r--mono/io-layer/Makefile.am71
-rw-r--r--mono/io-layer/error.c30
-rw-r--r--mono/io-layer/error.h1792
-rw-r--r--mono/io-layer/handles-private.h9
-rw-r--r--mono/io-layer/handles.c67
-rw-r--r--mono/io-layer/handles.h10
-rw-r--r--mono/io-layer/io-layer-dummy.c2
-rw-r--r--mono/io-layer/io-layer.h21
-rw-r--r--mono/io-layer/io.c820
-rw-r--r--mono/io-layer/io.h108
-rw-r--r--mono/io-layer/pthread-compat.c50
-rw-r--r--mono/io-layer/pthread-compat.h13
-rw-r--r--mono/io-layer/status.h36
-rw-r--r--mono/io-layer/threads.c483
-rw-r--r--mono/io-layer/threads.h28
-rw-r--r--mono/io-layer/timed-thread.c139
-rw-r--r--mono/io-layer/timed-thread.h31
-rw-r--r--mono/io-layer/uglify.h29
-rw-r--r--mono/io-layer/unicode.c124
-rw-r--r--mono/io-layer/unicode.h10
-rw-r--r--mono/io-layer/wait-private.h32
-rw-r--r--mono/io-layer/wait.c490
-rw-r--r--mono/io-layer/wait.h22
-rw-r--r--mono/io-layer/wapi-private.h60
-rw-r--r--mono/io-layer/wapi.h11
-rw-r--r--mono/jit/ChangeLog4
-rw-r--r--mono/jit/Makefile.am1
-rw-r--r--mono/metadata/ChangeLog4
-rw-r--r--mono/metadata/Makefile.am2
-rw-r--r--mono/metadata/threads-dummy.c2
-rwxr-xr-xstatus/class.xml9
39 files changed, 4630 insertions, 22 deletions
diff --git a/ChangeLog b/ChangeLog
index 743132f7093..d4042baa1e2 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,16 @@
+2001-11-09 Dick Porter <dick@ximian.com>
+
+ * configure.in: Try and get large file support, but it's not fatal
+ if it's not there (the io-layer just ignores the high word in that
+ case.)
+
+ Check for windows builds, and only bother to look for pthreads and
+ large files if we're not building for cygwin or native win32. Not
+ having pthread support on Posix systems is now a fatal error.
+
+ * autogen.sh: Fix ACLOCAL_FLAGS - it wasn't being passed to
+ aclocal
+
2001-10-15 Dietmar Maurer <dietmar@ximian.com>
* mono/tests/Makefile.am: removed JITTESTS, simply run all tests for
diff --git a/acconfig.h b/acconfig.h
index 63e6592083a..52fff9c0017 100644
--- a/acconfig.h
+++ b/acconfig.h
@@ -1,2 +1,5 @@
#undef HAVE_PTHREAD
#undef HAVE_PTHREAD_MUTEX_TIMEDLOCK
+#undef HAVE_LARGE_FILE_SUPPORT
+#undef PLATFORM_WIN32
+#undef PLATFORM_WIN32_NATIVE
diff --git a/autogen.sh b/autogen.sh
index 23b38bb076f..6f5d86a5691 100755
--- a/autogen.sh
+++ b/autogen.sh
@@ -86,8 +86,8 @@ if grep "^AM_PROG_LIBTOOL" configure.in >/dev/null; then
fi
fi
-echo "Running aclocal $aclocalinclude ..."
-aclocal $aclocalinclude || {
+echo "Running aclocal $ACLOCAL_FLAGS ..."
+aclocal $ACLOCAL_FLAGS || {
echo
echo "**Error**: aclocal failed. This may mean that you have not"
echo "installed all of the packages you need, or you may need to"
diff --git a/configure.in b/configure.in
index a50c9ffaba5..2d12e7eb7d6 100644
--- a/configure.in
+++ b/configure.in
@@ -35,19 +35,101 @@ GMODULE_LIBS=`glib-config --libs gmodule`
AC_SUBST(GMODULE_CFLAGS)
AC_SUBST(GMODULE_LIBS)
-dnl *****************************
-dnl *** Checks for libpthread ***
-dnl *****************************
-AC_CHECK_LIB(pthread, pthread_create, [
- THREAD_LIBS=-lpthread
+dnl ****************************************
+dnl *** Check if we're building on win32 ***
+dnl ****************************************
+AC_MSG_CHECKING([if building for some Win32 platform])
+case "$host" in
+ *-*-mingw*|*-*-cygwin*)
+ platform_win32=yes
+ AC_DEFINE(PLATFORM_WIN32)
+ ;;
+ *)
+ platform_win32=no
+ ;;
+esac
+AC_MSG_RESULT($platform_win32)
+AM_CONDITIONAL(PLATFORM_WIN32, test x$platform_win32 = xyes)
+
+if test x$platform_win32 = xyes; then
+ AC_MSG_CHECKING([if building for native Win32])
+ case "$host" in
+ *-*-mingw*)
+ platform_win32_native=yes
+ AC_DEFINE(PLATFORM_WIN32_NATIVE)
+ ;;
+ *)
+ platform_win32_native=no
+ ;;
+ esac
+ AC_MSG_RESULT($platform_win32_native)
+ AM_CONDITIONAL(PLATFORM_WIN32_NATIVE,
+ test x$platform_win32_native = xyes)
+fi
+
+
+if test x$platform_win32 = xno; then
+ dnl ******************************************************************
+ dnl *** Check for large file support ***
+ dnl *** (If we were using autoconf 2.50 we'd use AC_SYS_LARGEFILE) ***
+ dnl ******************************************************************
+
+ # Check that off_t can represent 2**63 - 1 correctly, working around
+ # potential compiler bugs. Defines LARGE_FILE_SUPPORT, adds $1 to
+ # CFLAGS and sets $large_offt to yes if the test succeeds
+ large_offt=no
+ AC_DEFUN(LARGE_FILES, [
+ large_CPPFLAGS=$CPPFLAGS
+ CPPFLAGS="$CPPFLAGS $1"
+ AC_TRY_RUN([
+ #include <sys/types.h>
+
+ #define BIG_OFF_T (((off_t)1<<62)-1+((off_t)1<<62))
+
+ int main(void) {
+ int big_off_t=((BIG_OFF_T%2147483629==721) &&
+ (BIG_OFF_T%2147483647==1));
+ if(big_off_t) {
+ exit(0);
+ } else {
+ exit(1);
+ }
+ }
+ ], [
+ AC_MSG_RESULT(ok)
+ AC_DEFINE(HAVE_LARGE_FILE_SUPPORT)
+ CFLAGS="$CFLAGS $1"
+ large_offt=yes
+ break
+ ], [
+ AC_MSG_RESULT(no)
+ ])
+ CPPFLAGS=$large_CPPFLAGS
+ ])
+
+ AC_MSG_CHECKING(if off_t is 64 bits wide)
+ LARGE_FILES("")
+ if test $large_offt = no; then
+ AC_MSG_CHECKING(if _FILE_OFFSET_BITS=64 gives 64 bit off_t)
+ LARGE_FILES("-D_FILE_OFFSET_BITS=64")
+ fi
+ if test $large_offt = no; then
+ AC_MSG_WARN([No 64 bit file size support available])
+ fi
+
+
+ dnl *****************************
+ dnl *** Checks for libpthread ***
+ dnl *****************************
+ AC_SEARCH_LIBS(pthread_create, pthread, [
AM_CONDITIONAL(THREADS_PTHREAD, true)
AC_DEFINE(HAVE_PTHREAD)
# Need pthread_mutex_timedlock
pthread_CFLAGS=""
orig_CPPFLAGS=$CPPFLAGS
- # This is a gcc-specific error, but we already set gcc-specific
- # options in CFLAGS :)
+ # This is a gcc-specific error, but we already set
+ # gcc-specific options in CFLAGS
CPPFLAGS="$CPPFLAGS -Werror-implicit-function-declaration"
AC_MSG_CHECKING(for pthread_mutex_timedlock)
AC_TRY_COMPILE([ #include <pthread.h>], [
@@ -80,15 +162,10 @@ AC_CHECK_LIB(pthread, pthread_create, [
CPPFLAGS=$orig_CPPFLAGS
CFLAGS="$CFLAGS $pthread_CFLAGS"
], [
- AC_MSG_RESULT([Cannot find libpthread])
- # Check for other thread systems here, set THREAD_LIBS to
- # whatever is needed, and define
- # AM_CONDITIONAL(THREADS_foo, true), and add it to the
- # section in mono/metadata/Makefile.am, AC_DEFINE(HAVE_foo),
- # add that to acconfig.h, add the section for that in
- # mono/metadata/threads.h
+ AC_MSG_ERROR([libpthread is required on non-win32 hosts])
])
-AC_SUBST(THREAD_LIBS)
+fi
+
TARGET="unknown"
ACCESS_UNALIGNED="yes"
@@ -137,6 +214,7 @@ mono/tests/Makefile
mono/wrapper/Makefile
mono/monoburg/Makefile
mono/jit/Makefile
+mono/io-layer/Makefile
runtime/Makefile
doc/Makefile
])
diff --git a/mono/Makefile.am b/mono/Makefile.am
index 553a6685f5d..50227f6916b 100644
--- a/mono/Makefile.am
+++ b/mono/Makefile.am
@@ -1,2 +1,2 @@
-SUBDIRS = monoburg metadata cil dis arch interpreter jit wrapper tests
+SUBDIRS = io-layer monoburg metadata cil dis arch interpreter jit wrapper tests
diff --git a/mono/interpreter/ChangeLog b/mono/interpreter/ChangeLog
index c87b3f82c4e..87a8b7aad2a 100644
--- a/mono/interpreter/ChangeLog
+++ b/mono/interpreter/ChangeLog
@@ -1,3 +1,7 @@
+2001-11-09 Dick Porter <dick@ximian.com>
+
+ * Makefile.am (mint_LDADD): Don't need THREAD_LIBS any more
+
2001-11-07 Miguel de Icaza <miguel@ximian.com>
* interp.c: Include stdlib to kill warning.
diff --git a/mono/interpreter/Makefile.am b/mono/interpreter/Makefile.am
index 8d45d90251b..b1a2df58a93 100644
--- a/mono/interpreter/Makefile.am
+++ b/mono/interpreter/Makefile.am
@@ -15,7 +15,6 @@ mint_LDADD = \
../metadata/libmetadata.a \
$(GLIB_LIBS) \
$(GMODULE_LIBS) \
- $(THREAD_LIBS) \
-lm
man_MANS = mint.1
diff --git a/mono/io-layer/ChangeLog b/mono/io-layer/ChangeLog
new file mode 100644
index 00000000000..d9b79661ee2
--- /dev/null
+++ b/mono/io-layer/ChangeLog
@@ -0,0 +1,7 @@
+2001-11-08 Dick Porter <dick@ximian.com>
+
+ * Initial checkin.
+
+ This is a library emulating the win32 threading and IO API.
+
+
diff --git a/mono/io-layer/Makefile.am b/mono/io-layer/Makefile.am
new file mode 100644
index 00000000000..c6ca5e01742
--- /dev/null
+++ b/mono/io-layer/Makefile.am
@@ -0,0 +1,71 @@
+lib_LIBRARIES = libwapi.a
+
+INCLUDES = \
+ $(GLIB_CFLAGS) \
+ $(GMODULE_CFLAGS) \
+ -I$(top_srcdir) \
+ #
+
+libwapiincludedir = $(includedir)/mono/wapi
+
+OTHER_H = \
+ error.h \
+ handles.h \
+ io.h \
+ io-layer.h \
+ status.h \
+ threads.h \
+ uglify.h \
+ wait.h \
+ wapi.h \
+ #
+
+OTHER_SOURCES = \
+ error.c \
+ error.h \
+ handles.c \
+ handles.h \
+ handles-private.h \
+ io.c \
+ io.h \
+ io-layer.h \
+ pthread-compat.c \
+ pthread-compat.h \
+ status.h \
+ threads.c \
+ threads.h \
+ timed-thread.c \
+ timed-thread.h \
+ uglify.h \
+ unicode.c \
+ unicode.h \
+ wait.c \
+ wait.h \
+ wait-private.h \
+ wapi.h \
+ wapi-private.h \
+ #
+
+WINDOWS_H = \
+ io-layer.h \
+ #
+
+WINDOWS_SOURCES = \
+ io-layer.h \
+ io-layer-dummy.c \
+ #
+
+if PLATFORM_WIN32
+libwapi_a_SOURCES = $(WINDOWS_SOURCES)
+libwapiinclude_HEADERS = $(WINDOWS_H)
+else
+libwapi_a_SOURCES = $(OTHER_SOURCES)
+libwapiinclude_HEADERS = $(OTHER_H)
+endif
+
+EXTRA_DIST = \
+ $(WINDOWS_SOURCES) \
+ $(OTHER_SOURCES) \
+ #
+
+
diff --git a/mono/io-layer/error.c b/mono/io-layer/error.c
new file mode 100644
index 00000000000..7c65ad5c7b1
--- /dev/null
+++ b/mono/io-layer/error.c
@@ -0,0 +1,30 @@
+#include <config.h>
+#include <glib.h>
+#include <pthread.h>
+
+#include "mono/io-layer/wapi.h"
+
+
+/**
+ * GetLastError:
+ *
+ * Retrieves the last error that occurred in the calling thread.
+ *
+ * Return value: The error code for the last error that happened on
+ * the calling thread.
+ */
+guint32 GetLastError(void)
+{
+ return(0);
+}
+
+/**
+ * SetLastError:
+ * @code: The error code.
+ *
+ * Sets the error code in the calling thread.
+ */
+void SetLastError(guint32 code G_GNUC_UNUSED)
+{
+ /* Set the thread-local error code */
+}
diff --git a/mono/io-layer/error.h b/mono/io-layer/error.h
new file mode 100644
index 00000000000..f900a7172a3
--- /dev/null
+++ b/mono/io-layer/error.h
@@ -0,0 +1,1792 @@
+#ifndef _WAPI_ERROR_H_
+#define _WAPI_ERROR_H_
+
+typedef enum {
+ ERROR_SUCCESS = 0,
+ ERROR_INVALID_FUNCTION = 1,
+ ERROR_FILE_NOT_FOUND = 2,
+ ERROR_PATH_NOT_FOUND = 3,
+ ERROR_TOO_MANY_OPEN_FILES = 4,
+ ERROR_ACCESS_DENIED = 5,
+ ERROR_INVALID_HANDLE = 6,
+ ERROR_ARENA_TRASHED = 7,
+ ERROR_NOT_ENOUGH_MEMORY = 8,
+ ERROR_INVALID_BLOCK = 9,
+ ERROR_BAD_ENVIRONMENT = 10,
+ ERROR_BAD_FORMAT = 11,
+ ERROR_INVALID_ACCESS = 12,
+ ERROR_INVALID_DATA = 13,
+ ERROR_OUTOFMEMORY = 14,
+ ERROR_INVALID_DRIVE = 15,
+ ERROR_CURRENT_DIRECTORY = 16,
+ ERROR_NOT_SAME_DEVICE = 17,
+ ERROR_NO_MORE_FILES = 18,
+ ERROR_WRITE_PROTECT = 19,
+ ERROR_BAD_UNIT = 20,
+ ERROR_NOT_READY = 21,
+ ERROR_BAD_COMMAND = 22,
+ ERROR_CRC = 23,
+ ERROR_BAD_LENGTH = 24,
+ ERROR_SEEK = 25,
+ ERROR_NOT_DOS_DISK = 26,
+ ERROR_SECTOR_NOT_FOUND = 27,
+ ERROR_OUT_OF_PAPER = 28,
+ ERROR_WRITE_FAULT = 29,
+ ERROR_READ_FAULT = 30,
+ ERROR_GEN_FAILURE = 31,
+ ERROR_SHARING_VIOLATION = 32,
+ ERROR_LOCK_VIOLATION = 33,
+ ERROR_WRONG_DISK = 34,
+ ERROR_SHARING_BUFFER_EXCEEDED = 36,
+ ERROR_HANDLE_EOF = 38,
+ ERROR_HANDLE_DISK_FULL = 39,
+ ERROR_NOT_SUPPORTED = 50,
+ ERROR_REM_NOT_LIST = 51,
+ ERROR_DUP_NAME = 52,
+ ERROR_BAD_NETPATH = 53,
+ ERROR_NETWORK_BUSY = 54,
+ ERROR_DEV_NOT_EXIST = 55,
+ ERROR_TOO_MANY_CMDS = 56,
+ ERROR_ADAP_HDW_ERR = 57,
+ ERROR_BAD_NET_RESP = 58,
+ ERROR_UNEXP_NET_ERR = 59,
+ ERROR_BAD_REM_ADAP = 60,
+ ERROR_PRINTQ_FULL = 61,
+ ERROR_NO_SPOOL_SPACE = 62,
+ ERROR_PRINT_CANCELLED = 63,
+ ERROR_NETNAME_DELETED = 64,
+ ERROR_NETWORK_ACCESS_DENIED = 65,
+ ERROR_BAD_DEV_TYPE = 66,
+ ERROR_BAD_NET_NAME = 67,
+ ERROR_TOO_MANY_NAMES = 68,
+ ERROR_TOO_MANY_SESS = 69,
+ ERROR_SHARING_PAUSED = 70,
+ ERROR_REQ_NOT_ACCEP = 71,
+ ERROR_REDIR_PAUSED = 72,
+ ERROR_FILE_EXISTS = 80,
+ ERROR_CANNOT_MAKE = 82,
+ ERROR_FAIL_I24 = 83,
+ ERROR_OUT_OF_STRUCTURES = 84,
+ ERROR_ALREADY_ASSIGNED = 85,
+ ERROR_INVALID_PASSWORD = 86,
+ ERROR_INVALID_PARAMETER = 87,
+ ERROR_NET_WRITE_FAULT = 88,
+ ERROR_NO_PROC_SLOTS = 89,
+ ERROR_TOO_MANY_SEMAPHORES = 100,
+ ERROR_EXCL_SEM_ALREADY_OWNED = 101,
+ ERROR_SEM_IS_SET = 102,
+ ERROR_TOO_MANY_SEM_REQUESTS = 103,
+ ERROR_INVALID_AT_INTERRUPT_TIME = 104,
+ ERROR_SEM_OWNER_DIED = 105,
+ ERROR_SEM_USER_LIMIT = 106,
+ ERROR_DISK_CHANGE = 107,
+ ERROR_DRIVE_LOCKED = 108,
+ ERROR_BROKEN_PIPE = 109,
+ ERROR_OPEN_FAILED = 110,
+ ERROR_BUFFER_OVERFLOW = 111,
+ ERROR_DISK_FULL = 112,
+ ERROR_NO_MORE_SEARCH_HANDLES = 113,
+ ERROR_INVALID_TARGET_HANDLE = 114,
+ ERROR_INVALID_CATEGORY = 117,
+ ERROR_INVALID_VERIFY_SWITCH = 118,
+ ERROR_BAD_DRIVER_LEVEL = 119,
+ ERROR_CALL_NOT_IMPLEMENTED = 120,
+ ERROR_SEM_TIMEOUT = 121,
+ ERROR_INSUFFICIENT_BUFFER = 122,
+ ERROR_INVALID_NAME = 123,
+ ERROR_INVALID_LEVEL = 124,
+ ERROR_NO_VOLUME_LABEL = 125,
+ ERROR_MOD_NOT_FOUND = 126,
+ ERROR_PROC_NOT_FOUND = 127,
+ ERROR_WAIT_NO_CHILDREN = 128,
+ ERROR_CHILD_NOT_COMPLETE = 129,
+ ERROR_DIRECT_ACCESS_HANDLE = 130,
+ ERROR_NEGATIVE_SEEK = 131,
+ ERROR_SEEK_ON_DEVICE = 132,
+ ERROR_IS_JOIN_TARGET = 133,
+ ERROR_IS_JOINED = 134,
+ ERROR_IS_SUBSTED = 135,
+ ERROR_NOT_JOINED = 136,
+ ERROR_NOT_SUBSTED = 137,
+ ERROR_JOIN_TO_JOIN = 138,
+ ERROR_SUBST_TO_SUBST = 139,
+ ERROR_JOIN_TO_SUBST = 140,
+ ERROR_SUBST_TO_JOIN = 141,
+ ERROR_BUSY_DRIVE = 142,
+ ERROR_SAME_DRIVE = 143,
+ ERROR_DIR_NOT_ROOT = 144,
+ ERROR_DIR_NOT_EMPTY = 145,
+ ERROR_IS_SUBST_PATH = 146,
+ ERROR_IS_JOIN_PATH = 147,
+ ERROR_PATH_BUSY = 148,
+ ERROR_IS_SUBST_TARGET = 149,
+ ERROR_SYSTEM_TRACE = 150,
+ ERROR_INVALID_EVENT_COUNT = 151,
+ ERROR_TOO_MANY_MUXWAITERS = 152,
+ ERROR_INVALID_LIST_FORMAT = 153,
+ ERROR_LABEL_TOO_LONG = 154,
+ ERROR_TOO_MANY_TCBS = 155,
+ ERROR_SIGNAL_REFUSED = 156,
+ ERROR_DISCARDED = 157,
+ ERROR_NOT_LOCKED = 158,
+ ERROR_BAD_THREADID_ADDR = 159,
+ ERROR_BAD_ARGUMENTS = 160,
+ ERROR_BAD_PATHNAME = 161,
+ ERROR_SIGNAL_PENDING = 162,
+ ERROR_MAX_THRDS_REACHED = 164,
+ ERROR_LOCK_FAILED = 167,
+ ERROR_BUSY = 170,
+ ERROR_CANCEL_VIOLATION = 173,
+ ERROR_ATOMIC_LOCKS_NOT_SUPPORTED = 174,
+ ERROR_INVALID_SEGMENT_NUMBER = 180,
+ ERROR_INVALID_ORDINAL = 182,
+ ERROR_ALREADY_EXISTS = 183,
+ ERROR_INVALID_FLAG_NUMBER = 186,
+ ERROR_SEM_NOT_FOUND = 187,
+ ERROR_INVALID_STARTING_CODESEG = 188,
+ ERROR_INVALID_STACKSEG = 189,
+ ERROR_INVALID_MODULETYPE = 190,
+ ERROR_INVALID_EXE_SIGNATURE = 191,
+ ERROR_EXE_MARKED_INVALID = 192,
+ ERROR_BAD_EXE_FORMAT = 193,
+ ERROR_ITERATED_DATA_EXCEEDS_64k = 194,
+ ERROR_INVALID_MINALLOCSIZE = 195,
+ ERROR_DYNLINK_FROM_INVALID_RING = 196,
+ ERROR_IOPL_NOT_ENABLED = 197,
+ ERROR_INVALID_SEGDPL = 198,
+ ERROR_AUTODATASEG_EXCEEDS_64k = 199,
+ ERROR_RING2SEG_MUST_BE_MOVABLE = 200,
+ ERROR_RELOC_CHAIN_XEEDS_SEGLIM = 201,
+ ERROR_INFLOOP_IN_RELOC_CHAIN = 202,
+ ERROR_ENVVAR_NOT_FOUND = 203,
+ ERROR_NO_SIGNAL_SENT = 205,
+ ERROR_FILENAME_EXCED_RANGE = 206,
+ ERROR_RING2_STACK_IN_USE = 207,
+ ERROR_META_EXPANSION_TOO_LONG = 208,
+ ERROR_INVALID_SIGNAL_NUMBER = 209,
+ ERROR_THREAD_1_INACTIVE = 210,
+ ERROR_LOCKED = 212,
+ ERROR_TOO_MANY_MODULES = 214,
+ ERROR_NESTING_NOT_ALLOWED = 215,
+ ERROR_EXE_MACHINE_TYPE_MISMATCH = 216,
+ ERROR_BAD_PIPE = 230,
+ ERROR_PIPE_BUSY = 231,
+ ERROR_NO_DATA = 232,
+ ERROR_PIPE_NOT_CONNECTED = 233,
+ ERROR_MORE_DATA = 234,
+ ERROR_VC_DISCONNECTED = 240,
+ ERROR_INVALID_EA_NAME = 254,
+ ERROR_EA_LIST_INCONSISTENT = 255,
+ WAIT_TIMEOUT = 258,
+ ERROR_NO_MORE_ITEMS = 259,
+ ERROR_CANNOT_COPY = 266,
+ ERROR_DIRECTORY = 267,
+ ERROR_EAS_DIDNT_FIT = 275,
+ ERROR_EA_FILE_CORRUPT = 276,
+ ERROR_EA_TABLE_FULL = 277,
+ ERROR_INVALID_EA_HANDLE = 278,
+ ERROR_EAS_NOT_SUPPORTED = 282,
+ ERROR_NOT_OWNER = 288,
+ ERROR_TOO_MANY_POSTS = 298,
+ ERROR_PARTIAL_COPY = 299,
+ ERROR_OPLOCK_NOT_GRANTED = 300,
+ ERROR_INVALID_OPLOCK_PROTOCOL = 301,
+ ERROR_DISK_TOO_FRAGMENTED = 302,
+ ERROR_DELETE_PENDING = 303,
+ ERROR_MR_MID_NOT_FOUND = 317,
+ ERROR_INVALID_ADDRESS = 487,
+ ERROR_ARITHMETIC_OVERFLOW = 534,
+ ERROR_PIPE_CONNECTED = 535,
+ ERROR_PIPE_LISTENING = 536,
+ ERROR_EA_ACCESS_DENIED = 994,
+ ERROR_OPERATION_ABORTED = 995,
+ ERROR_IO_INCOMPLETE = 996,
+ ERROR_IO_PENDING = 997,
+ ERROR_NOACCESS = 998,
+ ERROR_SWAPERROR = 999,
+ ERROR_STACK_OVERFLOW = 1001,
+ ERROR_INVALID_MESSAGE = 1002,
+ ERROR_CAN_NOT_COMPLETE = 1003,
+ ERROR_INVALID_FLAGS = 1004,
+ ERROR_UNRECOGNIZED_VOLUME = 1005,
+ ERROR_FILE_INVALID = 1006,
+ ERROR_FULLSCREEN_MODE = 1007,
+ ERROR_NO_TOKEN = 1008,
+ ERROR_BADDB = 1009,
+ ERROR_BADKEY = 1010,
+ ERROR_CANTOPEN = 1011,
+ ERROR_CANTREAD = 1012,
+ ERROR_CANTWRITE = 1013,
+ ERROR_REGISTRY_RECOVERED = 1014,
+ ERROR_REGISTRY_CORRUPT = 1015,
+ ERROR_REGISTRY_IO_FAILED = 1016,
+ ERROR_NOT_REGISTRY_FILE = 1017,
+ ERROR_KEY_DELETED = 1018,
+ ERROR_NO_LOG_SPACE = 1019,
+ ERROR_KEY_HAS_CHILDREN = 1020,
+ ERROR_CHILD_MUST_BE_VOLATILE = 1021,
+ ERROR_NOTIFY_ENUM_DIR = 1022,
+ ERROR_DEPENDENT_SERVICES_RUNNING = 1051,
+ ERROR_INVALID_SERVICE_CONTROL = 1052,
+ ERROR_SERVICE_REQUEST_TIMEOUT = 1053,
+ ERROR_SERVICE_NO_THREAD = 1054,
+ ERROR_SERVICE_DATABASE_LOCKED = 1055,
+ ERROR_SERVICE_ALREADY_RUNNING = 1056,
+ ERROR_INVALID_SERVICE_ACCOUNT = 1057,
+ ERROR_SERVICE_DISABLED = 1058,
+ ERROR_CIRCULAR_DEPENDENCY = 1059,
+ ERROR_SERVICE_DOES_NOT_EXIST = 1060,
+ ERROR_SERVICE_CANNOT_ACCEPT_CTRL = 1061,
+ ERROR_SERVICE_NOT_ACTIVE = 1062,
+ ERROR_FAILED_SERVICE_CONTROLLER_CONNECT = 1063,
+ ERROR_EXCEPTION_IN_SERVICE = 1064,
+ ERROR_DATABASE_DOES_NOT_EXIST = 1065,
+ ERROR_SERVICE_SPECIFIC_ERROR = 1066,
+ ERROR_PROCESS_ABORTED = 1067,
+ ERROR_SERVICE_DEPENDENCY_FAIL = 1068,
+ ERROR_SERVICE_LOGON_FAILED = 1069,
+ ERROR_SERVICE_START_HANG = 1070,
+ ERROR_INVALID_SERVICE_LOCK = 1071,
+ ERROR_SERVICE_MARKED_FOR_DELETE = 1072,
+ ERROR_SERVICE_EXISTS = 1073,
+ ERROR_ALREADY_RUNNING_LKG = 1074,
+ ERROR_SERVICE_DEPENDENCY_DELETED = 1075,
+ ERROR_BOOT_ALREADY_ACCEPTED = 1076,
+ ERROR_SERVICE_NEVER_STARTED = 1077,
+ ERROR_DUPLICATE_SERVICE_NAME = 1078,
+ ERROR_DIFFERENT_SERVICE_ACCOUNT = 1079,
+ ERROR_CANNOT_DETECT_DRIVER_FAILURE = 1080,
+ ERROR_CANNOT_DETECT_PROCESS_ABORT = 1081,
+ ERROR_NO_RECOVERY_PROGRAM = 1082,
+ ERROR_SERVICE_NOT_IN_EXE = 1083,
+ ERROR_NOT_SAFEBOOT_SERVICE = 1084,
+ ERROR_END_OF_MEDIA = 1100,
+ ERROR_FILEMARK_DETECTED = 1101,
+ ERROR_BEGINNING_OF_MEDIA = 1102,
+ ERROR_SETMARK_DETECTED = 1103,
+ ERROR_NO_DATA_DETECTED = 1104,
+ ERROR_PARTITION_FAILURE = 1105,
+ ERROR_INVALID_BLOCK_LENGTH = 1106,
+ ERROR_DEVICE_NOT_PARTITIONED = 1107,
+ ERROR_UNABLE_TO_LOCK_MEDIA = 1108,
+ ERROR_UNABLE_TO_UNLOAD_MEDIA = 1109,
+ ERROR_MEDIA_CHANGED = 1110,
+ ERROR_BUS_RESET = 1111,
+ ERROR_NO_MEDIA_IN_DRIVE = 1112,
+ ERROR_NO_UNICODE_TRANSLATION = 1113,
+ ERROR_DLL_INIT_FAILED = 1114,
+ ERROR_SHUTDOWN_IN_PROGRESS = 1115,
+ ERROR_NO_SHUTDOWN_IN_PROGRESS = 1116,
+ ERROR_IO_DEVICE = 1117,
+ ERROR_SERIAL_NO_DEVICE = 1118,
+ ERROR_IRQ_BUSY = 1119,
+ ERROR_MORE_WRITES = 1120,
+ ERROR_COUNTER_TIMEOUT = 1121,
+ ERROR_FLOPPY_ID_MARK_NOT_FOUND = 1122,
+ ERROR_FLOPPY_WRONG_CYLINDER = 1123,
+ ERROR_FLOPPY_UNKNOWN_ERROR = 1124,
+ ERROR_FLOPPY_BAD_REGISTERS = 1125,
+ ERROR_DISK_RECALIBRATE_FAILED = 1126,
+ ERROR_DISK_OPERATION_FAILED = 1127,
+ ERROR_DISK_RESET_FAILED = 1128,
+ ERROR_EOM_OVERFLOW = 1129,
+ ERROR_NOT_ENOUGH_SERVER_MEMORY = 1130,
+ ERROR_POSSIBLE_DEADLOCK = 1131,
+ ERROR_MAPPED_ALIGNMENT = 1132,
+ ERROR_SET_POWER_STATE_VETOED = 1140,
+ ERROR_SET_POWER_STATE_FAILED = 1141,
+ ERROR_TOO_MANY_LINKS = 1142,
+ ERROR_OLD_WIN_VERSION = 1150,
+ ERROR_APP_WRONG_OS = 1151,
+ ERROR_SINGLE_INSTANCE_APP = 1152,
+ ERROR_RMODE_APP = 1153,
+ ERROR_INVALID_DLL = 1154,
+ ERROR_NO_ASSOCIATION = 1155,
+ ERROR_DDE_FAIL = 1156,
+ ERROR_DLL_NOT_FOUND = 1157,
+ ERROR_NO_MORE_USER_HANDLES = 1158,
+ ERROR_MESSAGE_SYNC_ONLY = 1159,
+ ERROR_SOURCE_ELEMENT_EMPTY = 1160,
+ ERROR_DESTINATION_ELEMENT_FULL = 1161,
+ ERROR_ILLEGAL_ELEMENT_ADDRESS = 1162,
+ ERROR_MAGAZINE_NOT_PRESENT = 1163,
+ ERROR_DEVICE_REINITIALIZATION_NEEDED = 1164,
+ ERROR_DEVICE_REQUIRES_CLEANING = 1165,
+ ERROR_DEVICE_DOOR_OPEN = 1166,
+ ERROR_DEVICE_NOT_CONNECTED = 1167,
+ ERROR_NOT_FOUND = 1168,
+ ERROR_NO_MATCH = 1169,
+ ERROR_SET_NOT_FOUND = 1170,
+ ERROR_POINT_NOT_FOUND = 1171,
+ ERROR_NO_TRACKING_SERVICE = 1172,
+ ERROR_NO_VOLUME_ID = 1173,
+ ERROR_UNABLE_TO_REMOVE_REPLACED = 1175,
+ ERROR_UNABLE_TO_MOVE_REPLACEMENT = 1176,
+ ERROR_UNABLE_TO_MOVE_REPLACEMENT_2 = 1177,
+ ERROR_JOURNAL_DELETE_IN_PROGRESS = 1178,
+ ERROR_JOURNAL_NOT_ACTIVE = 1179,
+ ERROR_POTENTIAL_FILE_FOUND = 1180,
+ ERROR_JOURNAL_ENTRY_DELETED = 1181,
+ ERROR_BAD_DEVICE = 1200,
+ ERROR_CONNECTION_UNAVAIL = 1201,
+ ERROR_DEVICE_ALREADY_REMEMBERED = 1202,
+ ERROR_NO_NET_OR_BAD_PATH = 1203,
+ ERROR_BAD_PROVIDER = 1204,
+ ERROR_CANNOT_OPEN_PROFILE = 1205,
+ ERROR_BAD_PROFILE = 1206,
+ ERROR_NOT_CONTAINER = 1207,
+ ERROR_EXTENDED_ERROR = 1208,
+ ERROR_INVALID_GROUPNAME = 1209,
+ ERROR_INVALID_COMPUTERNAME = 1210,
+ ERROR_INVALID_EVENTNAME = 1211,
+ ERROR_INVALID_DOMAINNAME = 1212,
+ ERROR_INVALID_SERVICENAME = 1213,
+ ERROR_INVALID_NETNAME = 1214,
+ ERROR_INVALID_SHARENAME = 1215,
+ ERROR_INVALID_PASSWORDNAME = 1216,
+ ERROR_INVALID_MESSAGENAME = 1217,
+ ERROR_INVALID_MESSAGEDEST = 1218,
+ ERROR_SESSION_CREDENTIAL_CONFLICT = 1219,
+ ERROR_REMOTE_SESSION_LIMIT_EXCEEDED = 1220,
+ ERROR_DUP_DOMAINNAME = 1221,
+ ERROR_NO_NETWORK = 1222,
+ ERROR_CANCELLED = 1223,
+ ERROR_USER_MAPPED_FILE = 1224,
+ ERROR_CONNECTION_REFUSED = 1225,
+ ERROR_GRACEFUL_DISCONNECT = 1226,
+ ERROR_ADDRESS_ALREADY_ASSOCIATED = 1227,
+ ERROR_ADDRESS_NOT_ASSOCIATED = 1228,
+ ERROR_CONNECTION_INVALID = 1229,
+ ERROR_CONNECTION_ACTIVE = 1230,
+ ERROR_NETWORK_UNREACHABLE = 1231,
+ ERROR_HOST_UNREACHABLE = 1232,
+ ERROR_PROTOCOL_UNREACHABLE = 1233,
+ ERROR_PORT_UNREACHABLE = 1234,
+ ERROR_REQUEST_ABORTED = 1235,
+ ERROR_CONNECTION_ABORTED = 1236,
+ ERROR_RETRY = 1237,
+ ERROR_CONNECTION_COUNT_LIMIT = 1238,
+ ERROR_LOGIN_TIME_RESTRICTION = 1239,
+ ERROR_LOGIN_WKSTA_RESTRICTION = 1240,
+ ERROR_INCORRECT_ADDRESS = 1241,
+ ERROR_ALREADY_REGISTERED = 1242,
+ ERROR_SERVICE_NOT_FOUND = 1243,
+ ERROR_NOT_AUTHENTICATED = 1244,
+ ERROR_NOT_LOGGED_ON = 1245,
+ ERROR_CONTINUE = 1246,
+ ERROR_ALREADY_INITIALIZED = 1247,
+ ERROR_NO_MORE_DEVICES = 1248,
+ ERROR_NO_SUCH_SITE = 1249,
+ ERROR_DOMAIN_CONTROLLER_EXISTS = 1250,
+ ERROR_ONLY_IF_CONNECTED = 1251,
+ ERROR_OVERRIDE_NOCHANGES = 1252,
+ ERROR_BAD_USER_PROFILE = 1253,
+ ERROR_NOT_SUPPORTED_ON_SBS = 1254,
+ ERROR_SERVER_SHUTDOWN_IN_PROGRESS = 1255,
+ ERROR_HOST_DOWN = 1256,
+ ERROR_NON_ACCOUNT_SID = 1257,
+ ERROR_NON_DOMAIN_SID = 1258,
+ ERROR_APPHELP_BLOCK = 1259,
+ ERROR_ACCESS_DISABLED_BY_POLICY = 1260,
+ ERROR_REG_NAT_CONSUMPTION = 1261,
+ ERROR_CSCSHARE_OFFLINE = 1262,
+ ERROR_PKINIT_FAILURE = 1263,
+ ERROR_SMARTCARD_SUBSYSTEM_FAILURE = 1264,
+ ERROR_DOWNGRADE_DETECTED = 1265,
+ SEC_E_SMARTCARD_CERT_REVOKED = 1266,
+ SEC_E_ISSUING_CA_UNTRUSTED = 1267,
+ SEC_E_REVOCATION_OFFLINE_C = 1268,
+ SEC_E_PKINIT_CLIENT_FAILUR = 1269,
+ SEC_E_SMARTCARD_CERT_EXPIRED = 1270,
+ ERROR_MACHINE_LOCKED = 1271,
+ ERROR_CALLBACK_SUPPLIED_INVALID_DATA = 1273,
+ ERROR_SYNC_FOREGROUND_REFRESH_REQUIRED = 1274,
+ ERROR_DRIVER_BLOCKED = 1275,
+ ERROR_INVALID_IMPORT_OF_NON_DLL = 1276,
+ ERROR_NOT_ALL_ASSIGNED = 1300,
+ ERROR_SOME_NOT_MAPPED = 1301,
+ ERROR_NO_QUOTAS_FOR_ACCOUNT = 1302,
+ ERROR_LOCAL_USER_SESSION_KEY = 1303,
+ ERROR_NULL_LM_PASSWORD = 1304,
+ ERROR_UNKNOWN_REVISION = 1305,
+ ERROR_REVISION_MISMATCH = 1306,
+ ERROR_INVALID_OWNER = 1307,
+ ERROR_INVALID_PRIMARY_GROUP = 1308,
+ ERROR_NO_IMPERSONATION_TOKEN = 1309,
+ ERROR_CANT_DISABLE_MANDATORY = 1310,
+ ERROR_NO_LOGON_SERVERS = 1311,
+ ERROR_NO_SUCH_LOGON_SESSION = 1312,
+ ERROR_NO_SUCH_PRIVILEGE = 1313,
+ ERROR_PRIVILEGE_NOT_HELD = 1314,
+ ERROR_INVALID_ACCOUNT_NAME = 1315,
+ ERROR_USER_EXISTS = 1316,
+ ERROR_NO_SUCH_USER = 1317,
+ ERROR_GROUP_EXISTS = 1318,
+ ERROR_NO_SUCH_GROUP = 1319,
+ ERROR_MEMBER_IN_GROUP = 1320,
+ ERROR_MEMBER_NOT_IN_GROUP = 1321,
+ ERROR_LAST_ADMIN = 1322,
+ ERROR_WRONG_PASSWORD = 1323,
+ ERROR_ILL_FORMED_PASSWORD = 1324,
+ ERROR_PASSWORD_RESTRICTION = 1325,
+ ERROR_LOGON_FAILURE = 1326,
+ ERROR_ACCOUNT_RESTRICTION = 1327,
+ ERROR_INVALID_LOGON_HOURS = 1328,
+ ERROR_INVALID_WORKSTATION = 1329,
+ ERROR_PASSWORD_EXPIRED = 1330,
+ ERROR_ACCOUNT_DISABLED = 1331,
+ ERROR_NONE_MAPPED = 1332,
+ ERROR_TOO_MANY_LUIDS_REQUESTED = 1333,
+ ERROR_LUIDS_EXHAUSTED = 1334,
+ ERROR_INVALID_SUB_AUTHORITY = 1335,
+ ERROR_INVALID_ACL = 1336,
+ ERROR_INVALID_SID = 1337,
+ ERROR_INVALID_SECURITY_DESCR = 1338,
+ ERROR_BAD_INHERITANCE_ACL = 1340,
+ ERROR_SERVER_DISABLED = 1341,
+ ERROR_SERVER_NOT_DISABLED = 1342,
+ ERROR_INVALID_ID_AUTHORITY = 1343,
+ ERROR_ALLOTTED_SPACE_EXCEEDED = 1344,
+ ERROR_INVALID_GROUP_ATTRIBUTES = 1345,
+ ERROR_BAD_IMPERSONATION_LEVEL = 1346,
+ ERROR_CANT_OPEN_ANONYMOUS = 1347,
+ ERROR_BAD_VALIDATION_CLASS = 1348,
+ ERROR_BAD_TOKEN_TYPE = 1349,
+ ERROR_NO_SECURITY_ON_OBJECT = 1350,
+ ERROR_CANT_ACCESS_DOMAIN_INFO = 1351,
+ ERROR_INVALID_SERVER_STATE = 1352,
+ ERROR_INVALID_DOMAIN_STATE = 1353,
+ ERROR_INVALID_DOMAIN_ROLE = 1354,
+ ERROR_NO_SUCH_DOMAIN = 1355,
+ ERROR_DOMAIN_EXISTS = 1356,
+ ERROR_DOMAIN_LIMIT_EXCEEDED = 1357,
+ ERROR_INTERNAL_DB_CORRUPTION = 1358,
+ ERROR_INTERNAL_ERROR = 1359,
+ ERROR_GENERIC_NOT_MAPPED = 1360,
+ ERROR_BAD_DESCRIPTOR_FORMAT = 1361,
+ ERROR_NOT_LOGON_PROCESS = 1362,
+ ERROR_LOGON_SESSION_EXISTS = 1363,
+ ERROR_NO_SUCH_PACKAGE = 1364,
+ ERROR_BAD_LOGON_SESSION_STATE = 1365,
+ ERROR_LOGON_SESSION_COLLISION = 1366,
+ ERROR_INVALID_LOGON_TYPE = 1367,
+ ERROR_CANNOT_IMPERSONATE = 1368,
+ ERROR_RXACT_INVALID_STATE = 1369,
+ ERROR_RXACT_COMMIT_FAILURE = 1370,
+ ERROR_SPECIAL_ACCOUNT = 1371,
+ ERROR_SPECIAL_GROUP = 1372,
+ ERROR_SPECIAL_USER = 1373,
+ ERROR_MEMBERS_PRIMARY_GROUP = 1374,
+ ERROR_TOKEN_ALREADY_IN_USE = 1375,
+ ERROR_NO_SUCH_ALIAS = 1376,
+ ERROR_MEMBER_NOT_IN_ALIAS = 1377,
+ ERROR_MEMBER_IN_ALIAS = 1378,
+ ERROR_ALIAS_EXISTS = 1379,
+ ERROR_LOGON_NOT_GRANTED = 1380,
+ ERROR_TOO_MANY_SECRETS = 1381,
+ ERROR_SECRET_TOO_LONG = 1382,
+ ERROR_INTERNAL_DB_ERROR = 1383,
+ ERROR_TOO_MANY_CONTEXT_IDS = 1384,
+ ERROR_LOGON_TYPE_NOT_GRANTED = 1385,
+ ERROR_NT_CROSS_ENCRYPTION_REQUIRED = 1386,
+ ERROR_NO_SUCH_MEMBER = 1387,
+ ERROR_INVALID_MEMBER = 1388,
+ ERROR_TOO_MANY_SIDS = 1389,
+ ERROR_LM_CROSS_ENCRYPTION_REQUIRED = 1390,
+ ERROR_NO_INHERITANCE = 1391,
+ ERROR_FILE_CORRUPT = 1392,
+ ERROR_DISK_CORRUPT = 1393,
+ ERROR_NO_USER_SESSION_KEY = 1394,
+ ERROR_LICENSE_QUOTA_EXCEEDED = 1395,
+ ERROR_WRONG_TARGET_NAME = 1396,
+ ERROR_MUTUAL_AUTH_FAILED = 1397,
+ ERROR_TIME_SKEW = 1398,
+ ERROR_CURRENT_DOMAIN_NOT_ALLOWED = 1399,
+ ERROR_INVALID_WINDOW_HANDLE = 1400,
+ ERROR_INVALID_MENU_HANDLE = 1401,
+ ERROR_INVALID_CURSOR_HANDLE = 1402,
+ ERROR_INVALID_ACCEL_HANDLE = 1403,
+ ERROR_INVALID_HOOK_HANDLE = 1404,
+ ERROR_INVALID_DWP_HANDLE = 1405,
+ ERROR_TLW_WITH_WSCHILD = 1406,
+ ERROR_CANNOT_FIND_WND_CLASS = 1407,
+ ERROR_WINDOW_OF_OTHER_THREAD = 1408,
+ ERROR_HOTKEY_ALREADY_REGISTERED = 1409,
+ ERROR_CLASS_ALREADY_EXISTS = 1410,
+ ERROR_CLASS_DOES_NOT_EXIST = 1411,
+ ERROR_CLASS_HAS_WINDOWS = 1412,
+ ERROR_INVALID_INDEX = 1413,
+ ERROR_INVALID_ICON_HANDLE = 1414,
+ ERROR_PRIVATE_DIALOG_INDEX = 1415,
+ ERROR_LISTBOX_ID_NOT_FOUND = 1416,
+ ERROR_NO_WILDCARD_CHARACTERS = 1417,
+ ERROR_CLIPBOARD_NOT_OPEN = 1418,
+ ERROR_HOTKEY_NOT_REGISTERED = 1419,
+ ERROR_WINDOW_NOT_DIALOG = 1420,
+ ERROR_CONTROL_ID_NOT_FOUND = 1421,
+ ERROR_INVALID_COMBOBOX_MESSAGE = 1422,
+ ERROR_WINDOW_NOT_COMBOBOX = 1423,
+ ERROR_INVALID_EDIT_HEIGHT = 1424,
+ ERROR_DC_NOT_FOUND = 1425,
+ ERROR_INVALID_HOOK_FILTER = 1426,
+ ERROR_INVALID_FILTER_PROC = 1427,
+ ERROR_HOOK_NEEDS_HMOD = 1428,
+ ERROR_GLOBAL_ONLY_HOOK = 1429,
+ ERROR_JOURNAL_HOOK_SET = 1430,
+ ERROR_HOOK_NOT_INSTALLED = 1431,
+ ERROR_INVALID_LB_MESSAGE = 1432,
+ ERROR_SETCOUNT_ON_BAD_LB = 1433,
+ ERROR_LB_WITHOUT_TABSTOPS = 1434,
+ ERROR_DESTROY_OBJECT_OF_OTHER_THREAD = 1435,
+ ERROR_CHILD_WINDOW_MENU = 1436,
+ ERROR_NO_SYSTEM_MENU = 1437,
+ ERROR_INVALID_MSGBOX_STYLE = 1438,
+ ERROR_INVALID_SPI_VALUE = 1439,
+ ERROR_SCREEN_ALREADY_LOCKED = 1440,
+ ERROR_HWNDS_HAVE_DIFF_PARENT = 1441,
+ ERROR_NOT_CHILD_WINDOW = 1442,
+ ERROR_INVALID_GW_COMMAND = 1443,
+ ERROR_INVALID_THREAD_ID = 1444,
+ ERROR_NON_MDICHILD_WINDOW = 1445,
+ ERROR_POPUP_ALREADY_ACTIVE = 1446,
+ ERROR_NO_SCROLLBARS = 1447,
+ ERROR_INVALID_SCROLLBAR_RANGE = 1448,
+ ERROR_INVALID_SHOWWIN_COMMAND = 1449,
+ ERROR_NO_SYSTEM_RESOURCES = 1450,
+ ERROR_NONPAGED_SYSTEM_RESOURCES = 1451,
+ ERROR_PAGED_SYSTEM_RESOURCES = 1452,
+ ERROR_WORKING_SET_QUOTA = 1453,
+ ERROR_PAGEFILE_QUOTA = 1454,
+ ERROR_COMMITMENT_LIMIT = 1455,
+ ERROR_MENU_ITEM_NOT_FOUND = 1456,
+ ERROR_INVALID_KEYBOARD_HANDLE = 1457,
+ ERROR_HOOK_TYPE_NOT_ALLOWED = 1458,
+ ERROR_REQUIRES_INTERACTIVE_WINDOWSTATION = 1459,
+ ERROR_TIMEOUT = 1460,
+ ERROR_INVALID_MONITOR_HANDLE = 1461,
+ ERROR_EVENTLOG_FILE_CORRUPT = 1500,
+ ERROR_EVENTLOG_CANT_START = 1501,
+ ERROR_LOG_FILE_FULL = 1502,
+ ERROR_EVENTLOG_FILE_CHANGED = 1503,
+ ERROR_INSTALL_SERVICE_FAILURE = 1601,
+ ERROR_INSTALL_USEREXIT = 1602,
+ ERROR_INSTALL_FAILURE = 1603,
+ ERROR_INSTALL_SUSPEND = 1604,
+ ERROR_UNKNOWN_PRODUCT = 1605,
+ ERROR_UNKNOWN_FEATURE = 1606,
+ ERROR_UNKNOWN_COMPONENT = 1607,
+ ERROR_UNKNOWN_PROPERTY = 1608,
+ ERROR_INVALID_HANDLE_STATE = 1609,
+ ERROR_BAD_CONFIGURATION = 1610,
+ ERROR_INDEX_ABSENT = 1611,
+ ERROR_INSTALL_SOURCE_ABSENT = 1612,
+ ERROR_INSTALL_PACKAGE_VERSION = 1613,
+ ERROR_PRODUCT_UNINSTALLED = 1614,
+ ERROR_BAD_QUERY_SYNTAX = 1615,
+ ERROR_INVALID_FIELD = 1616,
+ ERROR_DEVICE_REMOVED = 1617,
+ ERROR_INSTALL_ALREADY_RUNNING = 1618,
+ ERROR_INSTALL_PACKAGE_OPEN_FAILED = 1619,
+ ERROR_INSTALL_PACKAGE_INVALID = 1620,
+ ERROR_INSTALL_UI_FAILURE = 1621,
+ ERROR_INSTALL_LOG_FAILURE = 1622,
+ ERROR_INSTALL_LANGUAGE_UNSUPPORTED = 1623,
+ ERROR_INSTALL_TRANSFORM_FAILURE = 1624,
+ ERROR_INSTALL_PACKAGE_REJECTED = 1625,
+ ERROR_FUNCTION_NOT_CALLED = 1626,
+ ERROR_FUNCTION_FAILED = 1627,
+ ERROR_INVALID_TABLE = 1628,
+ ERROR_DATATYPE_MISMATCH = 1629,
+ ERROR_UNSUPPORTED_TYPE = 1630,
+ ERROR_CREATE_FAILED = 1631,
+ ERROR_INSTALL_TEMP_UNWRITABLE = 1632,
+ ERROR_INSTALL_PLATFORM_UNSUPPORTED = 1633,
+ ERROR_INSTALL_NOTUSED = 1634,
+ ERROR_PATCH_PACKAGE_OPEN_FAILED = 1635,
+ ERROR_PATCH_PACKAGE_INVALID = 1636,
+ ERROR_PATCH_PACKAGE_UNSUPPORTED = 1637,
+ ERROR_PRODUCT_VERSION = 1638,
+ ERROR_INVALID_COMMAND_LINE = 1639,
+ ERROR_INSTALL_REMOTE_DISALLOWED = 1640,
+ ERROR_SUCCESS_REBOOT_INITIATED = 1641,
+ ERROR_PATCH_TARGET_NOT_FOUND = 1642,
+ ERROR_PATCH_PACKAGE_REJECTED = 1643,
+ ERROR_INSTALL_TRANSFORM_REJECTED = 1644,
+ RPC_S_INVALID_STRING_BINDING = 1700,
+ RPC_S_WRONG_KIND_OF_BINDING = 1701,
+ RPC_S_INVALID_BINDING = 1702,
+ RPC_S_PROTSEQ_NOT_SUPPORTED = 1703,
+ RPC_S_INVALID_RPC_PROTSEQ = 1704,
+ RPC_S_INVALID_STRING_UUID = 1705,
+ RPC_S_INVALID_ENDPOINT_FORMAT = 1706,
+ RPC_S_INVALID_NET_ADDR = 1707,
+ RPC_S_NO_ENDPOINT_FOUND = 1708,
+ RPC_S_INVALID_TIMEOUT = 1709,
+ RPC_S_OBJECT_NOT_FOUND = 1710,
+ RPC_S_ALREADY_REGISTERED = 1711,
+ RPC_S_TYPE_ALREADY_REGISTERED = 1712,
+ RPC_S_ALREADY_LISTENING = 1713,
+ RPC_S_NO_PROTSEQS_REGISTERED = 1714,
+ RPC_S_NOT_LISTENING = 1715,
+ RPC_S_UNKNOWN_MGR_TYPE = 1716,
+ RPC_S_UNKNOWN_IF = 1717,
+ RPC_S_NO_BINDINGS = 1718,
+ RPC_S_NO_PROTSEQS = 1719,
+ RPC_S_CANT_CREATE_ENDPOINT = 1720,
+ RPC_S_OUT_OF_RESOURCES = 1721,
+ RPC_S_SERVER_UNAVAILABLE = 1722,
+ RPC_S_SERVER_TOO_BUSY = 1723,
+ RPC_S_INVALID_NETWORK_OPTIONS = 1724,
+ RPC_S_NO_CALL_ACTIVE = 1725,
+ RPC_S_CALL_FAILED = 1726,
+ RPC_S_CALL_FAILED_DNE = 1727,
+ RPC_S_PROTOCOL_ERROR = 1728,
+ RPC_S_UNSUPPORTED_TRANS_SYN = 1730,
+ RPC_S_UNSUPPORTED_TYPE = 1732,
+ RPC_S_INVALID_TAG = 1733,
+ RPC_S_INVALID_BOUND = 1734,
+ RPC_S_NO_ENTRY_NAME = 1735,
+ RPC_S_INVALID_NAME_SYNTAX = 1736,
+ RPC_S_UNSUPPORTED_NAME_SYNTAX = 1737,
+ RPC_S_UUID_NO_ADDRESS = 1739,
+ RPC_S_DUPLICATE_ENDPOINT = 1740,
+ RPC_S_UNKNOWN_AUTHN_TYPE = 1741,
+ RPC_S_MAX_CALLS_TOO_SMALL = 1742,
+ RPC_S_STRING_TOO_LONG = 1743,
+ RPC_S_PROTSEQ_NOT_FOUND = 1744,
+ RPC_S_PROCNUM_OUT_OF_RANGE = 1745,
+ RPC_S_BINDING_HAS_NO_AUTH = 1746,
+ RPC_S_UNKNOWN_AUTHN_SERVICE = 1747,
+ RPC_S_UNKNOWN_AUTHN_LEVEL = 1748,
+ RPC_S_INVALID_AUTH_IDENTITY = 1749,
+ RPC_S_UNKNOWN_AUTHZ_SERVICE = 1750,
+ EPT_S_INVALID_ENTRY = 1751,
+ EPT_S_CANT_PERFORM_OP = 1752,
+ EPT_S_NOT_REGISTERED = 1753,
+ RPC_S_NOTHING_TO_EXPORT = 1754,
+ RPC_S_INCOMPLETE_NAME = 1755,
+ RPC_S_INVALID_VERS_OPTION = 1756,
+ RPC_S_NO_MORE_MEMBERS = 1757,
+ RPC_S_NOT_ALL_OBJS_UNEXPORTED = 1758,
+ RPC_S_INTERFACE_NOT_FOUND = 1759,
+ RPC_S_ENTRY_ALREADY_EXISTS = 1760,
+ RPC_S_ENTRY_NOT_FOUND = 1761,
+ RPC_S_NAME_SERVICE_UNAVAILABLE = 1762,
+ RPC_S_INVALID_NAF_ID = 1763,
+ RPC_S_CANNOT_SUPPORT = 1764,
+ RPC_S_NO_CONTEXT_AVAILABLE = 1765,
+ RPC_S_INTERNAL_ERROR = 1766,
+ RPC_S_ZERO_DIVIDE = 1767,
+ RPC_S_ADDRESS_ERROR = 1768,
+ RPC_S_FP_DIV_ZERO = 1769,
+ RPC_S_FP_UNDERFLOW = 1770,
+ RPC_S_FP_OVERFLOW = 1771,
+ RPC_X_NO_MORE_ENTRIES = 1772,
+ RPC_X_SS_CHAR_TRANS_OPEN_FAIL = 1773,
+ RPC_X_SS_CHAR_TRANS_SHORT_FILE = 1774,
+ RPC_X_SS_IN_NULL_CONTEXT = 1775,
+ RPC_X_SS_CONTEXT_DAMAGED = 1777,
+ RPC_X_SS_HANDLES_MISMATCH = 1778,
+ RPC_X_SS_CANNOT_GET_CALL_HANDLE = 1779,
+ RPC_X_NULL_REF_POINTER = 1780,
+ RPC_X_ENUM_VALUE_OUT_OF_RANGE = 1781,
+ RPC_X_BYTE_COUNT_TOO_SMALL = 1782,
+ RPC_X_BAD_STUB_DATA = 1783,
+ ERROR_INVALID_USER_BUFFER = 1784,
+ ERROR_UNRECOGNIZED_MEDIA = 1785,
+ ERROR_NO_TRUST_LSA_SECRET = 1786,
+ ERROR_NO_TRUST_SAM_ACCOUNT = 1787,
+ ERROR_TRUSTED_DOMAIN_FAILURE = 1788,
+ ERROR_TRUSTED_RELATIONSHIP_FAILURE = 1789,
+ ERROR_TRUST_FAILURE = 1790,
+ RPC_S_CALL_IN_PROGRESS = 1791,
+ ERROR_NETLOGON_NOT_STARTED = 1792,
+ ERROR_ACCOUNT_EXPIRED = 1793,
+ ERROR_REDIRECTOR_HAS_OPEN_HANDLES = 1794,
+ ERROR_PRINTER_DRIVER_ALREADY_INSTALLED = 1795,
+ ERROR_UNKNOWN_PORT = 1796,
+ ERROR_UNKNOWN_PRINTER_DRIVER = 1797,
+ ERROR_UNKNOWN_PRINTPROCESSOR = 1798,
+ ERROR_INVALID_SEPARATOR_FILE = 1799,
+ ERROR_INVALID_PRIORITY = 1800,
+ ERROR_INVALID_PRINTER_NAME = 1801,
+ ERROR_PRINTER_ALREADY_EXISTS = 1802,
+ ERROR_INVALID_PRINTER_COMMAND = 1803,
+ ERROR_INVALID_DATATYPE = 1804,
+ ERROR_INVALID_ENVIRONMENT = 1805,
+ RPC_S_NO_MORE_BINDINGS = 1806,
+ ERROR_NOLOGON_INTERDOMAIN_TRUST_ACCOUNT = 1807,
+ ERROR_NOLOGON_WORKSTATION_TRUST_ACCOUNT = 1808,
+ ERROR_NOLOGON_SERVER_TRUST_ACCOUNT = 1809,
+ ERROR_DOMAIN_TRUST_INCONSISTENT = 1810,
+ ERROR_SERVER_HAS_OPEN_HANDLES = 1811,
+ ERROR_RESOURCE_DATA_NOT_FOUND = 1812,
+ ERROR_RESOURCE_TYPE_NOT_FOUND = 1813,
+ ERROR_RESOURCE_NAME_NOT_FOUND = 1814,
+ ERROR_RESOURCE_LANG_NOT_FOUND = 1815,
+ ERROR_NOT_ENOUGH_QUOTA = 1816,
+ RPC_S_NO_INTERFACES = 1817,
+ RPC_S_CALL_CANCELLED = 1818,
+ RPC_S_BINDING_INCOMPLETE = 1819,
+ RPC_S_COMM_FAILURE = 1820,
+ RPC_S_UNSUPPORTED_AUTHN_LEVEL = 1821,
+ RPC_S_NO_PRINC_NAME = 1822,
+ RPC_S_NOT_RPC_ERROR = 1823,
+ RPC_S_UUID_LOCAL_ONLY = 1824,
+ RPC_S_SEC_PKG_ERROR = 1825,
+ RPC_S_NOT_CANCELLED = 1826,
+ RPC_X_INVALID_ES_ACTION = 1827,
+ RPC_X_WRONG_ES_VERSION = 1828,
+ RPC_X_WRONG_STUB_VERSION = 1829,
+ RPC_X_INVALID_PIPE_OBJECT = 1830,
+ RPC_X_WRONG_PIPE_ORDER = 1831,
+ RPC_X_WRONG_PIPE_VERSION = 1832,
+ RPC_S_GROUP_MEMBER_NOT_FOUND = 1898,
+ EPT_S_CANT_CREATE = 1899,
+ RPC_S_INVALID_OBJECT = 1900,
+ ERROR_INVALID_TIME = 1901,
+ ERROR_INVALID_FORM_NAME = 1902,
+ ERROR_INVALID_FORM_SIZE = 1903,
+ ERROR_ALREADY_WAITING = 1904,
+ ERROR_PRINTER_DELETED = 1905,
+ ERROR_INVALID_PRINTER_STATE = 1906,
+ ERROR_PASSWORD_MUST_CHANGE = 1907,
+ ERROR_DOMAIN_CONTROLLER_NOT_FOUND = 1908,
+ ERROR_ACCOUNT_LOCKED_OUT = 1909,
+ OR_INVALID_OXID = 1910,
+ OR_INVALID_OID = 1911,
+ OR_INVALID_SET = 1912,
+ RPC_S_SEND_INCOMPLETE = 1913,
+ RPC_S_INVALID_ASYNC_HANDLE = 1914,
+ RPC_S_INVALID_ASYNC_CALL = 1915,
+ RPC_X_PIPE_CLOSED = 1916,
+ RPC_X_PIPE_DISCIPLINE_ERROR = 1917,
+ RPC_X_PIPE_EMPTY = 1918,
+ ERROR_NO_SITENAME = 1919,
+ ERROR_CANT_ACCESS_FILE = 1920,
+ ERROR_CANT_RESOLVE_FILENAME = 1921,
+ RPC_S_ENTRY_TYPE_MISMATCH = 1922,
+ RPC_S_NOT_ALL_OBJS_EXPORTED = 1923,
+ RPC_S_INTERFACE_NOT_EXPORTED = 1924,
+ RPC_S_PROFILE_NOT_ADDED = 1925,
+ RPC_S_PRF_ELT_NOT_ADDED = 1926,
+ RPC_S_PRF_ELT_NOT_REMOVED = 1927,
+ RPC_S_GRP_ELT_NOT_ADDED = 1928,
+ RPC_S_GRP_ELT_NOT_REMOVED = 1929,
+ ERROR_KM_DRIVER_BLOCKED = 1930,
+ ERROR_CONTEXT_EXPIRED = 1931,
+ ERROR_INVALID_PIXEL_FORMAT = 2000,
+ ERROR_BAD_DRIVER = 2001,
+ ERROR_INVALID_WINDOW_STYLE = 2002,
+ ERROR_METAFILE_NOT_SUPPORTED = 2003,
+ ERROR_TRANSFORM_NOT_SUPPORTED = 2004,
+ ERROR_CLIPPING_NOT_SUPPORTED = 2005,
+ ERROR_INVALID_CMM = 2010,
+ ERROR_INVALID_PROFILE = 2011,
+ ERROR_TAG_NOT_FOUND = 2012,
+ ERROR_TAG_NOT_PRESENT = 2013,
+ ERROR_DUPLICATE_TAG = 2014,
+ ERROR_PROFILE_NOT_ASSOCIATED_WITH_DEVICE = 2015,
+ ERROR_PROFILE_NOT_FOUND = 2016,
+ ERROR_INVALID_COLORSPACE = 2017,
+ ERROR_ICM_NOT_ENABLED = 2018,
+ ERROR_DELETING_ICM_XFORM = 2019,
+ ERROR_INVALID_TRANSFORM = 2020,
+ ERROR_COLORSPACE_MISMATCH = 2021,
+ ERROR_INVALID_COLORINDEX = 2022,
+ ERROR_CONNECTED_OTHER_PASSWORD = 2108,
+ ERROR_CONNECTED_OTHER_PASSWORD_DEFAULT = 2109,
+ ERROR_BAD_USERNAME = 2202,
+ ERROR_NOT_CONNECTED = 2250,
+ ERROR_OPEN_FILES = 2401,
+ ERROR_ACTIVE_CONNECTIONS = 2402,
+ ERROR_DEVICE_IN_USE = 2404,
+ ERROR_UNKNOWN_PRINT_MONITOR = 3000,
+ ERROR_PRINTER_DRIVER_IN_USE = 3001,
+ ERROR_SPOOL_FILE_NOT_FOUND = 3002,
+ ERROR_SPL_NO_STARTDOC = 3003,
+ ERROR_SPL_NO_ADDJOB = 3004,
+ ERROR_PRINT_PROCESSOR_ALREADY_INSTALLED = 3005,
+ ERROR_PRINT_MONITOR_ALREADY_INSTALLED = 3006,
+ ERROR_INVALID_PRINT_MONITOR = 3007,
+ ERROR_PRINT_MONITOR_IN_USE = 3008,
+ ERROR_PRINTER_HAS_JOBS_QUEUED = 3009,
+ ERROR_SUCCESS_REBOOT_REQUIRED = 3010,
+ ERROR_SUCCESS_RESTART_REQUIRED = 3011,
+ ERROR_PRINTER_NOT_FOUND = 3012,
+ ERROR_PRINTER_DRIVER_WARNED = 3013,
+ ERROR_PRINTER_DRIVER_BLOCKED = 3014,
+ ERROR_WINS_INTERNAL = 4000,
+ ERROR_CAN_NOT_DEL_LOCAL_WINS = 4001,
+ ERROR_STATIC_INIT = 4002,
+ ERROR_INC_BACKUP = 4003,
+ ERROR_FULL_BACKUP = 4004,
+ ERROR_REC_NON_EXISTENT = 4005,
+ ERROR_RPL_NOT_ALLOWED = 4006,
+ ERROR_DHCP_ADDRESS_CONFLICT = 4100,
+ ERROR_WMI_GUID_NOT_FOUND = 4200,
+ ERROR_WMI_INSTANCE_NOT_FOUND = 4201,
+ ERROR_WMI_ITEMID_NOT_FOUND = 4202,
+ ERROR_WMI_TRY_AGAIN = 4203,
+ ERROR_WMI_DP_NOT_FOUND = 4204,
+ ERROR_WMI_UNRESOLVED_INSTANCE_REF = 4205,
+ ERROR_WMI_ALREADY_ENABLED = 4206,
+ ERROR_WMI_GUID_DISCONNECTED = 4207,
+ ERROR_WMI_SERVER_UNAVAILABLE = 4208,
+ ERROR_WMI_DP_FAILED = 4209,
+ ERROR_WMI_INVALID_MOF = 4210,
+ ERROR_WMI_INVALID_REGINFO = 4211,
+ ERROR_WMI_ALREADY_DISABLED = 4212,
+ ERROR_WMI_READ_ONLY = 4213,
+ ERROR_WMI_SET_FAILURE = 4214,
+ ERROR_INVALID_MEDIA = 4300,
+ ERROR_INVALID_LIBRARY = 4301,
+ ERROR_INVALID_MEDIA_POOL = 4302,
+ ERROR_DRIVE_MEDIA_MISMATCH = 4303,
+ ERROR_MEDIA_OFFLINE = 4304,
+ ERROR_LIBRARY_OFFLINE = 4305,
+ ERROR_EMPTY = 4306,
+ ERROR_NOT_EMPTY = 4307,
+ ERROR_MEDIA_UNAVAILABLE = 4308,
+ ERROR_RESOURCE_DISABLED = 4309,
+ ERROR_INVALID_CLEANER = 4310,
+ ERROR_UNABLE_TO_CLEAN = 4311,
+ ERROR_OBJECT_NOT_FOUND = 4312,
+ ERROR_DATABASE_FAILURE = 4313,
+ ERROR_DATABASE_FULL = 4314,
+ ERROR_MEDIA_INCOMPATIBLE = 4315,
+ ERROR_RESOURCE_NOT_PRESENT = 4316,
+ ERROR_INVALID_OPERATION = 4317,
+ ERROR_MEDIA_NOT_AVAILABLE = 4318,
+ ERROR_DEVICE_NOT_AVAILABLE = 4319,
+ ERROR_REQUEST_REFUSED = 4320,
+ ERROR_INVALID_DRIVE_OBJECT = 4321,
+ ERROR_LIBRARY_FULL = 4322,
+ ERROR_MEDIUM_NOT_ACCESSIBLE = 4323,
+ ERROR_UNABLE_TO_LOAD_MEDIUM = 4324,
+ ERROR_UNABLE_TO_INVENTORY_DRIVE = 4325,
+ ERROR_UNABLE_TO_INVENTORY_SLOT = 4326,
+ ERROR_UNABLE_TO_INVENTORY_TRANSPORT = 4327,
+ ERROR_TRANSPORT_FULL = 4328,
+ ERROR_CONTROLLING_IEPORT = 4329,
+ ERROR_UNABLE_TO_EJECT_MOUNTED_MEDIA = 4330,
+ ERROR_CLEANER_SLOT_SET = 4331,
+ ERROR_CLEANER_SLOT_NOT_SET = 4332,
+ ERROR_CLEANER_CARTRIDGE_SPENT = 4333,
+ ERROR_UNEXPECTED_OMID = 4334,
+ ERROR_CANT_DELETE_LAST_ITEM = 4335,
+ ERROR_MESSAGE_EXCEEDS_MAX_SIZE = 4336,
+ ERROR_VOLUME_CONTAINS_SYS_FILES = 4337,
+ ERROR_INDIGENOUS_TYPE = 4338,
+ ERROR_NO_SUPPORTING_DRIVES = 4339,
+ ERROR_CLEANER_CARTRIDGE_INSTALLED = 4340,
+ ERROR_FILE_OFFLINE = 4350,
+ ERROR_REMOTE_STORAGE_NOT_ACTIVE = 4351,
+ ERROR_REMOTE_STORAGE_MEDIA_ERROR = 4352,
+ ERROR_NOT_A_REPARSE_POINT = 4390,
+ ERROR_REPARSE_ATTRIBUTE_CONFLICT = 4391,
+ ERROR_INVALID_REPARSE_DATA = 4392,
+ ERROR_REPARSE_TAG_INVALID = 4393,
+ ERROR_REPARSE_TAG_MISMATCH = 4394,
+ ERROR_VOLUME_NOT_SIS_ENABLED = 4500,
+ ERROR_DEPENDENT_RESOURCE_EXISTS = 5001,
+ ERROR_DEPENDENCY_NOT_FOUND = 5002,
+ ERROR_DEPENDENCY_ALREADY_EXISTS = 5003,
+ ERROR_RESOURCE_NOT_ONLINE = 5004,
+ ERROR_HOST_NODE_NOT_AVAILABLE = 5005,
+ ERROR_RESOURCE_NOT_AVAILABLE = 5006,
+ ERROR_RESOURCE_NOT_FOUND = 5007,
+ ERROR_SHUTDOWN_CLUSTER = 5008,
+ ERROR_CANT_EVICT_ACTIVE_NODE = 5009,
+ ERROR_OBJECT_ALREADY_EXISTS = 5010,
+ ERROR_OBJECT_IN_LIST = 5011,
+ ERROR_GROUP_NOT_AVAILABLE = 5012,
+ ERROR_GROUP_NOT_FOUND = 5013,
+ ERROR_GROUP_NOT_ONLINE = 5014,
+ ERROR_HOST_NODE_NOT_RESOURCE_OWNER = 5015,
+ ERROR_HOST_NODE_NOT_GROUP_OWNER = 5016,
+ ERROR_RESMON_CREATE_FAILED = 5017,
+ ERROR_RESMON_ONLINE_FAILED = 5018,
+ ERROR_RESOURCE_ONLINE = 5019,
+ ERROR_QUORUM_RESOURCE = 5020,
+ ERROR_NOT_QUORUM_CAPABLE = 5021,
+ ERROR_CLUSTER_SHUTTING_DOWN = 5022,
+ ERROR_INVALID_STATE = 5023,
+ ERROR_RESOURCE_PROPERTIES_STORED = 5024,
+ ERROR_NOT_QUORUM_CLASS = 5025,
+ ERROR_CORE_RESOURCE = 5026,
+ ERROR_QUORUM_RESOURCE_ONLINE_FAILED = 5027,
+ ERROR_QUORUMLOG_OPEN_FAILED = 5028,
+ ERROR_CLUSTERLOG_CORRUPT = 5029,
+ ERROR_CLUSTERLOG_RECORD_EXCEEDS_MAXSIZE = 5030,
+ ERROR_CLUSTERLOG_EXCEEDS_MAXSIZE = 5031,
+ ERROR_CLUSTERLOG_CHKPOINT_NOT_FOUND = 5032,
+ ERROR_CLUSTERLOG_NOT_ENOUGH_SPACE = 5033,
+ ERROR_QUORUM_OWNER_ALIVE = 5034,
+ ERROR_NETWORK_NOT_AVAILABLE = 5035,
+ ERROR_NODE_NOT_AVAILABLE = 5036,
+ ERROR_ALL_NODES_NOT_AVAILABLE = 5037,
+ ERROR_RESOURCE_FAILED = 5038,
+ ERROR_CLUSTER_INVALID_NODE = 5039,
+ ERROR_CLUSTER_NODE_EXISTS = 5040,
+ ERROR_CLUSTER_JOIN_IN_PROGRESS = 5041,
+ ERROR_CLUSTER_NODE_NOT_FOUND = 5042,
+ ERROR_CLUSTER_LOCAL_NODE_NOT_FOUND = 5043,
+ ERROR_CLUSTER_NETWORK_EXISTS = 5044,
+ ERROR_CLUSTER_NETWORK_NOT_FOUND = 5045,
+ ERROR_CLUSTER_NETINTERFACE_EXISTS = 5046,
+ ERROR_CLUSTER_NETINTERFACE_NOT_FOUND = 5047,
+ ERROR_CLUSTER_INVALID_REQUEST = 5048,
+ ERROR_CLUSTER_INVALID_NETWORK_PROVIDER = 5049,
+ ERROR_CLUSTER_NODE_DOWN = 5050,
+ ERROR_CLUSTER_NODE_UNREACHABLE = 5051,
+ ERROR_CLUSTER_NODE_NOT_MEMBER = 5052,
+ ERROR_CLUSTER_JOIN_NOT_IN_PROGRESS = 5053,
+ ERROR_CLUSTER_INVALID_NETWORK = 5054,
+ ERROR_CLUSTER_NODE_UP = 5056,
+ ERROR_CLUSTER_IPADDR_IN_USE = 5057,
+ ERROR_CLUSTER_NODE_NOT_PAUSED = 5058,
+ ERROR_CLUSTER_NO_SECURITY_CONTEXT = 5059,
+ ERROR_CLUSTER_NETWORK_NOT_INTERNAL = 5060,
+ ERROR_CLUSTER_NODE_ALREADY_UP = 5061,
+ ERROR_CLUSTER_NODE_ALREADY_DOWN = 5062,
+ ERROR_CLUSTER_NETWORK_ALREADY_ONLINE = 5063,
+ ERROR_CLUSTER_NETWORK_ALREADY_OFFLINE = 5064,
+ ERROR_CLUSTER_NODE_ALREADY_MEMBER = 5065,
+ ERROR_CLUSTER_LAST_INTERNAL_NETWORK = 5066,
+ ERROR_CLUSTER_NETWORK_HAS_DEPENDENTS = 5067,
+ ERROR_INVALID_OPERATION_ON_QUORUM = 5068,
+ ERROR_DEPENDENCY_NOT_ALLOWED = 5069,
+ ERROR_CLUSTER_NODE_PAUSED = 5070,
+ ERROR_NODE_CANT_HOST_RESOURCE = 5071,
+ ERROR_CLUSTER_NODE_NOT_READY = 5072,
+ ERROR_CLUSTER_NODE_SHUTTING_DOWN = 5073,
+ ERROR_CLUSTER_JOIN_ABORTED = 5074,
+ ERROR_CLUSTER_INCOMPATIBLE_VERSIONS = 5075,
+ ERROR_CLUSTER_MAXNUM_OF_RESOURCES_EXCEEDED = 5076,
+ ERROR_CLUSTER_SYSTEM_CONFIG_CHANGED = 5077,
+ ERROR_CLUSTER_RESOURCE_TYPE_NOT_FOUND = 5078,
+ ERROR_CLUSTER_RESTYPE_NOT_SUPPORTED = 5079,
+ ERROR_CLUSTER_RESNAME_NOT_FOUND = 5080,
+ ERROR_CLUSTER_NO_RPC_PACKAGES_REGISTERED = 5081,
+ ERROR_CLUSTER_OWNER_NOT_IN_PREFLIST = 5082,
+ ERROR_CLUSTER_DATABASE_SEQMISMATCH = 5083,
+ ERROR_RESMON_INVALID_STATE = 5084,
+ ERROR_CLUSTER_GUM_NOT_LOCKER = 5085,
+ ERROR_QUORUM_DISK_NOT_FOUND = 5086,
+ ERROR_DATABASE_BACKUP_CORRUPT = 5087,
+ ERROR_CLUSTER_NODE_ALREADY_HAS_DFS_ROOT = 5088,
+ ERROR_RESOURCE_PROPERTY_UNCHANGEABLE = 5089,
+ ERROR_CLUSTER_MEMBERSHIP_INVALID_STATE = 5890,
+ ERROR_CLUSTER_QUORUMLOG_NOT_FOUND = 5891,
+ ERROR_CLUSTER_MEMBERSHIP_HALT = 5892,
+ ERROR_CLUSTER_INSTANCE_ID_MISMATCH = 5893,
+ ERROR_CLUSTER_NETWORK_NOT_FOUND_FOR_IP = 5894,
+ ERROR_CLUSTER_PROPERTY_DATA_TYPE_MISMATCH = 5895,
+ ERROR_CLUSTER_EVICT_WITHOUT_CLEANUP = 5896,
+ ERROR_CLUSTER_PARAMETER_MISMATCH = 5897,
+ ERROR_NODE_CANNOT_BE_CLUSTERED = 5898,
+ ERROR_CLUSTER_WRONG_OS_VERSION = 5899,
+ ERROR_CLUSTER_CANT_CREATE_DUP_CLUSTER_NAME = 5900,
+ ERROR_ENCRYPTION_FAILED = 6000,
+ ERROR_DECRYPTION_FAILED = 6001,
+ ERROR_FILE_ENCRYPTED = 6002,
+ ERROR_NO_RECOVERY_POLICY = 6003,
+ ERROR_NO_EFS = 6004,
+ ERROR_WRONG_EFS = 6005,
+ ERROR_NO_USER_KEYS = 6006,
+ ERROR_FILE_NOT_ENCRYPTED = 6007,
+ ERROR_NOT_EXPORT_FORMAT = 6008,
+ ERROR_FILE_READ_ONLY = 6009,
+ ERROR_DIR_EFS_DISALLOWED = 6010,
+ ERROR_EFS_SERVER_NOT_TRUSTED = 6011,
+ ERROR_BAD_RECOVERY_POLICY = 6012,
+ ERROR_EFS_ALG_BLOB_TOO_BIG = 6013,
+ ERROR_VOLUME_NOT_SUPPORT_EFS = 6014,
+ ERROR_EFS_DISABLED = 6015,
+ ERROR_EFS_VERSION_NOT_SUPPORT = 6016,
+ ERROR_NO_BROWSER_SERVERS_FOUND = 6118,
+ SCHED_E_SERVICE_NOT_LOCALSYSTEM = 6200,
+ ERROR_CTX_WINSTATION_NAME_INVALID = 7001,
+ ERROR_CTX_INVALID_PD = 7002,
+ ERROR_CTX_PD_NOT_FOUND = 7003,
+ ERROR_CTX_WD_NOT_FOUND = 7004,
+ ERROR_CTX_CANNOT_MAKE_EVENTLOG_ENTRY = 7005,
+ ERROR_CTX_SERVICE_NAME_COLLISION = 7006,
+ ERROR_CTX_CLOSE_PENDING = 7007,
+ ERROR_CTX_NO_OUTBUF = 7008,
+ ERROR_CTX_MODEM_INF_NOT_FOUND = 7009,
+ ERROR_CTX_INVALID_MODEMNAME = 7010,
+ ERROR_CTX_MODEM_RESPONSE_ERROR = 7011,
+ ERROR_CTX_MODEM_RESPONSE_TIMEOUT = 7012,
+ ERROR_CTX_MODEM_RESPONSE_NO_CARRIER = 7013,
+ ERROR_CTX_MODEM_RESPONSE_NO_DIALTONE = 7014,
+ ERROR_CTX_MODEM_RESPONSE_BUSY = 7015,
+ ERROR_CTX_MODEM_RESPONSE_VOICE = 7016,
+ ERROR_CTX_TD_ERROR = 7017,
+ ERROR_CTX_WINSTATION_NOT_FOUND = 7022,
+ ERROR_CTX_WINSTATION_ALREADY_EXISTS = 7023,
+ ERROR_CTX_WINSTATION_BUSY = 7024,
+ ERROR_CTX_BAD_VIDEO_MODE = 7025,
+ ERROR_CTX_GRAPHICS_INVALID = 7035,
+ ERROR_CTX_LOGON_DISABLED = 7037,
+ ERROR_CTX_NOT_CONSOLE = 7038,
+ ERROR_CTX_CLIENT_QUERY_TIMEOUT = 7040,
+ ERROR_CTX_CONSOLE_DISCONNECT = 7041,
+ ERROR_CTX_CONSOLE_CONNECT = 7042,
+ ERROR_CTX_SHADOW_DENIED = 7044,
+ ERROR_CTX_WINSTATION_ACCESS_DENIED = 7045,
+ ERROR_CTX_INVALID_WD = 7049,
+ ERROR_CTX_SHADOW_INVALID = 7050,
+ ERROR_CTX_SHADOW_DISABLED = 7051,
+ ERROR_CTX_CLIENT_LICENSE_IN_USE = 7052,
+ ERROR_CTX_CLIENT_LICENSE_NOT_SET = 7053,
+ ERROR_CTX_LICENSE_NOT_AVAILABLE = 7054,
+ ERROR_CTX_LICENSE_CLIENT_INVALID = 7055,
+ ERROR_CTX_LICENSE_EXPIRED = 7056,
+ ERROR_CTX_SHADOW_NOT_RUNNING = 7057,
+ ERROR_CTX_SHADOW_ENDED_BY_MODE_CHANGE = 7058,
+ FRS_ERR_INVALID_API_SEQUENCE = 8001,
+ FRS_ERR_STARTING_SERVICE = 8002,
+ FRS_ERR_STOPPING_SERVICE = 8003,
+ FRS_ERR_INTERNAL_API = 8004,
+ FRS_ERR_INTERNAL = 8005,
+ FRS_ERR_SERVICE_COMM = 8006,
+ FRS_ERR_INSUFFICIENT_PRIV = 8007,
+ FRS_ERR_AUTHENTICATION = 8008,
+ FRS_ERR_PARENT_INSUFFICIENT_PRIV = 8009,
+ FRS_ERR_PARENT_AUTHENTICATION = 8010,
+ FRS_ERR_CHILD_TO_PARENT_COMM = 8011,
+ FRS_ERR_PARENT_TO_CHILD_COMM = 8012,
+ FRS_ERR_SYSVOL_POPULATE = 8013,
+ FRS_ERR_SYSVOL_POPULATE_TIMEOUT = 8014,
+ FRS_ERR_SYSVOL_IS_BUSY = 8015,
+ FRS_ERR_SYSVOL_DEMOTE = 8016,
+ FRS_ERR_INVALID_SERVICE_PARAMETER = 8017,
+ ERROR_DS_NOT_INSTALLED = 8200,
+ ERROR_DS_MEMBERSHIP_EVALUATED_LOCALLY = 8201,
+ ERROR_DS_NO_ATTRIBUTE_OR_VALUE = 8202,
+ ERROR_DS_INVALID_ATTRIBUTE_SYNTAX = 8203,
+ ERROR_DS_ATTRIBUTE_TYPE_UNDEFINED = 8204,
+ ERROR_DS_ATTRIBUTE_OR_VALUE_EXISTS = 8205,
+ ERROR_DS_BUSY = 8206,
+ ERROR_DS_UNAVAILABLE = 8207,
+ ERROR_DS_NO_RIDS_ALLOCATED = 8208,
+ ERROR_DS_NO_MORE_RIDS = 8209,
+ ERROR_DS_INCORRECT_ROLE_OWNER = 8210,
+ ERROR_DS_RIDMGR_INIT_ERROR = 8211,
+ ERROR_DS_OBJ_CLASS_VIOLATION = 8212,
+ ERROR_DS_CANT_ON_NON_LEAF = 8213,
+ ERROR_DS_CANT_ON_RDN = 8214,
+ ERROR_DS_CANT_MOD_OBJ_CLASS = 8215,
+ ERROR_DS_CROSS_DOM_MOVE_ERROR = 8216,
+ ERROR_DS_GC_NOT_AVAILABLE = 8217,
+ ERROR_SHARED_POLICY = 8218,
+ ERROR_POLICY_OBJECT_NOT_FOUND = 8219,
+ ERROR_POLICY_ONLY_IN_DS = 8220,
+ ERROR_PROMOTION_ACTIVE = 8221,
+ ERROR_NO_PROMOTION_ACTIVE = 8222,
+ ERROR_DS_OPERATIONS_ERROR = 8224,
+ ERROR_DS_PROTOCOL_ERROR = 8225,
+ ERROR_DS_TIMELIMIT_EXCEEDED = 8226,
+ ERROR_DS_SIZELIMIT_EXCEEDED = 8227,
+ ERROR_DS_ADMIN_LIMIT_EXCEEDED = 8228,
+ ERROR_DS_COMPARE_FALSE = 8229,
+ ERROR_DS_COMPARE_TRUE = 8230,
+ ERROR_DS_AUTH_METHOD_NOT_SUPPORTED = 8231,
+ ERROR_DS_STRONG_AUTH_REQUIRED = 8232,
+ ERROR_DS_INAPPROPRIATE_AUTH = 8233,
+ ERROR_DS_AUTH_UNKNOWN = 8234,
+ ERROR_DS_REFERRAL = 8235,
+ ERROR_DS_UNAVAILABLE_CRIT_EXTENSION = 8236,
+ ERROR_DS_CONFIDENTIALITY_REQUIRED = 8237,
+ ERROR_DS_INAPPROPRIATE_MATCHING = 8238,
+ ERROR_DS_CONSTRAINT_VIOLATION = 8239,
+ ERROR_DS_NO_SUCH_OBJECT = 8240,
+ ERROR_DS_ALIAS_PROBLEM = 8241,
+ ERROR_DS_INVALID_DN_SYNTAX = 8242,
+ ERROR_DS_IS_LEAF = 8243,
+ ERROR_DS_ALIAS_DEREF_PROBLEM = 8244,
+ ERROR_DS_UNWILLING_TO_PERFORM = 8245,
+ ERROR_DS_LOOP_DETECT = 8246,
+ ERROR_DS_NAMING_VIOLATION = 8247,
+ ERROR_DS_OBJECT_RESULTS_TOO_LARGE = 8248,
+ ERROR_DS_AFFECTS_MULTIPLE_DSAS = 8249,
+ ERROR_DS_SERVER_DOWN = 8250,
+ ERROR_DS_LOCAL_ERROR = 8251,
+ ERROR_DS_ENCODING_ERROR = 8252,
+ ERROR_DS_DECODING_ERROR = 8253,
+ ERROR_DS_FILTER_UNKNOWN = 8254,
+ ERROR_DS_PARAM_ERROR = 8255,
+ ERROR_DS_NOT_SUPPORTED = 8256,
+ ERROR_DS_NO_RESULTS_RETURNED = 8257,
+ ERROR_DS_CONTROL_NOT_FOUND = 8258,
+ ERROR_DS_CLIENT_LOOP = 8259,
+ ERROR_DS_REFERRAL_LIMIT_EXCEEDED = 8260,
+ ERROR_DS_SORT_CONTROL_MISSING = 8261,
+ ERROR_DS_OFFSET_RANGE_ERROR = 8262,
+ ERROR_DS_ROOT_MUST_BE_NC = 8301,
+ ERROR_DS_ADD_REPLICA_INHIBITED = 8302,
+ ERROR_DS_ATT_NOT_DEF_IN_SCHEMA = 8303,
+ ERROR_DS_MAX_OBJ_SIZE_EXCEEDED = 8304,
+ ERROR_DS_OBJ_STRING_NAME_EXISTS = 8305,
+ ERROR_DS_NO_RDN_DEFINED_IN_SCHEMA = 8306,
+ ERROR_DS_RDN_DOESNT_MATCH_SCHEMA = 8307,
+ ERROR_DS_NO_REQUESTED_ATTS_FOUND = 8308,
+ ERROR_DS_USER_BUFFER_TO_SMALL = 8309,
+ ERROR_DS_ATT_IS_NOT_ON_OBJ = 8310,
+ ERROR_DS_ILLEGAL_MOD_OPERATION = 8311,
+ ERROR_DS_OBJ_TOO_LARGE = 8312,
+ ERROR_DS_BAD_INSTANCE_TYPE = 8313,
+ ERROR_DS_MASTERDSA_REQUIRED = 8314,
+ ERROR_DS_OBJECT_CLASS_REQUIRED = 8315,
+ ERROR_DS_MISSING_REQUIRED_ATT = 8316,
+ ERROR_DS_ATT_NOT_DEF_FOR_CLASS = 8317,
+ ERROR_DS_ATT_ALREADY_EXISTS = 8318,
+ ERROR_DS_CANT_ADD_ATT_VALUES = 8320,
+ ERROR_DS_SINGLE_VALUE_CONSTRAINT = 8321,
+ ERROR_DS_RANGE_CONSTRAINT = 8322,
+ ERROR_DS_ATT_VAL_ALREADY_EXISTS = 8323,
+ ERROR_DS_CANT_REM_MISSING_ATT = 8324,
+ ERROR_DS_CANT_REM_MISSING_ATT_VAL = 8325,
+ ERROR_DS_ROOT_CANT_BE_SUBREF = 8326,
+ ERROR_DS_NO_CHAINING = 8327,
+ ERROR_DS_NO_CHAINED_EVAL = 8328,
+ ERROR_DS_NO_PARENT_OBJECT = 8329,
+ ERROR_DS_PARENT_IS_AN_ALIAS = 8330,
+ ERROR_DS_CANT_MIX_MASTER_AND_REPS = 8331,
+ ERROR_DS_CHILDREN_EXIST = 8332,
+ ERROR_DS_OBJ_NOT_FOUND = 8333,
+ ERROR_DS_ALIASED_OBJ_MISSING = 8334,
+ ERROR_DS_BAD_NAME_SYNTAX = 8335,
+ ERROR_DS_ALIAS_POINTS_TO_ALIAS = 8336,
+ ERROR_DS_CANT_DEREF_ALIAS = 8337,
+ ERROR_DS_OUT_OF_SCOPE = 8338,
+ ERROR_DS_OBJECT_BEING_REMOVED = 8339,
+ ERROR_DS_CANT_DELETE_DSA_OBJ = 8340,
+ ERROR_DS_GENERIC_ERROR = 8341,
+ ERROR_DS_DSA_MUST_BE_INT_MASTER = 8342,
+ ERROR_DS_CLASS_NOT_DSA = 8343,
+ ERROR_DS_INSUFF_ACCESS_RIGHTS = 8344,
+ ERROR_DS_ILLEGAL_SUPERIOR = 8345,
+ ERROR_DS_ATTRIBUTE_OWNED_BY_SAM = 8346,
+ ERROR_DS_NAME_TOO_MANY_PARTS = 8347,
+ ERROR_DS_NAME_TOO_LONG = 8348,
+ ERROR_DS_NAME_VALUE_TOO_LONG = 8349,
+ ERROR_DS_NAME_UNPARSEABLE = 8350,
+ ERROR_DS_NAME_TYPE_UNKNOWN = 8351,
+ ERROR_DS_NOT_AN_OBJECT = 8352,
+ ERROR_DS_SEC_DESC_TOO_SHORT = 8353,
+ ERROR_DS_SEC_DESC_INVALID = 8354,
+ ERROR_DS_NO_DELETED_NAME = 8355,
+ ERROR_DS_SUBREF_MUST_HAVE_PARENT = 8356,
+ ERROR_DS_NCNAME_MUST_BE_NC = 8357,
+ ERROR_DS_CANT_ADD_SYSTEM_ONLY = 8358,
+ ERROR_DS_CLASS_MUST_BE_CONCRETE = 8359,
+ ERROR_DS_INVALID_DMD = 8360,
+ ERROR_DS_OBJ_GUID_EXISTS = 8361,
+ ERROR_DS_NOT_ON_BACKLINK = 8362,
+ ERROR_DS_NO_CROSSREF_FOR_NC = 8363,
+ ERROR_DS_SHUTTING_DOWN = 8364,
+ ERROR_DS_UNKNOWN_OPERATION = 8365,
+ ERROR_DS_INVALID_ROLE_OWNER = 8366,
+ ERROR_DS_COULDNT_CONTACT_FSMO = 8367,
+ ERROR_DS_CROSS_NC_DN_RENAME = 8368,
+ ERROR_DS_CANT_MOD_SYSTEM_ONLY = 8369,
+ ERROR_DS_REPLICATOR_ONLY = 8370,
+ ERROR_DS_OBJ_CLASS_NOT_DEFINED = 8371,
+ ERROR_DS_OBJ_CLASS_NOT_SUBCLASS = 8372,
+ ERROR_DS_NAME_REFERENCE_INVALID = 8373,
+ ERROR_DS_CROSS_REF_EXISTS = 8374,
+ ERROR_DS_CANT_DEL_MASTER_CROSSREF = 8375,
+ ERROR_DS_SUBTREE_NOTIFY_NOT_NC_HEAD = 8376,
+ ERROR_DS_NOTIFY_FILTER_TOO_COMPLEX = 8377,
+ ERROR_DS_DUP_RDN = 8378,
+ ERROR_DS_DUP_OID = 8379,
+ ERROR_DS_DUP_MAPI_ID = 8380,
+ ERROR_DS_DUP_SCHEMA_ID_GUID = 8381,
+ ERROR_DS_DUP_LDAP_DISPLAY_NAME = 8382,
+ ERROR_DS_SEMANTIC_ATT_TEST = 8383,
+ ERROR_DS_SYNTAX_MISMATCH = 8384,
+ ERROR_DS_EXISTS_IN_MUST_HAVE = 8385,
+ ERROR_DS_EXISTS_IN_MAY_HAVE = 8386,
+ ERROR_DS_NONEXISTENT_MAY_HAVE = 8387,
+ ERROR_DS_NONEXISTENT_MUST_HAVE = 8388,
+ ERROR_DS_AUX_CLS_TEST_FAIL = 8389,
+ ERROR_DS_NONEXISTENT_POSS_SUP = 8390,
+ ERROR_DS_SUB_CLS_TEST_FAIL = 8391,
+ ERROR_DS_BAD_RDN_ATT_ID_SYNTAX = 8392,
+ ERROR_DS_EXISTS_IN_AUX_CLS = 8393,
+ ERROR_DS_EXISTS_IN_SUB_CLS = 8394,
+ ERROR_DS_EXISTS_IN_POSS_SUP = 8395,
+ ERROR_DS_RECALCSCHEMA_FAILED = 8396,
+ ERROR_DS_TREE_DELETE_NOT_FINISHED = 8397,
+ ERROR_DS_CANT_DELETE = 8398,
+ ERROR_DS_ATT_SCHEMA_REQ_ID = 8399,
+ ERROR_DS_BAD_ATT_SCHEMA_SYNTAX = 8400,
+ ERROR_DS_CANT_CACHE_ATT = 8401,
+ ERROR_DS_CANT_CACHE_CLASS = 8402,
+ ERROR_DS_CANT_REMOVE_ATT_CACHE = 8403,
+ ERROR_DS_CANT_REMOVE_CLASS_CACHE = 8404,
+ ERROR_DS_CANT_RETRIEVE_DN = 8405,
+ ERROR_DS_MISSING_SUPREF = 8406,
+ ERROR_DS_CANT_RETRIEVE_INSTANCE = 8407,
+ ERROR_DS_CODE_INCONSISTENCY = 8408,
+ ERROR_DS_DATABASE_ERROR = 8409,
+ ERROR_DS_GOVERNSID_MISSING = 8410,
+ ERROR_DS_MISSING_EXPECTED_ATT = 8411,
+ ERROR_DS_NCNAME_MISSING_CR_REF = 8412,
+ ERROR_DS_SECURITY_CHECKING_ERROR = 8413,
+ ERROR_DS_SCHEMA_NOT_LOADED = 8414,
+ ERROR_DS_SCHEMA_ALLOC_FAILED = 8415,
+ ERROR_DS_ATT_SCHEMA_REQ_SYNTAX = 8416,
+ ERROR_DS_GCVERIFY_ERROR = 8417,
+ ERROR_DS_DRA_SCHEMA_MISMATCH = 8418,
+ ERROR_DS_CANT_FIND_DSA_OBJ = 8419,
+ ERROR_DS_CANT_FIND_EXPECTED_NC = 8420,
+ ERROR_DS_CANT_FIND_NC_IN_CACHE = 8421,
+ ERROR_DS_CANT_RETRIEVE_CHILD = 8422,
+ ERROR_DS_SECURITY_ILLEGAL_MODIFY = 8423,
+ ERROR_DS_CANT_REPLACE_HIDDEN_REC = 8424,
+ ERROR_DS_BAD_HIERARCHY_FILE = 8425,
+ ERROR_DS_BUILD_HIERARCHY_TABLE_FAILED = 8426,
+ ERROR_DS_CONFIG_PARAM_MISSING = 8427,
+ ERROR_DS_COUNTING_AB_INDICES_FAILED = 8428,
+ ERROR_DS_HIERARCHY_TABLE_MALLOC_FAILED = 8429,
+ ERROR_DS_INTERNAL_FAILURE = 8430,
+ ERROR_DS_UNKNOWN_ERROR = 8431,
+ ERROR_DS_ROOT_REQUIRES_CLASS_TOP = 8432,
+ ERROR_DS_REFUSING_FSMO_ROLES = 8433,
+ ERROR_DS_MISSING_FSMO_SETTINGS = 8434,
+ ERROR_DS_UNABLE_TO_SURRENDER_ROLES = 8435,
+ ERROR_DS_DRA_GENERIC = 8436,
+ ERROR_DS_DRA_INVALID_PARAMETER = 8437,
+ ERROR_DS_DRA_BUSY = 8438,
+ ERROR_DS_DRA_BAD_DN = 8439,
+ ERROR_DS_DRA_BAD_NC = 8440,
+ ERROR_DS_DRA_DN_EXISTS = 8441,
+ ERROR_DS_DRA_INTERNAL_ERROR = 8442,
+ ERROR_DS_DRA_INCONSISTENT_DIT = 8443,
+ ERROR_DS_DRA_CONNECTION_FAILED = 8444,
+ ERROR_DS_DRA_BAD_INSTANCE_TYPE = 8445,
+ ERROR_DS_DRA_OUT_OF_MEM = 8446,
+ ERROR_DS_DRA_MAIL_PROBLEM = 8447,
+ ERROR_DS_DRA_REF_ALREADY_EXISTS = 8448,
+ ERROR_DS_DRA_REF_NOT_FOUND = 8449,
+ ERROR_DS_DRA_OBJ_IS_REP_SOURCE = 8450,
+ ERROR_DS_DRA_DB_ERROR = 8451,
+ ERROR_DS_DRA_NO_REPLICA = 8452,
+ ERROR_DS_DRA_ACCESS_DENIED = 8453,
+ ERROR_DS_DRA_NOT_SUPPORTED = 8454,
+ ERROR_DS_DRA_RPC_CANCELLED = 8455,
+ ERROR_DS_DRA_SOURCE_DISABLED = 8456,
+ ERROR_DS_DRA_SINK_DISABLED = 8457,
+ ERROR_DS_DRA_NAME_COLLISION = 8458,
+ ERROR_DS_DRA_SOURCE_REINSTALLED = 8459,
+ ERROR_DS_DRA_MISSING_PARENT = 8460,
+ ERROR_DS_DRA_PREEMPTED = 8461,
+ ERROR_DS_DRA_ABANDON_SYNC = 8462,
+ ERROR_DS_DRA_SHUTDOWN = 8463,
+ ERROR_DS_DRA_INCOMPATIBLE_PARTIAL_SET = 8464,
+ ERROR_DS_DRA_SOURCE_IS_PARTIAL_REPLICA = 8465,
+ ERROR_DS_DRA_EXTN_CONNECTION_FAILED = 8466,
+ ERROR_DS_INSTALL_SCHEMA_MISMATCH = 8467,
+ ERROR_DS_DUP_LINK_ID = 8468,
+ ERROR_DS_NAME_ERROR_RESOLVING = 8469,
+ ERROR_DS_NAME_ERROR_NOT_FOUND = 8470,
+ ERROR_DS_NAME_ERROR_NOT_UNIQUE = 8471,
+ ERROR_DS_NAME_ERROR_NO_MAPPING = 8472,
+ ERROR_DS_NAME_ERROR_DOMAIN_ONLY = 8473,
+ ERROR_DS_NAME_ERROR_NO_SYNTACTICAL_MAPPING = 8474,
+ ERROR_DS_CONSTRUCTED_ATT_MOD = 8475,
+ ERROR_DS_WRONG_OM_OBJ_CLASS = 8476,
+ ERROR_DS_DRA_REPL_PENDING = 8477,
+ ERROR_DS_DS_REQUIRED = 8478,
+ ERROR_DS_INVALID_LDAP_DISPLAY_NAME = 8479,
+ ERROR_DS_NON_BASE_SEARCH = 8480,
+ ERROR_DS_CANT_RETRIEVE_ATTS = 8481,
+ ERROR_DS_BACKLINK_WITHOUT_LINK = 8482,
+ ERROR_DS_EPOCH_MISMATCH = 8483,
+ ERROR_DS_SRC_NAME_MISMATCH = 8484,
+ ERROR_DS_SRC_AND_DST_NC_IDENTICAL = 8485,
+ ERROR_DS_DST_NC_MISMATCH = 8486,
+ ERROR_DS_NOT_AUTHORITIVE_FOR_DST_NC = 8487,
+ ERROR_DS_SRC_GUID_MISMATCH = 8488,
+ ERROR_DS_CANT_MOVE_DELETED_OBJECT = 8489,
+ ERROR_DS_PDC_OPERATION_IN_PROGRESS = 8490,
+ ERROR_DS_CROSS_DOMAIN_CLEANUP_REQD = 8491,
+ ERROR_DS_ILLEGAL_XDOM_MOVE_OPERATION = 8492,
+ ERROR_DS_CANT_WITH_ACCT_GROUP_MEMBERSHPS = 8493,
+ ERROR_DS_NC_MUST_HAVE_NC_PARENT = 8494,
+ ERROR_DS_DST_DOMAIN_NOT_NATIVE = 8496,
+ ERROR_DS_MISSING_INFRASTRUCTURE_CONTAINER = 8497,
+ ERROR_DS_CANT_MOVE_ACCOUNT_GROUP = 8498,
+ ERROR_DS_CANT_MOVE_RESOURCE_GROUP = 8499,
+ ERROR_DS_INVALID_SEARCH_FLAG = 8500,
+ ERROR_DS_NO_TREE_DELETE_ABOVE_NC = 8501,
+ ERROR_DS_COULDNT_LOCK_TREE_FOR_DELETE = 8502,
+ ERROR_DS_COULDNT_IDENTIFY_OBJECTS_FOR_TREE_DELETE = 8503,
+ ERROR_DS_SAM_INIT_FAILURE = 8504,
+ ERROR_DS_SENSITIVE_GROUP_VIOLATION = 8505,
+ ERROR_DS_CANT_MOD_PRIMARYGROUPID = 8506,
+ ERROR_DS_ILLEGAL_BASE_SCHEMA_MOD = 8507,
+ ERROR_DS_NONSAFE_SCHEMA_CHANGE = 8508,
+ ERROR_DS_SCHEMA_UPDATE_DISALLOWED = 8509,
+ ERROR_DS_CANT_CREATE_UNDER_SCHEMA = 8510,
+ ERROR_DS_INSTALL_NO_SRC_SCH_VERSION = 8511,
+ ERROR_DS_INSTALL_NO_SCH_VERSION_IN_INIFILE = 8512,
+ ERROR_DS_INVALID_GROUP_TYPE = 8513,
+ ERROR_DS_NO_NEST_GLOBALGROUP_IN_MIXEDDOMAIN = 8514,
+ ERROR_DS_NO_NEST_LOCALGROUP_IN_MIXEDDOMAIN = 8515,
+ ERROR_DS_GLOBAL_CANT_HAVE_LOCAL_MEMBER = 8516,
+ ERROR_DS_GLOBAL_CANT_HAVE_UNIVERSAL_MEMBER = 8517,
+ ERROR_DS_UNIVERSAL_CANT_HAVE_LOCAL_MEMBER = 8518,
+ ERROR_DS_GLOBAL_CANT_HAVE_CROSSDOMAIN_MEMBER = 8519,
+ ERROR_DS_LOCAL_CANT_HAVE_CROSSDOMAIN_LOCAL_MEMBER = 8520,
+ ERROR_DS_HAVE_PRIMARY_MEMBERS = 8521,
+ ERROR_DS_STRING_SD_CONVERSION_FAILED = 8522,
+ ERROR_DS_NAMING_MASTER_GC = 8523,
+ ERROR_DS_LOOKUP_FAILURE = 8524,
+ ERROR_DS_COULDNT_UPDATE_SPNS = 8525,
+ ERROR_DS_CANT_RETRIEVE_SD = 8526,
+ ERROR_DS_KEY_NOT_UNIQUE = 8527,
+ ERROR_DS_WRONG_LINKED_ATT_SYNTAX = 8528,
+ ERROR_DS_SAM_NEED_BOOTKEY_PASSWORD = 8529,
+ ERROR_DS_SAM_NEED_BOOTKEY_FLOPPY = 8530,
+ ERROR_DS_CANT_START = 8531,
+ ERROR_DS_INIT_FAILURE = 8532,
+ ERROR_DS_NO_PKT_PRIVACY_ON_CONNECTION = 8533,
+ ERROR_DS_SOURCE_DOMAIN_IN_FOREST = 8534,
+ ERROR_DS_DESTINATION_DOMAIN_NOT_IN_FOREST = 8535,
+ ERROR_DS_DESTINATION_AUDITING_NOT_ENABLED = 8536,
+ ERROR_DS_CANT_FIND_DC_FOR_SRC_DOMAIN = 8537,
+ ERROR_DS_SRC_OBJ_NOT_GROUP_OR_USER = 8538,
+ ERROR_DS_SRC_SID_EXISTS_IN_FOREST = 8539,
+ ERROR_DS_SRC_AND_DST_OBJECT_CLASS_MISMATCH = 8540,
+ ERROR_SAM_INIT_FAILURE = 8541,
+ ERROR_DS_DRA_SCHEMA_INFO_SHIP = 8542,
+ ERROR_DS_DRA_SCHEMA_CONFLICT = 8543,
+ ERROR_DS_DRA_EARLIER_SCHEMA_CONLICT = 8544,
+ ERROR_DS_DRA_OBJ_NC_MISMATCH = 8545,
+ ERROR_DS_NC_STILL_HAS_DSAS = 8546,
+ ERROR_DS_GC_REQUIRED = 8547,
+ ERROR_DS_LOCAL_MEMBER_OF_LOCAL_ONLY = 8548,
+ ERROR_DS_NO_FPO_IN_UNIVERSAL_GROUPS = 8549,
+ ERROR_DS_CANT_ADD_TO_GC = 8550,
+ ERROR_DS_NO_CHECKPOINT_WITH_PDC = 8551,
+ ERROR_DS_SOURCE_AUDITING_NOT_ENABLED = 8552,
+ ERROR_DS_CANT_CREATE_IN_NONDOMAIN_NC = 8553,
+ ERROR_DS_INVALID_NAME_FOR_SPN = 8554,
+ ERROR_DS_FILTER_USES_CONTRUCTED_ATTRS = 8555,
+ ERROR_DS_UNICODEPWD_NOT_IN_QUOTES = 8556,
+ ERROR_DS_MACHINE_ACCOUNT_QUOTA_EXCEEDED = 8557,
+ ERROR_DS_MUST_BE_RUN_ON_DST_DC = 8558,
+ ERROR_DS_SRC_DC_MUST_BE_SP4_OR_GREATER = 8559,
+ ERROR_DS_CANT_TREE_DELETE_CRITICAL_OBJ = 8560,
+ ERROR_DS_INIT_FAILURE_CONSOLE = 8561,
+ ERROR_DS_SAM_INIT_FAILURE_CONSOLE = 8562,
+ ERROR_DS_FOREST_VERSION_TOO_HIGH = 8563,
+ ERROR_DS_DOMAIN_VERSION_TOO_HIGH = 8564,
+ ERROR_DS_FOREST_VERSION_TOO_LOW = 8565,
+ ERROR_DS_DOMAIN_VERSION_TOO_LOW = 8566,
+ ERROR_DS_INCOMPATIBLE_VERSION = 8567,
+ ERROR_DS_LOW_DSA_VERSION = 8568,
+ ERROR_DS_NO_BEHAVIOR_VERSION_IN_MIXEDDOMAIN = 8569,
+ ERROR_DS_NOT_SUPPORTED_SORT_ORDER = 8570,
+ ERROR_DS_NAME_NOT_UNIQUE = 8571,
+ ERROR_DS_MACHINE_ACCOUNT_CREATED_PRENT4 = 8572,
+ ERROR_DS_OUT_OF_VERSION_STORE = 8573,
+ ERROR_DS_INCOMPATIBLE_CONTROLS_USED = 8574,
+ ERROR_DS_NO_REF_DOMAIN = 8575,
+ ERROR_DS_RESERVED_LINK_ID = 8576,
+ ERROR_DS_LINK_ID_NOT_AVAILABLE = 8577,
+ ERROR_DS_AG_CANT_HAVE_UNIVERSAL_MEMBER = 8578,
+ ERROR_DS_MODIFYDN_DISALLOWED_BY_INSTANCE_TYPE = 8579,
+ ERROR_DS_NO_OBJECT_MOVE_IN_SCHEMA_NC = 8580,
+ ERROR_DS_MODIFYDN_DISALLOWED_BY_FLAG = 8581,
+ ERROR_DS_MODIFYDN_WRONG_GRANDPARENT = 8582,
+ ERROR_DS_NAME_ERROR_TRUST_REFERRAL = 8583,
+ ERROR_NOT_SUPPORTED_ON_STANDARD_SERVER = 8584,
+ ERROR_DS_CANT_ACCESS_REMOTE_PART_OF_AD = 8585,
+ ERROR_DS_CR_IMPOSSIBLE_TO_VALIDATE = 8586,
+ ERROR_DS_THREAD_LIMIT_EXCEEDED = 8587,
+ ERROR_DS_NOT_CLOSEST = 8588,
+ ERROR_DS_CANT_DERIVE_SPN_WITHOUT_SERVER_REF = 8589,
+ ERROR_DS_SINGLE_USER_MODE_FAILED = 8590,
+ ERROR_DS_NTDSCRIPT_SYNTAX_ERROR = 8591,
+ ERROR_DS_NTDSCRIPT_PROCESS_ERROR = 8592,
+ ERROR_DS_DIFFERENT_REPL_EPOCHS = 8593,
+ ERROR_DS_DRS_EXTENSIONS_CHANGED = 8594,
+ ERROR_DS_REPLICA_SET_CHANGE_NOT_ALLOWED_ON_DISABLED_CR = 8595,
+ ERROR_DS_NO_MSDS_INTID = 8596,
+ ERROR_DS_DUP_MSDS_INTID = 8597,
+ ERROR_DS_EXISTS_IN_RDNATTID = 8598,
+ ERROR_DS_AUTHORIZATION_FAILED = 8599,
+ ERROR_DS_INVALID_SCRIPT = 8600,
+ ERROR_DS_REMOTE_CROSSREF_OP_FAILED = 8601,
+ DNS_ERROR_RCODE_FORMAT_ERROR = 9001,
+ DNS_ERROR_RCODE_SERVER_FAILURE = 9002,
+ DNS_ERROR_RCODE_NAME_ERROR = 9003,
+ DNS_ERROR_RCODE_NOT_IMPLEMENTED = 9004,
+ DNS_ERROR_RCODE_REFUSED = 9005,
+ DNS_ERROR_RCODE_YXDOMAIN = 9006,
+ DNS_ERROR_RCODE_YXRRSET = 9007,
+ DNS_ERROR_RCODE_NXRRSET = 9008,
+ DNS_ERROR_RCODE_NOTAUTH = 9009,
+ DNS_ERROR_RCODE_NOTZONE = 9010,
+ DNS_ERROR_RCODE_BADSIG = 9016,
+ DNS_ERROR_RCODE_BADKEY = 9017,
+ DNS_ERROR_RCODE_BADTIME = 9018,
+ DNS_INFO_NO_RECORDS = 9501,
+ DNS_ERROR_BAD_PACKET = 9502,
+ DNS_ERROR_NO_PACKET = 9503,
+ DNS_ERROR_RCODE = 9504,
+ DNS_ERROR_UNSECURE_PACKET = 9505,
+ DNS_ERROR_INVALID_TYPE = 9551,
+ DNS_ERROR_INVALID_IP_ADDRESS = 9552,
+ DNS_ERROR_INVALID_PROPERTY = 9553,
+ DNS_ERROR_TRY_AGAIN_LATER = 9554,
+ DNS_ERROR_NOT_UNIQUE = 9555,
+ DNS_ERROR_NON_RFC_NAME = 9556,
+ DNS_STATUS_FQDN = 9557,
+ DNS_STATUS_DOTTED_NAME = 9558,
+ DNS_STATUS_SINGLE_PART_NAME = 9559,
+ DNS_ERROR_INVALID_NAME_CHAR = 9560,
+ DNS_ERROR_NUMERIC_NAME = 9561,
+ DNS_ERROR_NOT_ALLOWED_ON_ROOT_SERVER = 9562,
+ DNS_ERROR_ZONE_DOES_NOT_EXIST = 9601,
+ DNS_ERROR_NO_ZONE_INFO = 9602,
+ DNS_ERROR_INVALID_ZONE_OPERATION = 9603,
+ DNS_ERROR_ZONE_CONFIGURATION_ERROR = 9604,
+ DNS_ERROR_ZONE_HAS_NO_SOA_RECORD = 9605,
+ DNS_ERROR_ZONE_HAS_NO_NS_RECORDS = 9606,
+ DNS_ERROR_ZONE_LOCKED = 9607,
+ DNS_ERROR_ZONE_CREATION_FAILED = 9608,
+ DNS_ERROR_ZONE_ALREADY_EXISTS = 9609,
+ DNS_ERROR_AUTOZONE_ALREADY_EXISTS = 9610,
+ DNS_ERROR_INVALID_ZONE_TYPE = 9611,
+ DNS_ERROR_SECONDARY_REQUIRES_MASTER_IP = 9612,
+ DNS_ERROR_ZONE_NOT_SECONDARY = 9613,
+ DNS_ERROR_NEED_SECONDARY_ADDRESSES = 9614,
+ DNS_ERROR_WINS_INIT_FAILED = 9615,
+ DNS_ERROR_NEED_WINS_SERVERS = 9616,
+ DNS_ERROR_NBSTAT_INIT_FAILED = 9617,
+ DNS_ERROR_SOA_DELETE_INVALID = 9618,
+ DNS_ERROR_FORWARDER_ALREADY_EXISTS = 9619,
+ DNS_ERROR_ZONE_REQUIRES_MASTER_IP = 9620,
+ DNS_ERROR_ZONE_IS_SHUTDOWN = 9621,
+ DNS_ERROR_PRIMARY_REQUIRES_DATAFILE = 9651,
+ DNS_ERROR_INVALID_DATAFILE_NAME = 9652,
+ DNS_ERROR_DATAFILE_OPEN_FAILURE = 9653,
+ DNS_ERROR_FILE_WRITEBACK_FAILED = 9654,
+ DNS_ERROR_DATAFILE_PARSING = 9655,
+ DNS_ERROR_RECORD_DOES_NOT_EXIST = 9701,
+ DNS_ERROR_RECORD_FORMAT = 9702,
+ DNS_ERROR_NODE_CREATION_FAILED = 9703,
+ DNS_ERROR_UNKNOWN_RECORD_TYPE = 9704,
+ DNS_ERROR_RECORD_TIMED_OUT = 9705,
+ DNS_ERROR_NAME_NOT_IN_ZONE = 9706,
+ DNS_ERROR_CNAME_LOOP = 9707,
+ DNS_ERROR_NODE_IS_CNAME = 9708,
+ DNS_ERROR_CNAME_COLLISION = 9709,
+ DNS_ERROR_RECORD_ONLY_AT_ZONE_ROOT = 9710,
+ DNS_ERROR_RECORD_ALREADY_EXISTS = 9711,
+ DNS_ERROR_SECONDARY_DATA = 9712,
+ DNS_ERROR_NO_CREATE_CACHE_DATA = 9713,
+ DNS_ERROR_NAME_DOES_NOT_EXIST = 9714,
+ DNS_WARNING_PTR_CREATE_FAILED = 9715,
+ DNS_WARNING_DOMAIN_UNDELETED = 9716,
+ DNS_ERROR_DS_UNAVAILABLE = 9717,
+ DNS_ERROR_DS_ZONE_ALREADY_EXISTS = 9718,
+ DNS_ERROR_NO_BOOTFILE_IF_DS_ZONE = 9719,
+ DNS_INFO_AXFR_COMPLETE = 9751,
+ DNS_ERROR_AXFR = 9752,
+ DNS_INFO_ADDED_LOCAL_WINS = 9753,
+ DNS_STATUS_CONTINUE_NEEDED = 9801,
+ DNS_ERROR_NO_TCPIP = 9851,
+ DNS_ERROR_NO_DNS_SERVERS = 9852,
+ DNS_ERROR_DP_DOES_NOT_EXIST = 9901,
+ DNS_ERROR_DP_ALREADY_EXISTS = 9902,
+ DNS_ERROR_DP_NOT_ENLISTED = 9903,
+ DNS_ERROR_DP_ALREADY_ENLISTED = 9904,
+ WSAEINTR = 10004,
+ WSAEBADF = 10009,
+ WSAEACCES = 10013,
+ WSAEFAULT = 10014,
+ WSAEINVAL = 10022,
+ WSAEMFILE = 10024,
+ WSAEWOULDBLOCK = 10035,
+ WSAEINPROGRESS = 10036,
+ WSAEALREADY = 10037,
+ WSAENOTSOCK = 10038,
+ WSAEDESTADDRREQ = 10039,
+ WSAEMSGSIZE = 10040,
+ WSAEPROTOTYPE = 10041,
+ WSAENOPROTOOPT = 10042,
+ WSAEPROTONOSUPPORT = 10043,
+ WSAESOCKTNOSUPPORT = 10044,
+ WSAEOPNOTSUPP = 10045,
+ WSAEPFNOSUPPORT = 10046,
+ WSAEAFNOSUPPORT = 10047,
+ WSAEADDRINUSE = 10048,
+ WSAEADDRNOTAVAIL = 10049,
+ WSAENETDOWN = 10050,
+ WSAENETUNREACH = 10051,
+ WSAENETRESET = 10052,
+ WSAECONNABORTED = 10053,
+ WSAECONNRESET = 10054,
+ WSAENOBUFS = 10055,
+ WSAEISCONN = 10056,
+ WSAENOTCONN = 10057,
+ WSAESHUTDOWN = 10058,
+ WSAETOOMANYREFS = 10059,
+ WSAETIMEDOUT = 10060,
+ WSAECONNREFUSED = 10061,
+ WSAELOOP = 10062,
+ WSAENAMETOOLONG = 10063,
+ WSAEHOSTDOWN = 10064,
+ WSAEHOSTUNREACH = 10065,
+ WSAENOTEMPTY = 10066,
+ WSAEPROCLIM = 10067,
+ WSAEUSERS = 10068,
+ WSAEDQUOT = 10069,
+ WSAESTALE = 10070,
+ WSAEREMOTE = 10071,
+ WSASYSNOTREADY = 10091,
+ WSAVERNOTSUPPORTED = 10092,
+ WSANOTINITIALISED = 10093,
+ WSAEDISCON = 10101,
+ WSAENOMORE = 10102,
+ WSAECANCELLED = 10103,
+ WSAEINVALIDPROCTABLE = 10104,
+ WSAEINVALIDPROVIDER = 10105,
+ WSAEPROVIDERFAILEDINIT = 10106,
+ WSASYSCALLFAILURE = 10107,
+ WSASERVICE_NOT_FOUND = 10108,
+ WSATYPE_NOT_FOUND = 10109,
+ WSA_E_NO_MORE = 10110,
+ WSA_E_CANCELLED = 10111,
+ WSAEREFUSED = 10112,
+ WSAHOST_NOT_FOUND = 11001,
+ WSATRY_AGAIN = 11002,
+ WSANO_RECOVERY = 11003,
+ WSANO_DATA = 11004,
+ WSA_QOS_RECEIVERS = 11005,
+ WSA_QOS_SENDERS = 11006,
+ WSA_QOS_NO_SENDERS = 11007,
+ WSA_QOS_NO_RECEIVERS = 11008,
+ WSA_QOS_REQUEST_CONFIRMED = 11009,
+ WSA_QOS_ADMISSION_FAILURE = 11010,
+ WSA_QOS_POLICY_FAILURE = 11011,
+ WSA_QOS_BAD_STYLE = 11012,
+ WSA_QOS_BAD_OBJECT = 11013,
+ WSA_QOS_TRAFFIC_CTRL_ERROR = 11014,
+ WSA_QOS_GENERIC_ERROR = 11015,
+ WSA_QOS_ESERVICETYPE = 11016,
+ WSA_QOS_EFLOWSPEC = 11017,
+ WSA_QOS_EPROVSPECBUF = 11018,
+ WSA_QOS_EFILTERSTYLE = 11019,
+ WSA_QOS_EFILTERTYPE = 11020,
+ WSA_QOS_EFILTERCOUNT = 11021,
+ WSA_QOS_EOBJLENGTH = 11022,
+ WSA_QOS_EFLOWCOUNT = 11023,
+ WSA_QOS_EUNKNOWNPSOBJ = 11024,
+ WSA_QOS_EPOLICYOBJ = 11025,
+ WSA_QOS_EFLOWDESC = 11026,
+ WSA_QOS_EPSFLOWSPEC = 11027,
+ WSA_QOS_EPSFILTERSPEC = 11028,
+ WSA_QOS_ESDMODEOBJ = 11029,
+ WSA_QOS_ESHAPERATEOBJ = 11030,
+ WSA_QOS_RESERVED_PETYPE = 11031,
+ ERROR_IPSEC_QM_POLICY_EXISTS = 13000,
+ ERROR_IPSEC_QM_POLICY_NOT_FOUND = 13001,
+ ERROR_IPSEC_QM_POLICY_IN_USE = 13002,
+ ERROR_IPSEC_MM_POLICY_EXISTS = 13003,
+ ERROR_IPSEC_MM_POLICY_NOT_FOUND = 13004,
+ ERROR_IPSEC_MM_POLICY_IN_USE = 13005,
+ ERROR_IPSEC_MM_FILTER_EXISTS = 13006,
+ ERROR_IPSEC_MM_FILTER_NOT_FOUND = 13007,
+ ERROR_IPSEC_TRANSPORT_FILTER_EXISTS = 13008,
+ ERROR_IPSEC_TRANSPORT_FILTER_NOT_FOUND = 13009,
+ ERROR_IPSEC_MM_AUTH_EXISTS = 13010,
+ ERROR_IPSEC_MM_AUTH_NOT_FOUND = 13011,
+ ERROR_IPSEC_MM_AUTH_IN_USE = 13012,
+ ERROR_IPSEC_DEFAULT_MM_POLICY_NOT_FOUND = 13013,
+ ERROR_IPSEC_DEFAULT_MM_AUTH_NOT_FOUND = 13014,
+ ERROR_IPSEC_DEFAULT_QM_POLICY_NOT_FOUND = 13015,
+ ERROR_IPSEC_TUNNEL_FILTER_EXISTS = 13016,
+ ERROR_IPSEC_TUNNEL_FILTER_NOT_FOUND = 13017,
+ ERROR_IPSEC_MM_FILTER_PENDING_DELETION = 13018,
+ ERROR_IPSEC_TRANSPORT_FILTER_PENDING_DELETION = 13019,
+ ERROR_IPSEC_TUNNEL_FILTER_PENDING_DELETION = 13020,
+ ERROR_IPSEC_MM_POLICY_PENDING_DELETION = 13021,
+ ERROR_IPSEC_MM_AUTH_PENDING_DELETION = 13022,
+ ERROR_IPSEC_QM_POLICY_PENDING_DELETION = 13023,
+ ERROR_IPSEC_IKE_AUTH_FAIL = 13801,
+ ERROR_IPSEC_IKE_ATTRIB_FAIL = 13802,
+ ERROR_IPSEC_IKE_NEGOTIATION_PENDING = 13803,
+ ERROR_IPSEC_IKE_GENERAL_PROCESSING_ERROR = 13804,
+ ERROR_IPSEC_IKE_TIMED_OUT = 13805,
+ ERROR_IPSEC_IKE_NO_CERT = 13806,
+ ERROR_IPSEC_IKE_SA_DELETED = 13807,
+ ERROR_IPSEC_IKE_SA_REAPED = 13808,
+ ERROR_IPSEC_IKE_MM_ACQUIRE_DROP = 13809,
+ ERROR_IPSEC_IKE_QM_ACQUIRE_DROP = 13810,
+ ERROR_IPSEC_IKE_QUEUE_DROP_MM = 13811,
+ ERROR_IPSEC_IKE_QUEUE_DROP_NO_MM = 13812,
+ ERROR_IPSEC_IKE_DROP_NO_RESPONSE = 13813,
+ ERROR_IPSEC_IKE_MM_DELAY_DROP = 13814,
+ ERROR_IPSEC_IKE_QM_DELAY_DROP = 13815,
+ ERROR_IPSEC_IKE_ERROR = 13816,
+ ERROR_IPSEC_IKE_CRL_FAILED = 13817,
+ ERROR_IPSEC_IKE_INVALID_KEY_USAGE = 13818,
+ ERROR_IPSEC_IKE_INVALID_CERT_TYPE = 13819,
+ ERROR_IPSEC_IKE_NO_PRIVATE_KEY = 13820,
+ ERROR_IPSEC_IKE_DH_FAIL = 13822,
+ ERROR_IPSEC_IKE_INVALID_HEADER = 13824,
+ ERROR_IPSEC_IKE_NO_POLICY = 13825,
+ ERROR_IPSEC_IKE_INVALID_SIGNATURE = 13826,
+ ERROR_IPSEC_IKE_KERBEROS_ERROR = 13827,
+ ERROR_IPSEC_IKE_NO_PUBLIC_KEY = 13828,
+ ERROR_IPSEC_IKE_PROCESS_ERR = 13829,
+ ERROR_IPSEC_IKE_PROCESS_ERR_SA = 13830,
+ ERROR_IPSEC_IKE_PROCESS_ERR_PROP = 13831,
+ ERROR_IPSEC_IKE_PROCESS_ERR_TRANS = 13832,
+ ERROR_IPSEC_IKE_PROCESS_ERR_KE = 13833,
+ ERROR_IPSEC_IKE_PROCESS_ERR_ID = 13834,
+ ERROR_IPSEC_IKE_PROCESS_ERR_CERT = 13835,
+ ERROR_IPSEC_IKE_PROCESS_ERR_CERT_REQ = 13836,
+ ERROR_IPSEC_IKE_PROCESS_ERR_HASH = 13837,
+ ERROR_IPSEC_IKE_PROCESS_ERR_SIG = 13838,
+ ERROR_IPSEC_IKE_PROCESS_ERR_NONCE = 13839,
+ ERROR_IPSEC_IKE_PROCESS_ERR_NOTIFY = 13840,
+ ERROR_IPSEC_IKE_PROCESS_ERR_DELETE = 13841,
+ ERROR_IPSEC_IKE_PROCESS_ERR_VENDOR = 13842,
+ ERROR_IPSEC_IKE_INVALID_PAYLOAD = 13843,
+ ERROR_IPSEC_IKE_LOAD_SOFT_SA = 13844,
+ ERROR_IPSEC_IKE_SOFT_SA_TORN_DOWN = 13845,
+ ERROR_IPSEC_IKE_INVALID_COOKIE = 13846,
+ ERROR_IPSEC_IKE_NO_PEER_CERT = 13847,
+ ERROR_IPSEC_IKE_PEER_CRL_FAILED = 13848,
+ ERROR_IPSEC_IKE_POLICY_CHANGE = 13849,
+ ERROR_IPSEC_IKE_NO_MM_POLICY = 13850,
+ ERROR_IPSEC_IKE_NOTCBPRIV = 13851,
+ ERROR_IPSEC_IKE_SECLOADFAIL = 13852,
+ ERROR_IPSEC_IKE_FAILSSPINIT = 13853,
+ ERROR_IPSEC_IKE_FAILQUERYSSP = 13854,
+ ERROR_IPSEC_IKE_SRVACQFAIL = 13855,
+ ERROR_IPSEC_IKE_SRVQUERYCRED = 13856,
+ ERROR_IPSEC_IKE_GETSPIFAIL = 13857,
+ ERROR_IPSEC_IKE_INVALID_FILTER = 13858,
+ ERROR_IPSEC_IKE_OUT_OF_MEMORY = 13859,
+ ERROR_IPSEC_IKE_ADD_UPDATE_KEY_FAILED = 13860,
+ ERROR_IPSEC_IKE_INVALID_POLICY = 13861,
+ ERROR_IPSEC_IKE_UNKNOWN_DOI = 13862,
+ ERROR_IPSEC_IKE_INVALID_SITUATION = 13863,
+ ERROR_IPSEC_IKE_DH_FAILURE = 13864,
+ ERROR_IPSEC_IKE_INVALID_GROUP = 13865,
+ ERROR_IPSEC_IKE_ENCRYPT = 13866,
+ ERROR_IPSEC_IKE_DECRYPT = 13867,
+ ERROR_IPSEC_IKE_POLICY_MATCH = 13868,
+ ERROR_IPSEC_IKE_UNSUPPORTED_ID = 13869,
+ ERROR_IPSEC_IKE_INVALID_HASH = 13870,
+ ERROR_IPSEC_IKE_INVALID_HASH_ALG = 13871,
+ ERROR_IPSEC_IKE_INVALID_HASH_SIZE = 13872,
+ ERROR_IPSEC_IKE_INVALID_ENCRYPT_ALG = 13873,
+ ERROR_IPSEC_IKE_INVALID_AUTH_ALG = 13874,
+ ERROR_IPSEC_IKE_INVALID_SIG = 13875,
+ ERROR_IPSEC_IKE_LOAD_FAILED = 13876,
+ ERROR_IPSEC_IKE_RPC_DELETE = 13877,
+ ERROR_IPSEC_IKE_BENIGN_REINIT = 13878,
+ ERROR_IPSEC_IKE_INVALID_RESPONDER_LIFETIME_NOTIFY = 13879,
+ ERROR_IPSEC_IKE_INVALID_CERT_KEYLEN = 13881,
+ ERROR_IPSEC_IKE_MM_LIMIT = 13882,
+ ERROR_IPSEC_IKE_NEGOTIATION_DISABLED = 13883,
+ ERROR_IPSEC_IKE_NEG_STATUS_END = 13884,
+ ERROR_SXS_SECTION_NOT_FOUND = 14000,
+ ERROR_SXS_CANT_GEN_ACTCTX = 14001,
+ ERROR_SXS_INVALID_ACTCTXDATA_FORMAT = 14002,
+ ERROR_SXS_ASSEMBLY_NOT_FOUND = 14003,
+ ERROR_SXS_MANIFEST_FORMAT_ERROR = 14004,
+ ERROR_SXS_MANIFEST_PARSE_ERROR = 14005,
+ ERROR_SXS_ACTIVATION_CONTEXT_DISABLED = 14006,
+ ERROR_SXS_KEY_NOT_FOUND = 14007,
+ ERROR_SXS_VERSION_CONFLICT = 14008,
+ ERROR_SXS_WRONG_SECTION_TYPE = 14009,
+ ERROR_SXS_THREAD_QUERIES_DISABLED = 14010,
+ ERROR_SXS_PROCESS_DEFAULT_ALREADY_SET = 14011,
+ ERROR_SXS_UNKNOWN_ENCODING_GROUP = 14012,
+ ERROR_SXS_UNKNOWN_ENCODING = 14013,
+ ERROR_SXS_INVALID_XML_NAMESPACE_URI = 14014,
+ ERROR_SXS_ROOT_MANIFEST_DEPENDENCY_NOT_INSTALLED = 14015,
+ ERROR_SXS_LEAF_MANIFEST_DEPENDENCY_NOT_INSTALLED = 14016,
+ ERROR_SXS_INVALID_ASSEMBLY_IDENTITY_ATTRIBUTE = 14017,
+ ERROR_SXS_MANIFEST_MISSING_REQUIRED_DEFAULT_NAMESPACE = 14018,
+ ERROR_SXS_MANIFEST_INVALID_REQUIRED_DEFAULT_NAMESPACE = 14019,
+ ERROR_SXS_PRIVATE_MANIFEST_CROSS_PATH_WITH_REPARSE_POINT = 14020,
+ ERROR_SXS_DUPLICATE_DLL_NAME = 14021,
+ ERROR_SXS_DUPLICATE_WINDOWCLASS_NAME = 14022,
+ ERROR_SXS_DUPLICATE_CLSID = 14023,
+ ERROR_SXS_DUPLICATE_IID = 14024,
+ ERROR_SXS_DUPLICATE_TLBID = 14025,
+ ERROR_SXS_DUPLICATE_PROGID = 14026,
+ ERROR_SXS_DUPLICATE_ASSEMBLY_NAME = 14027,
+ ERROR_SXS_FILE_HASH_MISMATCH = 14028,
+ ERROR_SXS_POLICY_PARSE_ERROR = 14029,
+ ERROR_SXS_XML_E_MISSINGQUOTE = 14030,
+ ERROR_SXS_XML_E_COMMENTSYNTAX = 14031,
+ ERROR_SXS_XML_E_BADSTARTNAMECHAR = 14032,
+ ERROR_SXS_XML_E_BADNAMECHAR = 14033,
+ ERROR_SXS_XML_E_BADCHARINSTRING = 14034,
+ ERROR_SXS_XML_E_XMLDECLSYNTAX = 14035,
+ ERROR_SXS_XML_E_BADCHARDATA = 14036,
+ ERROR_SXS_XML_E_MISSINGWHITESPACE = 14037,
+ ERROR_SXS_XML_E_EXPECTINGTAGEND = 14038,
+ ERROR_SXS_XML_E_MISSINGSEMICOLON = 14039,
+ ERROR_SXS_XML_E_UNBALANCEDPAREN = 14040,
+ ERROR_SXS_XML_E_INTERNALERROR = 14041,
+ ERROR_SXS_XML_E_UNEXPECTED_WHITESPACE = 14042,
+ ERROR_SXS_XML_E_INCOMPLETE_ENCODING = 14043,
+ ERROR_SXS_XML_E_MISSING_PAREN = 14044,
+ ERROR_SXS_XML_E_EXPECTINGCLOSEQUOTE = 14045,
+ ERROR_SXS_XML_E_MULTIPLE_COLONS = 14046,
+ ERROR_SXS_XML_E_INVALID_DECIMAL = 14047,
+ ERROR_SXS_XML_E_INVALID_HEXIDECIMAL = 14048,
+ ERROR_SXS_XML_E_INVALID_UNICODE = 14049,
+ ERROR_SXS_XML_E_WHITESPACEORQUESTIONMARK = 14050,
+ ERROR_SXS_XML_E_UNEXPECTEDENDTAG = 14051,
+ ERROR_SXS_XML_E_UNCLOSEDTAG = 14052,
+ ERROR_SXS_XML_E_DUPLICATEATTRIBUTE = 14053,
+ ERROR_SXS_XML_E_MULTIPLEROOTS = 14054,
+ ERROR_SXS_XML_E_INVALIDATROOTLEVEL = 14055,
+ ERROR_SXS_XML_E_BADXMLDECL = 14056,
+ ERROR_SXS_XML_E_MISSINGROOT = 14057,
+ ERROR_SXS_XML_E_UNEXPECTEDEOF = 14058,
+ ERROR_SXS_XML_E_BADPEREFINSUBSET = 14059,
+ ERROR_SXS_XML_E_UNCLOSEDSTARTTAG = 14060,
+ ERROR_SXS_XML_E_UNCLOSEDENDTAG = 14061,
+ ERROR_SXS_XML_E_UNCLOSEDSTRING = 14062,
+ ERROR_SXS_XML_E_UNCLOSEDCOMMENT = 14063,
+ ERROR_SXS_XML_E_UNCLOSEDDECL = 14064,
+ ERROR_SXS_XML_E_UNCLOSEDCDATA = 14065,
+ ERROR_SXS_XML_E_RESERVEDNAMESPACE = 14066,
+ ERROR_SXS_XML_E_INVALIDENCODING = 14067,
+ ERROR_SXS_XML_E_INVALIDSWITCH = 14068,
+ ERROR_SXS_XML_E_BADXMLCASE = 14069,
+ ERROR_SXS_XML_E_INVALID_STANDALONE = 14070,
+ ERROR_SXS_XML_E_UNEXPECTED_STANDALONE = 14071,
+ ERROR_SXS_XML_E_INVALID_VERSION = 14072,
+ ERROR_SXS_XML_E_MISSINGEQUALS = 14073,
+ ERROR_SXS_PROTECTION_RECOVERY_FAILED = 14074,
+ ERROR_SXS_PROTECTION_PUBLIC_KEY_TOO_SHORT = 14075,
+ ERROR_SXS_PROTECTION_CATALOG_NOT_VALID = 14076,
+ ERROR_SXS_UNTRANSLATABLE_HRESULT = 14077,
+ ERROR_SXS_PROTECTION_CATALOG_FILE_MISSING = 14078,
+ ERROR_SXS_MISSING_ASSEMBLY_IDENTITY_ATTRIBUTE = 14079,
+ ERROR_SXS_INVALID_ASSEMBLY_IDENTITY_ATTRIBUTE_NAME = 14080,
+} WapiError;
+
+extern guint32 GetLastError(void);
+extern void SetLastError(guint32 code);
+
+#endif /* _WAPI_ERROR_H_ */
diff --git a/mono/io-layer/handles-private.h b/mono/io-layer/handles-private.h
new file mode 100644
index 00000000000..1cf0d068759
--- /dev/null
+++ b/mono/io-layer/handles-private.h
@@ -0,0 +1,9 @@
+#ifndef _WAPI_HANDLES_PRIVATE_H_
+#define _WAPI_HANDLES_PRIVATE_H_
+
+#include <config.h>
+#include <glib.h>
+
+extern guint32 _wapi_handle_count_signalled(GPtrArray *handles);
+
+#endif /* _WAPI_HANDLES_PRIVATE_H_ */
diff --git a/mono/io-layer/handles.c b/mono/io-layer/handles.c
new file mode 100644
index 00000000000..5901544cdc8
--- /dev/null
+++ b/mono/io-layer/handles.c
@@ -0,0 +1,67 @@
+#include <config.h>
+#include <glib.h>
+
+#include "mono/io-layer/wapi.h"
+#include "wapi-private.h"
+#include "handles-private.h"
+
+guint32 _wapi_handle_count_signalled(GPtrArray *handles)
+{
+ guint32 i, ret=0;
+
+ /* Count how many of the interesting thread handles are signalled */
+ for(i=0; i<handles->len; i++) {
+ WapiHandle *handle;
+
+ handle=(WapiHandle *)g_ptr_array_index(handles, i);
+#ifdef DEBUG
+ g_message(G_GNUC_PRETTY_FUNCTION ": Checking handle %p",
+ handle);
+#endif
+
+ if(handle->signalled==TRUE) {
+#ifdef DEBUG
+ g_message(G_GNUC_PRETTY_FUNCTION
+ ": Thread %p signalled", handle);
+#endif
+ ret++;
+ }
+ }
+
+#ifdef DEBUG
+ g_message(G_GNUC_PRETTY_FUNCTION ": %d signalled handles", ret);
+#endif
+
+ return(ret);
+}
+
+/**
+ * CloseHandle:
+ * @handle: The handle to release
+ *
+ * Closes and invalidates @handle, releasing any resources it
+ * consumes. When the last handle to a temporary or non-persistent
+ * object is closed, that object can be deleted. Closing the same
+ * handle twice is an error.
+ *
+ * Return value: %TRUE on success, %FALSE otherwise.
+ */
+gboolean CloseHandle(WapiHandle *handle)
+{
+ g_return_val_if_fail(handle->ref>0, FALSE);
+
+ handle->ref--;
+ if(handle->ref==0) {
+ if(handle->ops->close!=NULL) {
+ handle->ops->close(handle);
+ }
+
+ g_free(handle); /* maybe this should be in
+ * ops, cuurently ops->close()
+ * is being used to free
+ * handle data
+ */
+ }
+
+ return(TRUE);
+}
diff --git a/mono/io-layer/handles.h b/mono/io-layer/handles.h
new file mode 100644
index 00000000000..a7f8cd4b222
--- /dev/null
+++ b/mono/io-layer/handles.h
@@ -0,0 +1,10 @@
+#ifndef _WAPI_HANDLES_H_
+#define _WAPI_HANDLES_H_
+
+#define INVALID_HANDLE_VALUE (WapiHandle *)-1
+
+typedef struct _WapiHandle WapiHandle;
+
+extern gboolean CloseHandle(WapiHandle *handle);
+
+#endif /* _WAPI_HANDLES_H_ */
diff --git a/mono/io-layer/io-layer-dummy.c b/mono/io-layer/io-layer-dummy.c
new file mode 100644
index 00000000000..d0d088fa433
--- /dev/null
+++ b/mono/io-layer/io-layer-dummy.c
@@ -0,0 +1,2 @@
+extern char *_mono_iolayer_dummylib;
+char *_mono_iolayer_dummylib="This is a dummy library that isn't needed on Windows";
diff --git a/mono/io-layer/io-layer.h b/mono/io-layer/io-layer.h
new file mode 100644
index 00000000000..4dc10ffc494
--- /dev/null
+++ b/mono/io-layer/io-layer.h
@@ -0,0 +1,21 @@
+#ifndef _MONO_IOLAYER_IOLAYER_H_
+#define _MONO_IOLAYER_IOLAYER_H_
+
+#include <config.h>
+
+#if defined(PLATFORM_WIN32_NATIVE)
+/* Native win32 */
+#define UNICODE
+#define _UNICODE
+#include <windows.h>
+#elif defined(PLATFORM_WIN32)
+/* Cygwin */
+#define UNICODE
+#define _UNICODE
+#include <w32api/windows.h>
+#else /* EVERYONE ELSE */
+#include "mono/io-layer/wapi.h"
+#include "mono/io-layer/uglify.h"
+#endif /* PLATFORM_WIN32_NATIVE */
+
+#endif /* _MONO_IOLAYER_IOLAYER_H_ */
diff --git a/mono/io-layer/io.c b/mono/io-layer/io.c
new file mode 100644
index 00000000000..7c89d7525b2
--- /dev/null
+++ b/mono/io-layer/io.c
@@ -0,0 +1,820 @@
+#include <config.h>
+#include <glib.h>
+#include <fcntl.h>
+#include <unistd.h>
+#include <errno.h>
+#include <string.h>
+#include <sys/poll.h>
+#include <sys/stat.h>
+
+#include "mono/io-layer/wapi.h"
+#include "unicode.h"
+#include "wapi-private.h"
+
+#define DEBUG
+
+/* Currently used for both FILE and CONSOLE handle types. This may
+ * have to change in future.
+ */
+struct _WapiHandle_file
+{
+ WapiHandle handle;
+ int fd;
+ WapiSecurityAttributes *security_attributes;
+ guint32 fileaccess;
+ guint32 sharemode;
+ guint32 attrs;
+};
+
+static void file_close(WapiHandle *handle);
+static WapiFileType file_getfiletype(void);
+static gboolean file_read(WapiHandle *handle, gpointer buffer,
+ guint32 numbytes, guint32 *bytesread,
+ WapiOverlapped *overlapped);
+static gboolean file_write(WapiHandle *handle, gconstpointer buffer,
+ guint32 numbytes, guint32 *byteswritten,
+ WapiOverlapped *overlapped);
+static guint32 file_seek(WapiHandle *handle, gint32 movedistance,
+ gint32 *highmovedistance, WapiSeekMethod method);
+static gboolean file_setendoffile(WapiHandle *handle);
+static guint32 file_getfilesize(WapiHandle *handle, guint32 *highsize);
+
+/* File handle is only signalled for overlapped IO */
+static struct _WapiHandleOps file_ops = {
+ file_close, /* close */
+ file_getfiletype, /* getfiletype */
+ file_read, /* readfile */
+ file_write, /* writefile */
+ file_seek, /* seek */
+ file_setendoffile, /* setendoffile */
+ file_getfilesize, /* getfilesize */
+ NULL, /* wait */
+ NULL, /* wait_multiple */
+};
+
+static WapiFileType console_getfiletype(void);
+
+/* Console is mostly the same as file, except it can block waiting for
+ * input or output
+ */
+static struct _WapiHandleOps console_ops = {
+ file_close, /* close */
+ console_getfiletype, /* getfiletype */
+ file_read, /* readfile */
+ file_write, /* writefile */
+ NULL, /* seek */
+ NULL, /* setendoffile */
+ NULL, /* getfilesize */
+ NULL, /* FIXME: wait */
+ NULL, /* FIXME: wait_multiple */
+};
+
+static void file_close(WapiHandle *handle)
+{
+ struct _WapiHandle_file *file_handle=(struct _WapiHandle_file *)handle;
+
+#ifdef DEBUG
+ g_message(G_GNUC_PRETTY_FUNCTION ": closing file handle %p with fd %d",
+ file_handle, file_handle->fd);
+#endif
+
+ close(file_handle->fd);
+}
+
+static WapiFileType file_getfiletype(void)
+{
+ return(FILE_TYPE_DISK);
+}
+
+static gboolean file_read(WapiHandle *handle, gpointer buffer,
+ guint32 numbytes, guint32 *bytesread,
+ WapiOverlapped *overlapped G_GNUC_UNUSED)
+{
+ struct _WapiHandle_file *file_handle=(struct _WapiHandle_file *)handle;
+ int ret;
+
+ if(bytesread!=NULL) {
+ *bytesread=0;
+ }
+
+ if(!(file_handle->fileaccess&GENERIC_READ) &&
+ !(file_handle->fileaccess&GENERIC_ALL)) {
+#ifdef DEBUG
+ g_message(G_GNUC_PRETTY_FUNCTION ": handle %p fd %d doesn't have GENERIC_READ access: %u", handle, file_handle->fd, file_handle->fileaccess);
+#endif
+
+ return(FALSE);
+ }
+
+ ret=read(file_handle->fd, buffer, numbytes);
+ if(ret==-1) {
+#ifdef DEBUG
+ g_message(G_GNUC_PRETTY_FUNCTION
+ ": read of handle %p fd %d error: %s", handle,
+ file_handle->fd, strerror(errno));
+#endif
+
+ return(FALSE);
+ }
+
+ if(bytesread!=NULL) {
+ *bytesread=ret;
+ }
+
+ return(TRUE);
+}
+
+static gboolean file_write(WapiHandle *handle, gconstpointer buffer,
+ guint32 numbytes, guint32 *byteswritten,
+ WapiOverlapped *overlapped G_GNUC_UNUSED)
+{
+ struct _WapiHandle_file *file_handle=(struct _WapiHandle_file *)handle;
+ int ret;
+
+ if(byteswritten!=NULL) {
+ *byteswritten=0;
+ }
+
+ if(!(file_handle->fileaccess&GENERIC_WRITE) &&
+ !(file_handle->fileaccess&GENERIC_ALL)) {
+#ifdef DEBUG
+ g_message(G_GNUC_PRETTY_FUNCTION ": handle %p fd %d doesn't have GENERIC_WRITE access: %u", handle, file_handle->fd, file_handle->fileaccess);
+#endif
+
+ return(FALSE);
+ }
+
+ ret=write(file_handle->fd, buffer, numbytes);
+ if(ret==-1) {
+#ifdef DEBUG
+ g_message(G_GNUC_PRETTY_FUNCTION
+ ": write of handle %p fd %d error: %s", handle,
+ file_handle->fd, strerror(errno));
+#endif
+
+ return(FALSE);
+ }
+ if(byteswritten!=NULL) {
+ *byteswritten=ret;
+ }
+
+ return(TRUE);
+}
+
+static guint32 file_seek(WapiHandle *handle, gint32 movedistance,
+ gint32 *highmovedistance, WapiSeekMethod method)
+{
+ struct _WapiHandle_file *file_handle=(struct _WapiHandle_file *)handle;
+ off_t offset, newpos;
+ int whence;
+ guint32 ret;
+
+ if(!(file_handle->fileaccess&GENERIC_READ) &&
+ !(file_handle->fileaccess&GENERIC_WRITE) &&
+ !(file_handle->fileaccess&GENERIC_ALL)) {
+#ifdef DEBUG
+ g_message(G_GNUC_PRETTY_FUNCTION ": handle %p fd %d doesn't have GENERIC_READ or GENERIC_WRITE access: %u", handle, file_handle->fd, file_handle->fileaccess);
+#endif
+
+ return(INVALID_SET_FILE_POINTER);
+ }
+
+ switch(method) {
+ case FILE_BEGIN:
+ whence=SEEK_SET;
+ break;
+ case FILE_CURRENT:
+ whence=SEEK_CUR;
+ break;
+ case FILE_END:
+ whence=SEEK_END;
+ break;
+ default:
+#ifdef DEBUG
+ g_message(G_GNUC_PRETTY_FUNCTION ": invalid seek type %d",
+ method);
+#endif
+
+ return(INVALID_SET_FILE_POINTER);
+ }
+
+#ifdef HAVE_LARGE_FILE_SUPPORT
+ if(highmovedistance==NULL) {
+ offset=movedistance;
+ } else {
+ offset=*highmovedistance;
+ offset<<=32;
+ offset+=movedistance;
+ }
+#else
+ offset=movedistance;
+#endif
+
+#ifdef DEBUG
+#ifdef HAVE_LARGE_FILE_SUPPORT
+ g_message(G_GNUC_PRETTY_FUNCTION
+ ": moving handle %p fd %d by %lld bytes from %d", handle,
+ file_handle->fd, offset, whence);
+#else
+ g_message(G_GNUC_PRETTY_FUNCTION
+ ": moving handle %p fd %d by %ld bytes from %d", handle,
+ file_handle->fd, offset, whence);
+#endif
+#endif
+
+ newpos=lseek(file_handle->fd, offset, whence);
+ if(newpos==-1) {
+#ifdef DEBUG
+ g_message(G_GNUC_PRETTY_FUNCTION
+ ": lseek on handle %p fd %d returned error %s",
+ handle, file_handle->fd, strerror(errno));
+#endif
+
+ return(INVALID_SET_FILE_POINTER);
+ }
+
+#ifdef DEBUG
+#ifdef HAVE_LARGE_FILE_SUPPORT
+ g_message(G_GNUC_PRETTY_FUNCTION ": lseek returns %lld", newpos);
+#else
+ g_message(G_GNUC_PRETTY_FUNCTION ": lseek returns %ld", newpos);
+#endif
+#endif
+
+#ifdef HAVE_LARGE_FILE_SUPPORT
+ ret=newpos & 0xFFFFFFFF;
+ if(highmovedistance!=NULL) {
+ *highmovedistance=newpos>>32;
+ }
+#else
+ ret=newpos;
+ if(highmovedistance!=NULL) {
+ /* Accurate, but potentially dodgy :-) */
+ *highmovedistance=0;
+ }
+#endif
+
+#ifdef DEBUG
+ g_message(G_GNUC_PRETTY_FUNCTION
+ ": move of handle %p fd %d returning %d/%d", handle,
+ file_handle->fd, ret,
+ highmovedistance==NULL?0:*highmovedistance);
+#endif
+
+ return(ret);
+}
+
+static gboolean file_setendoffile(WapiHandle *handle)
+{
+ struct _WapiHandle_file *file_handle=(struct _WapiHandle_file *)handle;
+ struct stat statbuf;
+ off_t size, pos;
+ int ret;
+
+ if(!(file_handle->fileaccess&GENERIC_WRITE) &&
+ !(file_handle->fileaccess&GENERIC_ALL)) {
+#ifdef DEBUG
+ g_message(G_GNUC_PRETTY_FUNCTION ": handle %p fd %d doesn't have GENERIC_WRITE access: %u", handle, file_handle->fd, file_handle->fileaccess);
+#endif
+
+ return(FALSE);
+ }
+
+ /* Find the current file position, and the file length. If
+ * the file position is greater than the length, write to
+ * extend the file with a hole. If the file position is less
+ * than the length, truncate the file.
+ */
+
+ ret=fstat(file_handle->fd, &statbuf);
+ if(ret==-1) {
+#ifdef DEBUG
+ g_message(G_GNUC_PRETTY_FUNCTION
+ ": handle %p fd %d fstat failed: %s", handle,
+ file_handle->fd, strerror(errno));
+#endif
+
+ return(FALSE);
+ }
+ size=statbuf.st_size;
+
+ pos=lseek(file_handle->fd, (off_t)0, SEEK_CUR);
+ if(pos==-1) {
+#ifdef DEBUG
+ g_message(G_GNUC_PRETTY_FUNCTION
+ ": handle %p fd %d lseek failed: %s", handle,
+ file_handle->fd, strerror(errno));
+#endif
+
+ return(FALSE);
+ }
+
+ if(pos>size) {
+ /* extend */
+ ret=write(file_handle->fd, "", 1);
+ if(ret==-1) {
+#ifdef DEBUG
+ g_message(G_GNUC_PRETTY_FUNCTION
+ ": handle %p fd %d extend write failed: %s",
+ handle, file_handle->fd, strerror(errno));
+#endif
+
+ return(FALSE);
+ }
+ }
+
+ /* always truncate, because the extend write() adds an extra
+ * byte to the end of the file
+ */
+ ret=ftruncate(file_handle->fd, pos);
+ if(ret==-1) {
+#ifdef DEBUG
+ g_message(G_GNUC_PRETTY_FUNCTION
+ ": handle %p fd %d ftruncate failed: %s", handle,
+ file_handle->fd, strerror(errno));
+#endif
+
+ return(FALSE);
+ }
+
+ return(TRUE);
+}
+
+static guint32 file_getfilesize(WapiHandle *handle, guint32 *highsize)
+{
+ struct _WapiHandle_file *file_handle=(struct _WapiHandle_file *)handle;
+ struct stat statbuf;
+ guint32 size;
+ int ret;
+
+ if(!(file_handle->fileaccess&GENERIC_READ) &&
+ !(file_handle->fileaccess&GENERIC_WRITE) &&
+ !(file_handle->fileaccess&GENERIC_ALL)) {
+#ifdef DEBUG
+ g_message(G_GNUC_PRETTY_FUNCTION ": handle %p fd %d doesn't have GENERIC_READ or GENERIC_WRITE access: %u", handle, file_handle->fd, file_handle->fileaccess);
+#endif
+
+ return(INVALID_FILE_SIZE);
+ }
+
+ ret=fstat(file_handle->fd, &statbuf);
+ if(ret==-1) {
+#ifdef DEBUG
+ g_message(G_GNUC_PRETTY_FUNCTION
+ ": handle %p fd %d fstat failed: %s", handle,
+ file_handle->fd, strerror(errno));
+#endif
+
+ return(INVALID_FILE_SIZE);
+ }
+
+#ifdef HAVE_LARGE_FILE_SUPPORT
+ size=statbuf.st_size & 0xFFFFFFFF;
+ if(highsize!=NULL) {
+ *highsize=statbuf.st_size>>32;
+ }
+#else
+ if(highsize!=NULL) {
+ /* Accurate, but potentially dodgy :-) */
+ *highsize=0;
+ }
+ size=statbuf.st_size;
+#endif
+
+#ifdef DEBUG
+ g_message(G_GNUC_PRETTY_FUNCTION ": Returning size %d/%d", size,
+ *highsize);
+#endif
+
+ return(size);
+}
+
+static WapiFileType console_getfiletype(void)
+{
+ return(FILE_TYPE_CHAR);
+}
+
+static int convert_flags(guint32 fileaccess, guint32 createmode)
+{
+ int flags=0;
+
+ switch(fileaccess) {
+ case GENERIC_READ:
+ flags=O_RDONLY;
+ break;
+ case GENERIC_WRITE:
+ flags=O_WRONLY;
+ break;
+ case GENERIC_READ|GENERIC_WRITE:
+ flags=O_RDWR;
+ break;
+ default:
+#ifdef DEBUG
+ g_message(G_GNUC_PRETTY_FUNCTION ": Unknown access type 0x%x",
+ fileaccess);
+#endif
+ break;
+ }
+
+ switch(createmode) {
+ case CREATE_NEW:
+ flags|=O_CREAT|O_EXCL;
+ break;
+ case CREATE_ALWAYS:
+ flags|=O_CREAT|O_TRUNC;
+ break;
+ case OPEN_EXISTING:
+ break;
+ case OPEN_ALWAYS:
+ flags|=O_CREAT;
+ break;
+ case TRUNCATE_EXISTING:
+ flags|=O_TRUNC;
+ break;
+ default:
+#ifdef DEBUG
+ g_message(G_GNUC_PRETTY_FUNCTION ": Unknown create mode 0x%x",
+ createmode);
+#endif
+ break;
+ }
+
+ return(flags);
+}
+
+static guint32 convert_from_flags(int flags)
+{
+ guint32 fileaccess=0;
+
+ if(flags&O_RDONLY) {
+ fileaccess=GENERIC_READ;
+ } else if (flags&O_WRONLY) {
+ fileaccess=GENERIC_WRITE;
+ } else if (flags&O_RDWR) {
+ fileaccess=GENERIC_READ|GENERIC_WRITE;
+ } else {
+#ifdef DEBUG
+ g_message(G_GNUC_PRETTY_FUNCTION
+ ": Can't figure out flags 0x%x", flags);
+#endif
+ }
+
+ /* Maybe sort out create mode too */
+
+ return(fileaccess);
+}
+
+static mode_t convert_perms(guint32 sharemode)
+{
+ mode_t perms=0600;
+
+ if(sharemode&FILE_SHARE_READ) {
+ perms|=044;
+ }
+ if(sharemode&FILE_SHARE_WRITE) {
+ perms|=022;
+ }
+
+ return(perms);
+}
+
+
+/**
+ * CreateFile:
+ * @name: a pointer to a NULL-terminated unicode string, that names
+ * the file or other object to create.
+ * @fileaccess: specifies the file access mode
+ * @sharemode: whether the file should be shared. This parameter is
+ * currently ignored.
+ * @security: Ignored for now.
+ * @createmode: specifies whether to create a new file, whether to
+ * overwrite an existing file, whether to truncate the file, etc.
+ * @attrs: specifies file attributes and flags. On win32 attributes
+ * are characteristics of the file, not the handle, and are ignored
+ * when an existing file is opened. Flags give the library hints on
+ * how to process a file to optimise performance.
+ * @template: the handle of an open %GENERIC_READ file that specifies
+ * attributes to apply to a newly created file, ignoring @attrs.
+ * Normally this parameter is NULL. This parameter is ignored when an
+ * existing file is opened.
+ *
+ * Creates a new file handle. This only applies to normal files:
+ * pipes are handled by CreatePipe(), and console handles are created
+ * with GetStdHandle().
+ *
+ * Return value: the new handle, or %INVALID_HANDLE_VALUE on error.
+ */
+WapiHandle *CreateFile(const guchar *name, guint32 fileaccess,
+ guint32 sharemode, WapiSecurityAttributes *security,
+ guint32 createmode, guint32 attrs,
+ WapiHandle *template G_GNUC_UNUSED)
+{
+ struct _WapiHandle_file *file_handle;
+ WapiHandle *handle;
+ int flags=convert_flags(fileaccess, createmode);
+ mode_t perms=convert_perms(sharemode);
+ guchar *filename;
+ int ret;
+
+ if(name==NULL) {
+#ifdef DEBUG
+ g_message(G_GNUC_PRETTY_FUNCTION ": name is NULL");
+#endif
+
+ return(INVALID_HANDLE_VALUE);
+ }
+
+ filename=_wapi_unicode_to_utf8(name);
+#ifdef ACTUALLY_DO_UNICODE
+ if(filename==NULL) {
+#ifdef DEBUG
+ g_message(G_GNUC_PRETTY_FUNCTION
+ ": unicode conversion returned NULL");
+#endif
+
+ return(INVALID_HANDLE_VALUE);
+ }
+#endif
+
+#ifdef ACTUALLY_DO_UNICODE
+ ret=open(filename, flags, perms);
+#else
+ ret=open(name, flags, perms);
+#endif
+
+ g_free(filename);
+
+ if(ret==-1) {
+#ifdef DEBUG
+ g_message(G_GNUC_PRETTY_FUNCTION ": Error opening file: %s",
+ strerror(errno));
+#endif
+ return(INVALID_HANDLE_VALUE);
+ }
+
+ file_handle=g_new0(struct _WapiHandle_file, 1);
+ handle=(WapiHandle *)file_handle;
+
+ _WAPI_HANDLE_INIT(handle, WAPI_HANDLE_FILE, file_ops);
+
+ file_handle->fd=ret;
+ file_handle->security_attributes=security;
+ file_handle->fileaccess=fileaccess;
+ file_handle->sharemode=sharemode;
+ file_handle->attrs=attrs;
+
+#ifdef DEBUG
+ g_message(G_GNUC_PRETTY_FUNCTION ": returning handle %p with fd %d",
+ handle, file_handle->fd);
+#endif
+
+ return(handle);
+}
+
+/**
+ * GetStdHandle:
+ * @stdhandle: specifies the file descriptor
+ *
+ * Returns a handle for stdin, stdout, or stderr. Always returns the
+ * same handle for the same @stdhandle.
+ *
+ * Return value: the handle, or %INVALID_HANDLE_VALUE on error
+ */
+WapiHandle *GetStdHandle(WapiStdHandle stdhandle)
+{
+ struct _WapiHandle_file *file_handle;
+ WapiHandle *handle;
+ int flags, fd;
+
+ switch(stdhandle) {
+ case STD_INPUT_HANDLE:
+ fd=0;
+ break;
+
+ case STD_OUTPUT_HANDLE:
+ fd=1;
+ break;
+
+ case STD_ERROR_HANDLE:
+ fd=2;
+ break;
+
+ default:
+#ifdef DEBUG
+ g_message(G_GNUC_PRETTY_FUNCTION
+ ": unknown standard handle type");
+#endif
+
+ return(INVALID_HANDLE_VALUE);
+ }
+
+ /* Check if fd is valid */
+ flags=fcntl(fd, F_GETFL);
+ if(flags==-1) {
+ /* Invalid fd. Not really much point checking for EBADF
+ * specifically
+ */
+#ifdef DEBUG
+ g_message(G_GNUC_PRETTY_FUNCTION ": fcntl error on fd %d: %s",
+ fd, strerror(errno));
+#endif
+
+ return(INVALID_HANDLE_VALUE);
+ }
+
+ file_handle=g_new0(struct _WapiHandle_file, 1);
+ handle=(WapiHandle *)file_handle;
+
+ _WAPI_HANDLE_INIT(handle, WAPI_HANDLE_CONSOLE, console_ops);
+
+ file_handle->fd=fd;
+ file_handle->security_attributes=/*some default*/NULL;
+ file_handle->fileaccess=convert_from_flags(flags);
+ file_handle->sharemode=0;
+ file_handle->attrs=0;
+
+#ifdef DEBUG
+ g_message(G_GNUC_PRETTY_FUNCTION ": returning handle %p with fd %d",
+ handle, file_handle->fd);
+#endif
+
+ return(handle);
+}
+
+/**
+ * ReadFile:
+ * @handle: The file handle to read from. The handle must have
+ * %GENERIC_READ access.
+ * @buffer: The buffer to store read data in
+ * @numbytes: The maximum number of bytes to read
+ * @bytesread: The actual number of bytes read is stored here. This
+ * value can be zero if the handle is positioned at the end of the
+ * file.
+ * @overlapped: points to a required %WapiOverlapped structure if
+ * @handle has the %FILE_FLAG_OVERLAPPED option set, should be NULL
+ * otherwise.
+ *
+ * If @handle does not have the %FILE_FLAG_OVERLAPPED option set, this
+ * function reads up to @numbytes bytes from the file from the current
+ * file position, and stores them in @buffer. If there are not enough
+ * bytes left in the file, just the amount available will be read.
+ * The actual number of bytes read is stored in @bytesread.
+
+ * If @handle has the %FILE_FLAG_OVERLAPPED option set, the current
+ * file position is ignored and the read position is taken from data
+ * in the @overlapped structure.
+ *
+ * Return value: %TRUE if the read succeeds (even if no bytes were
+ * read due to an attempt to read past the end of the file), %FALSE on
+ * error.
+ */
+gboolean ReadFile(WapiHandle *handle, gpointer buffer, guint32 numbytes,
+ guint32 *bytesread, WapiOverlapped *overlapped)
+{
+ if(handle->ops->readfile==NULL) {
+ return(FALSE);
+ }
+
+ return(handle->ops->readfile(handle, buffer, numbytes, bytesread,
+ overlapped));
+}
+
+/**
+ * WriteFile:
+ * @handle: The file handle to write to. The handle must have
+ * %GENERIC_WRITE access.
+ * @buffer: The buffer to read data from.
+ * @numbytes: The maximum number of bytes to write.
+ * @byteswritten: The actual number of bytes written is stored here.
+ * If the handle is positioned at the file end, the length of the file
+ * is extended. This parameter may be %NULL.
+ * @overlapped: points to a required %WapiOverlapped structure if
+ * @handle has the %FILE_FLAG_OVERLAPPED option set, should be NULL
+ * otherwise.
+ *
+ * If @handle does not have the %FILE_FLAG_OVERLAPPED option set, this
+ * function writes up to @numbytes bytes from @buffer to the file at
+ * the current file position. If @handle is positioned at the end of
+ * the file, the file is extended. The actual number of bytes written
+ * is stored in @byteswritten.
+ *
+ * If @handle has the %FILE_FLAG_OVERLAPPED option set, the current
+ * file position is ignored and the write position is taken from data
+ * in the @overlapped structure.
+ *
+ * Return value: %TRUE if the write succeeds, %FALSE on error.
+ */
+gboolean WriteFile(WapiHandle *handle, gconstpointer buffer, guint32 numbytes,
+ guint32 *byteswritten, WapiOverlapped *overlapped)
+{
+ if(handle->ops->writefile==NULL) {
+ return(FALSE);
+ }
+
+ return(handle->ops->writefile(handle, buffer, numbytes, byteswritten,
+ overlapped));
+}
+
+/**
+ * SetEndOfFile:
+ * @handle: The file handle to set. The handle must have
+ * %GENERIC_WRITE access.
+ *
+ * Moves the end-of-file position to the current position of the file
+ * pointer. This function is used to truncate or extend a file.
+ *
+ * Return value: %TRUE on success, %FALSE otherwise.
+ */
+gboolean SetEndOfFile(WapiHandle *handle)
+{
+ if(handle->ops->setendoffile==NULL) {
+ return(FALSE);
+ }
+
+ return(handle->ops->setendoffile(handle));
+}
+
+/**
+ * SetFilePointer:
+ * @handle: The file handle to set. The handle must have
+ * %GENERIC_READ or %GENERIC_WRITE access.
+ * @movedistance: Low 32 bits of a signed value that specifies the
+ * number of bytes to move the file pointer.
+ * @highmovedistance: Pointer to the high 32 bits of a signed value
+ * that specifies the number of bytes to move the file pointer, or
+ * %NULL.
+ * @method: The starting point for the file pointer move.
+ *
+ * Sets the file pointer of an open file.
+ *
+ * The distance to move the file pointer is calculated from
+ * @movedistance and @highmovedistance: If @highmovedistance is %NULL,
+ * @movedistance is the 32-bit signed value; otherwise, @movedistance
+ * is the low 32 bits and @highmovedistance a pointer to the high 32
+ * bits of a 64 bit signed value. A positive distance moves the file
+ * pointer forward from the position specified by @method; a negative
+ * distance moves the file pointer backward.
+ *
+ * If the library is compiled without large file support,
+ * @highmovedistance is ignored and its value is set to zero on a
+ * successful return.
+ *
+ * Return value: On success, the low 32 bits of the new file pointer.
+ * If @highmovedistance is not %NULL, the high 32 bits of the new file
+ * pointer are stored there. On failure, %INVALID_SET_FILE_POINTER.
+ */
+guint32 SetFilePointer(WapiHandle *handle, gint32 movedistance,
+ gint32 *highmovedistance, WapiSeekMethod method)
+{
+ if(handle->ops->seek==NULL) {
+ return(INVALID_SET_FILE_POINTER);
+ }
+
+ return(handle->ops->seek(handle, movedistance, highmovedistance,
+ method));
+}
+
+/**
+ * GetFileType:
+ * @handle: The file handle to test.
+ *
+ * Finds the type of file @handle.
+ *
+ * Return value: %FILE_TYPE_UNKNOWN - the type of the file @handle is
+ * unknown. %FILE_TYPE_DISK - @handle is a disk file.
+ * %FILE_TYPE_CHAR - @handle is a character device, such as a console.
+ * %FILE_TYPE_PIPE - @handle is a named or anonymous pipe.
+ */
+WapiFileType GetFileType(WapiHandle *handle)
+{
+ if(handle->ops->getfiletype==NULL) {
+ return(FILE_TYPE_UNKNOWN);
+ }
+
+ return(handle->ops->getfiletype());
+}
+
+/**
+ * GetFileSize:
+ * @handle: The file handle to query. The handle must have
+ * %GENERIC_READ or %GENERIC_WRITE access.
+ * @highsize: If non-%NULL, the high 32 bits of the file size are
+ * stored here.
+ *
+ * Retrieves the size of the file @handle.
+ *
+ * If the library is compiled without large file support, @highsize
+ * has its value set to zero on a successful return.
+ *
+ * Return value: On success, the low 32 bits of the file size. If
+ * @highsize is non-%NULL then the high 32 bits of the file size are
+ * stored here. On failure %INVALID_FILE_SIZE is returned.
+ */
+guint32 GetFileSize(WapiHandle *handle, guint32 *highsize)
+{
+ if(handle->ops->getfilesize==NULL) {
+ return(INVALID_FILE_SIZE);
+ }
+
+ return(handle->ops->getfilesize(handle, highsize));
+}
diff --git a/mono/io-layer/io.h b/mono/io-layer/io.h
new file mode 100644
index 00000000000..782844f7200
--- /dev/null
+++ b/mono/io-layer/io.h
@@ -0,0 +1,108 @@
+#ifndef _WAPI_IO_H_
+#define _WAPI_IO_H_
+
+#include <stdlib.h>
+
+#include "mono/io-layer/wapi.h"
+
+typedef struct _WapiSecurityAttributes WapiSecurityAttributes;
+
+struct _WapiSecurityAttributes
+{
+ guint32 nLength;
+ gpointer lpSecurityDescriptor;
+ gboolean bInheritHandle;
+};
+
+typedef struct _WapiOverlapped WapiOverlapped;
+
+struct _WapiOverlapped
+{
+ guint32 Internal;
+ guint32 InternalHigh;
+ guint32 Offset;
+ guint32 OffsetHigh;
+ WapiHandle *hEvent;
+};
+
+#define GENERIC_READ 0x80000000
+#define GENERIC_WRITE 0x40000000
+#define GENERIC_EXECUTE 0x20000000
+#define GENERIC_ALL 0x10000000
+
+#define FILE_SHARE_READ 0x00000001
+#define FILE_SHARE_WRITE 0x00000002
+#define FILE_SHARE_DELETE 0x00000004
+
+#define CREATE_NEW 1
+#define CREATE_ALWAYS 2
+#define OPEN_EXISTING 3
+#define OPEN_ALWAYS 4
+#define TRUNCATE_EXISTING 5
+
+
+#define FILE_ATTRIBUTE_READONLY 0x00000001
+#define FILE_ATTRIBUTE_HIDDEN 0x00000002
+#define FILE_ATTRIBUTE_SYSTEM 0x00000004
+#define FILE_ATTRIBUTE_DIRECTORY 0x00000010
+#define FILE_ATTRIBUTE_ARCHIVE 0x00000020
+#define FILE_ATTRIBUTE_ENCRYPTED 0x00000040
+#define FILE_ATTRIBUTE_NORMAL 0x00000080
+#define FILE_ATTRIBUTE_TEMPORARY 0x00000100
+#define FILE_ATTRIBUTE_SPARSE_FILE 0x00000200
+#define FILE_ATTRIBUTE_REPARSE_POINT 0x00000400
+#define FILE_ATTRIBUTE_COMPRESSED 0x00000800
+#define FILE_ATTRIBUTE_OFFLINE 0x00001000
+#define FILE_ATTRIBUTE_NOT_CONTENT_INDEXED 0x00002000
+#define FILE_FLAG_OPEN_NO_RECALL 0x00100000
+#define FILE_FLAG_OPEN_REPARSE_POINT 0x00200000
+#define FILE_FLAG_POSIX_SEMANTICS 0x01000000
+#define FILE_FLAG_BACKUP_SEMANTICS 0x02000000
+#define FILE_FLAG_DELETE_ON_CLOSE 0x04000000
+#define FILE_FLAG_SEQUENTIAL_SCAN 0x08000000
+#define FILE_FLAG_RANDOM_ACCESS 0x10000000
+#define FILE_FLAG_NO_BUFFERING 0x20000000
+#define FILE_FLAG_OVERLAPPED 0x40000000
+#define FILE_FLAG_WRITE_THROUGH 0x80000000
+
+typedef enum {
+ STD_INPUT_HANDLE=-10,
+ STD_OUTPUT_HANDLE=-11,
+ STD_ERROR_HANDLE=-12,
+} WapiStdHandle;
+
+typedef enum {
+ FILE_BEGIN=0,
+ FILE_CURRENT=1,
+ FILE_END=2,
+} WapiSeekMethod;
+
+typedef enum {
+ FILE_TYPE_UNKNOWN=0x0000,
+ FILE_TYPE_DISK=0x0001,
+ FILE_TYPE_CHAR=0x0002,
+ FILE_TYPE_PIPE=0x0003,
+ FILE_TYPE_REMOTE=0x8000,
+} WapiFileType;
+
+#define INVALID_SET_FILE_POINTER ((guint32)-1)
+#define INVALID_FILE_SIZE ((guint32)0xFFFFFFFF)
+
+extern WapiHandle *CreateFile(const guchar *name, guint32 fileaccess,
+ guint32 sharemode,
+ WapiSecurityAttributes *security,
+ guint32 createmode,
+ guint32 attrs, WapiHandle *template);
+extern WapiHandle *GetStdHandle(WapiStdHandle stdhandle);
+extern gboolean ReadFile(WapiHandle *handle, gpointer buffer, guint32 numbytes,
+ guint32 *bytesread, WapiOverlapped *overlapped);
+extern gboolean WriteFile(WapiHandle *handle, gconstpointer buffer,
+ guint32 numbytes, guint32 *byteswritten,
+ WapiOverlapped *overlapped);
+extern gboolean SetEndOfFile(WapiHandle *handle);
+extern guint32 SetFilePointer(WapiHandle *handle, gint32 movedistance,
+ gint32 *highmovedistance, WapiSeekMethod method);
+extern WapiFileType GetFileType(WapiHandle *handle);
+extern guint32 GetFileSize(WapiHandle *handle, guint32 *highsize);
+
+#endif /* _WAPI_IO_H_ */
diff --git a/mono/io-layer/pthread-compat.c b/mono/io-layer/pthread-compat.c
new file mode 100644
index 00000000000..11658fcfe89
--- /dev/null
+++ b/mono/io-layer/pthread-compat.c
@@ -0,0 +1,50 @@
+#include <config.h>
+#include <pthread.h>
+#include <time.h>
+
+#include "pthread-compat.h"
+
+#ifndef HAVE_PTHREAD_MUTEX_TIMEDLOCK
+/*
+ * Implementation of timed mutex locking from the P1003.1d/D14 (July
+ * 1999) draft spec, figure B-4.
+ */
+/**
+ * pthread_mutex_timedlock:
+ * @mutex: A pointer to a mutex to lock
+ * @timeout: A pointer to a struct timespec giving an absolute time to
+ * time out at.
+ *
+ * This is a compatibility implementation for C libraries that are
+ * lacking this function.
+ *
+ * Tries to lock @mutex, but times out when the time specified in
+ * @timeout is reached.
+ *
+ * Return value: zero on success, ETIMEDOUT on timeout.
+ */
+int pthread_mutex_timedlock(pthread_mutex_t *mutex,
+ const struct timespec *timeout)
+{
+ struct timeval timenow;
+ struct timespec sleepytime;
+
+ /* This is just to avoid a completely busy wait */
+ sleepytime.tv_sec=0;
+ sleepytime.tv_nsec=10000; /* 10ms */
+
+ while(pthread_mutex_trylock(mutex)==EBUSY) {
+ gettimeofday(&timenow, NULL);
+
+ if(timenow.tv_sec >= timeout->tv_sec &&
+ (timenow.tv_usec * 1000) >= timeout->tv_nsec) {
+ return(ETIMEDOUT);
+ }
+
+ nanosleep(&sleepytime, NULL);
+ }
+
+ return(0);
+}
+#endif /* !HAVE_PTHREAD_MUTEX_TIMEDLOCK */
+
diff --git a/mono/io-layer/pthread-compat.h b/mono/io-layer/pthread-compat.h
new file mode 100644
index 00000000000..a562275a017
--- /dev/null
+++ b/mono/io-layer/pthread-compat.h
@@ -0,0 +1,13 @@
+#ifndef _WAPI_PTHREAD_COMPAT_H_
+#define _WAPI_PTHREAD_COMPAT_H_
+
+#include <config.h>
+#include <pthread.h>
+#include <time.h>
+
+#ifndef HAVE_PTHREAD_MUTEX_TIMEDLOCK
+extern int pthread_mutex_timedlock(pthread_mutex_t *mutex,
+ const struct timespec *timeout);
+#endif /* HAVE_PTHREAD_MUTEX_TIMEDLOCK */
+
+#endif /* _WAPI_PTHREAD_COMPAT_H_ */
diff --git a/mono/io-layer/status.h b/mono/io-layer/status.h
new file mode 100644
index 00000000000..cbbf12a55f4
--- /dev/null
+++ b/mono/io-layer/status.h
@@ -0,0 +1,36 @@
+#ifndef _WAPI_STATUS_H_
+#define _WAPI_STATUS_H_
+
+typedef enum {
+ STATUS_WAIT_0 = 0x00000000,
+ STATUS_ABANDONED_WAIT_0 = 0x00000080,
+ STATUS_USER_APC = 0x000000C0,
+ STATUS_TIMEOUT = 0x00000102,
+ STATUS_PENDING = 0x00000103,
+ STATUS_SEGMENT_NOTIFICATION = 0x40000005,
+ STATUS_GUARD_PAGE_VIOLATION = 0x80000001,
+ STATUS_DATATYPE_MISALIGNMENT = 0x80000002,
+ STATUS_BREAKPOINT = 0x80000003,
+ STATUS_SINGLE_STEP = 0x80000004,
+ STATUS_ACCESS_VIOLATION = 0xC0000005,
+ STATUS_IN_PAGE_ERROR = 0xC0000006,
+ STATUS_NO_MEMORY = 0xC0000017,
+ STATUS_ILLEGAL_INSTRUCTION = 0xC000001D,
+ STATUS_NONCONTINUABLE_EXCEPTION = 0xC0000025,
+ STATUS_INVALID_DISPOSITION = 0xC0000026,
+ STATUS_ARRAY_BOUNDS_EXCEEDED = 0xC000008C,
+ STATUS_FLOAT_DENORMAL_OPERAND = 0xC000008D,
+ STATUS_FLOAT_DIVIDE_BY_ZERO = 0xC000008E,
+ STATUS_FLOAT_INEXACT_RESULT = 0xC000008F,
+ STATUS_FLOAT_INVALID_OPERATION = 0xC0000090,
+ STATUS_FLOAT_OVERFLOW = 0xC0000091,
+ STATUS_FLOAT_STACK_CHECK = 0xC0000092,
+ STATUS_FLOAT_UNDERFLOW = 0xC0000093,
+ STATUS_INTEGER_DIVIDE_BY_ZERO = 0xC0000094,
+ STATUS_INTEGER_UNDERFLOW = 0xC0000095,
+ STATUS_PRIVILEGED_INSTRUCTION = 0xC0000096,
+ STATUS_STACK_OVERFLOW = 0xC00000FD,
+ STATUS_CONTROL_C_EXIT = 0xC000013A,
+} WapiStatus;
+
+#endif /* _WAPI_STATUS_H_ */
diff --git a/mono/io-layer/threads.c b/mono/io-layer/threads.c
new file mode 100644
index 00000000000..e3e6c67e594
--- /dev/null
+++ b/mono/io-layer/threads.c
@@ -0,0 +1,483 @@
+#include <config.h>
+#include <glib.h>
+#include <string.h>
+#include <pthread.h>
+#include <sched.h>
+#include <sys/time.h>
+#include <errno.h>
+
+#include "mono/io-layer/wapi.h"
+#include "wapi-private.h"
+#include "timed-thread.h"
+#include "wait-private.h"
+#include "handles-private.h"
+
+#include "pthread-compat.h"
+
+#define DEBUG
+
+typedef enum {
+ THREAD_STATE_START,
+ THREAD_STATE_EXITED,
+} WapiThreadState;
+
+struct _WapiHandle_thread
+{
+ WapiHandle handle;
+ WapiThreadState state;
+ TimedThread *thread;
+ guint32 exitstatus;
+};
+
+static pthread_mutex_t thread_signal_mutex = PTHREAD_MUTEX_INITIALIZER;
+static pthread_cond_t thread_signal_cond = PTHREAD_COND_INITIALIZER;
+
+static void thread_close(WapiHandle *handle);
+static gboolean thread_wait(WapiHandle *handle, guint32 ms);
+static guint32 thread_wait_multiple(gpointer data);
+
+static struct _WapiHandleOps thread_ops = {
+ thread_close, /* close */
+ NULL, /* getfiletype */
+ NULL, /* readfile */
+ NULL, /* writefile */
+ NULL, /* seek */
+ NULL, /* setendoffile */
+ NULL, /* getfilesize */
+ thread_wait, /* wait */
+ thread_wait_multiple, /* wait_multiple */
+};
+
+static void thread_close(WapiHandle *handle)
+{
+ struct _WapiHandle_thread *thread_handle=(struct _WapiHandle_thread *)handle;
+
+#ifdef DEBUG
+ g_message(G_GNUC_PRETTY_FUNCTION
+ ": closing thread handle %p with thread %p id %ld",
+ thread_handle, thread_handle->thread,
+ thread_handle->thread->id);
+#endif
+
+ g_free(thread_handle->thread);
+}
+
+static gboolean thread_wait(WapiHandle *handle, guint32 ms)
+{
+ struct _WapiHandle_thread *thread_handle=(struct _WapiHandle_thread *)handle;
+ int ret;
+
+ if(handle->signalled) {
+ /* Already signalled, so return straight away */
+#ifdef DEBUG
+ g_message(G_GNUC_PRETTY_FUNCTION ": thread handle %p already signalled, returning now", handle);
+#endif
+
+ return(TRUE);
+ }
+
+#ifdef DEBUG
+ g_message(G_GNUC_PRETTY_FUNCTION
+ ": waiting for %d ms for thread handle %p with id %ld", ms,
+ thread_handle, thread_handle->thread->id);
+#endif
+
+ if(ms==INFINITE) {
+ ret=_wapi_timed_thread_join(thread_handle->thread, NULL, NULL);
+ } else {
+ struct timespec timeout;
+ struct timeval now;
+ div_t divvy;
+
+ divvy=div((int)ms, 1000);
+ gettimeofday(&now, NULL);
+
+ timeout.tv_sec=now.tv_sec+divvy.quot;
+ timeout.tv_nsec=(now.tv_usec+divvy.rem)*1000;
+
+ ret=_wapi_timed_thread_join(thread_handle->thread, &timeout,
+ NULL);
+ }
+
+ if(ret==0) {
+ /* Thread joined */
+ return(TRUE);
+ } else {
+ /* ret might be ETIMEDOUT for timeout, or other for error */
+ return(FALSE);
+ }
+}
+
+static guint32 thread_wait_multiple(gpointer data)
+{
+ WaitQueueItem *item=(WaitQueueItem *)data;
+ int ret;
+ guint32 numhandles, count;
+ struct timespec timeout;
+ struct timeval now;
+ div_t divvy;
+
+ pthread_mutex_lock(&item->mutex);
+
+ numhandles=item->handles[WAPI_HANDLE_THREAD]->len;
+
+#ifdef DEBUG
+ g_message(G_GNUC_PRETTY_FUNCTION
+ ": waiting on %d thread handles for %d ms", numhandles,
+ item->timeout);
+#endif
+
+ /* First, check if any of the handles are already
+ * signalled. If waitall is specified we only return if all
+ * handles have been signalled.
+ */
+ count=_wapi_handle_count_signalled(item->handles[WAPI_HANDLE_THREAD]);
+
+#ifdef DEBUG
+ g_message(G_GNUC_PRETTY_FUNCTION
+ ": Preliminary check found %d handles signalled", count);
+#endif
+
+ if((item->waitall==TRUE && count==numhandles) ||
+ (item->waitall==FALSE && count>0)) {
+ goto success;
+ }
+
+ /* OK, we need to wait for some */
+ if(item->timeout!=INFINITE) {
+ divvy=div((int)item->timeout, 1000);
+ gettimeofday(&now, NULL);
+
+ timeout.tv_sec=now.tv_sec+divvy.quot;
+ timeout.tv_nsec=(now.tv_usec+divvy.rem)*1000;
+ }
+
+ /* We can restart from here without resetting the timeout,
+ * because it is calculated from absolute time, not an offset
+ */
+again:
+ pthread_mutex_lock(&thread_signal_mutex);
+ if(item->timeout==INFINITE) {
+ ret=pthread_cond_wait(&thread_signal_cond,
+ &thread_signal_mutex);
+ } else {
+ ret=pthread_cond_timedwait(&thread_signal_cond,
+ &thread_signal_mutex,
+ &timeout);
+ }
+ pthread_mutex_unlock(&thread_signal_mutex);
+
+ if(ret==ETIMEDOUT) {
+ /* Check signalled state here, just in case a thread
+ * exited between the first check and the cond wait.
+ * We return the number of signalled handles, which
+ * may be fewer than the total.
+ */
+#ifdef DEBUG
+ g_message(G_GNUC_PRETTY_FUNCTION ": Wait timed out");
+#endif
+
+ count=_wapi_handle_count_signalled(
+ item->handles[WAPI_HANDLE_THREAD]);
+ goto success;
+ }
+
+#ifdef DEBUG
+ g_message(G_GNUC_PRETTY_FUNCTION ": Thread exited, checking status");
+#endif
+
+ /* Another thread exited, so see if it was one we are
+ * interested in
+ */
+ count=_wapi_handle_count_signalled(item->handles[WAPI_HANDLE_THREAD]);
+
+#ifdef DEBUG
+ g_message(G_GNUC_PRETTY_FUNCTION
+ ": Check after thread exit found %d handles signalled",
+ count);
+#endif
+
+ if((item->waitall==TRUE && count==numhandles) ||
+ (item->waitall==FALSE && count>0)) {
+ goto success;
+ }
+
+ /* Either we have waitall set with more handles to wait for,
+ * or the thread that exited wasn't interesting to us
+ */
+#ifdef DEBUG
+ g_message(G_GNUC_PRETTY_FUNCTION ": Waiting a bit longer");
+#endif
+
+ goto again;
+
+success:
+ item->waited[WAPI_HANDLE_THREAD]=TRUE;
+ pthread_mutex_unlock(&item->mutex);
+ return(count);
+}
+
+static void thread_exit(guint32 exitstatus, gpointer userdata)
+{
+ struct _WapiHandle_thread *thread_handle=(struct _WapiHandle_thread *)userdata;
+
+ thread_handle->exitstatus=exitstatus;
+ thread_handle->state=THREAD_STATE_EXITED;
+ thread_handle->handle.signalled=TRUE;
+
+#ifdef DEBUG
+ g_message(G_GNUC_PRETTY_FUNCTION
+ ": Recording thread handle %p status as %d", thread_handle,
+ exitstatus);
+#endif
+
+ /* Signal any thread waiting on thread exit */
+ pthread_mutex_lock(&thread_signal_mutex);
+ pthread_cond_broadcast(&thread_signal_cond);
+ pthread_mutex_unlock(&thread_signal_mutex);
+}
+
+/**
+ * CreateThread:
+ * @security: Ignored for now.
+ * @stacksize: the size in bytes of the new thread's stack. Use 0 to
+ * default to the normal stack size. (Ignored for now).
+ * @start: The function that the new thread should start with
+ * @param: The parameter to give to @start.
+ * @create: If 0, the new thread is ready to run immediately. If
+ * %CREATE_SUSPENDED, the new thread will be in the suspended state,
+ * requiring a ResumeThread() call to continue running.
+ * @tid: If non-NULL, the ID of the new thread is stored here.
+ *
+ * Creates a new threading handle.
+ *
+ * Return value: a new handle, or NULL
+ */
+WapiHandle *CreateThread(WapiSecurityAttributes *security G_GNUC_UNUSED, guint32 stacksize G_GNUC_UNUSED,
+ WapiThreadStart start, gpointer param, guint32 create G_GNUC_UNUSED,
+ guint32 *tid)
+{
+ struct _WapiHandle_thread *thread_handle;
+ WapiHandle *handle;
+ int ret;
+
+ if(start==NULL) {
+ return(NULL);
+ }
+
+ thread_handle=(struct _WapiHandle_thread *)g_new0(struct _WapiHandle_thread, 1);
+ thread_handle->state=THREAD_STATE_START;
+
+ ret=_wapi_timed_thread_create(&thread_handle->thread, NULL, start,
+ thread_exit, param, thread_handle);
+ if(ret!=0) {
+#ifdef DEBUG
+ g_message(G_GNUC_PRETTY_FUNCTION ": Thread create error: %s",
+ strerror(ret));
+#endif
+ g_free(thread_handle);
+ return(NULL);
+ }
+
+ handle=(WapiHandle *)thread_handle;
+ _WAPI_HANDLE_INIT(handle, WAPI_HANDLE_THREAD, thread_ops);
+
+#ifdef DEBUG
+ g_message(G_GNUC_PRETTY_FUNCTION
+ ": Started thread handle %p thread %p ID %ld", thread_handle,
+ thread_handle->thread, thread_handle->thread->id);
+#endif
+
+ if(tid!=NULL) {
+ *tid=thread_handle->thread->id;
+ }
+
+ return(handle);
+}
+
+/**
+ * ExitThread:
+ * @exitcode: Sets the thread's exit code, which can be read from
+ * another thread with GetExitCodeThread().
+ *
+ * Terminates the calling thread. A thread can also exit by returning
+ * from its start function. When the last thread in a process
+ * terminates, the process itself terminates.
+ */
+void ExitThread(guint32 exitcode)
+{
+ _wapi_timed_thread_exit(exitcode);
+}
+
+/**
+ * GetExitCodeThread:
+ * @handle: The thread handle to query
+ * @exitcode: The thread @handle exit code is stored here
+ *
+ * Finds the exit code of @handle, and stores it in @exitcode. If the
+ * thread @handle is still running, the value stored is %STILL_ACTIVE.
+ *
+ * Return value: %TRUE, or %FALSE on error.
+ */
+gboolean GetExitCodeThread(WapiHandle *handle, guint32 *exitcode)
+{
+ struct _WapiHandle_thread *thread_handle=(struct _WapiHandle_thread *)handle;
+
+#ifdef DEBUG
+ g_message(G_GNUC_PRETTY_FUNCTION
+ ": Finding exit status for thread handle %p id %ld", handle,
+ thread_handle->thread->id);
+#endif
+
+ if(exitcode==NULL) {
+#ifdef DEBUG
+ g_message(G_GNUC_PRETTY_FUNCTION
+ ": Nowhere to store exit code");
+#endif
+ return(FALSE);
+ }
+
+ if(thread_handle->state!=THREAD_STATE_EXITED) {
+#ifdef DEBUG
+ g_message(G_GNUC_PRETTY_FUNCTION
+ ": Thread still active (state %d, exited is %d)",
+ thread_handle->state, THREAD_STATE_EXITED);
+#endif
+ *exitcode=STILL_ACTIVE;
+ return(TRUE);
+ }
+
+ *exitcode=thread_handle->exitstatus;
+
+ return(TRUE);
+}
+
+/**
+ * ResumeThread:
+ * @handle: the thread handle to resume
+ *
+ * Decrements the suspend count of thread @handle. A thread can only
+ * run if its suspend count is zero.
+ *
+ * Return value: the previous suspend count, or 0xFFFFFFFF on error.
+ */
+guint32 ResumeThread(WapiHandle *handle G_GNUC_UNUSED)
+{
+ return(0xFFFFFFFF);
+}
+
+/**
+ * SuspendThread:
+ * @handle: the thread handle to suspend
+ *
+ * Increments the suspend count of thread @handle. A thread can only
+ * run if its suspend count is zero.
+ *
+ * Return value: the previous suspend count, or 0xFFFFFFFF on error.
+ */
+guint32 SuspendThread(WapiHandle *handle G_GNUC_UNUSED)
+{
+ return(0xFFFFFFFF);
+}
+
+/**
+ * TlsAlloc:
+ *
+ * Allocates a Thread Local Storage (TLS) index. Any thread in the
+ * same process can use this index to store and retrieve values that
+ * are local to that thread.
+ *
+ * Return value: The index value, or %TLS_OUT_OF_INDEXES if no index
+ * is available.
+ */
+guint32 TlsAlloc(void)
+{
+ return(TLS_OUT_OF_INDEXES);
+}
+
+/**
+ * TlsFree:
+ * @idx: The TLS index to free
+ *
+ * Releases a TLS index, making it available for reuse. This call
+ * will delete any TLS data stored under index @idx in all threads.
+ *
+ * Return value: %TRUE on success, %FALSE otherwise.
+ */
+gboolean TlsFree(guint32 idx G_GNUC_UNUSED)
+{
+ return(FALSE);
+}
+
+/**
+ * TlsGetValue:
+ * @idx: The TLS index to retrieve
+ *
+ * Retrieves the TLS data stored under index @idx.
+ *
+ * Return value: The value stored in the TLS index @idx in the current
+ * thread, or %NULL on error. As %NULL can be a valid return value,
+ * in this case GetLastError() returns %ERROR_SUCCESS.
+ */
+gpointer TlsGetValue(guint32 idx G_GNUC_UNUSED)
+{
+ return(NULL);
+}
+
+/**
+ * TlsSetValue:
+ * @idx: The TLS index to store
+ * @value: The value to store under index @idx
+ *
+ * Stores @value at TLS index @idx.
+ *
+ * Return value: %TRUE on success, %FALSE otherwise.
+ */
+gboolean TlsSetValue(guint32 idx G_GNUC_UNUSED, gpointer value G_GNUC_UNUSED)
+{
+ return(FALSE);
+}
+
+/**
+ * Sleep:
+ * @ms: The time in milliseconds to suspend for
+ *
+ * Suspends execution of the current thread for @ms milliseconds. A
+ * value of zero causes the thread to relinquish its time slice. A
+ * value of %INFINITE causes an infinite delay.
+ */
+void Sleep(guint32 ms)
+{
+ struct timespec req, rem;
+ div_t divvy;
+ int ret;
+
+#ifdef DEBUG
+ g_message(G_GNUC_PRETTY_FUNCTION ": Sleeping for %d ms", ms);
+#endif
+
+ if(ms==0) {
+ sched_yield();
+ return;
+ }
+
+ /* FIXME: check for INFINITE and sleep forever */
+ divvy=div((int)ms, 1000);
+
+ req.tv_sec=divvy.quot;
+ req.tv_nsec=divvy.rem*1000;
+
+again:
+ ret=nanosleep(&req, &rem);
+ if(ret==-1) {
+ /* Sleep interrupted with rem time remaining */
+#ifdef DEBUG
+ guint32 rems=rem.tv_sec*1000 + rem.tv_nsec/1000;
+
+ g_message(G_GNUC_PRETTY_FUNCTION ": Still got %d ms to go",
+ rems);
+#endif
+ req=rem;
+ goto again;
+ }
+}
diff --git a/mono/io-layer/threads.h b/mono/io-layer/threads.h
new file mode 100644
index 00000000000..29627af115c
--- /dev/null
+++ b/mono/io-layer/threads.h
@@ -0,0 +1,28 @@
+#ifndef _WAPI_THREADS_H_
+#define _WAPI_THREADS_H_
+
+#include <glib.h>
+
+#include "mono/io-layer/handles.h"
+#include "mono/io-layer/io.h"
+#include "mono/io-layer/status.h"
+
+#define TLS_MINIMUM_AVAILABLE 64
+#define TLS_OUT_OF_INDEXES 0xFFFFFFFF
+
+#define STILL_ACTIVE STATUS_PENDING
+
+typedef guint32 (*WapiThreadStart)(gpointer);
+
+extern WapiHandle *CreateThread(WapiSecurityAttributes *security, guint32 stacksize, WapiThreadStart start, gpointer param, guint32 create, guint32 *tid);
+extern void ExitThread(guint32 exitcode) G_GNUC_NORETURN;
+extern gboolean GetExitCodeThread(WapiHandle *handle, guint32 *exitcode);
+extern guint32 ResumeThread(WapiHandle *handle);
+extern guint32 SuspendThread(WapiHandle *handle);
+extern guint32 TlsAlloc(void);
+extern gboolean TlsFree(guint32 idx);
+extern gpointer TlsGetValue(guint32 idx);
+extern gboolean TlsSetValue(guint32 idx, gpointer value);
+extern void Sleep(guint32 ms);
+
+#endif /* _WAPI_THREADS_H_ */
diff --git a/mono/io-layer/timed-thread.c b/mono/io-layer/timed-thread.c
new file mode 100644
index 00000000000..7a6fcf228e5
--- /dev/null
+++ b/mono/io-layer/timed-thread.c
@@ -0,0 +1,139 @@
+#include <config.h>
+#include <glib.h>
+#include <pthread.h>
+
+#include "timed-thread.h"
+
+#define DEBUG
+
+/*
+ * Implementation of timed thread joining from the P1003.1d/D14 (July 1999)
+ * draft spec, figure B-6.
+ */
+
+static pthread_key_t timed_thread_key;
+static pthread_once_t timed_thread_once = PTHREAD_ONCE_INIT;
+
+static void timed_thread_init(void)
+{
+ pthread_key_create(&timed_thread_key, NULL);
+}
+
+void _wapi_timed_thread_exit(guint32 exitstatus)
+{
+ TimedThread *thread;
+ void *specific;
+
+ if((specific = pthread_getspecific(timed_thread_key)) == NULL) {
+ /* Handle cases which won't happen with correct usage.
+ */
+ pthread_exit(NULL);
+ }
+
+ thread=(TimedThread *)specific;
+
+ pthread_mutex_lock(&thread->join_mutex);
+
+ /* Tell a joiner that we're exiting.
+ */
+#ifdef DEBUG
+ g_message(G_GNUC_PRETTY_FUNCTION
+ ": Setting thread %p id %ld exit status to %d",
+ thread, thread->id, exitstatus);
+#endif
+
+ thread->exitstatus=exitstatus;
+ thread->exiting=TRUE;
+
+ if(thread->exit_routine!=NULL) {
+ thread->exit_routine(exitstatus, thread->exit_userdata);
+ }
+
+ pthread_cond_signal(&thread->exit_cond);
+ pthread_mutex_unlock(&thread->join_mutex);
+
+ /* Call pthread_exit() to call destructors and really exit the
+ * thread.
+ */
+ pthread_exit(NULL);
+}
+
+/* Routine to establish thread specific data value and run the actual
+ * thread start routine which was supplied to timed_thread_create()
+ */
+static void *timed_thread_start_routine(gpointer args) G_GNUC_NORETURN;
+static void *timed_thread_start_routine(gpointer args)
+{
+ TimedThread *thread = (TimedThread *)args;
+
+ pthread_once(&timed_thread_once, timed_thread_init);
+ pthread_setspecific(timed_thread_key, (void *)thread);
+ _wapi_timed_thread_exit(thread->start_routine(thread->arg));
+}
+
+/* Allocate a thread which can be used with timed_thread_join().
+ */
+int _wapi_timed_thread_create(TimedThread **threadp,
+ const pthread_attr_t *attr,
+ guint32 (*start_routine)(gpointer),
+ void (*exit_routine)(guint32, gpointer),
+ gpointer arg, gpointer exit_userdata)
+{
+ TimedThread *thread;
+ int result;
+
+ thread=(TimedThread *)g_new0(TimedThread, 1);
+
+ pthread_mutex_init(&thread->join_mutex, NULL);
+ pthread_cond_init(&thread->exit_cond, NULL);
+ thread->start_routine = start_routine;
+ thread->exit_routine = exit_routine;
+ thread->arg = arg;
+ thread->exit_userdata = exit_userdata;
+ thread->exitstatus = 0;
+ thread->exiting = FALSE;
+
+ *threadp = thread;
+
+ if((result = pthread_create(&thread->id, attr,
+ timed_thread_start_routine,
+ (void *)thread)) != 0) {
+ g_free(thread);
+ return(result);
+ }
+
+ pthread_detach(thread->id);
+ return(0);
+}
+
+int _wapi_timed_thread_join(TimedThread *thread, struct timespec *timeout,
+ guint32 *exitstatus)
+{
+ int result;
+
+ pthread_mutex_lock(&thread->join_mutex);
+ result=0;
+
+ /* Wait until the thread announces that it's exiting, or until
+ * timeout.
+ */
+ while(result == 0 && !thread->exiting) {
+ if(timeout == NULL) {
+ result = pthread_cond_wait(&thread->exit_cond,
+ &thread->join_mutex);
+ } else {
+ result = pthread_cond_timedwait(&thread->exit_cond,
+ &thread->join_mutex,
+ timeout);
+ }
+ }
+
+ pthread_mutex_unlock(&thread->join_mutex);
+ if(result == 0 && thread->exiting) {
+ if(exitstatus!=NULL) {
+ *exitstatus = thread->exitstatus;
+ }
+ }
+ return(result);
+}
+
diff --git a/mono/io-layer/timed-thread.h b/mono/io-layer/timed-thread.h
new file mode 100644
index 00000000000..bb5908058c2
--- /dev/null
+++ b/mono/io-layer/timed-thread.h
@@ -0,0 +1,31 @@
+#ifndef _WAPI_TIMED_THREAD_H_
+#define _WAPI_TIMED_THREAD_H_
+
+#include <config.h>
+#include <glib.h>
+#include <pthread.h>
+
+typedef struct
+{
+ pthread_t id;
+ pthread_mutex_t join_mutex;
+ pthread_cond_t exit_cond;
+ guint32 (*start_routine)(gpointer arg);
+ void (*exit_routine)(guint32 exitstatus, gpointer userdata);
+ gpointer arg;
+ gpointer exit_userdata;
+ guint32 exitstatus;
+ gboolean exiting;
+} TimedThread;
+
+extern void _wapi_timed_thread_exit(guint32 exitstatus) G_GNUC_NORETURN;
+extern int _wapi_timed_thread_create(TimedThread **threadp,
+ const pthread_attr_t *attr,
+ guint32 (*start_routine)(gpointer),
+ void (*exit_routine)(guint32, gpointer),
+ gpointer arg, gpointer exit_userdata);
+extern int _wapi_timed_thread_join(TimedThread *thread,
+ struct timespec *timeout,
+ guint32 *exitstatus);
+
+#endif /* _WAPI_TIMED_THREAD_H_ */
diff --git a/mono/io-layer/uglify.h b/mono/io-layer/uglify.h
new file mode 100644
index 00000000000..6e59bedbebe
--- /dev/null
+++ b/mono/io-layer/uglify.h
@@ -0,0 +1,29 @@
+#ifndef _WAPI_UGLIFY_H_
+#define _WAPI_UGLIFY_H_
+
+/* Include this file if you insist on using the nasty Win32 typedefs */
+
+#include <stdlib.h>
+
+#include "mono/io-layer/wapi.h"
+
+typedef const guchar *LPCTSTR; /* replace this with gunichar */
+typedef guint32 DWORD;
+typedef gpointer LPVOID;
+typedef gboolean BOOL;
+typedef guint32 *LPDWORD;
+typedef gint32 LONG;
+typedef gint32 *PLONG;
+
+typedef WapiHandle *HANDLE;
+typedef WapiHandle **LPHANDLE;
+typedef WapiSecurityAttributes *LPSECURITY_ATTRIBUTES;
+typedef WapiOverlapped *LPOVERLAPPED;
+typedef WapiThreadStart LPTHREAD_START_ROUTINE;
+
+#define CONST const
+#define VOID void
+
+#define WINAPI
+
+#endif /* _WAPI_UGLIFY_H_ */
diff --git a/mono/io-layer/unicode.c b/mono/io-layer/unicode.c
new file mode 100644
index 00000000000..c555ab2ae10
--- /dev/null
+++ b/mono/io-layer/unicode.c
@@ -0,0 +1,124 @@
+#include <config.h>
+#include <glib.h>
+#include <pthread.h>
+#include <iconv.h>
+#include <errno.h>
+
+#include "mono/io-layer/wapi.h"
+#include "unicode.h"
+
+static pthread_key_t unicode_key;
+static pthread_once_t unicode_key_once=PTHREAD_ONCE_INIT;
+
+static void unicode_end(void *buf)
+{
+ iconv_t cd=(iconv_t)buf;
+
+ iconv_close(cd);
+}
+
+static void unicode_init(void)
+{
+ pthread_key_create(&unicode_key, unicode_end);
+}
+
+static iconv_t unicode_reset(void)
+{
+ iconv_t cd;
+
+ pthread_once(&unicode_key_once, unicode_init);
+
+ cd=pthread_getspecific(unicode_key);
+ if(cd==NULL) {
+ cd=iconv_open("UTF-8", "UNICODE");
+ if(cd==(iconv_t)-1) {
+ g_message(G_GNUC_PRETTY_FUNCTION ": Can't open iconv descriptor from UTF-8 to UNICODE");
+ return(cd);
+ }
+ pthread_setspecific(unicode_key, cd);
+ }
+
+ if(cd==(iconv_t)-1) {
+ return(cd);
+ }
+
+ iconv(cd, NULL, NULL, NULL, NULL);
+
+ return(cd);
+}
+
+/* Cut&pasted from glib (switch to g_convert() when glib-2 is out */
+guchar *_wapi_unicode_to_utf8(const guchar *uni)
+{
+ guchar *str;
+ guchar *dest;
+ guchar *outp;
+ guchar *p;
+ guint inbytes_remaining;
+ guint outbytes_remaining;
+ size_t err;
+ guint outbuf_size;
+ gint len;
+ gboolean have_error = FALSE;
+ iconv_t converter;
+
+ converter=unicode_reset();
+
+ g_return_val_if_fail(uni != NULL, NULL);
+ g_return_val_if_fail(converter != (iconv_t) -1, NULL);
+
+ str = g_strdup(uni);
+ len = strlen(str);
+
+ p = str;
+ inbytes_remaining = len;
+ outbuf_size = len + 1; /* + 1 for nul in case len == 1 */
+
+ outbytes_remaining = outbuf_size - 1; /* -1 for nul */
+ outp = dest = g_malloc(outbuf_size);
+
+again:
+ err = iconv(converter, (char **)&p, &inbytes_remaining, (char **)&outp, &outbytes_remaining);
+
+ if(err == (size_t)-1) {
+ switch(errno) {
+ case EINVAL:
+ /* Incomplete text, do not report an error */
+ break;
+ case E2BIG: {
+ size_t used = outp - dest;
+
+ outbuf_size *= 2;
+ dest = g_realloc(dest, outbuf_size);
+
+ outp = dest + used;
+ outbytes_remaining = outbuf_size - used - 1; /* -1 for nul */
+
+ goto again;
+ }
+ case EILSEQ:
+ have_error = TRUE;
+ break;
+ default:
+ have_error = TRUE;
+ break;
+ }
+ }
+
+ *outp = '\0';
+
+ if((p - str) != len) {
+ if(!have_error) {
+ have_error = TRUE;
+ }
+ }
+
+ g_free(str);
+
+ if(have_error) {
+ g_free (dest);
+ return NULL;
+ } else {
+ return dest;
+ }
+}
diff --git a/mono/io-layer/unicode.h b/mono/io-layer/unicode.h
new file mode 100644
index 00000000000..55847b9ffdd
--- /dev/null
+++ b/mono/io-layer/unicode.h
@@ -0,0 +1,10 @@
+#ifndef _WAPI_UNICODE_H_
+#define _WAPI_UNICODE_H_
+
+/* This is an internal, private header file */
+
+#include <glib.h>
+
+extern guchar *_wapi_unicode_to_utf8(const guchar *uni);
+
+#endif /* _WAPI_UNICODE_H_ */
diff --git a/mono/io-layer/wait-private.h b/mono/io-layer/wait-private.h
new file mode 100644
index 00000000000..3be5e19b11a
--- /dev/null
+++ b/mono/io-layer/wait-private.h
@@ -0,0 +1,32 @@
+#ifndef _WAPI_WAIT_PRIVATE_H_
+#define _WAPI_WAIT_PRIVATE_H_
+
+/* This is an internal, private header file */
+
+#include <glib.h>
+#include <pthread.h>
+#include <semaphore.h>
+
+#include "wapi-private.h"
+#include "timed-thread.h"
+
+typedef enum {
+ WQ_NEW,
+ WQ_WAITING,
+ WQ_SIGNALLED,
+} WaitQueueState;
+
+typedef struct _WaitQueueItem
+{
+ pthread_mutex_t mutex;
+ sem_t wait_sem;
+ WaitQueueState state;
+ guint32 update, ack;
+ guint32 timeout;
+ gboolean waitall;
+ GPtrArray *handles[WAPI_HANDLE_COUNT];
+ TimedThread *thread[WAPI_HANDLE_COUNT];
+ gboolean waited[WAPI_HANDLE_COUNT];
+} WaitQueueItem;
+
+#endif /* _WAPI_WAIT_PRIVATE_H_ */
diff --git a/mono/io-layer/wait.c b/mono/io-layer/wait.c
new file mode 100644
index 00000000000..ab642aa2a96
--- /dev/null
+++ b/mono/io-layer/wait.c
@@ -0,0 +1,490 @@
+#include <config.h>
+#include <glib.h>
+#include <string.h>
+
+#include "mono/io-layer/wapi.h"
+#include "wait-private.h"
+#include "timed-thread.h"
+#include "handles-private.h"
+#include "wapi-private.h"
+
+#define DEBUG
+
+static pthread_once_t wait_once=PTHREAD_ONCE_INIT;
+
+static GPtrArray *WaitQueue=NULL;
+
+static pthread_t wait_monitor_thread_id;
+static gboolean wait_monitor_thread_running=FALSE;
+static pthread_mutex_t wait_monitor_mutex=PTHREAD_MUTEX_INITIALIZER;
+static sem_t wait_monitor_sem;
+
+static void launch_tidy(guint32 exitcode G_GNUC_UNUSED, gpointer user)
+{
+ WaitQueueItem *item=(WaitQueueItem *)user;
+
+#ifdef DEBUG
+ g_message(G_GNUC_PRETTY_FUNCTION ": Informing monitor thread");
+#endif
+
+ /* Update queue item */
+ pthread_mutex_lock(&item->mutex);
+ item->update++;
+ pthread_mutex_unlock(&item->mutex);
+
+ /* Signal monitor */
+ sem_post(&wait_monitor_sem);
+}
+
+/* This function is called by the monitor thread to launch handle-type
+ * specific threads to block in particular ways.
+ *
+ * The item mutex is held by the monitor thread when this function is
+ * called.
+ */
+static void launch_blocker_threads(WaitQueueItem *item)
+{
+ int i, ret;
+
+#ifdef DEBUG
+ g_message(G_GNUC_PRETTY_FUNCTION ": Launching blocker threads");
+#endif
+
+ for(i=0; i<WAPI_HANDLE_COUNT; i++) {
+ if(item->handles[i]->len>0) {
+ WapiHandle *handle;
+
+ handle=g_ptr_array_index(item->handles[i], 0);
+ g_assert(handle!=NULL);
+ g_assert(handle->ops->wait_multiple!=NULL);
+
+#ifdef DEBUG
+ g_message("Handle type %d active", i);
+#endif
+ item->waited[i]=FALSE;
+
+ ret=_wapi_timed_thread_create(
+ &item->thread[i], NULL,
+ handle->ops->wait_multiple, launch_tidy, item,
+ item);
+ if(ret!=0) {
+ g_warning(G_GNUC_PRETTY_FUNCTION
+ ": Thread create error: %s",
+ strerror(ret));
+ return;
+ }
+ } else {
+ /* Pretend to have already waited for the
+ * thread; it makes life easier for the
+ * monitor thread.
+ */
+ item->waited[i]=TRUE;
+ }
+ }
+}
+
+static gboolean launch_threads_done(WaitQueueItem *item)
+{
+ int i;
+
+ for(i=0; i<WAPI_HANDLE_COUNT; i++) {
+ if(item->waited[i]==FALSE) {
+ return(FALSE);
+ }
+ }
+
+ return(TRUE);
+}
+
+/* This is the main loop for the monitor thread. It waits for a
+ * signal to check the wait queue, then takes any action necessary on
+ * any queue items that have indicated readiness.
+ */
+static void *wait_monitor_thread(void *unused G_GNUC_UNUSED)
+{
+ guint i;
+
+ /* Signal that the monitor thread is ready */
+ wait_monitor_thread_running=TRUE;
+
+ while(TRUE) {
+ /* Use a semaphore rather than a cond so we dont miss
+ * any signals
+ */
+ sem_wait(&wait_monitor_sem);
+
+#ifdef DEBUG
+ g_message(G_GNUC_PRETTY_FUNCTION
+ ": Blocking thread doing stuff");
+#endif
+
+ /* We've been signalled, so scan the wait queue for
+ * activity.
+ */
+ pthread_mutex_lock(&wait_monitor_mutex);
+ for(i=0; i<WaitQueue->len; i++) {
+ WaitQueueItem *item=g_ptr_array_index(WaitQueue, i);
+
+ if(item->update > item->ack) {
+ /* Something changed */
+ pthread_mutex_lock(&item->mutex);
+ item->ack=item->update;
+
+ switch(item->state) {
+ case WQ_NEW:
+ /* Launch a new thread for each type of
+ * handle to be waited for here.
+ */
+ launch_blocker_threads(item);
+
+ item->state=WQ_WAITING;
+ break;
+
+ case WQ_WAITING:
+ /* See if we have waited for
+ * the last blocker thread.
+ */
+ if(launch_threads_done(item)) {
+ /* All handles have
+ * been signalled, so
+ * signal the waiting
+ * thread. Let the
+ * waiting thread
+ * remove this item
+ * from the queue,
+ * because it makes
+ * the logic a lot
+ * easier here.
+ */
+ item->state=WQ_SIGNALLED;
+ sem_post(&item->wait_sem);
+ }
+ break;
+
+ case WQ_SIGNALLED:
+ /* This shouldn't happen. Prod
+ * the blocking thread again
+ * just to make sure.
+ */
+ g_warning(G_GNUC_PRETTY_FUNCTION
+ ": Prodding blocker again");
+ sem_post(&item->wait_sem);
+ break;
+ }
+
+ pthread_mutex_unlock(&item->mutex);
+ }
+ }
+
+ pthread_mutex_unlock(&wait_monitor_mutex);
+ }
+
+ return(NULL);
+}
+
+static void wait_init(void)
+{
+ int ret;
+
+#ifdef DEBUG
+ g_message(G_GNUC_PRETTY_FUNCTION ": Starting monitor thread");
+#endif
+
+ WaitQueue=g_ptr_array_new();
+
+ sem_init(&wait_monitor_sem, 0, 0);
+
+ /* Launch a thread which manages the wait queue, and deals
+ * with waiting for handles of various types.
+ */
+ ret=pthread_create(&wait_monitor_thread_id, NULL,
+ wait_monitor_thread, NULL);
+ if(ret!=0) {
+ g_warning(G_GNUC_PRETTY_FUNCTION
+ ": Couldn't start handle monitor thread: %s",
+ strerror(ret));
+ }
+
+ /* Wait for the monitor thread to get going */
+ while(wait_monitor_thread_running==FALSE) {
+ pthread_yield();
+ }
+}
+
+static WaitQueueItem *wait_item_new(guint32 timeout, gboolean waitall)
+{
+ WaitQueueItem *new;
+ int i;
+
+ new=g_new0(WaitQueueItem, 1);
+
+ pthread_mutex_init(&new->mutex, NULL);
+ sem_init(&new->wait_sem, 0, 0);
+
+ new->update=1; /* As soon as this item is queued it
+ * will need attention.
+ */
+ new->state=WQ_NEW;
+ new->timeout=timeout;
+ new->waitall=waitall;
+
+ for(i=0; i<WAPI_HANDLE_COUNT; i++) {
+ new->handles[i]=g_ptr_array_new();
+ }
+
+ return(new);
+}
+
+/* Adds our queue item to the work queue, and blocks until the monitor
+ * thread thinks it's done the work. Returns TRUE for done, FALSE for
+ * timed out.
+ */
+static gboolean wait_for_item(WaitQueueItem *item)
+{
+ gboolean ret;
+ int i;
+
+ /* Add the wait item to the monitor queue, and signal the
+ * monitor thread */
+ pthread_mutex_lock(&wait_monitor_mutex);
+ g_ptr_array_add(WaitQueue, item);
+ sem_post(&wait_monitor_sem);
+ pthread_mutex_unlock(&wait_monitor_mutex);
+
+ /* Wait for the item to become ready */
+ sem_wait(&item->wait_sem);
+
+ pthread_mutex_lock(&item->mutex);
+
+ /* If waitall is TRUE, then the number signalled in each handle type
+ * must be the length of the handle type array for the wait to be
+ * successful. Otherwise, any signalled handle is good enough
+ */
+ if(item->waitall==TRUE) {
+ ret=TRUE;
+ for(i=0; i<WAPI_HANDLE_COUNT; i++) {
+ if(_wapi_handle_count_signalled(item->handles[i])!=item->handles[i]->len) {
+ ret=FALSE;
+ break;
+ }
+ }
+ } else {
+ ret=FALSE;
+ for(i=0; i<WAPI_HANDLE_COUNT; i++) {
+ if(_wapi_handle_count_signalled(item->handles[i])>0) {
+ ret=TRUE;
+ break;
+ }
+ }
+ }
+ pthread_mutex_unlock(&item->mutex);
+
+ return(ret);
+}
+
+static gboolean wait_dequeue_item(WaitQueueItem *item)
+{
+ gboolean ret;
+
+ g_assert(WaitQueue!=NULL);
+
+ pthread_mutex_lock(&wait_monitor_mutex);
+ ret=g_ptr_array_remove_fast(WaitQueue, item);
+ pthread_mutex_unlock(&wait_monitor_mutex);
+
+ return(ret);
+}
+
+static void wait_item_destroy(WaitQueueItem *item)
+{
+ int i;
+
+ pthread_mutex_destroy(&item->mutex);
+ sem_destroy(&item->wait_sem);
+
+ for(i=0; i<WAPI_HANDLE_COUNT; i++) {
+ if(item->thread[i]!=NULL) {
+ g_free(item->thread[i]);
+ }
+ g_ptr_array_free(item->handles[i], FALSE);
+ }
+}
+
+
+/**
+ * WaitForSingleObject:
+ * @handle: an object to wait for
+ * @timeout: the maximum time in milliseconds to wait for
+ *
+ * This function returns when either @handle is signalled, or @timeout
+ * ms elapses. If @timeout is zero, the object's state is tested and
+ * the function returns immediately. If @timeout is %INFINITE, the
+ * function waits forever.
+ *
+ * Return value: %WAIT_ABANDONED - @handle is a mutex that was not
+ * released by the owning thread when it exited. Ownership of the
+ * mutex object is granted to the calling thread and the mutex is set
+ * to nonsignalled. %WAIT_OBJECT_0 - The state of @handle is
+ * signalled. %WAIT_TIMEOUT - The @timeout interval elapsed and
+ * @handle's state is still not signalled. %WAIT_FAILED - an error
+ * occurred.
+ */
+guint32 WaitForSingleObject(WapiHandle *handle, guint32 timeout)
+{
+ gboolean wait;
+
+ if(handle->ops->wait==NULL) {
+ return(WAIT_FAILED);
+ }
+
+ if(timeout==0) {
+ /* Just poll the object */
+#ifdef DEBUG
+ g_message(G_GNUC_PRETTY_FUNCTION ": Polling");
+#endif
+
+ if(handle->signalled==TRUE) {
+ return(WAIT_OBJECT_0);
+ } else {
+ return(WAIT_TIMEOUT);
+ }
+ }
+
+ wait=handle->ops->wait(handle, timeout);
+ if(wait==TRUE) {
+ /* Object signalled before timeout expired */
+#ifdef DEBUG
+ g_message(G_GNUC_PRETTY_FUNCTION ": Object %p signalled",
+ handle);
+#endif
+ return(WAIT_OBJECT_0);
+ } else {
+#ifdef DEBUG
+ g_message(G_GNUC_PRETTY_FUNCTION ": Object %p wait timed out",
+ handle);
+#endif
+ return(WAIT_TIMEOUT);
+ }
+}
+
+/**
+ * WaitForMultipleObjects:
+ * @numobjects: The number of objects in @handles. The maximum allowed
+ * is %MAXIMUM_WAIT_OBJECTS.
+ * @handles: An array of object handles. Duplicates are not allowed.
+ * @waitall: If %TRUE, this function waits until all of the handles
+ * are signalled. If %FALSE, this function returns when any object is
+ * signalled.
+ * @timeout: The maximum time in milliseconds to wait for.
+ *
+ * This function returns when either one or more of @handles is
+ * signalled, or @timeout ms elapses. If @timeout is zero, the state
+ * of each item of @handles is tested and the function returns
+ * immediately. If @timeout is %INFINITE, the function waits forever.
+ *
+ * Return value: %WAIT_OBJECT_0 to %WAIT_OBJECT_0 + @numobjects - 1 -
+ * if @waitall is %TRUE, indicates that all objects are signalled. If
+ * @waitall is %FALSE, the return value minus %WAIT_OBJECT_0 indicates
+ * the first index into @handles of the objects that are signalled.
+ * %WAIT_ABANDONED_0 to %WAIT_ABANDONED_0 + @numobjects - 1 - if
+ * @waitall is %TRUE, indicates that all objects are signalled, and at
+ * least one object is an abandoned mutex object (See
+ * WaitForSingleObject() for a description of abandoned mutexes.) If
+ * @waitall is %FALSE, the return value minus %WAIT_ABANDONED_0
+ * indicates the first index into @handles of an abandoned mutex.
+ * %WAIT_TIMEOUT - The @timeout interval elapsed and no objects in
+ * @handles are signalled. %WAIT_FAILED - an error occurred.
+ */
+guint32 WaitForMultipleObjects(guint32 numobjects, WapiHandle **handles,
+ gboolean waitall, guint32 timeout)
+{
+ WaitQueueItem *item;
+ GHashTable *dups;
+ gboolean duplicate=FALSE, bogustype=FALSE;
+ gboolean wait;
+ guint i;
+
+ pthread_once(&wait_once, wait_init);
+
+ if(numobjects>MAXIMUM_WAIT_OBJECTS) {
+#ifdef DEBUG
+ g_message(G_GNUC_PRETTY_FUNCTION ": Too many handles: %d",
+ numobjects);
+#endif
+
+ return(WAIT_FAILED);
+ }
+
+ /* Check for duplicates */
+ dups=g_hash_table_new(g_direct_hash, g_direct_equal);
+ for(i=0; i<numobjects; i++) {
+ gpointer exists=g_hash_table_lookup(dups, handles[i]);
+ if(exists!=NULL) {
+#ifdef DEBUG
+ g_message(G_GNUC_PRETTY_FUNCTION
+ ": Handle %p duplicated", handles[i]);
+#endif
+
+ duplicate=TRUE;
+ break;
+ }
+
+ if(handles[i]->ops->wait_multiple==NULL) {
+#ifdef DEBUG
+ g_message(G_GNUC_PRETTY_FUNCTION
+ ": Handle %p can't be waited for (type %d)",
+ handles[i], handles[i]->type);
+#endif
+
+ bogustype=TRUE;
+ }
+
+ g_hash_table_insert(dups, handles[i], handles[i]);
+ }
+ g_hash_table_destroy(dups);
+
+ if(duplicate==TRUE) {
+#ifdef DEBUG
+ g_message(G_GNUC_PRETTY_FUNCTION
+ ": Returning due to duplicates");
+#endif
+
+ return(WAIT_FAILED);
+ }
+
+ if(bogustype==TRUE) {
+#ifdef DEBUG
+ g_message(G_GNUC_PRETTY_FUNCTION
+ ": Returning due to bogus type");
+#endif
+
+ return(WAIT_FAILED);
+ }
+
+ item=wait_item_new(timeout, waitall);
+
+ /* Sort the handles by type */
+ for(i=0; i<numobjects; i++) {
+ g_ptr_array_add(item->handles[handles[i]->type], handles[i]);
+ }
+
+ wait=wait_for_item(item);
+ wait_dequeue_item(item);
+ wait_item_destroy(item);
+
+ if(wait==FALSE) {
+ /* Wait timed out */
+ return(WAIT_TIMEOUT);
+ }
+
+ for(i=0; i<numobjects; i++) {
+ if(handles[i]->signalled==TRUE) {
+ return(WAIT_OBJECT_0+i);
+ }
+ }
+
+ /* Oh dear. Something returned from the wait, but nothing
+ * appears to be signalled.
+ */
+ return(WAIT_FAILED);
+}
diff --git a/mono/io-layer/wait.h b/mono/io-layer/wait.h
new file mode 100644
index 00000000000..b0218bd93cb
--- /dev/null
+++ b/mono/io-layer/wait.h
@@ -0,0 +1,22 @@
+#ifndef _WAPI_WAIT_H_
+#define _WAPI_WAIT_H_
+
+#include "mono/io-layer/status.h"
+
+#define MAXIMUM_WAIT_OBJECTS 64
+
+#define INFINITE 0xFFFFFFFF
+
+#define WAIT_FAILED 0xFFFFFFFF
+#define WAIT_OBJECT_0 ((STATUS_WAIT_0) +0)
+#define WAIT_ABANDONED ((STATUS_ABANDONED_WAIT_0) +0)
+#define WAIT_ABANDONED_0 ((STATUS_ABANDONED_WAIT_0) +0)
+
+/* WAIT_TIMEOUT is also defined in error.h. Luckily it's the same value */
+#define WAIT_TIMEOUT STATUS_TIMEOUT
+#define WAIT_IO_COMPLETION STATUS_USER_APC
+
+extern guint32 WaitForSingleObject(WapiHandle *handle, guint32 timeout);
+extern guint32 WaitForMultipleObjects(guint32 numobjects, WapiHandle **handles, gboolean waitall, guint32 timeout);
+
+#endif /* _WAPI_WAIT_H_ */
diff --git a/mono/io-layer/wapi-private.h b/mono/io-layer/wapi-private.h
new file mode 100644
index 00000000000..f434555132e
--- /dev/null
+++ b/mono/io-layer/wapi-private.h
@@ -0,0 +1,60 @@
+#ifndef _WAPI_PRIVATE_H_
+#define _WAPI_PRIVATE_H_
+
+#include <config.h>
+#include <glib.h>
+
+#include "mono/io-layer/handles.h"
+
+typedef enum {
+ WAPI_HANDLE_FILE,
+ WAPI_HANDLE_CONSOLE,
+ WAPI_HANDLE_THREAD,
+ WAPI_HANDLE_COUNT,
+} WapiHandleType;
+
+struct _WapiHandleOps
+{
+ /* All handle types */
+ void (*close)(WapiHandle *handle);
+
+ /* File, console and pipe handles */
+ WapiFileType (*getfiletype)(void);
+
+ /* File and console handles */
+ gboolean (*readfile)(WapiHandle *handle, gpointer buffer,
+ guint32 numbytes, guint32 *bytesread,
+ WapiOverlapped *overlapped);
+ gboolean (*writefile)(WapiHandle *handle, gconstpointer buffer,
+ guint32 numbytes, guint32 *byteswritten,
+ WapiOverlapped *overlapped);
+
+ /* File handles */
+ guint32 (*seek)(WapiHandle *handle, gint32 movedistance,
+ gint32 *highmovedistance, WapiSeekMethod method);
+ gboolean (*setendoffile)(WapiHandle *handle);
+ guint32 (*getfilesize)(WapiHandle *handle, guint32 *highsize);
+
+ /* WaitForSingleObject */
+ gboolean (*wait)(WapiHandle *handle, guint32 ms);
+
+ /* WaitForMultipleObjects */
+ guint32 (*wait_multiple)(gpointer data);
+};
+
+struct _WapiHandle
+{
+ WapiHandleType type;
+ guint ref;
+ gboolean signalled;
+ struct _WapiHandleOps *ops;
+};
+
+#define _WAPI_HANDLE_INIT(_handle, _type, _ops) G_STMT_START {\
+ _handle->type=_type;\
+ _handle->ref=1;\
+ _handle->signalled=FALSE;\
+ _handle->ops=&_ops;\
+ } G_STMT_END;
+
+#endif /* _WAPI_PRIVATE_H_ */
diff --git a/mono/io-layer/wapi.h b/mono/io-layer/wapi.h
new file mode 100644
index 00000000000..c77af554e87
--- /dev/null
+++ b/mono/io-layer/wapi.h
@@ -0,0 +1,11 @@
+#ifndef _WAPI_WAPI_H_
+#define _WAPI_WAPI_H_
+
+#include <mono/io-layer/error.h>
+#include <mono/io-layer/handles.h>
+#include <mono/io-layer/io.h>
+#include <mono/io-layer/threads.h>
+#include <mono/io-layer/status.h>
+#include <mono/io-layer/wait.h>
+
+#endif /* _WAPI_WAPI_H_ */
diff --git a/mono/jit/ChangeLog b/mono/jit/ChangeLog
index a23e94fc3e0..29fc9dbbafc 100644
--- a/mono/jit/ChangeLog
+++ b/mono/jit/ChangeLog
@@ -1,3 +1,7 @@
+2001-11-09 Dick Porter <dick@ximian.com>
+
+ * Makefile.am (testjit_LDADD): Don't need THREAD_LIBS any more
+
2001-11-09 Dietmar Maurer <dietmar@ximian.com>
* testjit.c (mono_analyze_stack): new BOX impl.
diff --git a/mono/jit/Makefile.am b/mono/jit/Makefile.am
index 82ccbea58e6..70b017cbcc4 100644
--- a/mono/jit/Makefile.am
+++ b/mono/jit/Makefile.am
@@ -20,7 +20,6 @@ testjit_LDADD = \
../metadata/libmetadata.a \
$(GLIB_LIBS) \
$(GMODULE_LIBS) \
- $(THREAD_LIBS) \
-lm
codegen-x86.c codegen.h: x86.brg
diff --git a/mono/metadata/ChangeLog b/mono/metadata/ChangeLog
index 23577a4e963..9218e13e522 100644
--- a/mono/metadata/ChangeLog
+++ b/mono/metadata/ChangeLog
@@ -1,3 +1,7 @@
+2001-11-09 Dick Porter <dick@ximian.com>
+
+ * Makefile.am (pedump_LDADD): Don't need THREAD_LIBS any more
+
2001-11-09 Dietmar Maurer <dietmar@ximian.com>
* class.c (mono_class_metadata_init): bug fix: compute the right slot
diff --git a/mono/metadata/Makefile.am b/mono/metadata/Makefile.am
index 4b978950c85..9925b32db8d 100644
--- a/mono/metadata/Makefile.am
+++ b/mono/metadata/Makefile.am
@@ -67,6 +67,6 @@ libmetadatainclude_HEADERS = \
pedump_SOURCES = \
pedump.c $(libmetadata_a_SOURCES)
-pedump_LDADD = $(GLIB_LIBS) $(GMODULE_LIBS) $(THREAD_LIBS)
+pedump_LDADD = $(GLIB_LIBS) $(GMODULE_LIBS)
diff --git a/mono/metadata/threads-dummy.c b/mono/metadata/threads-dummy.c
index ce5f7482ea5..d197d9297b3 100644
--- a/mono/metadata/threads-dummy.c
+++ b/mono/metadata/threads-dummy.c
@@ -114,7 +114,7 @@ void mono_thread_init(void)
* object? In theory, I guess the whole program should act as
* though exit() were called :-)
*/
- main_thread=mono_new_object(thread_class);
+ main_thread=mono_object_new(thread_class);
}
diff --git a/status/class.xml b/status/class.xml
index b4b190cbcc0..79332aedfca 100755
--- a/status/class.xml
+++ b/status/class.xml
@@ -2185,6 +2185,15 @@
<maintainer>miguel@ximian.com</maintainer>
</maintainers>
</class>
+ <class name="System.LocalDataStoreSlot">
+ <last-activity>Sep-27-2001</last-activity>
+ <implementation>yes</implementation>
+ <test-suite>no</test-suite>
+ <completion>0</completion>
+ <maintainers>
+ <maintainer>dick@ximian.com</maintainer>
+ </maintainers>
+ </class>
<class name="System.Web.HttpCacheability">
<last-activity>Aug-9-2001</last-activity>
<implementation>yes</implementation>