diff --git a/src/xpdev/semwrap.c b/src/xpdev/semwrap.c
index 4f22d479266706aab621e60cf259eb6c2dce052e..a489162dd7d6fe196c04c9dbd6d7050eeda512f5 100644
--- a/src/xpdev/semwrap.c
+++ b/src/xpdev/semwrap.c
@@ -59,4 +59,52 @@ sem_trywait_block(sem_t *sem, unsigned long timeout)
 		errno=EAGAIN;
 	return retval;
 }
+
+#elif defined(_WIN32)
+
+#include <limits.h>		/* INT_MAX */
+
+#if defined(__BORLANDC__)
+	#pragma argsused
 #endif
+int sem_init(sem_t* psem, int pshared, unsigned int value)
+{
+
+	if((*(psem)=CreateSemaphore(NULL,value,INT_MAX,NULL))==NULL)
+		return -1;
+		
+	return 0;
+}
+
+int sem_trywait_block(sem_t* psem, unsigned long timeout)
+{
+	if(WaitForSingleObject(*(psem),timeout)!=WAIT_OBJECT_0) {
+		errno=EAGAIN;
+		return -1;
+	}
+
+	return 0;
+}
+
+int sem_post(sem_t* psem)
+{
+	if(ReleaseSemaphore(*(psem),1,NULL)==TRUE)
+		return 0;
+
+	return -1;
+}
+
+int sem_getvalue(sem_t* psem, int* vp)
+{
+	ReleaseSemaphore(*(psem),0,(LPLONG)vp);
+	return 0;
+}
+
+int sem_destroy(sem_t* psem)
+{
+	if(CloseHandle(*(psem))==TRUE)
+		return 0;
+	return -1;
+}
+
+#endif /* _WIN32 */
diff --git a/src/xpdev/semwrap.h b/src/xpdev/semwrap.h
index 2c25eaff079a853c7a410544d74bff77e81f74d7..2220d72b2fa87de55062316b6ac7a0ed1392437d 100644
--- a/src/xpdev/semwrap.h
+++ b/src/xpdev/semwrap.h
@@ -61,28 +61,18 @@ extern "C" {
 		#include <semaphore.h>	/* POSIX semaphores */
 	#endif
 
-	/* NOT POSIX */
-	int 	sem_trywait_block(sem_t *sem, unsigned long timeout);
-
 #elif defined(_WIN32)	
 
 	#include <process.h>	/* _beginthread */
-	#include <limits.h>		/* INT_MAX */
-	#include <errno.h>		/* EAGAIN and EBUSY */
 
 	/* POSIX semaphores */
 	typedef HANDLE sem_t;
-	#define sem_init(psem,ps,v)			*(psem)=CreateSemaphore(NULL,v,INT_MAX,NULL),*(psem)==NULL?-1:0
-
-	/* NOT POSIX */
-	#define sem_trywait_block(psem,t)	(WaitForSingleObject(*(psem),t)==WAIT_OBJECT_0?0:(errno=EAGAIN,-1))
-
-	/* POSIX */
+	int sem_init(sem_t*, int pshared, unsigned int value);
+	int sem_post(sem_t*);
+	int sem_getvalue(sem_t*, int* value);
+	int sem_destroy(sem_t*);
 	#define sem_wait(psem)				sem_trywait_block(psem,INFINITE)
 	#define sem_trywait(psem)			sem_trywait_block(psem,0)
-	#define sem_post(psem)				(ReleaseSemaphore(*(psem),1,NULL)==TRUE?0:-1)
-	#define sem_destroy(psem)			(CloseHandle(*(psem))==TRUE?0:-1)
-	#define sem_getvalue(psem,val)		ReleaseSemaphore(*(psem),0,(LPLONG)val)
 
 #elif defined(__OS2__)	/* These have *not* been tested! */
 
@@ -99,6 +89,10 @@ extern "C" {
 
 #endif
 
+/* NOT POSIX */
+int sem_trywait_block(sem_t* psem, unsigned long timeout);
+
+
 /* Change semaphore to "unsignaled" (NOT POSIX) */
 #define sem_reset(psem)					while(sem_trywait(psem)==0)
 
diff --git a/src/xpdev/xpdev_mt.dsp b/src/xpdev/xpdev_mt.dsp
index 631a35ff70d352c8e73d80e82aa3e0b29b4c1897..bb12dfae0d677e9f9ca9e403dd88505ef02f96b1 100644
--- a/src/xpdev/xpdev_mt.dsp
+++ b/src/xpdev/xpdev_mt.dsp
@@ -106,6 +106,10 @@ SOURCE=.\msg_queue.c
 # End Source File
 # Begin Source File
 
+SOURCE=.\semwrap.c
+# End Source File
+# Begin Source File
+
 SOURCE=.\sockwrap.c
 # End Source File
 # Begin Source File