diff -urN honeyd-0.5/WIN32-Code/config.h honeyd-0.5-win32/WIN32-Code/config.h
--- honeyd-0.5/WIN32-Code/config.h	Wed Dec 31 18:00:00 1969
+++ honeyd-0.5-win32/WIN32-Code/config.h	Fri Mar 14 00:19:42 2003
@@ -0,0 +1,266 @@
+/* config.h.  Generated automatically by configure.  */
+/* config.h.in.  Generated automatically from configure.in by autoheader.  */
+/* Define if the addr_cmp in libdnet is broken */
+/* #undef HAVE_BROKEN_DNET */
+
+/* Define to `unsigned int' if <sys/types.h> doesn't define.  */
+/* #undef u_int */
+
+/* Define to `unsigned long long' if <sys/types.h> doesn't define.  */
+/* #undef u_int64_t */
+
+/* Define to `unsigned int' if <sys/types.h> doesn't define.  */
+/* #undef u_int32_t */
+
+/* Define to `unsigned short' if <sys/types.h> doesn't define.  */
+/* #undef u_int16_t */
+
+/* Define to `unsigned char' if <sys/types.h> doesn't define.  */
+/* #undef u_int8_t */
+
+/* Define if timeradd is defined in <sys/time.h> */
+#define HAVE_TIMERADD 1
+#ifndef HAVE_TIMERADD
+#define timeradd(tvp, uvp, vvp)                                         \
+        do {                                                            \
+                (vvp)->tv_sec = (tvp)->tv_sec + (uvp)->tv_sec;          \
+                (vvp)->tv_usec = (tvp)->tv_usec + (uvp)->tv_usec;       \
+                if ((vvp)->tv_usec >= 1000000) {                        \
+                        (vvp)->tv_sec++;                                \
+                        (vvp)->tv_usec -= 1000000;                      \
+                }                                                       \
+        } while (0)
+#define	timersub(tvp, uvp, vvp)						\
+	do {								\
+		(vvp)->tv_sec = (tvp)->tv_sec - (uvp)->tv_sec;		\
+		(vvp)->tv_usec = (tvp)->tv_usec - (uvp)->tv_usec;	\
+		if ((vvp)->tv_usec < 0) {				\
+			(vvp)->tv_sec--;				\
+			(vvp)->tv_usec += 1000000;			\
+		}							\
+	} while (0)
+#endif /* !HAVE_TIMERADD */
+
+/* Define if isblank is defined in <ctype.h> */
+#define HAVE_ISBLANK 1
+#ifndef HAVE_ISBLANK
+#define isblank(x)	((x) == ' ' || (x) == '\t')
+#endif
+
+/* Define if your system defines struct sockaddr_storage */
+#define HAVE_STRUCT_SOCKADDR_STORAGE 1
+
+/* Define if you have the `daemon' function. */
+/* #undef HAVE_DAEMON */
+
+/* Define if you don't have `vprintf' but do have `_doprnt.' */
+/* #undef HAVE_DOPRNT */
+
+/* Define if you have the `dup2' function. */
+/* #undef HAVE_DUP2 */
+
+/* Define if you have the `err' function. */
+#define HAVE_ERR 1
+
+/* Define if you have the <errno.h> header file. */
+#define HAVE_ERRNO_H 1
+
+/* Define if you have the <fcntl.h> header file. */
+#define HAVE_FCNTL_H 1
+
+/* Define if you have the `freeaddrinfo' function. */
+#define HAVE_FREEADDRINFO 1
+
+/* Define if you have the `getaddrinfo' function. */
+#define HAVE_GETADDRINFO 1
+
+/* Define if you have the `gettimeofday' function. */
+#define HAVE_GETTIMEOFDAY 1
+
+/* Define if you have the <inttypes.h> header file. */
+#define HAVE_INTTYPES_H 1
+
+/* Define if you have the `isblank' function. */
+#define HAVE_ISBLANK 1
+
+/* Define if you have the `memmove' function. */
+#define HAVE_MEMMOVE 1
+
+/* Define if you have the <memory.h> header file. */
+#define HAVE_MEMORY_H 1
+
+/* Define if you have the `memset' function. */
+#define HAVE_MEMSET 1
+
+/* Define if you have the <paths.h> header file. */
+#define HAVE_PATHS_H 1
+
+/* Define if you have the `setgroups' function. */
+/* #undef HAVE_SETGROUPS */
+
+/* Define if you have the <stdint.h> header file. */
+/* #undef HAVE_STDINT_H */
+
+/* Define if you have the <stdlib.h> header file. */
+#define HAVE_STDLIB_H 1
+
+/* Define if you have the `strcasecmp' function. */
+#define HAVE_STRCASECMP 1
+
+/* Define if you have the `strchr' function. */
+#define HAVE_STRCHR 1
+
+/* Define if you have the `strdup' function. */
+#define HAVE_STRDUP 1
+
+/* Define if you have the <strings.h> header file. */
+#define HAVE_STRINGS_H 1
+
+/* Define if you have the <string.h> header file. */
+#define HAVE_STRING_H 1
+
+/* Define if you have the `strlcpy' function. */
+/* #undef HAVE_STRLCPY */
+
+/* Define if you have the `strncasecmp' function. */
+#define HAVE_STRNCASECMP 1
+
+/* Define if you have the `strsep' function. */
+/* #undef HAVE_STRSEP */
+
+/* Define if you have the `strspn' function. */
+#define HAVE_STRSPN 1
+
+/* Define if you have the `strtoul' function. */
+#define HAVE_STRTOUL 1
+
+/* Define if you have the <syslog.h> header file. */
+#define HAVE_SYSLOG_H 1
+
+/* Define if you have the <sys/ioccom.h> header file. */
+/* #undef HAVE_SYS_IOCCOM_H */
+
+/* Define if you have the <sys/ioctl.h> header file. */
+#define HAVE_SYS_IOCTL_H 1
+
+/* Define if you have the <sys/param.h> header file. */
+/* #undef HAVE_SYS_PARAM_H */
+
+/* Define if you have the <sys/socket.h> header file. */
+#define HAVE_SYS_SOCKET_H 1
+
+/* Define if you have the <sys/stat.h> header file. */
+#define HAVE_SYS_STAT_H 1
+
+/* Define if you have the <sys/time.h> header file. */
+#define HAVE_SYS_TIME_H 1
+
+/* Define if you have the <syslog.h> header file.  */
+#define HAVE_SYSLOG_H 1
+
+/* Define if you have the <time.h> header file.  */
+#define HAVE_TIME_H 1
+
+/* Define if you have the <sys/types.h> header file. */
+#define HAVE_SYS_TYPES_H 1
+
+/* Define if you have <sys/wait.h> that is POSIX.1 compatible. */
+#define HAVE_SYS_WAIT_H 1
+
+/* Define if you have the <unistd.h> header file. */
+#define HAVE_UNISTD_H 1
+
+/* Define if you have the `vprintf' function. */
+#define HAVE_VPRINTF 1
+
+/* Name of package */
+#define PACKAGE "honeyd"
+
+/* Define as the return type of signal handlers (`int' or `void'). */
+#define RETSIGTYPE void
+
+/* Define if you have the ANSI C header files. */
+#define STDC_HEADERS 1
+
+/* Define if you can safely include both <sys/time.h> and <time.h>. */
+#define TIME_WITH_SYS_TIME 1
+
+/* Version number of package */
+#define VERSION "0.4a"
+
+/* Define if `lex' declares `yytext' as a `char *' by default, not a `char[]'.
+   */
+#define YYTEXT_POINTER 1
+
+/* Define to empty if `const' does not conform to ANSI C. */
+/* #undef const */
+
+/* Define to `int' if <sys/types.h> doesn't define. */
+/* #undef gid_t */
+
+/* Define to `int' if <sys/types.h> does not define. */
+/* #undef pid_t */
+
+/* Define to `unsigned' if <sys/types.h> does not define. */
+/* #undef size_t */
+
+/* Define to `unsigned int' if <sys/types.h> does not define. */
+/* #undef u_int */
+
+/* Define to `unsigned short' if <sys/types.h> does not define. */
+/* #undef u_int16_t */
+
+/* Define to `unsigned int' if <sys/types.h> does not define. */
+/* #undef u_int32_t */
+
+/* Define to `unsigned long long' if <sys/types.h> does not define. */
+/* #undef u_int64_t */
+
+/* Define to `unsigned char' if <sys/types.h> does not define. */
+/* #undef u_int8_t */
+
+/* Define to `int' if <sys/types.h> doesn't define. */
+/* #undef uid_t */
+
+/* Prototypes for missing functions */
+#ifdef WIN32
+#include <winsock2.h>
+#endif
+
+#ifndef HAVE_STRLCPY
+size_t	 strlcpy(char *, const char *, size_t);
+#endif
+
+#ifndef HAVE_STRSEP
+char	*strsep(char **, const char *);
+#endif
+
+#ifndef HAVE_DAEMON
+int	daemon(int, int);
+#endif
+
+#ifdef WIN32
+#include <io.h>
+#define uid_t int
+#define gid_t int
+#define pid_t int
+#define SHUT_WR SD_SEND
+#define snprintf _snprintf
+#define strcasecmp stricmp
+#define strncasecmp strnicmp
+#define __FUNCTION__ "honeyd-win32"
+#define __func__ __FUNCTION__
+#define UINT_MAX 0xFFFFU/0xFFFFFFFFUL
+#define read _read
+#define write _write
+#define socklen_t uint32_t
+#define ssize_t long
+#define setegid
+#define setgid
+#define seteuid
+#define setuid
+
+static __inline int isblank(int c) { if(c == ' ' || c == '\t') return 1; return 0; }
+size_t	strlcat(char *, const char *, size_t);
+
+#endif
diff -urN honeyd-0.5/WIN32-Code/getopt.c honeyd-0.5-win32/WIN32-Code/getopt.c
--- honeyd-0.5/WIN32-Code/getopt.c	Wed Dec 31 18:00:00 1969
+++ honeyd-0.5-win32/WIN32-Code/getopt.c	Fri Dec  1 08:37:14 2000
@@ -0,0 +1,106 @@
+#include <stdio.h>                  /* for EOF */ 
+#include <string.h>                 /* for strchr() */ 
+
+#include "getopt.h" 
+ 
+/* static (global) variables that are specified as exported by getopt() */ 
+char *optarg = NULL;    /* pointer to the start of the option argument  */ 
+int   optind = 1;       /* number of the next argv[] to be evaluated    */ 
+int   opterr = 1;       /* non-zero if a question mark should be returned 
+                           when a non-valid option character is detected */
+
+int getopt(int argc, char *argv[], char *opstring) 
+{ 
+    static char *pIndexPosition = NULL; /* place inside current argv string */ 
+    char *pArgString = NULL;        /* where to start from next */ 
+    char *pOptString;               /* the string in our program */ 
+ 
+ 
+    if (pIndexPosition != NULL) { 
+        /* we last left off inside an argv string */ 
+        if (*(++pIndexPosition)) { 
+            /* there is more to come in the most recent argv */ 
+            pArgString = pIndexPosition; 
+        } 
+    } 
+ 
+    if (pArgString == NULL) { 
+        /* we didn't leave off in the middle of an argv string */ 
+        if (optind >= argc) { 
+            /* more command-line arguments than the argument count */ 
+            pIndexPosition = NULL;  /* not in the middle of anything */ 
+            return EOF;             /* used up all command-line arguments */ 
+        } 
+ 
+        /*--------------------------------------------------------------------- 
+         * If the next argv[] is not an option, there can be no more options. 
+         *-------------------------------------------------------------------*/ 
+        pArgString = argv[optind++]; /* set this to the next argument ptr */ 
+ 
+        if (('/' != *pArgString) && /* doesn't start with a slash or a dash? */ 
+            ('-' != *pArgString)) { 
+            --optind;               /* point to current arg once we're done */ 
+            optarg = NULL;          /* no argument follows the option */ 
+            pIndexPosition = NULL;  /* not in the middle of anything */ 
+            return EOF;             /* used up all the command-line flags */ 
+        } 
+
+        /* check for special end-of-flags markers */ 
+        if ((strcmp(pArgString, "-") == 0) || 
+            (strcmp(pArgString, "--") == 0)) { 
+            optarg = NULL;          /* no argument follows the option */ 
+            pIndexPosition = NULL;  /* not in the middle of anything */ 
+            return EOF;             /* encountered the special flag */ 
+        } 
+ 
+        pArgString++;               /* look past the / or - */ 
+    } 
+ 
+    if (':' == *pArgString) {       /* is it a colon? */ 
+        /*--------------------------------------------------------------------- 
+         * Rare case: if opterr is non-zero, return a question mark; 
+         * otherwise, just return the colon we're on. 
+         *-------------------------------------------------------------------*/ 
+        return (opterr ? (int)'?' : (int)':'); 
+    } 
+    else if ((pOptString = strchr(opstring, *pArgString)) == 0) { 
+        /*--------------------------------------------------------------------- 
+         * The letter on the command-line wasn't any good. 
+         *-------------------------------------------------------------------*/ 
+        optarg = NULL;              /* no argument follows the option */ 
+        pIndexPosition = NULL;      /* not in the middle of anything */ 
+        return (opterr ? (int)'?' : (int)*pArgString); 
+    } 
+    else { 
+        /*--------------------------------------------------------------------- 
+         * The letter on the command-line matches one we expect to see 
+         *-------------------------------------------------------------------*/ 
+        if (':' == _next_char(pOptString)) { /* is the next letter a colon? */ 
+            /* It is a colon.  Look for an argument string. */ 
+            if ('\0' != _next_char(pArgString)) {  /* argument in this argv? */ 
+                optarg = &pArgString[1];   /* Yes, it is */ 
+            } 
+            else { 
+                /*------------------------------------------------------------- 
+                 * The argument string must be in the next argv. 
+                 * But, what if there is none (bad input from the user)? 
+                 * In that case, return the letter, and optarg as NULL. 
+                 *-----------------------------------------------------------*/ 
+                if (optind < argc) 
+                    optarg = argv[optind++]; 
+                else { 
+                    optarg = NULL; 
+                    return (opterr ? (int)'?' : (int)*pArgString); 
+                } 
+            } 
+
+            pIndexPosition = NULL;  /* not in the middle of anything */ 
+        } 
+        else { 
+            /* it's not a colon, so just return the letter */ 
+            optarg = NULL;          /* no argument follows the option */ 
+            pIndexPosition = pArgString;    /* point to the letter we're on */ 
+        } 
+        return (int)*pArgString;    /* return the letter that matched */ 
+    } 
+}
diff -urN honeyd-0.5/WIN32-Code/getopt.h honeyd-0.5-win32/WIN32-Code/getopt.h
--- honeyd-0.5/WIN32-Code/getopt.h	Wed Dec 31 18:00:00 1969
+++ honeyd-0.5-win32/WIN32-Code/getopt.h	Fri Dec  1 08:37:14 2000
@@ -0,0 +1,8 @@
+
+#define _next_char(string)  (char)(*(string+1))
+
+extern char * optarg; 
+extern int    optind; 
+
+int getopt(int, char**, char*);
+
diff -urN honeyd-0.5/WIN32-Code/misc.c honeyd-0.5-win32/WIN32-Code/misc.c
--- honeyd-0.5/WIN32-Code/misc.c	Wed Dec 31 18:00:00 1969
+++ honeyd-0.5-win32/WIN32-Code/misc.c	Fri Mar 14 17:21:28 2003
@@ -0,0 +1,67 @@
+#include <stdio.h>
+#include <string.h>
+#include <windows.h>
+#include <sys/timeb.h>
+#include <time.h>
+
+/****************************************************************************
+ *
+ * Function: gettimeofday(struct timeval *, struct timezone *)
+ *
+ * Purpose:  Get current time of day.
+ *
+ * Arguments: tv => Place to store the curent time of day.
+ *            tz => Ignored.
+ *
+ * Returns: 0 => Success.
+ *
+ ****************************************************************************/
+
+int gettimeofday(struct timeval *tv, struct timezone *tz) {
+  struct _timeb tb;
+
+	if(tv == NULL)
+		return -1;
+
+	_ftime(&tb);
+	tv->tv_sec = tb.time;
+	tv->tv_usec = ((int) tb.millitm) * 1000;
+	return 0;
+}
+
+int setenv(const char *name, const char *value, int overwrite)
+{
+	char buf[1024];
+	memset(buf, 0, sizeof(buf));
+	_snprintf(buf, sizeof(buf) - 1, "%s=%s", name, value);
+	return _putenv(buf);
+}
+
+/****************************************************************************
+ *
+ * Function: init_winsock(void)
+ *
+ * Purpose:  Initialize winsock.
+ *
+ * Arguments: None.
+ *
+ * Returns: 0 => Initilization failed.
+ *          1 => Initilization succeeded.
+ *
+ ****************************************************************************/
+
+int init_winsock(void) {
+  WORD wVersionRequested = MAKEWORD(1, 1);
+  WSADATA wsaData;
+
+  if (WSAStartup(wVersionRequested, &wsaData)) {
+    return 0;
+  }
+
+  if (LOBYTE(wsaData.wVersion) < 1 || HIBYTE(wsaData.wVersion) < 1) {
+    WSACleanup();
+    return 0;
+  }
+	
+  return 1;
+}	
diff -urN honeyd-0.5/WIN32-Code/misc.h honeyd-0.5-win32/WIN32-Code/misc.h
--- honeyd-0.5/WIN32-Code/misc.h	Wed Dec 31 18:00:00 1969
+++ honeyd-0.5-win32/WIN32-Code/misc.h	Sun Mar  9 21:25:10 2003
@@ -0,0 +1,8 @@
+#ifndef MISC_H
+#define MISC_H
+
+int gettimeofday(struct timeval *,struct timezone *);
+int setenv(const char *name, const char *value, int overwrite);
+int init_winsock(void);
+
+#endif
diff -urN honeyd-0.5/WIN32-Code/strlcat.c honeyd-0.5-win32/WIN32-Code/strlcat.c
--- honeyd-0.5/WIN32-Code/strlcat.c	Wed Dec 31 18:00:00 1969
+++ honeyd-0.5-win32/WIN32-Code/strlcat.c	Mon Nov 19 16:27:10 2001
@@ -0,0 +1,73 @@
+/*	$OpenBSD: strlcat.c,v 1.8 2001/05/13 15:40:15 deraadt Exp $	*/
+
+/*
+ * Copyright (c) 1998 Todd C. Miller <Todd.Miller@courtesan.com>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. The name of the author may not be used to endorse or promote products
+ *    derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL
+ * THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
+ * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#if defined(LIBC_SCCS) && !defined(lint)
+static char *rcsid = "$OpenBSD: strlcat.c,v 1.8 2001/05/13 15:40:15 deraadt Exp $";
+#endif /* LIBC_SCCS and not lint */
+
+#include <sys/types.h>
+#include <string.h>
+
+/*
+ * Appends src to string dst of size siz (unlike strncat, siz is the
+ * full size of dst, not space left).  At most siz-1 characters
+ * will be copied.  Always NUL terminates (unless siz <= strlen(dst)).
+ * Returns strlen(src) + MIN(siz, strlen(initial dst)).
+ * If retval >= siz, truncation occurred.
+ */
+size_t
+strlcat(dst, src, siz)
+	char *dst;
+	const char *src;
+	size_t siz;
+{
+	register char *d = dst;
+	register const char *s = src;
+	register size_t n = siz;
+	size_t dlen;
+
+	/* Find the end of dst and adjust bytes left but don't go past end */
+	while (n-- != 0 && *d != '\0')
+		d++;
+	dlen = d - dst;
+	n = siz - dlen;
+
+	if (n == 0)
+		return(dlen + strlen(s));
+	while (*s != '\0') {
+		if (n != 1) {
+			*d++ = *s;
+			n--;
+		}
+		s++;
+	}
+	*d = '\0';
+
+	return(dlen + (s - src));	/* count does not include NUL */
+}
diff -urN honeyd-0.5/WIN32-Code/sys/time.h honeyd-0.5-win32/WIN32-Code/sys/time.h
--- honeyd-0.5/WIN32-Code/sys/time.h	Wed Dec 31 18:00:00 1969
+++ honeyd-0.5-win32/WIN32-Code/sys/time.h	Mon Jan 27 23:00:58 2003
@@ -0,0 +1,155 @@
+/*	$OpenBSD: time.h,v 1.11 2000/10/10 13:36:48 itojun Exp $	*/
+/*	$NetBSD: time.h,v 1.18 1996/04/23 10:29:33 mycroft Exp $	*/
+
+/*
+ * Copyright (c) 1982, 1986, 1993
+ *	The Regents of the University of California.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *	This product includes software developed by the University of
+ *	California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ *	@(#)time.h	8.2 (Berkeley) 7/10/94
+ */
+
+#ifndef _SYS_TIME_H_
+#define _SYS_TIME_H_
+
+#include <sys/types.h>
+
+/*
+ * Structure defined by POSIX.1b to be like a timeval.
+ */
+struct timespec {
+	time_t	tv_sec;		/* seconds */
+	long	tv_nsec;	/* and nanoseconds */
+};
+
+#define	TIMEVAL_TO_TIMESPEC(tv, ts) {					\
+	(ts)->tv_sec = (tv)->tv_sec;					\
+	(ts)->tv_nsec = (tv)->tv_usec * 1000;				\
+}
+#define	TIMESPEC_TO_TIMEVAL(tv, ts) {					\
+	(tv)->tv_sec = (ts)->tv_sec;					\
+	(tv)->tv_usec = (ts)->tv_nsec / 1000;				\
+}
+
+struct timezone {
+	int	tz_minuteswest;	/* minutes west of Greenwich */
+	int	tz_dsttime;	/* type of dst correction */
+};
+#define	DST_NONE	0	/* not on dst */
+#define	DST_USA		1	/* USA style dst */
+#define	DST_AUST	2	/* Australian style dst */
+#define	DST_WET		3	/* Western European dst */
+#define	DST_MET		4	/* Middle European dst */
+#define	DST_EET		5	/* Eastern European dst */
+#define	DST_CAN		6	/* Canada */
+
+/* Operations on timevals. */
+#define	timerclear(tvp)		(tvp)->tv_sec = (tvp)->tv_usec = 0
+#define	timerisset(tvp)		((tvp)->tv_sec || (tvp)->tv_usec)
+
+#define	timeradd(tvp, uvp, vvp)						\
+	do {								\
+		(vvp)->tv_sec = (tvp)->tv_sec + (uvp)->tv_sec;		\
+		(vvp)->tv_usec = (tvp)->tv_usec + (uvp)->tv_usec;	\
+		if ((vvp)->tv_usec >= 1000000) {			\
+			(vvp)->tv_sec++;				\
+			(vvp)->tv_usec -= 1000000;			\
+		}							\
+	} while (0)
+#define	timersub(tvp, uvp, vvp)						\
+	do {								\
+		(vvp)->tv_sec = (tvp)->tv_sec - (uvp)->tv_sec;		\
+		(vvp)->tv_usec = (tvp)->tv_usec - (uvp)->tv_usec;	\
+		if ((vvp)->tv_usec < 0) {				\
+			(vvp)->tv_sec--;				\
+			(vvp)->tv_usec += 1000000;			\
+		}							\
+	} while (0)
+
+/* Operations on timespecs. */
+#define	timespecclear(tsp)		(tsp)->tv_sec = (tsp)->tv_nsec = 0
+#define	timespecisset(tsp)		((tsp)->tv_sec || (tsp)->tv_nsec)
+#define	timespeccmp(tsp, usp, cmp)					\
+	(((tsp)->tv_sec == (usp)->tv_sec) ?				\
+	    ((tsp)->tv_nsec cmp (usp)->tv_nsec) :			\
+	    ((tsp)->tv_sec cmp (usp)->tv_sec))
+#define	timespecadd(tsp, usp, vsp)					\
+	do {								\
+		(vsp)->tv_sec = (tsp)->tv_sec + (usp)->tv_sec;		\
+		(vsp)->tv_nsec = (tsp)->tv_nsec + (usp)->tv_nsec;	\
+		if ((vsp)->tv_nsec >= 1000000000L) {			\
+			(vsp)->tv_sec++;				\
+			(vsp)->tv_nsec -= 1000000000L;			\
+		}							\
+	} while (0)
+#define	timespecsub(tsp, usp, vsp)					\
+	do {								\
+		(vsp)->tv_sec = (tsp)->tv_sec - (usp)->tv_sec;		\
+		(vsp)->tv_nsec = (tsp)->tv_nsec - (usp)->tv_nsec;	\
+		if ((vsp)->tv_nsec < 0) {				\
+			(vsp)->tv_sec--;				\
+			(vsp)->tv_nsec += 1000000000L;			\
+		}							\
+	} while (0)
+
+/*
+ * Names of the interval timers, and structure
+ * defining a timer setting.
+ */
+#define	ITIMER_REAL	0
+#define	ITIMER_VIRTUAL	1
+#define	ITIMER_PROF	2
+
+struct	itimerval {
+	struct	timeval it_interval;	/* timer interval */
+	struct	timeval it_value;	/* current value */
+};
+
+/*
+ * Getkerninfo clock information structure
+ */
+struct clockinfo {
+	int	hz;		/* clock frequency */
+	int	tick;		/* micro-seconds per hz tick */
+	int	tickadj;	/* clock skew rate for adjtime() */
+	int	stathz;		/* statistics clock frequency */
+	int	profhz;		/* profiling clock frequency */
+};
+
+#define CLOCK_REALTIME	0
+#define CLOCK_VIRTUAL	1
+#define CLOCK_PROF	2
+
+#define TIMER_RELTIME	0x0	/* relative timer */
+#define TIMER_ABSTIME	0x1	/* absolute timer */
+
+/* --- stuff got cut here - niels --- */
+
+#endif /* !_SYS_TIME_H_ */
diff -urN honeyd-0.5/WIN32-Code/syslog.c honeyd-0.5-win32/WIN32-Code/syslog.c
--- honeyd-0.5/WIN32-Code/syslog.c	Wed Dec 31 18:00:00 1969
+++ honeyd-0.5-win32/WIN32-Code/syslog.c	Fri Mar 14 19:13:10 2003
@@ -0,0 +1,111 @@
+/* -/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/
+ . Copyright (c) 2003 Michael Davis <mike@datanerds.net>
+ . All rights reserved.
+ .
+ . Redistribution and use in source and binary forms, with or without
+ . modification, are permitted provided that the following conditions
+ . are met:
+ .
+ . 1. Redistributions of source code must retain the above copyright
+ .    notice, this list of conditions and the following disclaimer.
+ .
+ . 2. Redistributions in binary form must reproduce the above copyright
+ .    notice, this list of conditions and the following disclaimer in the
+ .    documentation and/or other materials provided with the distribution.
+ .
+ . 3. The name of author may not be used to endorse or promote products
+ .    derived from this software without specific prior written permission.
+ .
+ . THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ . INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ . AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
+ . THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ . EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ . PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
+ . OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ . WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+ . OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ . ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ . -\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\ */
+
+#include <windows.h>
+#include <stdio.h>
+#include <time.h>
+#include "syslog.h"
+
+#define TBUF_LEN        2048
+#define FMT_LEN         1024
+#define INTERNALLOG     LOG_ERR|LOG_CONS|LOG_PERROR|LOG_PID
+
+static int      LogFile = -1;           /* fd for log */
+static int      opened;                 /* have done openlog() */
+static int      LogStat = 0;            /* status bits, set by openlog() */
+static char *LogTag = NULL;       /* string to tag the entry with */
+static int      LogFacility = LOG_USER; /* default facility code */
+static int      LogMask = 0xff;         /* mask of priorities to be logged */
+extern int debug;
+void syslog(int pri, char *fmt, ...)
+{
+        va_list ap;
+        va_start(ap, fmt);
+        vsyslog(pri, fmt, ap);
+        va_end(ap);
+}
+
+void vsyslog(int pri, char *fmt, va_list ap){
+	char ch, *p, *t;
+	int tbuf_left, fmt_left, prlen, saved_errno;
+	char tbuf[TBUF_LEN], fmt_cpy[FMT_LEN];
+
+	p = tbuf;
+	tbuf_left = TBUF_LEN;
+
+	saved_errno = errno;
+
+        /*
+         * We wouldn't need this mess if printf handled %m, or if
+         * strerror() had been invented before syslog().
+         */
+        for (t = fmt_cpy, fmt_left = FMT_LEN; (ch = *fmt); ++fmt) {
+                if (ch == '%' && fmt[1] == 'm') {
+                        ++fmt;
+                        prlen = _snprintf(t, fmt_left, "%s",
+                            strerror(saved_errno));
+                        if (prlen >= fmt_left)
+                                prlen = fmt_left - 1;
+                        t += prlen;
+                        fmt_left -= prlen;
+                } else {
+                        if (fmt_left > 1) {
+                                *t++ = ch;
+                                fmt_left--;
+                        }
+                }
+        }
+        *t = '\0';
+
+	_vsnprintf(p, tbuf_left, fmt_cpy, ap);
+	
+	/* Get connected, output the message to the local logger. */
+	if(opened)
+		if(debug)
+			printf("%s\n", p);
+
+	return;
+}
+
+void openlog(char *ident, int logstat, int logfac){
+
+	if(ident != NULL){
+		LogTag = ident;
+        LogStat = logstat;
+		if (logfac != 0 && (logfac &~ LOG_FACMASK) == 0)
+                LogFacility = logfac;
+	}
+	opened = 1;
+}
+
+void closelog()
+{
+  opened = 0;
+}
diff -urN honeyd-0.5/WIN32-Code/syslog.h honeyd-0.5-win32/WIN32-Code/syslog.h
--- honeyd-0.5/WIN32-Code/syslog.h	Wed Dec 31 18:00:00 1969
+++ honeyd-0.5-win32/WIN32-Code/syslog.h	Sun Mar  9 19:03:12 2003
@@ -0,0 +1,240 @@
+/* -/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/
+ . Copyright (c) 2003 Michael Davis <mike@datanerds.net>
+ . All rights reserved.
+ .
+ . Redistribution and use in source and binary forms, with or without
+ . modification, are permitted provided that the following conditions
+ . are met:
+ .
+ . 1. Redistributions of source code must retain the above copyright
+ .    notice, this list of conditions and the following disclaimer.
+ .
+ . 2. Redistributions in binary form must reproduce the above copyright
+ .    notice, this list of conditions and the following disclaimer in the
+ .    documentation and/or other materials provided with the distribution.
+ .
+ . 3. The name of author may not be used to endorse or promote products
+ .    derived from this software without specific prior written permission.
+ .
+ . THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ . INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ . AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
+ . THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ . EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ . PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
+ . OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ . WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+ . OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ . ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ . -\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\ */
+ 
+/*	$OpenBSD: syslog.h,v 1.5 1998/02/10 18:41:57 deraadt Exp $	*/
+/*	$NetBSD: syslog.h,v 1.14 1996/04/03 20:46:44 christos Exp $	*/
+
+/*
+ * Copyright (c) 1982, 1986, 1988, 1993
+ *	The Regents of the University of California.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *	This product includes software developed by the University of
+ *	California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ *	@(#)syslog.h	8.1 (Berkeley) 6/2/93
+ */
+
+#define	_PATH_LOG	"/dev/log"
+
+/*
+ * priorities/facilities are encoded into a single 32-bit quantity, where the
+ * bottom 3 bits are the priority (0-7) and the top 28 bits are the facility
+ * (0-big number).  Both the priorities and the facilities map roughly
+ * one-to-one to strings in the syslogd(8) source code.  This mapping is
+ * included in this file.
+ *
+ * priorities (these are ordered)
+ */
+#define	LOG_EMERG	0	/* system is unusable */
+#define	LOG_ALERT	1	/* action must be taken immediately */
+#define	LOG_CRIT	2	/* critical conditions */
+#define	LOG_ERR		3	/* error conditions */
+#define	LOG_WARNING	4	/* warning conditions */
+#define	LOG_NOTICE	5	/* normal but significant condition */
+#define	LOG_INFO	6	/* informational */
+#define	LOG_DEBUG	7	/* debug-level messages */
+
+#define	LOG_PRIMASK	0x07	/* mask to extract priority part (internal) */
+				/* extract priority */
+#define	LOG_PRI(p)	((p) & LOG_PRIMASK)
+#define	LOG_MAKEPRI(fac, pri)	(((fac) << 3) | (pri))
+
+#ifdef SYSLOG_NAMES
+#define	INTERNAL_NOPRI	0x10	/* the "no priority" priority */
+				/* mark "facility" */
+#define	INTERNAL_MARK	LOG_MAKEPRI(LOG_NFACILITIES, 0)
+typedef struct _code {
+	char	*c_name;
+	int	c_val;
+} CODE;
+
+CODE prioritynames[] = {
+	{ "alert",	LOG_ALERT },
+	{ "crit",	LOG_CRIT },
+	{ "debug",	LOG_DEBUG },
+	{ "emerg",	LOG_EMERG },
+	{ "err",	LOG_ERR },
+	{ "error",	LOG_ERR },		/* DEPRECATED */
+	{ "info",	LOG_INFO },
+	{ "none",	INTERNAL_NOPRI },	/* INTERNAL */
+	{ "notice",	LOG_NOTICE },
+	{ "panic", 	LOG_EMERG },		/* DEPRECATED */
+	{ "warn",	LOG_WARNING },		/* DEPRECATED */
+	{ "warning",	LOG_WARNING },
+	{ NULL,		-1 },
+};
+#endif
+
+/* facility codes */
+#define	LOG_KERN	(0<<3)	/* kernel messages */
+#define	LOG_USER	(1<<3)	/* random user-level messages */
+#define	LOG_MAIL	(2<<3)	/* mail system */
+#define	LOG_DAEMON	(3<<3)	/* system daemons */
+#define	LOG_AUTH	(4<<3)	/* security/authorization messages */
+#define	LOG_SYSLOG	(5<<3)	/* messages generated internally by syslogd */
+#define	LOG_LPR		(6<<3)	/* line printer subsystem */
+#define	LOG_NEWS	(7<<3)	/* network news subsystem */
+#define	LOG_UUCP	(8<<3)	/* UUCP subsystem */
+#define	LOG_CRON	(9<<3)	/* clock daemon */
+#define	LOG_AUTHPRIV	(10<<3)	/* security/authorization messages (private) */
+#define	LOG_FTP		(11<<3)	/* ftp daemon */
+
+	/* other codes through 15 reserved for system use */
+#define	LOG_LOCAL0	(16<<3)	/* reserved for local use */
+#define	LOG_LOCAL1	(17<<3)	/* reserved for local use */
+#define	LOG_LOCAL2	(18<<3)	/* reserved for local use */
+#define	LOG_LOCAL3	(19<<3)	/* reserved for local use */
+#define	LOG_LOCAL4	(20<<3)	/* reserved for local use */
+#define	LOG_LOCAL5	(21<<3)	/* reserved for local use */
+#define	LOG_LOCAL6	(22<<3)	/* reserved for local use */
+#define	LOG_LOCAL7	(23<<3)	/* reserved for local use */
+
+#define	LOG_NFACILITIES	24	/* current number of facilities */
+#define	LOG_FACMASK	0x03f8	/* mask to extract facility part */
+				/* facility of pri */
+#define	LOG_FAC(p)	(((p) & LOG_FACMASK) >> 3)
+
+#ifdef SYSLOG_NAMES
+CODE facilitynames[] = {
+	{ "auth",	LOG_AUTH },
+	{ "authpriv",	LOG_AUTHPRIV },
+	{ "cron", 	LOG_CRON },
+	{ "daemon",	LOG_DAEMON },
+	{ "ftp",	LOG_FTP },
+	{ "kern",	LOG_KERN },
+	{ "lpr",	LOG_LPR },
+	{ "mail",	LOG_MAIL },
+	{ "mark", 	INTERNAL_MARK },	/* INTERNAL */
+	{ "news",	LOG_NEWS },
+	{ "security",	LOG_AUTH },		/* DEPRECATED */
+	{ "syslog",	LOG_SYSLOG },
+	{ "user",	LOG_USER },
+	{ "uucp",	LOG_UUCP },
+	{ "local0",	LOG_LOCAL0 },
+	{ "local1",	LOG_LOCAL1 },
+	{ "local2",	LOG_LOCAL2 },
+	{ "local3",	LOG_LOCAL3 },
+	{ "local4",	LOG_LOCAL4 },
+	{ "local5",	LOG_LOCAL5 },
+	{ "local6",	LOG_LOCAL6 },
+	{ "local7",	LOG_LOCAL7 },
+	{ NULL,		-1 },
+};
+#endif
+
+#ifdef _KERNEL
+#define	LOG_PRINTF	-1	/* pseudo-priority to indicate use of printf */
+#endif
+
+/*
+ * arguments to setlogmask.
+ */
+#define	LOG_MASK(pri)	(1 << (pri))		/* mask for one priority */
+#define	LOG_UPTO(pri)	((1 << ((pri)+1)) - 1)	/* all priorities through pri */
+
+/*
+ * Option flags for openlog.
+ *
+ * LOG_ODELAY no longer does anything.
+ * LOG_NDELAY is the inverse of what it used to be.
+ */
+#define	LOG_PID		0x01	/* log the pid with each message */
+#define	LOG_CONS	0x02	/* log on the console if errors in sending */
+#define	LOG_ODELAY	0x04	/* delay open until first syslog() (default) */
+#define	LOG_NDELAY	0x08	/* don't delay open */
+#define	LOG_NOWAIT	0x10	/* don't wait for console forks: DEPRECATED */
+#define	LOG_PERROR	0x20	/* log to stderr as well */
+
+#ifndef _KERNEL
+
+/*
+ * Don't use va_list in the vsyslog() prototype.   Va_list is typedef'd in two
+ * places (<machine/varargs.h> and <machine/stdarg.h>), so if we include one
+ * of them here we may collide with the utility's includes.  It's unreasonable
+ * for utilities to have to include one of them to include syslog.h, so we get
+ * _BSD_VA_LIST_ from <machine/ansi.h> and use it.
+ */
+#ifndef WIN32
+#include <machine/ansi.h>
+#include <sys/cdefs.h>
+#endif
+
+#ifdef WIN32
+void syslog(int, char *, ...);
+void vsyslog(int, char *, va_list);
+void openlog(char *, int, int);
+void closelog(void);
+unsigned long resolve_host(char *);
+#else
+__BEGIN_DECLS
+void	closelog __P((void));
+void	openlog __P((const char *, int, int));
+int	setlogmask __P((int));
+void	syslog __P((int, const char *, ...))
+    __attribute__((__format__(__printf__,2,3)));
+void	vsyslog __P((int, const char *, _BSD_VA_LIST_));
+__END_DECLS
+#endif
+
+#else /* !_KERNEL */
+
+void	logpri __P((int));
+void	log __P((int, const char *, ...))
+    __kprintf_attribute__((__format__(__kprintf__,2,3)));
+int	addlog __P((const char *, ...))
+    __kprintf_attribute__((__format__(__kprintf__,1,2)));
+void	logwakeup __P((void));
+
+#endif /* !_KERNEL */
diff -urN honeyd-0.5/WIN32-Prj/honeyd.dsp honeyd-0.5-win32/WIN32-Prj/honeyd.dsp
--- honeyd-0.5/WIN32-Prj/honeyd.dsp	Wed Dec 31 18:00:00 1969
+++ honeyd-0.5-win32/WIN32-Prj/honeyd.dsp	Fri Mar 14 19:12:08 2003
@@ -0,0 +1,263 @@
+# Microsoft Developer Studio Project File - Name="honeyd" - Package Owner=<4>
+# Microsoft Developer Studio Generated Build File, Format Version 6.00
+# ** DO NOT EDIT **
+
+# TARGTYPE "Win32 (x86) Console Application" 0x0103
+
+CFG=honeyd - Win32 Debug
+!MESSAGE This is not a valid makefile. To build this project using NMAKE,
+!MESSAGE use the Export Makefile command and run
+!MESSAGE 
+!MESSAGE NMAKE /f "honeyd.mak".
+!MESSAGE 
+!MESSAGE You can specify a configuration when running NMAKE
+!MESSAGE by defining the macro CFG on the command line. For example:
+!MESSAGE 
+!MESSAGE NMAKE /f "honeyd.mak" CFG="honeyd - Win32 Debug"
+!MESSAGE 
+!MESSAGE Possible choices for configuration are:
+!MESSAGE 
+!MESSAGE "honeyd - Win32 Release" (based on "Win32 (x86) Console Application")
+!MESSAGE "honeyd - Win32 Debug" (based on "Win32 (x86) Console Application")
+!MESSAGE 
+
+# Begin Project
+# PROP AllowPerConfigDependencies 0
+# PROP Scc_ProjName ""
+# PROP Scc_LocalPath ""
+CPP=cl.exe
+RSC=rc.exe
+
+!IF  "$(CFG)" == "honeyd - Win32 Release"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 0
+# PROP BASE Output_Dir "Release"
+# PROP BASE Intermediate_Dir "Release"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 0
+# PROP Output_Dir "Release"
+# PROP Intermediate_Dir "Release"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
+# ADD CPP /nologo /W3 /GX /O2 /I "..\\" /I "..\WIN32-Code" /I "..\compat" /I "..\..\libevent-0.6" /I "..\..\libdnet-1.5\WIN32-include" /I "..\..\libdnet-1.5\include" /I "..\..\Wpdpack\include" /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /D "HAVE_CONFIG_H" /YX /FD /c
+# ADD BASE RSC /l 0x409 /d "NDEBUG"
+# ADD RSC /l 0x409 /d "NDEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386
+# ADD LINK32 ws2_32.lib ..\..\libevent-0.6\WIN32-Prj\Release\libevent.lib ..\..\WPdpack\Lib\wpcap.lib ..\..\\libdnet-1.5\WIN32-Prj\Release\libdnet.lib Advapi32.lib Iphlpapi.lib /nologo /subsystem:console /machine:I386
+
+!ELSEIF  "$(CFG)" == "honeyd - Win32 Debug"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 1
+# PROP BASE Output_Dir "Debug"
+# PROP BASE Intermediate_Dir "Debug"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 1
+# PROP Output_Dir "Debug"
+# PROP Intermediate_Dir "Debug"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c
+# ADD CPP /nologo /W3 /Gm /GX /ZI /Od /I "..\\" /I "..\WIN32-Code" /I "..\compat" /I "..\..\libevent-0.6" /I "..\..\libdnet-1.5\WIN32-include" /I "..\..\libdnet-1.5\include" /I "..\..\Wpdpack\include" /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /D "HAVE_CONFIG_H" /YX /FD /GZ /c
+# ADD BASE RSC /l 0x409 /d "_DEBUG"
+# ADD RSC /l 0x409 /d "_DEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept
+# ADD LINK32 ws2_32.lib ..\..\libevent-0.6\WIN32-Prj\Debug\libevent.lib ..\..\WPdpack\Lib\wpcap.lib ..\..\\libdnet-1.5\WIN32-Prj\Debug\libdnet.lib Advapi32.lib Iphlpapi.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept
+
+!ENDIF 
+
+# Begin Target
+
+# Name "honeyd - Win32 Release"
+# Name "honeyd - Win32 Debug"
+# Begin Group "Source Files"
+
+# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
+# Begin Source File
+
+SOURCE=..\atomicio.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\command.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\config.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\err.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\fdpass.c
+# End Source File
+# Begin Source File
+
+SOURCE="..\WIN32-Code\getopt.c"
+# End Source File
+# Begin Source File
+
+SOURCE=..\honeyd.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\ipfrag.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\lex.c
+
+!IF  "$(CFG)" == "honeyd - Win32 Release"
+
+!ELSEIF  "$(CFG)" == "honeyd - Win32 Debug"
+
+# ADD CPP /D "i386"
+
+!ENDIF 
+
+# End Source File
+# Begin Source File
+
+SOURCE=..\lex.l
+# End Source File
+# Begin Source File
+
+SOURCE=..\log.c
+# End Source File
+# Begin Source File
+
+SOURCE="..\WIN32-Code\misc.c"
+# End Source File
+# Begin Source File
+
+SOURCE=..\parse.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\personality.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\router.c
+# End Source File
+# Begin Source File
+
+SOURCE="..\WIN32-Code\strlcat.c"
+# End Source File
+# Begin Source File
+
+SOURCE=..\strlcpy.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\strsep.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\subsystem.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\subsystem.h
+# End Source File
+# Begin Source File
+
+SOURCE="..\WIN32-Code\syslog.c"
+# End Source File
+# Begin Source File
+
+SOURCE=..\tcp.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\udp.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\util.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\xprobe_assoc.c
+# End Source File
+# End Group
+# Begin Group "Header Files"
+
+# PROP Default_Filter "h;hpp;hxx;hm;inl"
+# Begin Source File
+
+SOURCE="..\WIN32-Code\config.h"
+# End Source File
+# Begin Source File
+
+SOURCE=..\fdpass.h
+# End Source File
+# Begin Source File
+
+SOURCE="..\WIN32-Code\getopt.h"
+# End Source File
+# Begin Source File
+
+SOURCE=..\honeyd.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\ipfrag.h
+# End Source File
+# Begin Source File
+
+SOURCE="..\WIN32-Code\misc.h"
+# End Source File
+# Begin Source File
+
+SOURCE=..\parse.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\personality.h
+# End Source File
+# Begin Source File
+
+SOURCE="..\WIN32-Code\res_config.h"
+# End Source File
+# Begin Source File
+
+SOURCE=..\router.h
+# End Source File
+# Begin Source File
+
+SOURCE="..\WIN32-Code\syslog.h"
+# End Source File
+# Begin Source File
+
+SOURCE=..\tcp.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\udp.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\xprobe_assoc.h
+# End Source File
+# End Group
+# Begin Group "Resource Files"
+
+# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe"
+# End Group
+# End Target
+# End Project
diff -urN honeyd-0.5/WIN32-Prj/honeyd.dsw honeyd-0.5-win32/WIN32-Prj/honeyd.dsw
--- honeyd-0.5/WIN32-Prj/honeyd.dsw	Wed Dec 31 18:00:00 1969
+++ honeyd-0.5-win32/WIN32-Prj/honeyd.dsw	Mon Jan 27 22:31:40 2003
@@ -0,0 +1,29 @@
+Microsoft Developer Studio Workspace File, Format Version 6.00
+# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE!
+
+###############################################################################
+
+Project: "honeyd"=".\honeyd.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+}}}
+
+###############################################################################
+
+Global:
+
+Package=<5>
+{{{
+}}}
+
+Package=<3>
+{{{
+}}}
+
+###############################################################################
+
diff -urN honeyd-0.5/WIN32_README.txt honeyd-0.5-win32/WIN32_README.txt
--- honeyd-0.5/WIN32_README.txt	Wed Dec 31 18:00:00 1969
+++ honeyd-0.5-win32/WIN32_README.txt	Fri Mar 14 18:11:42 2003
@@ -0,0 +1,71 @@
+Honeyd - (c) 2002 Niels Provos <provos@citi.umich.edu>
+Honeyd-WIN32 - (c) 2003 Michael A. Davis <mdavis@securityprofiling.com>
+
+About Honeyd-WIN32
+------------------
+
+Honeyd-win32 has all the capabilities of the UNIX version of honeyd with the exception of subsystems. Scripts, proxies, etc are all 100% supported.
+
+Installation:
+-------------
+
+  1. Download and install WinPCAP from http://winpcap.polito.it/.
+     
+     !!! NOTE: Honeyd-win32 has ONLY been test with WinPCAP Version 3.0 Beta. Other versions may or may not work. !!!
+
+  2. Follow the WinPCAP instructions and install the WinPCAP driver.
+      
+  3. Execute honeyd just like the Unix version.
+
+FAQ:
+----
+	Q: Does this version of honeyd contain the newest patches for version 0.5?
+	
+	A: Yes.
+	
+	Q: What directory does honeyd look for its configuration files in?
+	
+	A: Whatever the current working directory is when you execute honeyd.
+	
+	Q: Can I use the scripts that come with honeyd?
+	
+	A: Yes! You need to install cygwin and make sure that the cygwin binary directory is in your System's PATH Variable.
+	
+	Q: When will subsystems be supported?
+	
+	A: Probably not for a while, if ever. I do not know of a win32 way to emulate the LD_PRELOAD functionality in UNIX without a hook server and driver which is a PITA.
+	
+Known Bugs:
+-----------
+  1. When specifying a subsystem within a config file you will receive a parse error.
+	2. If you have two identical Ethernet Adapters(as in Vendor and Model number: i.e. 2 3c905C cards) you will NOT be able to select the second interface to listen on. This is a problem with libdnet that Dug Song and I are fixing.
+       
+Documentation:
+--------------
+
+Please refer to honeyd.html
+
+How to Compile honeyd-win32:
+----------------------------
+
+	1. You need the following libraries: libevent-win32(http://www.secuirtyprofiling.com), libdnet-msvc(http://www.secuirtyprofiling.com), and winpcap Developer Pack(ttp://winpcap.polito.it/) and the Microsoft Platform SDK.
+	2. You shoould extract all three of these libraries into a common directory. here is how the layout should look:
+	
+		\CommonDirectory
+		   \libdnet-1.5
+		   \libevent-0.6
+		   \wpdpack
+		   \honeyd-0.5
+		   
+	3. Load the honeyd.dsw project into MS VC++ 6. NOTE: There is curently no support for MS VC.NET.
+	4. Verify that the Platform SDK has been added to your Directory search path. Go to Tools->Options->Directories. If the path where you installed the MS Platform SDK is not listed then add it to the "Include Files" search and "Library Files" search list.
+	5. Click Build then click Build honeyd.exe.
+	
+Acknowledgments:
+----------------
+
+The following people have helped with suggestions, ideas or code:
+
+	Brett Oliphant <brett@securityprofiling.com>
+  Dug Song <dugsong@monkey.org>
+  Lance Spitzner <lance@honeynet.org>
diff -urN honeyd-0.5/atomicio.c honeyd-0.5-win32/atomicio.c
--- honeyd-0.5/atomicio.c	Wed Feb 12 21:06:53 2003
+++ honeyd-0.5-win32/atomicio.c	Thu Mar 13 16:10:46 2003
@@ -25,7 +25,9 @@
  */
 
 #include <sys/types.h>
+#ifndef WIN32
 #include <unistd.h>
+#endif
 #include <errno.h>
 
 #ifdef HAVE_CONFIG_H
diff -urN honeyd-0.5/command.c honeyd-0.5-win32/command.c
--- honeyd-0.5/command.c	Sat Feb 15 14:31:49 2003
+++ honeyd-0.5-win32/command.c	Fri Mar 14 19:06:00 2003
@@ -29,18 +29,53 @@
  */
 
 #include <sys/types.h>
-#include <sys/param.h>
 
 #ifdef HAVE_CONFIG_H
 #include "config.h"
 #endif
+#ifdef HAVE_SYS_TIME_H
+#include <sys/time.h>
+#endif
+#ifdef WIN32
+#include "misc.h"
+#include <process.h>
+#include <memory.h>
+#include <string.h>
+#include <stdio.h>
+#include <fcntl.h>
+#include <io.h>
 
+struct sockinet {
+  u_char  si_len;
+  u_char  si_family;
+  u_short si_port;
+};
+
+struct addrinfo {
+  int     ai_flags;
+  int     ai_family;
+  int     ai_socktype;
+  int     ai_protocol;
+  size_t  ai_addrlen;
+  char   *ai_canonname;
+  struct sockaddr  *ai_addr;
+  struct addrinfo  *ai_next;
+};
+
+#define NI_MAXHOST  1025
+#define NI_MAXSERV    32
+#define NI_NUMERICHOST  0x00000002
+#define NI_NUMERICSERV  0x00000008
+#else
+#include <sys/param.h>
 #include <sys/ioctl.h>
+#include <sys/socket.h>
+#include <sys/resource.h>
+#include <unistd.h>
+#endif
 #include <sys/stat.h>
 #include <sys/tree.h>
 #include <sys/queue.h>
-#include <sys/socket.h>
-#include <sys/resource.h>
 
 #include <err.h>
 #include <errno.h>
@@ -49,7 +84,6 @@
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
-#include <unistd.h>
 #include <dnet.h>
 #include <syslog.h>
 
@@ -73,19 +107,41 @@
 void
 cmd_trigger_read(struct command *cmd, int size)
 {
- 	if (cmd->pfd == -1 || !cmd->fdconnected)
+#ifdef WIN32
+	/* Specify a quick timeout becuse we do no want libevent to wait INFINITE. */
+	struct timeval tv = {0,1};
+#endif
+ 	if (cmd->pfd == INVALID_SOCKET || !cmd->fdconnected)
 		return;
 	if (size)
+#ifdef WIN32
+		if(!cmd->IsProxyCmd)
+			event_add(&cmd->pread, &tv);
+		else
+			event_add(&cmd->pread, NULL);
+#else
 		event_add(&cmd->pread, NULL);
+#endif
 }
 
 void
 cmd_trigger_write(struct command *cmd, int size)
 {
- 	if (cmd->pfd == -1 || !cmd->fdconnected)
+#ifdef WIN32
+	/* Specify a quick timeout becuse we do no want libevent to wait INFINITE. */
+	struct timeval tv = {0,1};
+#endif
+ 	if (cmd->pfd == INVALID_SOCKET || !cmd->fdconnected)
 		return;
 	if (size)
+#ifdef WIN32
+	if(!cmd->IsProxyCmd)
+		event_add(&cmd->pwrite, &tv);
+	else
 		event_add(&cmd->pwrite, NULL);
+#else
+		event_add(&cmd->pwrite, NULL);
+#endif
 }
 
 void
@@ -93,24 +149,68 @@
 {
 	event_del(&cmd->pread);
 	event_del(&cmd->pwrite);
+#ifdef WIN32
+	if(cmd->IsProxyCmd) {
+		WSAEventSelect(cmd->pfd, cmd->pread.ev_fd, 0);
+		WSAEventSelect(cmd->pfd, cmd->pwrite.ev_fd, 0);
+		WSACloseEvent(cmd->pread.ev_fd);
+		WSACloseEvent(cmd->pwrite.ev_fd);
+
+		close(cmd->pfd);
+		cmd->pfd = INVALID_SOCKET;
+	} else {
+		CloseHandle((HANDLE)cmd->pfd);
+		cmd->pfd = INVALID_SOCKET;
+		CloseHandle((HANDLE)cmd->pwritefd);
+		cmd->pwritefd = INVALID_SOCKET;
+	}
+#else
 	close(cmd->pfd);
-	cmd->pfd = -1;
+	cmd->pfd = INVALID_SOCKET;
+#endif
 
-	if (cmd->perrfd != -1) {
+	if (cmd->perrfd != INVALID_SOCKET) {
 		event_del(&cmd->peread);
 		close(cmd->perrfd);
-		cmd->perrfd = -1;
+		cmd->perrfd = INVALID_SOCKET;
 	}
 }
 
+#ifdef WIN32
+
+#endif
+
 void
 cmd_ready_fd(struct command *cmd, struct callback *cb, void *con)
 {
+#ifdef WIN32
+	if(cmd->IsProxyCmd) {
+		if((cmd->pread.ev_fd = WSACreateEvent()) == NULL)
+			return;
+		if((cmd->pwrite.ev_fd = WSACreateEvent()) == NULL)
+			return;
+
+		/* 
+			XXX: Creating two events which are read/write may cause issues 
+						but in all my testing it works fine. 
+		*/
+		if(WSAEventSelect(cmd->pfd, cmd->pread.ev_fd, FD_READ|FD_WRITE|FD_CLOSE) == SOCKET_ERROR)
+			errx(1, "WSAEventSelect: %d", WSAGetLastError());
+		if(WSAEventSelect(cmd->pfd, cmd->pwrite.ev_fd, FD_READ|FD_WRITE|FD_CLOSE) == SOCKET_ERROR)
+			errx(1, "WSAEventSelect: %d", WSAGetLastError());
+		event_set(&cmd->pread, (int)cmd->pread.ev_fd, EV_READ, cb->cb_read, con);
+		event_set(&cmd->pwrite, (int)cmd->pwrite.ev_fd, EV_WRITE, cb->cb_write, con);
+	} else {
+		event_set(&cmd->pread, cmd->pfd, EV_READ, cb->cb_read, con);
+		event_set(&cmd->pwrite, cmd->pwritefd, EV_WRITE, cb->cb_write, con);
+	}
+#else
 	event_set(&cmd->pread, cmd->pfd, EV_READ, cb->cb_read, con);
 	event_set(&cmd->pwrite, cmd->pfd, EV_WRITE, cb->cb_write, con);
+#endif
 	cmd->fdconnected = 1;
 
-	if (cmd->perrfd != -1)
+	if (cmd->perrfd != INVALID_SOCKET)
 		event_set(&cmd->peread, cmd->perrfd, EV_READ, cb->cb_eread,
 		    con);
 }
@@ -119,18 +219,50 @@
 cmd_proxy_getinfo(char *address, int type, short port)
 {
 	struct addrinfo ai, *aitop;
+#ifdef WIN32
+	struct hostent *host_entry;
+	struct sockaddr_in *sin;
+#else
         char strport[NI_MAXSERV];
+#endif
 
         memset(&ai, 0, sizeof (ai));
         ai.ai_family = AF_INET;
         ai.ai_socktype = type;
         ai.ai_flags = 0;
+#ifdef WIN32
+	aitop = (struct addrinfo *)malloc(sizeof(struct addrinfo));
+	if(!aitop) {
+		warn("malloc");
+		return (NULL);
+	}
+	aitop->ai_addr = (struct sockaddr *)malloc(sizeof(struct sockaddr));
+	if(!aitop->ai_addr) {
+		warn("malloc");
+		return (NULL);
+	}
+	aitop->ai_addrlen = sizeof(struct sockaddr);
+	sin = (struct sockaddr_in *)aitop->ai_addr;
+	sin->sin_port = htons(port);
+
+  host_entry = gethostbyname(address); 
+
+  if(host_entry == NULL) {
+		warn("gethostbyname");
+		return (NULL);
+  } 
+
+  memcpy(&sin->sin_addr, host_entry->h_addr_list[0], host_entry->h_length); 
+
+  sin->sin_family = host_entry->h_addrtype; 
+  sin->sin_port = htons(port);	
+#else
         snprintf(strport, sizeof (strport), "%d", port);
         if (getaddrinfo(address, strport, &ai, &aitop) != 0) {
                 warn("getaddrinfo");
                 return (NULL);
         }
-
+#endif
 	return (aitop);
 }
 
@@ -143,40 +275,55 @@
 	struct callback *cb;
 	struct timeval tv = {10, 0};
         int fd;
-        
+#ifdef WIN32
+	struct hostent *pHost = NULL;
+
+	cmd->IsProxyCmd = 1;
+#endif        
 	if (hdr->type == SOCK_STREAM)
 		cb = &cb_tcp;
 	else
 		cb = &cb_udp;
 
         fd = socket(AF_INET, hdr->type, 0);
-        if (fd == -1) {
+        if (fd == INVALID_SOCKET) {
                 warn("socket");
                 return (-1);
         }
-
+#ifndef WIN32
         if (fcntl(fd, F_SETFL, O_NONBLOCK) == -1)
                 warn("fcntl(O_NONBLOCK)");
 
         if (fcntl(fd, F_SETFD, 1) == -1)
                 warn("fcntl(F_SETFD)");
-
+#endif
 	cmd->pfd = fd;
         if (connect(fd, ai->ai_addr, ai->ai_addrlen) == 0) {
 		(*cb->cb_connect)(fd, EV_WRITE, con);
 		return (0);
 	}
 
+#ifndef WIN32
 	if (errno != EINPROGRESS) {
 		warn("connect");
 		cmd->pfd = -1;
 		close(fd);
 		return (-1);
 	}
+#endif
 
 	event_set(&cmd->pwrite, fd, EV_WRITE, cb->cb_connect, con);
 	event_add(&cmd->pwrite, &tv);
 
+#ifdef WIN32
+  pHost = gethostbyaddr(ai->ai_addr->sa_data, ai->ai_addrlen,AF_INET);
+	if(pHost)
+		host = pHost->h_name;
+	else
+		host = inet_ntoa(((struct sockaddr_in *)ai->ai_addr)->sin_addr);
+
+	snprintf(port, sizeof(strport), "%d", ntohs(((const struct sockinet *)ai->ai_addr)->si_port));
+#else
 	if (getnameinfo(ai->ai_addr, ai->ai_addrlen,
 		ntop, sizeof(ntop), strport, sizeof(strport),
 		NI_NUMERICHOST|NI_NUMERICSERV) != 0) {
@@ -184,6 +331,7 @@
 		host = "<hosterror>";
 		port = "<porterror>";
 	}
+#endif
 	syslog(LOG_INFO, "Connection established: %s -> proxy to %s:%s",
 	    honeyd_contoa(hdr), host, port);
 
@@ -222,6 +370,7 @@
 int
 cmd_setpriv(struct template *tmpl)
 {
+#ifndef WIN32
 	uid_t uid = 32767;
 	gid_t gid = 32767;
 	struct rlimit rl;
@@ -244,7 +393,7 @@
 	rl.rlim_cur = rl.rlim_max = 24;
 	if (setrlimit(RLIMIT_NOFILE, &rl) == -1)
 		err(1, "setrlimit");
-
+#endif
 	return (0);
 }
 
@@ -253,8 +402,176 @@
     char *execcmd, char **argv, void *con)
 {
 	extern int honeyd_nchildren;
-	int pair[2], perr[2];
 	struct callback *cb;
+#ifdef WIN32
+	int pid;
+  SECURITY_ATTRIBUTES saAttr; 
+  BOOL fSuccess;
+	DWORD dwMode;
+	HANDLE hChildStdinRd, hChildStdinWr, hChildStdinWrDup, 
+   hChildStdoutRd, hChildStdoutWr, hChildStdoutRdDup, 
+	 hChildStderrRd, hChildStderrWr, hChildStderrRdDup, 
+	 hSaveStdin, hSaveStdout, hSaveStderr; 
+
+	// Set the bInheritHandle flag so pipe handles are inherited. 
+
+	saAttr.nLength = sizeof(SECURITY_ATTRIBUTES); 
+	saAttr.bInheritHandle = TRUE; 
+	saAttr.lpSecurityDescriptor = NULL; 
+
+	// The steps for redirecting child process's STDOUT: 
+	//     1. Save current STDOUT, to be restored later. 
+	//     2. Create anonymous pipe to be STDOUT for child process. 
+	//     3. Set STDOUT of the parent process to be write handle to 
+	//        the pipe, so it is inherited by the child process. 
+	//     4. Create a noninheritable duplicate of the read handle and
+	//        close the inheritable read handle. 
+
+	// Save the handle to the current STDOUT. 
+
+	hSaveStdout = GetStdHandle(STD_OUTPUT_HANDLE); 
+
+	// Create a pipe for the child process's STDOUT. 
+
+	if (!CreatePipe(&hChildStdoutRd, &hChildStdoutWr, &saAttr, 0)) 
+		warn("Stdout pipe creation failed\n"); 
+
+	// Set a write handle to the pipe to be STDOUT. 
+
+	if (!SetStdHandle(STD_OUTPUT_HANDLE, hChildStdoutWr)) 
+		warn("Redirecting STDOUT failed"); 
+
+	// Create noninheritable read handle and close the inheritable read 
+	// handle. 
+
+	fSuccess = DuplicateHandle(GetCurrentProcess(), hChildStdoutRd,
+			GetCurrentProcess(), &hChildStdoutRdDup , 0,
+			FALSE,
+			DUPLICATE_SAME_ACCESS);
+	if( !fSuccess )
+			warn("DuplicateHandle failed");
+	CloseHandle(hChildStdoutRd);
+
+	// Save the handle to the current STDERR. 
+
+	hSaveStderr = GetStdHandle(STD_ERROR_HANDLE); 
+
+	// Create a pipe for the child process's STDERR. 
+
+	if (!CreatePipe(&hChildStderrRd, &hChildStderrWr, &saAttr, 0)) 
+		warn("Stderr pipe creation failed\n"); 
+
+	// Set a write handle to the pipe to be STDERR. 
+
+	if (! SetStdHandle(STD_ERROR_HANDLE, hChildStderrWr)) 
+		warn("Redirecting STDERR failed"); 
+
+	// Create noninheritable read handle and close the inheritable read 
+	// handle. 
+
+	fSuccess = DuplicateHandle(GetCurrentProcess(), hChildStderrRd,
+			GetCurrentProcess(), &hChildStderrRdDup , 0,
+			FALSE,
+			DUPLICATE_SAME_ACCESS);
+	if(!fSuccess )
+			warn("DuplicateHandle failed");
+
+	CloseHandle(hChildStderrRd);
+
+	// The steps for redirecting child process's STDIN: 
+	//     1.  Save current STDIN, to be restored later. 
+	//     2.  Create anonymous pipe to be STDIN for child process. 
+	//     3.  Set STDIN of the parent to be the read handle to the 
+	//         pipe, so it is inherited by the child process. 
+	//     4.  Create a noninheritable duplicate of the write handle, 
+	//         and close the inheritable write handle. 
+
+	// Save the handle to the current STDIN. 
+
+	hSaveStdin = GetStdHandle(STD_INPUT_HANDLE); 
+
+	// Create a pipe for the child process's STDIN. 
+
+	if (! CreatePipe(&hChildStdinRd, &hChildStdinWr, &saAttr, 0)) 
+		warn("Stdin pipe creation failed\n"); 
+
+	// Set a read handle to the pipe to be STDIN. 
+
+	if (! SetStdHandle(STD_INPUT_HANDLE, hChildStdinRd)) 
+		warn("Redirecting Stdin failed"); 
+
+	// Duplicate the write handle to the pipe so it is not inherited. 
+
+	fSuccess = DuplicateHandle(GetCurrentProcess(), hChildStdinWr, 
+		GetCurrentProcess(), &hChildStdinWrDup, 0, 
+		FALSE,                  // not inherited 
+		DUPLICATE_SAME_ACCESS); 
+	if (! fSuccess) 
+		warn("DuplicateHandle failed"); 
+
+	CloseHandle(hChildStdinWr); 
+
+	// Set our Pipes to Asynchronous mode.
+	dwMode = PIPE_NOWAIT;
+	SetNamedPipeHandleState( 
+		hChildStdoutRdDup,    // pipe handle 
+		&dwMode,  // new pipe mode 
+		NULL,     // don't set maximum bytes 
+		NULL);    // don't set maximum time 
+	SetNamedPipeHandleState( 
+		hChildStdinWrDup,    // pipe handle 
+		&dwMode,  // new pipe mode 
+		NULL,     // don't set maximum bytes 
+		NULL);
+	SetNamedPipeHandleState( 
+		hChildStderrRdDup,    // pipe handle 
+		&dwMode,  // new pipe mode 
+		NULL,     // don't set maximum bytes 
+		NULL);
+
+	// Place the handles in out command struct.
+	cmd->pfd = (int)hChildStdoutRdDup;
+	cmd->pwritefd = (int)hChildStdinWrDup;
+	cmd->perrfd = (int)hChildStderrRdDup;
+	
+	// Create our Environment.
+	cmd_environment(tmpl, hdr);
+
+	// Spawn process
+	pid = spawnvp(P_NOWAIT, execcmd, argv);
+	if(!pid) {
+		warn("Could not spawn process");
+		return (-1);
+	}
+
+	// To give our cmd some time to initialize. Recommended by MSDN.
+	Sleep(1);
+
+	// After process creation, restore the saved STDIN, STDOUT, and STDERR. 
+	if (!SetStdHandle(STD_INPUT_HANDLE, hSaveStdin)) 
+		warn("Re-redirecting Stdin failed\n"); 
+
+	if (!SetStdHandle(STD_OUTPUT_HANDLE, hSaveStdout)) 
+		warn("Re-redirecting Stdout failed\n"); 
+ 
+	if (!SetStdHandle(STD_ERROR_HANDLE, hSaveStderr)) 
+		warn("Re-redirecting Stderr failed\n"); 
+
+	if (hdr->type == SOCK_STREAM)
+		cb = &cb_tcp;
+	else
+		cb = &cb_udp;
+
+	cmd_ready_fd(cmd, cb, con);
+
+	event_add(&cmd->pread, NULL);
+	event_add(&cmd->peread, NULL);
+
+	honeyd_nchildren++;
+
+	return (0);
+#else
+	int pair[2], perr[2];
 	sigset_t sigmask;
 
 	if (socketpair(AF_UNIX, hdr->type, 0, pair) == -1)
@@ -349,6 +666,7 @@
 	close(pair[0]);
 	close(pair[1]);
 	cmd->pfd = -1;
+#endif
 
 	return (-1);
 }
@@ -357,6 +675,9 @@
 cmd_subsystem(struct template *tmpl, struct subsystem *sub,
     char *execcmd, char **argv)
 {
+#ifdef WIN32
+	return (-1);
+#else
 	extern int honeyd_nchildren;
 	struct command *cmd = &sub->cmd;
 	extern struct callback subsystem_cb;
@@ -440,12 +761,16 @@
 	cmd->pfd = -1;
 
 	return (-1);
+#endif
 }
 
 int
 cmd_subsystem_connect(struct tuple *hdr, struct command *cmd,
     struct port *port, void *con)
 {
+#ifdef WIN32
+	return (-1);
+#else
 	struct callback *cb;
 	struct subsystem *sub = port->sub;
 	struct sockaddr_in si;
@@ -488,12 +813,16 @@
 	    honeyd_contoa(hdr), sub->cmdstring);
 
 	return (0);
+#endif
 }
 
 int
 cmd_subsystem_localconnect(struct tuple *hdr, struct command *cmd,
     struct port *port, void *con)
 {
+#ifdef WIN32
+	return (-1);
+#else
 	struct callback *cb;
 	struct subsystem *sub = port->sub;
 	struct sockaddr_in si;
@@ -559,4 +888,5 @@
 	    sub->cmdstring, honeyd_contoa(hdr));
 
 	return (0);
+#endif
 }
diff -urN honeyd-0.5/compat/sys/queue.h honeyd-0.5-win32/compat/sys/queue.h
--- honeyd-0.5/compat/sys/queue.h	Thu Apr 11 11:41:07 2002
+++ honeyd-0.5-win32/compat/sys/queue.h	Fri Feb 21 20:59:12 2003
@@ -96,11 +96,13 @@
  
 #define	SLIST_HEAD_INITIALIZER(head)					\
 	{ NULL }
- 
+
+#ifndef WIN32 
 #define SLIST_ENTRY(type)						\
 struct {								\
 	struct type *sle_next;	/* next element */			\
 }
+#endif
  
 /*
  * Singly-linked List access methods.
diff -urN honeyd-0.5/config.c honeyd-0.5-win32/config.c
--- honeyd-0.5/config.c	Sat Feb 15 14:53:30 2003
+++ honeyd-0.5-win32/config.c	Thu Mar 13 19:50:24 2003
@@ -29,25 +29,30 @@
  */
 
 #include <sys/types.h>
+#include "config.h"
+
+#ifdef WIN32
+#include <winsock2.h>
+#else
 #include <sys/param.h>
+#include <unistd.h>
+#include <sys/ioctl.h>
+#include <sys/socket.h>
+#endif
 
-#include "config.h"
 #ifdef HAVE_SYS_TIME_H
 #include <sys/time.h>
 #endif
 
-#include <sys/ioctl.h>
 #include <sys/stat.h>
 #include <sys/tree.h>
 #include <sys/queue.h>
-#include <sys/socket.h>
 
 #include <err.h>
 #include <errno.h>
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
-#include <unistd.h>
 #include <dnet.h>
 
 #undef timeout_pending
@@ -173,7 +178,13 @@
 	if (port->action.action != NULL)
 		free (port->action.action);
 	if (port->action.aitop != NULL)
+#ifdef WIN32
+		{
+			free(port->action.aitop);
+		}
+#else
 		freeaddrinfo(port->action.aitop);
+#endif
 	free(port);
 }
 
diff -urN honeyd-0.5/fdpass.c honeyd-0.5-win32/fdpass.c
--- honeyd-0.5/fdpass.c	Thu Feb 13 10:58:39 2003
+++ honeyd-0.5-win32/fdpass.c	Thu Mar 13 19:47:14 2003
@@ -23,15 +23,17 @@
  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  */
 
-#include <sys/param.h>
 #include <sys/types.h>
 
 #ifdef HAVE_CONFIG_H
 #include "config.h"
 #endif
 
+#ifndef WIN32
+#include <sys/param.h>
 #include <sys/socket.h>
 #include <sys/uio.h>
+#endif
 
 #include <errno.h>
 #include <err.h>
@@ -87,6 +89,9 @@
 #else
 	errx(1, "%s: subsystems not supported due to lack of fd passing",
 	    __func__);
+#ifdef WIN32
+	return 0;
+#endif
 #endif
 
 	return (0);
@@ -151,5 +156,8 @@
 #else
 	errx(1, "%s: subsystems not supported due to lack of fd passing",
 	    __func__);
+#ifdef WIN32
+	return 0;
+#endif
 #endif
 }
diff -urN honeyd-0.5/honeyd.c honeyd-0.5-win32/honeyd.c
--- honeyd-0.5/honeyd.c	Sat Feb 15 16:07:48 2003
+++ honeyd-0.5-win32/honeyd.c	Fri Mar 14 19:07:32 2003
@@ -28,7 +28,6 @@
  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  */
 
-#include <sys/param.h>
 #include <sys/types.h>
 
 #ifdef HAVE_CONFIG_H
@@ -41,11 +40,18 @@
 #ifdef HAVE_SYS_IOCCOM_H
 #include <sys/ioccom.h>
 #endif
+#ifdef WIN32
+#include "getopt.h"
+#include "misc.h"
+#else
+#include <sys/param.h>
 #include <sys/resource.h>
 #include <sys/ioctl.h>
+#include <unistd.h>
+#include <sys/wait.h>
+#endif
 #include <sys/stat.h>
 #include <sys/tree.h>
-#include <sys/wait.h>
 #include <sys/queue.h>
 
 #include <pcap.h>
@@ -60,7 +66,6 @@
 #ifdef HAVE_TIME_H
 #include <time.h>
 #endif
-#include <unistd.h>
 #include <dnet.h>
 
 #undef timeout_pending
@@ -122,12 +127,20 @@
 int			 honeyd_dopoll;
 int			 honeyd_ttl;
 struct tcp_con		 honeyd_tmp;
+#ifdef WIN32
+int debug;
+#endif
 
 void
 usage(void)
 {
 	fprintf(stderr,
+#ifdef WIN32
+			"WIN32 Port By Michael A. Davis (mdavis@securityprofiling.com, www.securityprofiling.com)\n"
+			"Usage: honeyd [-dPW] [-l logfile] [-i interface] [-p personalities]\n"
+#else
 	    "Usage: honeyd [-dP] [-l logfile] [-i interface] [-p personalities]\n"
+#endif
 	    "\t[-x xprobe] [-a assoc] [-f config] [net ...]\n");
 	exit(1);
 }
@@ -146,8 +159,12 @@
 	hdr->type = SOCK_STREAM;
 	hdr->local = local;
 	con->rcv_flags = tcp->th_flags;
-	con->cmd.pfd = -1;
-	con->cmd.perrfd = -1;
+	con->cmd.pfd = INVALID_SOCKET;
+	con->cmd.perrfd = INVALID_SOCKET;
+#ifdef WIN32
+	con->cmd.pwritefd = INVALID_SOCKET;
+	con->cmd.IsProxyCmd = 0;
+#endif
 }
 
 void
@@ -164,9 +181,12 @@
 	hdr->type = SOCK_DGRAM;
 	hdr->local = local;
 	con->softerrors = 0;
-	con->cmd.pfd = -1;
-	con->cmd.perrfd = -1;
-
+	con->cmd.pfd = INVALID_SOCKET;
+	con->cmd.perrfd = INVALID_SOCKET;
+#ifdef WIN32
+	con->cmd.pwritefd = INVALID_SOCKET;
+	con->cmd.IsProxyCmd = 0;
+#endif
 	TAILQ_INIT(&con->incoming);
 }
 
@@ -316,7 +336,12 @@
 honeyd_init(char *dev, int naddresses, char **addresses)
 {
 	struct bpf_program fcode;
+#ifndef WIN32
 	struct rlimit rl;
+#else
+	pcap_if_t *alldevs, *d;
+	int adapter, i;
+#endif
 	char filter[1024], ebuf[PCAP_ERRBUF_SIZE], *dst;
 	intf_t *intf;
 	int options, time;
@@ -330,6 +355,7 @@
 
 	memset(&honeyd_tmp, 0, sizeof(honeyd_tmp));
 
+#ifndef WIN32
 	/* Raising file descriptor limits */
 	if (getrlimit(RLIMIT_NOFILE, &rl) == -1)
 		err(1, "getrlimit");
@@ -343,6 +369,8 @@
 	if (setrlimit(RLIMIT_NPROC, &rl) == -1)
 		err(1, "setrlimit");
 #endif
+#endif
+
 	if ((honeyd_ip = ip_open()) == NULL)
 		err(1, "ip_open");
 
@@ -352,13 +380,32 @@
 	if ((intf = intf_open()) == NULL)
 		err(1, "intf_open");
 
+#ifdef WIN32
+	if (pcap_findalldevs(&alldevs, ebuf) == -1)
+		errx(1, "pcap_findalldevs: %s", ebuf);
+	
+	if (dev == NULL)
+		d = alldevs;
+	else {
+		adapter = atoi(dev);
+		for(i=1, d=alldevs; adapter && i <= adapter && d; i++, d=d->next);
+	
+		if (d == NULL)
+			errx(1, "Unable to find adapter %d", adapter);
+	}
+	dev = d->name;
+	honeyd_ifent.intf_len = sizeof(honeyd_ifent);
+	strlcpy(honeyd_ifent.intf_name, alldevs->description, sizeof(honeyd_ifent.intf_name));
+
+#else
 	if (dev == NULL) {
 		if ((dev = pcap_lookupdev(ebuf)) == NULL)
 			errx(1, "pcap_lookupdev: %s", ebuf);
 	}
 	honeyd_ifent.intf_len = sizeof(honeyd_ifent);
 	strlcpy(honeyd_ifent.intf_name, dev, sizeof(honeyd_ifent.intf_name));
-	
+#endif
+
 	if (intf_get(intf, &honeyd_ifent) < 0)
 		err(1, "intf_get");
 
@@ -429,7 +476,9 @@
 			syslog(LOG_WARNING, "calloc: %m");
 			return (NULL);
 	}
-
+#ifdef WIN32
+	con->cmd.IsProxyCmd = 0;
+#endif
 	honeyd_nconnects++;
 	honeyd_settcp(con, ip, tcp, local);
 	timeout_set(&con->timeout, honeyd_tcp_timeout, con);
@@ -663,7 +712,13 @@
 		if ((ai = cmd_proxy_getinfo(name, hdr->type, nport)) == NULL)
 			return (-1);
 		res = cmd_proxy_connect(hdr, cmd, ai, arg);
+#ifdef WIN32
+		if(ai->ai_addr)
+			free(ai->ai_addr);
+		free(ai);
+#else
 		freeaddrinfo(ai);
+#endif
 	} else
 		res = cmd_proxy_connect(hdr, cmd, ai, arg);
 
@@ -776,13 +831,22 @@
 			goto out;
 		return;
 	}
+#ifdef WIN32
+	argv[0] = "C:\\winnt\\system32\\cmd.exe";
+	argv[1] = "/c";
+	argv[2] = line;
+	argv[3] = NULL;
 
+	if (cmd_fork(hdr, cmd, tmpl, "C:\\winnt\\system32\\cmd.exe", argv, con) == -1) {
+#else
 	argv[0] = "/bin/sh";
 	argv[1] = "-c";
 	argv[2] = line;
 	argv[3] = NULL;
 
 	if (cmd_fork(hdr, cmd, tmpl, "/bin/sh", argv, con) == -1) {
+#endif
+
 		syslog(LOG_WARNING, "malloc %s: %m", honeyd_contoa(hdr));
 		goto err;
 	}
@@ -873,7 +937,7 @@
 void
 tcp_senddata(struct tcp_con *con, uint8_t flags)
 {
-	int space, sent;
+	unsigned int space, sent;
 	int needretrans = 0;
 
 	do {
@@ -1271,7 +1335,7 @@
 			} \
 			tcp_drain_payload(con, acked); \
 			acked += ackinc; \
-			if (con->cmd_pfd == -1 && con->plen <= TCP_MAX_SEND) \
+			if (con->cmd_pfd == INVALID_SOCKET && con->plen <= TCP_MAX_SEND) \
 				con->sentfin = 1; \
 		} else if (con->sentfin) { \
 			if (th_ack == con->snd_una + 1) { \
@@ -1594,7 +1658,7 @@
 	udp = (struct udp_hdr *)(pkt + (ip->ip_hl << 2));
 	data = (u_char *)(pkt + (ip->ip_hl*4) + UDP_HDR_LEN);
 	dlen = ntohs(ip->ip_len) - (ip->ip_hl << 2) - UDP_HDR_LEN;
-	if (dlen != (ntohs(udp->uh_ulen) - UDP_HDR_LEN))
+	if ((u_short)dlen != (ntohs(udp->uh_ulen) - UDP_HDR_LEN))
 		return;
 	
 	portnum = ntohs(udp->uh_dport);
@@ -1918,7 +1982,7 @@
 	int delay = 0;
 	u_short iplen;
 
-	if (pkthdr->caplen < honeyd_dloff + IP_HDR_LEN)
+	if (pkthdr->caplen < (unsigned int)(honeyd_dloff + IP_HDR_LEN))
 		return;
 
 	ip = (struct ip_hdr *)(pkt + honeyd_dloff);
@@ -2036,6 +2100,7 @@
 void
 child_handler(int sig)
 {
+#ifndef WIN32
 	int s = errno;
 
 	if (signal(SIGCHLD, child_handler) == SIG_ERR) {
@@ -2047,6 +2112,7 @@
 	while (waitpid(-1, NULL, WNOHANG) > 0)
 		honeyd_nchildren--;
 	errno = s;
+#endif
 }
 
 int
@@ -2069,14 +2135,43 @@
 	char *xprobe = PATH_HONEYDDATA "/xprobe2.conf";
 	char *assoc = PATH_HONEYDDATA "/nmap.assoc";
 	char *logfile = NULL;
+#ifndef WIN32
 	int c, debug;
+#endif
 	FILE *fp;
+#ifdef WIN32
+	int c;
+	char ebuf[PCAP_ERRBUF_SIZE];
+	pcap_if_t *alldevs, *d;
+	int i;
+#endif
 
 	dev = NULL;
 	debug = 0;
-	
+
+#ifdef WIN32
+	while ((c = getopt(argc, argv, "WVPdi:p:x:a:f:l:h?")) != -1) {
+#else
 	while ((c = getopt(argc, argv, "VPdi:p:x:a:f:l:h?")) != -1) {
+#endif
 		switch (c) {
+#ifdef WIN32
+    case 'W':
+				if (pcap_findalldevs(&alldevs, ebuf) == -1)
+					errx(1, "pcap_findalldevs: %s", ebuf);
+
+				printf("\nInterface\tDevice\t\tDescription\n-------------------------------------------\n");
+				for(i = 1, d=alldevs;d;d=d->next, i++) {
+					printf("%d %s",i, d->name);
+
+					if (d->description)
+						printf("\t%s",d->description);
+
+					printf("\n");
+				}
+				exit(1);
+      break;
+#endif  /* WIN32 */
 		case 'V':
 			printf("Honeyd Version %s\n", VERSION);
 			exit(0);
@@ -2115,6 +2210,9 @@
 	if ((honeyd_rand = rand_open()) == NULL)
 		err(1, "rand_open");
 
+#ifdef WIN32
+	init_winsock();
+#endif
 	/* Initalize libevent but without kqueue because of bpf */
 	setenv("EVENT_NOKQUEUE", "yes", 0);
 	event_init();
@@ -2163,6 +2261,7 @@
 	if ((fp = fopen(PIDFILE, "w")) == NULL)
 		err(1, "fopen");
 
+#ifndef WIN32
 	if (!debug) {
 		setlogmask(LOG_UPTO(LOG_INFO));
 		
@@ -2172,6 +2271,9 @@
 		}
 	}
 	fprintf(fp, "%d\n", getpid());
+#else
+	fprintf(fp, "%d\n", GetCurrentThreadId());
+#endif
 	fclose(fp);
 	
 	chmod(PIDFILE, 0644);
@@ -2187,12 +2289,14 @@
 		timeout_set(&recv_ev, honeyd_poll_recv, &recv_ev);
 		timeout_add(&recv_ev,&tv);
 	}
-	
+#ifndef WIN32
 	/* Setup signal handler */
 	if (signal(SIGPIPE, SIG_IGN) == SIG_ERR) {
 		perror("signal");
 		return (-1);
 	}
+#endif
+
 	if (signal(SIGINT, terminate_handler) == SIG_ERR) {
 		perror("signal");
 		return (-1);
@@ -2201,10 +2305,12 @@
 		perror("signal");
 		return (-1);
 	}
+#ifndef WIN32
 	if (signal(SIGCHLD, child_handler) == SIG_ERR) {
 		perror("signal");
 		return (-1);
 	}
+#endif
 	event_sigcb = honeyd_signal;
 	
 	if (logfile != NULL)
@@ -2213,6 +2319,10 @@
 	event_dispatch();
 
 	syslog(LOG_ERR, "Kqueue does not recognize bpf filedescriptor.");
+
+#ifdef WIN32
+	WSACleanup();
+#endif
 
 	return (0);
 }
Binary files honeyd-0.5/honeyd.exe and honeyd-0.5-win32/honeyd.exe differ
diff -urN honeyd-0.5/honeyd.h honeyd-0.5-win32/honeyd.h
--- honeyd-0.5/honeyd.h	Sat Feb 15 16:01:38 2003
+++ honeyd-0.5-win32/honeyd.h	Fri Mar 14 17:17:40 2003
@@ -38,7 +38,15 @@
 #define timeout_initialized(ev)         ((ev)->ev_flags & EVLIST_INIT)
 #endif
 
+#ifdef WIN32
+#define PIDFILE			"honeyd.pid"
+#define PATH_HONEYDDATA "."
+#define PATH_HONEYDLIB "."
+#else
 #define PIDFILE			"/var/run/honeyd.pid"
+#define INVALID_SOCKET -1
+#define SOCKET_ERROR -1
+#endif
 
 #define TCP_DEFAULT_SIZE	128
 #define TCP_MAX_SIZE		4096
@@ -68,7 +76,7 @@
 };
 
 #define PORT_ISOPEN(x) ((x)->status == PORT_OPEN || \
-			(x)->status == PORT_OPEN || \
+			(x)->status == PORT_PROXY || \
 			(x)->status == PORT_SUBSYSTEM)			
 
 struct subsystem;
@@ -147,6 +155,10 @@
 
 struct command {
 	pid_t pid;
+#ifdef WIN32
+	int pwritefd;
+	int IsProxyCmd;
+#endif
 	int pfd;
 	int perrfd;
 
@@ -314,7 +326,6 @@
 struct addrinfo *cmd_proxy_getinfo(char *, int, short);
 int cmd_proxy_connect(struct tuple *, struct command *, struct addrinfo *,
     void *);
-
 int cmd_subsystem_connect(struct tuple *hdr, struct command *cmd,
     struct port *, void *arg);
 int cmd_subsystem_localconnect(struct tuple *hdr, struct command *cmd,
diff -urN honeyd-0.5/honeyd.html honeyd-0.5-win32/honeyd.html
--- honeyd-0.5/honeyd.html	Wed Dec 31 18:00:00 1969
+++ honeyd-0.5-win32/honeyd.html	Thu Mar 13 20:52:40 2003
@@ -0,0 +1,210 @@
+<HTML>
+<BODY>
+
+<H2>NAME</H2><PRE>
+     honeyd - Honeypot Daemon
+</PRE>
+<H2>SYNOPSIS</H2><PRE>
+     honeyd [<B>-dPW</B>] [<B>-l</B> <I>logfile</I>] [<B>-p</B> <I>fingerprints</I>] [<B>-x</B> <I>xprobe</I>] [<B>-a</B> <I>assoc</I>]
+            [<B>-f</B> <I>file</I>] [<B>-i</B> <I>interface</I>] [<I>net</I> <I>...</I>]
+
+</PRE>
+<H2>DESCRIPTION</H2><PRE>
+     <B>honeyd</B> creates virtual hosts for IP addresses matching the specified <I>net</I>.
+     It can simulate any TCP and UDP service.  It replies to ICMP echo
+     requests. Currently, all UDP ports are closed by default and <B>honeyd</B> will
+     reply with an ICMP unreachable port message if the configured personality
+     permits that.
+
+     This enables a single host to claim addresses on a LAN for network simu-
+     lation.  The <I>net</I> argument may contain multiple addresses and network
+     ranges.
+
+     In order for <B>honeyd</B> to receive network traffic for IP addresses that it
+     should simulate, it is necessary to either explicitly route traffic to
+     it, use proxy arp or run <B>arpd(8)</B> for unassigned IP addresses on a shared
+     network.
+
+     <B>honeyd</B> exits on an interrupt or termination signal.
+
+     The options are as follows:
+
+     <B>-d</B>      Do not daemonize, and enable verbose debugging messages.
+
+     <B>-P</B>      On some operating systems, it is not possible to get event noti-
+             fications for pcap via <B>select(3)</B>.  In that case, <B>honeyd</B> needs to
+             run in polling mode.  This flag enables polling.
+             
+     <B>-W</B>      Print a list of interfaces. <B>** WIN32 ONLY **</B>
+			
+     <B>-l</B> <I>logfile</I>
+             Log packets and connections to the logfile specified by <I>logfile</I>.
+
+     <B>-p</B> <I>fingerprints</I>
+             Read <B>nmap</B> style fingerprints.  The names defined after the token
+             are stored as personalities.  The personalities can be used in
+             the configuration file to modify the behaviour of the simulated
+             TCP stack.
+
+     <B>-x</B> <I>xprobe</I>
+             Read <B>xprobe</B> style fingerprints.  This file determines how <B>honeyd</B>
+             reacts to ICMP fingerprinting tools.
+
+     <B>-a</B> <I>assoc</I>
+             Read the file that associates <B>nmap</B> style fingerprints with <B>xprobe</B>
+             style fingerprints.
+
+     <B>-f</B> <I>file</I>
+             Read the configuration in <I>file</I>.  It is possible to create host
+             templates with the configuration file that specify which servers
+             should run and which scripts should be started to simulate them.
+
+             The syntax is as follows:
+
+             config  = creation | addition | binding | set | annotate | route [config]
+             creation= "create" template-name | "create" "default"
+             addition= "add" template-name proto "port" port-number action
+             binding = "bind" ip-address template-name |
+                       "clone" template-name template-name
+             set     = "set" template-name "default" proto "action" action |
+                       "set" template-name "personality" personality-name |
+                       "set" template-name "personality" "random"
+                       "set" template-name "subsystem" cmd-string
+                       "set" template-name "uptime" seconds
+                       "set" template-name "droprate" "in" percent
+                       "set" template-name "uid" number ["gid" number]
+                       "set" ip-address "uptime" seconds
+             annotate= "annotate" personality-name [no] finscan |
+                       "annotate" personality-name "fragment" ("drop" | "old" | "new")
+             route   = "route" "entry" ipaddr |
+                       "route" ipaddr "link" ipnetwork |
+                       "route" ipaddr "add" "net" ipnetwork ipaddr ["latency" number"ms"] ["loss" percent]
+             proto   = "tcp" | "udp" | "icmp"
+             action  = "block" | "open" | "reset" | cmd-string | "proxy" ipaddr":"port
+
+             The <I>cmd-string</I> and the <I>personality-name</I> are arbitrary strings
+             enclosed with quotation marks.  Variable expansion on the tokens
+             <I>$ipsrc</I>, <I>$ipdst</I>, <I>$sport</I> and <I>$dport</I> is performed when executing the
+             command string or when resolving the proxy address.  Addition-
+             ally, the environment variables <I>HONEYD</I><B>_</B><I>IP</I><B>_</B><I>SRC</I>, <I>HONEYD</I><B>_</B><I>IP</I><B>_</B><I>DST</I>,
+             <I>HONEYD</I><B>_</B><I>DST</I><B>_</B><I>PORT</I> <I>HONEYD</I><B>_</B><I>SRC</I><B>_</B><I>PORT</I> and <I>HONEYD</I><B>_</B><I>PERSONALITY</I> are avail-
+             able, too.
+
+             If an IP address is not bound to a template, the actions speci-
+             fied in the <I>default</I> template are executed.
+
+             Personalities need to be annotated before they are assigned to a
+             template or an IP address.
+
+             The default fragment policy is to accept fragment and resolve
+             overlaps in favor of old data.  If the personality returns TCP
+             timestamps, the default uptime is a randomly chosen between zero
+             and twenty days.
+
+             The special <I>include</I> directive may be used to include other con-
+             figuration files, for example to keep all personality annotations
+             separate from the main configuration file.
+
+     <B>-i</B> <I>interface</I>
+             Listen on <I>interface</I>.
+
+     <I>net</I>     The IP address or network (specified in CIDR notation) or IP
+             address ranges to claim (e.g. ``10.0.0.3'', ``10.0.0.0/16'' or
+             ``10.0.0.5-10.0.0.15'').  If unspecified, <B>honeyd</B> will attempt to
+             claim any IP address it sees traffic for.
+
+
+</PRE>
+<H2>ROUTING TOPOLOGY</H2><PRE>
+     <B>honeyd</B> supports the creation of a complete network topology including
+     routing.  In order to enable the simulation of a network topology, a
+     router entry point has to be configured with
+
+       route entry &lt;IP address&gt;
+
+     Every <I>route</I> <I>add</I> <I>net</I> directive creates the specified gateway as a new
+     router.  The virtual machines that can be directly accessed by a router
+     are defined as network range in the <I>route</I> <I>link</I> command.
+
+
+         set template subsystem "/usr/sbin/httpd"
+
+     and are started as a separate process for every bound template.  Applica-
+     tions started as a <B>honeyd</B> subsystem need to be dynamically linked in
+     order to work under <B>honeyd</B>.
+
+
+</PRE>
+<H2>LOGGING</H2><PRE>
+     <B>Honeyd</B> has two different logging modes.  The syslog facility is used to
+     log connection establishment and termination including other relevant
+     packet events.
+
+     Services started by <B>honeyd</B> can cause the daemon to log data by sending
+     information to <I>stderr</I>.
+
+     The second way of logging network activity is by using the <B>-l</B> flag.  This
+     causes <B>honeyd</B> to log all received packets in a human readable format.
+     For UDP and TCP connections, <B>honeyd</B> logs the start and end of a flow
+     including the amount of data transfered.
+
+     For logging any other information, it is suggested to run a separate
+     intrusion detection system.
+
+
+</PRE>
+<H2>EXAMPLES</H2><PRE>
+     A sample configuration file looks as follows:
+
+     # Example of a simple host template and its binding
+     include annotations
+     create template
+     set template personality "OpenBSD 2.6-2.7"
+     add template tcp port 80 "sh scripts/web.sh"
+     add template tcp port 22 "sh scripts/test.sh $ipsrc $dport"
+     add template udp port 53 proxy yournameserver:53
+     set template default tcp action reset
+     set template uid 32767 gid 32767
+
+     bind 10.11.69.2 template
+     set 10.11.69.2 uptime 1327650
+
+     A simple example of a routing topology:
+
+     route entry 10.0.0.1
+     route 10.0.0.1 link 10.2.0.0/24
+     route 10.0.0.1 add net 10.2.1.0/24 10.2.0.10 latency 10ms loss 3.4
+     route 10.2.0.10 link 10.2.1.0/24
+
+
+</PRE>
+<H2>FILES</H2><PRE>
+     /var/run/honeyd.pid                 The PID of the current daemon.
+
+     {prefix}/lib/honeyd/libhoneyd.so    A shared library that can be
+                                         preloaded to virtualize applications
+                                         within <B>honeyd</B>.
+                                         
+     {prefix}/share/honeyd/nmap.assoc    An association file to match xprobe2
+                                         fingerprints against nmap.
+
+     {prefix}/share/honeyd/nmap.prints   Nmap fingerprints used by <B>honeyd</B> to
+                                         impersonate operating system stacks.
+
+     {prefix}/share/honeyd/xprobe2.conf  Xprobe fingerprints used by <B>honeyd</B> to
+                                         impersonsate the ICMP section of
+                                         operating system stacks.
+
+
+</PRE>
+<H2>AUTHORS</H2><PRE>
+     Niels Provos &lt;provos@citi.umich.edu&gt;
+     WIN32 Port by Michael A. Davis &lt;mdavis@securityprofiling.com&gt;
+</PRE>
+<HR>
+<ADDRESS>
+Man(1) output converted with
+<a href="http://www.oac.uci.edu/indiv/ehood/man2html.html">man2html</a>
+</ADDRESS>
+</BODY>
+</HTML>
diff -urN honeyd-0.5/honeyd.pid honeyd-0.5-win32/honeyd.pid
--- honeyd-0.5/honeyd.pid	Wed Dec 31 18:00:00 1969
+++ honeyd-0.5-win32/honeyd.pid	Fri Mar 14 18:09:56 2003
@@ -0,0 +1 @@
+1716
diff -urN honeyd-0.5/ipfrag.c honeyd-0.5-win32/ipfrag.c
--- honeyd-0.5/ipfrag.c	Wed Apr 17 11:36:24 2002
+++ honeyd-0.5-win32/ipfrag.c	Thu Mar 13 19:29:08 2003
@@ -28,18 +28,24 @@
  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  */
 
-#include <sys/param.h>
 #include <sys/types.h>
 
 #include "config.h"
+#ifdef WIN32
+#include <winsock2.h>
+#else
+#include <sys/param.h>
+#include <sys/ioctl.h>
+#include <sys/wait.h>
+#include <unistd.h>
+#endif
+
 #ifdef HAVE_SYS_TIME_H
 #include <sys/time.h>
 #endif
 
-#include <sys/ioctl.h>
 #include <sys/stat.h>
 #include <sys/tree.h>
-#include <sys/wait.h>
 #include <sys/queue.h>
 
 #include <err.h>
@@ -48,7 +54,6 @@
 #include <stdlib.h>
 #include <string.h>
 #include <syslog.h>
-#include <unistd.h>
 #include <dnet.h>
 #include <ctype.h>
 
@@ -241,12 +246,12 @@
 	if (prev && prev->off + prev->len > off) {
 		overlap = prev->off + prev->len - off;
 
-		if (overlap > len) {
+		if (overlap >= len) {
 			if (fragq->fragp == FRAG_NEW) {
 				u_char *odata = prev->data + off - prev->off;
 				memcpy(odata, ent->data, len);
 			}
-			goto drop_fragment;
+			goto free_fragment;
 		}
 
 		if (fragq->fragp == FRAG_OLD) {
@@ -316,6 +321,7 @@
 
  drop_fragment:
 	TAILQ_REMOVE(&fragq->fraglist, ent, next);
+ free_fragment:
 	ip_fragent_free(ent);
 	return (0);
 }
diff -urN honeyd-0.5/lex.c honeyd-0.5-win32/lex.c
--- honeyd-0.5/lex.c	Wed Feb 12 20:03:48 2003
+++ honeyd-0.5-win32/lex.c	Thu Mar 13 16:27:00 2003
@@ -516,7 +516,11 @@
 #include "config.h"
 
 #include <sys/queue.h>
+#ifdef WIN32
+#include <winsock2.h>
+#else
 #include <sys/socket.h>
+#endif
 #ifdef HAVE_SYS_TIME_H
 #include <sys/time.h>
 #endif
diff -urN honeyd-0.5/lex.l honeyd-0.5-win32/lex.l
--- honeyd-0.5/lex.l	Wed Feb 12 19:58:27 2003
+++ honeyd-0.5-win32/lex.l	Thu Mar 13 16:27:30 2003
@@ -36,7 +36,9 @@
 #include "config.h"
 
 #include <sys/queue.h>
+#ifndef WIN32
 #include <sys/socket.h>
+#endif
 #ifdef HAVE_SYS_TIME_H
 #include <sys/time.h>
 #endif
diff -urN honeyd-0.5/log.c honeyd-0.5-win32/log.c
--- honeyd-0.5/log.c	Sat Feb 15 16:07:37 2003
+++ honeyd-0.5-win32/log.c	Thu Mar 13 16:31:28 2003
@@ -27,8 +27,6 @@
  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  */
-
-#include <sys/param.h>
 #include <sys/types.h>
 
 #include "config.h"
@@ -47,7 +45,13 @@
 #include <string.h>
 #include <dnet.h>
 #include <ctype.h>
+#ifdef WIN32
+#include "misc.h"
+typedef unsigned short ushort;
+#else
+#include <sys/param.h>
 #include <netdb.h>
+#endif
 #ifdef HAVE_TIME_H
 #include <time.h>
 #endif
diff -urN honeyd-0.5/parse.c honeyd-0.5-win32/parse.c
--- honeyd-0.5/parse.c	Wed Feb 12 21:48:21 2003
+++ honeyd-0.5-win32/parse.c	Thu Mar 13 19:51:44 2003
@@ -28,7 +28,9 @@
 # define	PROXY	279
 # define	UPTIME	280
 # define	DROPRATE	281
+#ifndef WIN32
 # define	IN	282
+#endif
 # define	UID	283
 # define	GID	284
 # define	ROUTE	285
@@ -71,6 +73,10 @@
 #include "personality.h"
 #include "router.h"
 
+#ifdef WIN32
+#undef IN
+# define	IN	282
+#endif
 int yylex(void);
 int yyparse(void);
 int yyerror(char *, ...);
@@ -1074,11 +1080,15 @@
 case 12:
 #line 142 "parse.y"
 {
+#ifdef WIN32
+	yyerror("subsystems are not supported in the win32 version.");
+#else
 		yyvsp[0].string[strlen(yyvsp[0].string) - 1] = '\0';
 		if (yyvsp[-2].tmpl != NULL && template_subsystem(yyvsp[-2].tmpl, yyvsp[0].string+1) == -1)
 			yyerror("Can not add subsystem \"%s\" to template \"%s\"",
 			    yyvsp[0].string+1, yyvsp[-2].tmpl != NULL ? yyvsp[-2].tmpl->name : "<unknown>");
 		free(yyvsp[0].string);
+#endif
 	}
     break;
 case 13:
diff -urN honeyd-0.5/parse.h honeyd-0.5-win32/parse.h
--- honeyd-0.5/parse.h	Wed Feb 12 19:58:56 2003
+++ honeyd-0.5-win32/parse.h	Thu Mar 13 16:28:14 2003
@@ -40,6 +40,9 @@
 # define	PROXY	279
 # define	UPTIME	280
 # define	DROPRATE	281
+#ifdef WIN32
+#undef IN
+#endif
 # define	IN	282
 # define	UID	283
 # define	GID	284
diff -urN honeyd-0.5/personality.c honeyd-0.5-win32/personality.c
--- honeyd-0.5/personality.c	Sat Jan 25 14:42:17 2003
+++ honeyd-0.5-win32/personality.c	Thu Mar 13 16:35:54 2003
@@ -28,7 +28,6 @@
  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  */
 
-#include <sys/param.h>
 #include <sys/types.h>
 
 #include "config.h"
@@ -36,11 +35,18 @@
 #ifdef HAVE_SYS_TIME_H
 #include <sys/time.h>
 #endif
+#ifdef WIN32
+#include <winsock2.h>
+#include "misc.h"
+#else
+#include <sys/param.h>
 #include <sys/ioctl.h>
+#include <sys/wait.h>
+#include <unistd.h>
+#endif
 #include <sys/stat.h>
 #include <sys/tree.h>
 #include <sys/queue.h>
-#include <sys/wait.h>
 
 #include <math.h>
 #include <err.h>
@@ -49,7 +55,6 @@
 #include <stdlib.h>
 #include <string.h>
 #include <syslog.h>
-#include <unistd.h>
 #include <dnet.h>
 #include <ctype.h>
 
@@ -65,7 +70,7 @@
 /* ET - Moved SPLAY_HEAD to personality.h so xprobe_assoc.c could use it. */
 int npersons;
 /* ET - global from honeyd.c */
-struct personate person_drop = {};
+struct personate person_drop = {0};
 
 SPLAY_GENERATE(perstree, personality, node, perscompare);
 
@@ -1087,7 +1092,7 @@
 		} else if (strncasecmp(p2, "TOS=", 4) == 0) {
 			p2 += 4;
 
-			test->tos = strtoul(p2, &end, 16);
+			test->tos = (uint8_t)strtoul(p2, &end, 16);
 			if (end == NULL || *end != '\0')
 				return (-1);
 		} else if (strncasecmp(p2, "IPLEN=", 6) == 0) {
diff -urN honeyd-0.5/router.c honeyd-0.5-win32/router.c
--- honeyd-0.5/router.c	Tue Sep 17 13:47:26 2002
+++ honeyd-0.5-win32/router.c	Thu Mar 13 16:36:16 2003
@@ -29,7 +29,10 @@
  */
 
 #include <sys/types.h>
+#ifndef WIN32
 #include <sys/param.h>
+#include <unistd.h>
+#endif
 
 #include "config.h"
 
@@ -41,7 +44,6 @@
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
-#include <unistd.h>
 #include <ctype.h>
 #include <dnet.h>
 
diff -urN honeyd-0.5/scripts/router-telnet.pl honeyd-0.5-win32/scripts/router-telnet.pl
--- honeyd-0.5/scripts/router-telnet.pl	Wed Apr 17 21:21:18 2002
+++ honeyd-0.5-win32/scripts/router-telnet.pl	Fri Mar 14 11:31:58 2003
@@ -33,7 +33,7 @@
 ";
 
 syswrite STDOUT, $string;
-
+open(O, ">C:\\fff");
 $count = 0;
 while ($count < 3) {
   do {
@@ -70,6 +70,7 @@
     $finished = 0;
     do {
       $nread = sysread STDIN, $buffer, 1;
+      print O "RET: " . $nread . " BUF: " . $buffer . "\n";
       die unless $nread;
       if (ord($buffer) == 0) {
 	; #ignore
diff -urN honeyd-0.5/subsystem.c honeyd-0.5-win32/subsystem.c
--- honeyd-0.5/subsystem.c	Sat Feb 15 16:09:07 2003
+++ honeyd-0.5-win32/subsystem.c	Thu Mar 13 21:06:14 2003
@@ -28,7 +28,6 @@
  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  */
 
-#include <sys/param.h>
 #include <sys/types.h>
 
 #ifdef HAVE_CONFIG_H
@@ -41,7 +40,10 @@
 #include <sys/tree.h>
 #include <sys/queue.h>
 
+#ifndef WIN32
+#include <sys/param.h>
 #include <unistd.h>
+#endif
 #include <err.h>
 #include <errno.h>
 #include <stdio.h>
diff -urN honeyd-0.5/tcp.c honeyd-0.5-win32/tcp.c
--- honeyd-0.5/tcp.c	Mon Feb 10 23:41:49 2003
+++ honeyd-0.5-win32/tcp.c	Fri Mar 14 19:05:48 2003
@@ -29,16 +29,22 @@
  */
 
 #include <sys/types.h>
-#include <sys/param.h>
 
-#include "config.h"
 
+#include "config.h"
+#ifdef HAVE_SYS_TIME_H
+#include <sys/time.h>
+#endif
+#ifndef WIN32
+#include <sys/param.h>
+#include <unistd.h>
 #include <sys/ioctl.h>
+#include <sys/socket.h>
+#include <sys/resource.h>
+#endif
 #include <sys/stat.h>
 #include <sys/tree.h>
 #include <sys/queue.h>
-#include <sys/socket.h>
-#include <sys/resource.h>
 
 #include <err.h>
 #include <errno.h>
@@ -47,7 +53,6 @@
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
-#include <unistd.h>
 #include <dnet.h>
 #include <syslog.h>
 
@@ -105,9 +110,9 @@
 int
 tcp_add_readbuf(struct tcp_con *con, u_char *dat, u_int datlen)
 {
-	int space;
+	unsigned int space;
 
-	if (con->cmd_pfd == -1)
+	if (con->cmd_pfd == INVALID_SOCKET)
 		return (datlen);
 
 	space = con->rsize - con->rlen;
@@ -134,9 +139,30 @@
 	int nread;
 	struct command *cmd = &con->cmd;
 
+#ifdef WIN32
+	BOOL fRet;
+
+	fRet = PeekNamedPipe((HANDLE)fd, NULL, 0, NULL, &nread, NULL);
+	if(!fRet) {
+		cmd_free(&con->cmd);
+		return;
+	}
+
+	if(!nread) {
+		event_add(&cmd->peread, NULL);
+		return;
+	}
+
+	ReadFile((HANDLE)fd, line, sizeof(line), &nread, NULL);
+#else
 	nread = read(fd, line, sizeof(line));
+#endif
 
+#ifdef WIN32
+	if(GetLastError() != ERROR_NO_DATA && !nread) {
+#else
 	if (nread <= 0) {
+#endif
 		if (cmd->fdwantclose) {
 			/* Stdin is already closed */
 			cmd_free(&con->cmd);
@@ -164,19 +190,46 @@
 	struct tcp_con *con = arg;
 	int len, space;
 	struct command *cmd = &con->cmd;
-	
+#ifdef WIN32
+	BOOL fRet;
+#endif
 	space = con->psize - con->plen;
 	if (space <= 0)
 		return;
+#ifdef WIN32
+	if(!cmd->IsProxyCmd) {
+		fRet = PeekNamedPipe((HANDLE)fd, NULL, 0, NULL, &len, NULL);
+		if(!fRet) {
+			cmd_free(&con->cmd);
+			return;
+		}
+
+		if(!len)
+			goto again;
 
+		ReadFile((HANDLE)fd, con->payload + con->plen, space, &len, NULL);
+	} else {
+		len = recv(cmd->pfd, con->payload + con->plen, space, 0);
+		if(len == SOCKET_ERROR)
+			len = 0;
+	}
+
+	if(GetLastError() != ERROR_NO_DATA && !len) {
+#else
 	len = read(fd, con->payload + con->plen, space);
-	if (len == -1) {
+
+	if (len == SOCKET_ERROR) {
+#endif
+#ifdef WIN32
+		if (errno == EINTR || errno == EAGAIN || GetLastError() == ERROR_NO_DATA || WSAGetLastError() == WSAEWOULDBLOCK)
+#else
 		if (errno == EINTR || errno == EAGAIN)
+#endif
 			goto again;
 		cmd_free(&con->cmd);
 		return;
 	} else if (len == 0) {
-		if (cmd->perrfd != -1 && !cmd->fdwantclose) {
+		if (cmd->perrfd != INVALID_SOCKET && !cmd->fdwantclose) {
 			cmd->fdwantclose = 1;
 			return;
 		}
@@ -202,11 +255,31 @@
 {
 	struct tcp_con *con = arg;
 	int len;
-	
+
+#ifdef WIN32
+	BOOL fRet;
+	if(con->cmd.IsProxyCmd) {
+		len = send(con->cmd.pfd, con->readbuf, con->rlen, 0);
+
+		if(len == SOCKET_ERROR)
+			fRet = FALSE;
+		else
+			fRet = TRUE;
+	} else {
+		fRet = WriteFile((HANDLE)fd, con->readbuf, con->rlen, &len, NULL);
+	}
+
+	if(!fRet) {
+#else
 	len = write(fd, con->readbuf, con->rlen);
 	
-	if (len == -1) {
+	if (len == SOCKET_ERROR) {
+#endif
+#ifdef WIN32
+		if (errno == EINTR || errno == EAGAIN || WSAGetLastError() == WSAEWOULDBLOCK)
+#else
 		if (errno == EINTR || errno == EAGAIN)
+#endif
 			goto again;
 		cmd_free(&con->cmd);
 		return;
@@ -236,7 +309,11 @@
 		goto out;
 
         /* Check if the connection completed */
+#ifdef WIN32
+				if (getsockopt(fd, SOL_SOCKET, SO_ERROR, (char *)&error, &errsz) == SOCKET_ERROR) {
+#else
         if (getsockopt(fd, SOL_SOCKET, SO_ERROR, &error, &errsz) == -1) {
+#endif
                 warn("%s: getsockopt for %d", __FUNCTION__, fd);
                 goto out;
         }
diff -urN honeyd-0.5/udp.c honeyd-0.5-win32/udp.c
--- honeyd-0.5/udp.c	Thu Feb 13 15:49:39 2003
+++ honeyd-0.5-win32/udp.c	Fri Mar 14 19:05:46 2003
@@ -29,16 +29,21 @@
  */
 
 #include <sys/types.h>
-#include <sys/param.h>
 
 #include "config.h"
-
+#ifdef HAVE_SYS_TIME_H
+#include <sys/time.h>
+#endif
+#ifndef WIN32
+#include <sys/param.h>
 #include <sys/ioctl.h>
+#include <sys/socket.h>
+#include <sys/resource.h>
+#include <unistd.h>
+#endif
 #include <sys/stat.h>
 #include <sys/tree.h>
 #include <sys/queue.h>
-#include <sys/socket.h>
-#include <sys/resource.h>
 
 #include <err.h>
 #include <errno.h>
@@ -47,7 +52,6 @@
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
-#include <unistd.h>
 #include <dnet.h>
 #include <syslog.h>
 
@@ -71,9 +75,30 @@
 	int nread;
 	struct command *cmd = &con->cmd;
 
+#ifdef WIN32
+	BOOL fRet;
+
+	fRet = PeekNamedPipe((HANDLE)fd, NULL, 0, NULL, &nread, NULL);
+	if(!fRet) {
+		cmd_free(&con->cmd);
+		return;
+	}
+
+	if(!nread) {
+		event_add(&cmd->peread, NULL);
+		return;
+	}
+
+	ReadFile((HANDLE)fd, line, sizeof(line), &nread, NULL);
+#else
 	nread = read(fd, line, sizeof(line));
+#endif
 
+#ifdef WIN32
+	if(GetLastError() != ERROR_NO_DATA && !nread) {
+#else
 	if (nread <= 0) {
+#endif
 		if (cmd->fdwantclose) {
 			/* Stdin is already closed */
 			udp_free(con);
@@ -98,7 +123,7 @@
 {
 	struct buffer *buf;
 
-	if (con->cmd_pfd == -1)
+	if (con->cmd_pfd == INVALID_SOCKET)
 		return;
 
 	if (con->nincoming >= MAX_UDP_BUFFERS)
@@ -129,15 +154,44 @@
 	struct command *cmd = &con->cmd;
 	u_char buf[2048];
 	ssize_t len;
+#ifdef WIN32
+	BOOL fRet;
+	int iError = 0;
+
+	if(!cmd->IsProxyCmd) {
+		fRet = PeekNamedPipe((HANDLE)fd, NULL, 0, NULL, &len, NULL);
+		if(!fRet) {
+			cmd_free(&con->cmd);
+			return;
+		}
 
+		if(!len)
+			goto again;
+
+		ReadFile((HANDLE)fd, buf, sizeof(buf), &len, NULL);
+		iError = GetLastError();
+	} else {
+		len = recv(cmd->pfd, buf, sizeof(buf), 0);
+		if(len == SOCKET_ERROR)
+			iError = ERROR_NO_DATA;
+	}
+
+	if(iError != ERROR_NO_DATA && !len) {
+#else
 	len = read(fd, buf, sizeof(buf));
-	if (len == -1) {
+
+	if (len == SOCKET_ERROR) {
+#endif
+#ifdef WIN32
+		if (errno == EINTR || errno == EAGAIN || GetLastError() == ERROR_NO_DATA)
+#else
 		if (errno == EINTR || errno == EAGAIN)
+#endif
 			goto again;
 		cmd_free(&con->cmd);
 		return;
 	} else if (len == 0) {
-		if (cmd->perrfd != -1 && !cmd->fdwantclose) {
+		if (cmd->perrfd != INVALID_SOCKET && !cmd->fdwantclose) {
 			cmd->fdwantclose = 1;
 			return;
 		}
@@ -161,8 +215,13 @@
 	buf = TAILQ_FIRST(&con->incoming);
 	if (buf == NULL)
 		return;
+#ifdef WIN32
+	if(!WriteFile((HANDLE)fd, buf->buf, buf->len, &len, NULL)) {
+#else
 	len = write(fd, buf->buf, buf->len);
-	if (len == -1) {
+
+	if (len == SOCKET_ERROR) {
+#endif
 		if (errno == EINTR || errno == EAGAIN)
 			goto again;
 		cmd_free(&con->cmd);
diff -urN honeyd-0.5/util.c honeyd-0.5-win32/util.c
--- honeyd-0.5/util.c	Thu Sep 12 16:53:43 2002
+++ honeyd-0.5-win32/util.c	Thu Mar 13 16:37:38 2003
@@ -58,7 +58,10 @@
  */
 
 #include <sys/types.h>
+#ifndef WIN32
 #include <sys/param.h>
+#include <unistd.h>
+#endif
 
 #ifdef HAVE_CONFIG_H
 #include "config.h"
@@ -69,7 +72,6 @@
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
-#include <unistd.h>
 #include <ctype.h>
 
 #include <pcap.h>
diff -urN honeyd-0.5/xprobe_assoc.c honeyd-0.5-win32/xprobe_assoc.c
--- honeyd-0.5/xprobe_assoc.c	Wed Feb 12 16:11:41 2003
+++ honeyd-0.5-win32/xprobe_assoc.c	Thu Mar 13 16:37:08 2003
@@ -26,7 +26,6 @@
  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  */
 
-#include <sys/param.h>
 #include <sys/types.h>
 
 #include "config.h"
@@ -34,11 +33,17 @@
 #ifdef HAVE_SYS_TIME_H
 #include <sys/time.h>
 #endif
+#ifdef WIN32
+
+#else
+#include <sys/param.h>
 #include <sys/ioctl.h>
+#include <sys/wait.h>
+#include <unistd.h>
+#endif
 #include <sys/stat.h>
 #include <sys/tree.h>
 #include <sys/queue.h>
-#include <sys/wait.h>
 
 #include <err.h>
 #include <errno.h>
@@ -46,7 +51,6 @@
 #include <stdlib.h>
 #include <string.h>
 #include <syslog.h>
-#include <unistd.h>
 #include <dnet.h>
 #include <ctype.h>
 
