diff --git a/scheduler/Makefile.in b/scheduler/Makefile.in
index b64b88a..a6f8003 100644
--- a/scheduler/Makefile.in
+++ b/scheduler/Makefile.in
@@ -8,14 +8,10 @@
 C_SRCS = \
 	client.c \
 	critsection.c \
-	debugger.c \
-	event.c \
 	handle.c \
-	mutex.c \
 	pipe.c \
 	process.c \
 	pthread.c \
-	semaphore.c \
 	services.c \
 	synchro.c \
 	sysdeps.c \
diff --git a/scheduler/critsection.c b/scheduler/critsection.c
index 9c223a7..dabc37c 100644
--- a/scheduler/critsection.c
+++ b/scheduler/critsection.c
@@ -34,7 +34,7 @@
 {
     /* let's assume that only one thread at a time will try to do this */
     HANDLE sem = crit->LockSemaphore;
-    if (!sem) sem = CreateSemaphoreA( NULL, 0, 1, NULL );
+    if (!sem) NtCreateSemaphore( &sem, SEMAPHORE_ALL_ACCESS, NULL, 0, 1 );
     crit->LockSemaphore = ConvertToGlobalHandle( sem );
 }
 
diff --git a/scheduler/debugger.c b/scheduler/debugger.c
deleted file mode 100644
index f3d5df6..0000000
--- a/scheduler/debugger.c
+++ /dev/null
@@ -1,231 +0,0 @@
-/*
- * Win32 debugger functions
- *
- * Copyright (C) 1999 Alexandre Julliard
- */
-
-#include <string.h>
-
-#include "winerror.h"
-#include "server.h"
-#include "debugtools.h"
-
-DEFAULT_DEBUG_CHANNEL(debugstr);
-
-
-/******************************************************************************
- *           WaitForDebugEvent   (KERNEL32.720)
- *
- * Waits for a debugging event to occur in a process being debugged
- *
- * PARAMS
- *    event   [I] Address of structure for event information
- *    timeout [I] Number of milliseconds to wait for event
- *
- * RETURNS STD
- */
-BOOL WINAPI WaitForDebugEvent( LPDEBUG_EVENT event, DWORD timeout )
-{
-    BOOL ret;
-    SERVER_START_REQ
-    {
-        debug_event_t *data;
-        struct wait_debug_event_request *req = server_alloc_req( sizeof(*req), sizeof(*data) );
-
-        req->timeout = timeout;
-        if (!(ret = !server_call( REQ_WAIT_DEBUG_EVENT ))) goto done;
-
-        if (!server_data_size(req))  /* timeout */
-        {
-            SetLastError( ERROR_SEM_TIMEOUT );
-            ret = FALSE;
-            goto done;
-        }
-        data = server_data_ptr(req);
-        event->dwDebugEventCode = data->code;
-        event->dwProcessId      = (DWORD)req->pid;
-        event->dwThreadId       = (DWORD)req->tid;
-        switch(data->code)
-        {
-        case EXCEPTION_DEBUG_EVENT:
-            event->u.Exception.ExceptionRecord = data->info.exception.record;
-            event->u.Exception.dwFirstChance   = data->info.exception.first;
-            break;
-        case CREATE_THREAD_DEBUG_EVENT:
-            event->u.CreateThread.hThread           = data->info.create_thread.handle;
-            event->u.CreateThread.lpThreadLocalBase = data->info.create_thread.teb;
-            event->u.CreateThread.lpStartAddress    = data->info.create_thread.start;
-            break;
-        case CREATE_PROCESS_DEBUG_EVENT:
-            event->u.CreateProcessInfo.hFile                 = data->info.create_process.file;
-            event->u.CreateProcessInfo.hProcess              = data->info.create_process.process;
-            event->u.CreateProcessInfo.hThread               = data->info.create_process.thread;
-            event->u.CreateProcessInfo.lpBaseOfImage         = data->info.create_process.base;
-            event->u.CreateProcessInfo.dwDebugInfoFileOffset = data->info.create_process.dbg_offset;
-            event->u.CreateProcessInfo.nDebugInfoSize        = data->info.create_process.dbg_size;
-            event->u.CreateProcessInfo.lpThreadLocalBase     = data->info.create_process.teb;
-            event->u.CreateProcessInfo.lpStartAddress        = data->info.create_process.start;
-            event->u.CreateProcessInfo.lpImageName           = data->info.create_process.name;
-            event->u.CreateProcessInfo.fUnicode              = data->info.create_process.unicode;
-            if (data->info.create_process.file == -1) event->u.CreateProcessInfo.hFile = 0;
-            break;
-        case EXIT_THREAD_DEBUG_EVENT:
-            event->u.ExitThread.dwExitCode = data->info.exit.exit_code;
-            break;
-        case EXIT_PROCESS_DEBUG_EVENT:
-            event->u.ExitProcess.dwExitCode = data->info.exit.exit_code;
-            break;
-        case LOAD_DLL_DEBUG_EVENT:
-            event->u.LoadDll.hFile                 = data->info.load_dll.handle;
-            event->u.LoadDll.lpBaseOfDll           = data->info.load_dll.base;
-            event->u.LoadDll.dwDebugInfoFileOffset = data->info.load_dll.dbg_offset;
-            event->u.LoadDll.nDebugInfoSize        = data->info.load_dll.dbg_size;
-            event->u.LoadDll.lpImageName           = data->info.load_dll.name;
-            event->u.LoadDll.fUnicode              = data->info.load_dll.unicode;
-            if (data->info.load_dll.handle == -1) event->u.LoadDll.hFile = 0;
-            break;
-        case UNLOAD_DLL_DEBUG_EVENT:
-            event->u.UnloadDll.lpBaseOfDll = data->info.unload_dll.base;
-            break;
-        case OUTPUT_DEBUG_STRING_EVENT:
-            event->u.DebugString.lpDebugStringData  = data->info.output_string.string;
-            event->u.DebugString.fUnicode           = data->info.output_string.unicode;
-            event->u.DebugString.nDebugStringLength = data->info.output_string.length;
-            break;
-        case RIP_EVENT:
-            event->u.RipInfo.dwError = data->info.rip_info.error;
-            event->u.RipInfo.dwType  = data->info.rip_info.type;
-            break;
-        default:
-            server_protocol_error( "WaitForDebugEvent: bad code %d\n", data->code );
-        }
-    done:
-    }
-    SERVER_END_REQ;
-    return ret;
-}
-
-
-/**********************************************************************
- *           ContinueDebugEvent   (KERNEL32.146)
- */
-BOOL WINAPI ContinueDebugEvent( DWORD pid, DWORD tid, DWORD status )
-{
-    BOOL ret;
-    SERVER_START_REQ
-    {
-        struct continue_debug_event_request *req = server_alloc_req( sizeof(*req), 0 );
-        req->pid    = (void *)pid;
-        req->tid    = (void *)tid;
-        req->status = status;
-        ret = !server_call( REQ_CONTINUE_DEBUG_EVENT );
-    }
-    SERVER_END_REQ;
-    return ret;
-}
-
-
-/**********************************************************************
- *           DebugActiveProcess   (KERNEL32.180)
- */
-BOOL WINAPI DebugActiveProcess( DWORD pid )
-{
-    BOOL ret;
-    SERVER_START_REQ
-    {
-        struct debug_process_request *req = server_alloc_req( sizeof(*req), 0 );
-        req->pid = (void *)pid;
-        ret = !server_call( REQ_DEBUG_PROCESS );
-    }
-    SERVER_END_REQ;
-    return ret;
-}
-
-
-/***********************************************************************
- *           OutputDebugStringA   (KERNEL32.548)
- */
-void WINAPI OutputDebugStringA( LPCSTR str )
-{
-    SERVER_START_REQ
-    {
-        struct output_debug_string_request *req = server_alloc_req( sizeof(*req), 0 );
-        req->string  = (void *)str;
-        req->unicode = 0;
-        req->length  = strlen(str) + 1;
-        server_call_noerr( REQ_OUTPUT_DEBUG_STRING );
-    }
-    SERVER_END_REQ;
-    WARN("%s\n", str);
-}
-
-
-/***********************************************************************
- *           OutputDebugStringW   (KERNEL32.549)
- */
-void WINAPI OutputDebugStringW( LPCWSTR str )
-{
-    SERVER_START_REQ
-    {
-        struct output_debug_string_request *req = server_alloc_req( sizeof(*req), 0 );
-        req->string  = (void *)str;
-        req->unicode = 1;
-        req->length  = (lstrlenW(str) + 1) * sizeof(WCHAR);
-        server_call_noerr( REQ_OUTPUT_DEBUG_STRING );
-    }
-    SERVER_END_REQ;
-    WARN("%s\n", debugstr_w(str));
-}
-
-
-/***********************************************************************
- *           OutputDebugString16   (KERNEL.115)
- */
-void WINAPI OutputDebugString16( LPCSTR str )
-{
-    OutputDebugStringA( str );
-}
-
-
-/***********************************************************************
- *           DebugBreak   (KERNEL32.181)
- */
-void WINAPI DebugBreak(void)
-{
-    DbgBreakPoint();
-}
-
-
-/***********************************************************************
- *           DebugBreak16   (KERNEL.203)
- */
-void WINAPI DebugBreak16( CONTEXT86 *context )
-{
-#ifdef __i386__
-    EXCEPTION_RECORD rec;
-
-    rec.ExceptionCode    = EXCEPTION_BREAKPOINT;
-    rec.ExceptionFlags   = 0;
-    rec.ExceptionRecord  = NULL;
-    rec.ExceptionAddress = GET_IP(context); 
-    rec.NumberParameters = 0;
-    NtRaiseException( &rec, context, TRUE );
-#endif  /* defined(__i386__) */
-}
-
-
-/***********************************************************************
- *           IsDebuggerPresent   (KERNEL32)
- */
-BOOL WINAPI IsDebuggerPresent(void)
-{
-    BOOL ret = FALSE;
-    SERVER_START_REQ
-    {
-        struct get_process_info_request *req = server_alloc_req( sizeof(*req), 0 );
-        req->handle = GetCurrentProcess();
-        if (!server_call( REQ_GET_PROCESS_INFO )) ret = req->debugged;
-    }
-    SERVER_END_REQ;
-    return ret;
-}
diff --git a/scheduler/event.c b/scheduler/event.c
deleted file mode 100644
index 7df111e..0000000
--- a/scheduler/event.c
+++ /dev/null
@@ -1,230 +0,0 @@
-/*
- * Win32 events
- *
- * Copyright 1998 Alexandre Julliard
- */
-
-#include <assert.h>
-#include <string.h>
-#include "winerror.h"
-#include "winnls.h"
-#include "wine/unicode.h"
-#include "syslevel.h"
-#include "server.h"
-
-
-/***********************************************************************
- *           CreateEventA    (KERNEL32.156)
- */
-HANDLE WINAPI CreateEventA( SECURITY_ATTRIBUTES *sa, BOOL manual_reset,
-                            BOOL initial_state, LPCSTR name )
-{
-    HANDLE ret;
-    DWORD len = name ? MultiByteToWideChar( CP_ACP, 0, name, strlen(name), NULL, 0 ) : 0;
-    if (len >= MAX_PATH)
-    {
-        SetLastError( ERROR_FILENAME_EXCED_RANGE );
-        return 0;
-    }
-    SERVER_START_REQ
-    {
-        struct create_event_request *req = server_alloc_req( sizeof(*req), len * sizeof(WCHAR) );
-
-        req->manual_reset = manual_reset;
-        req->initial_state = initial_state;
-        req->inherit = (sa && (sa->nLength>=sizeof(*sa)) && sa->bInheritHandle);
-        if (len) MultiByteToWideChar( CP_ACP, 0, name, strlen(name), server_data_ptr(req), len );
-        SetLastError(0);
-        server_call( REQ_CREATE_EVENT );
-        ret = req->handle;
-    }
-    SERVER_END_REQ;
-    if (ret == -1) ret = 0; /* must return 0 on failure, not -1 */
-    return ret;
-}
-
-
-/***********************************************************************
- *           CreateEventW    (KERNEL32.157)
- */
-HANDLE WINAPI CreateEventW( SECURITY_ATTRIBUTES *sa, BOOL manual_reset,
-                            BOOL initial_state, LPCWSTR name )
-{
-    HANDLE ret;
-    DWORD len = name ? strlenW(name) : 0;
-    if (len >= MAX_PATH)
-    {
-        SetLastError( ERROR_FILENAME_EXCED_RANGE );
-        return 0;
-    }
-    SERVER_START_REQ
-    {
-        struct create_event_request *req = server_alloc_req( sizeof(*req), len * sizeof(WCHAR) );
-
-        req->manual_reset = manual_reset;
-        req->initial_state = initial_state;
-        req->inherit = (sa && (sa->nLength>=sizeof(*sa)) && sa->bInheritHandle);
-        memcpy( server_data_ptr(req), name, len * sizeof(WCHAR) );
-        SetLastError(0);
-        server_call( REQ_CREATE_EVENT );
-        ret = req->handle;
-    }
-    SERVER_END_REQ;
-    if (ret == -1) ret = 0; /* must return 0 on failure, not -1 */
-    return ret;
-}
-
-/***********************************************************************
- *           WIN16_CreateEvent    (KERNEL.457)
- */
-HANDLE WINAPI WIN16_CreateEvent( BOOL manual_reset, BOOL initial_state )
-{
-    return CreateEventA( NULL, manual_reset, initial_state, NULL );
-}
-
-
-/***********************************************************************
- *           OpenEventA    (KERNEL32.536)
- */
-HANDLE WINAPI OpenEventA( DWORD access, BOOL inherit, LPCSTR name )
-{
-    HANDLE ret;
-    DWORD len = name ? MultiByteToWideChar( CP_ACP, 0, name, strlen(name), NULL, 0 ) : 0;
-    if (len >= MAX_PATH)
-    {
-        SetLastError( ERROR_FILENAME_EXCED_RANGE );
-        return 0;
-    }
-    SERVER_START_REQ
-    {
-        struct open_event_request *req = server_alloc_req( sizeof(*req), len * sizeof(WCHAR) );
-
-        req->access  = access;
-        req->inherit = inherit;
-        if (len) MultiByteToWideChar( CP_ACP, 0, name, strlen(name), server_data_ptr(req), len );
-        server_call( REQ_OPEN_EVENT );
-        ret = req->handle;
-    }
-    SERVER_END_REQ;
-    if (ret == -1) ret = 0; /* must return 0 on failure, not -1 */
-    return ret;
-}
-
-
-/***********************************************************************
- *           OpenEventW    (KERNEL32.537)
- */
-HANDLE WINAPI OpenEventW( DWORD access, BOOL inherit, LPCWSTR name )
-{
-    HANDLE ret;
-    DWORD len = name ? strlenW(name) : 0;
-    if (len >= MAX_PATH)
-    {
-        SetLastError( ERROR_FILENAME_EXCED_RANGE );
-        return 0;
-    }
-    SERVER_START_REQ
-    {
-        struct open_event_request *req = server_alloc_req( sizeof(*req), len * sizeof(WCHAR) );
-
-        req->access  = access;
-        req->inherit = inherit;
-        memcpy( server_data_ptr(req), name, len * sizeof(WCHAR) );
-        server_call( REQ_OPEN_EVENT );
-        ret = req->handle;
-    }
-    SERVER_END_REQ;
-    if (ret == -1) ret = 0; /* must return 0 on failure, not -1 */
-    return ret;
-}
-
-
-/***********************************************************************
- *           EVENT_Operation
- *
- * Execute an event operation (set,reset,pulse).
- */
-static BOOL EVENT_Operation( HANDLE handle, enum event_op op )
-{
-    BOOL ret;
-    SERVER_START_REQ
-    {
-        struct event_op_request *req = server_alloc_req( sizeof(*req), 0 );
-        req->handle = handle;
-        req->op     = op;
-        ret = !server_call( REQ_EVENT_OP );
-    }
-    SERVER_END_REQ;
-    return ret;
-}
-
-
-/***********************************************************************
- *           PulseEvent    (KERNEL32.557)
- */
-BOOL WINAPI PulseEvent( HANDLE handle )
-{
-    return EVENT_Operation( handle, PULSE_EVENT );
-}
-
-
-/***********************************************************************
- *           SetEvent    (KERNEL32.644)
- */
-BOOL WINAPI SetEvent( HANDLE handle )
-{
-    return EVENT_Operation( handle, SET_EVENT );
-}
-
-
-/***********************************************************************
- *           ResetEvent    (KERNEL32.586)
- */
-BOOL WINAPI ResetEvent( HANDLE handle )
-{
-    return EVENT_Operation( handle, RESET_EVENT );
-}
-
-
-/***********************************************************************
- * NOTE: The Win95 VWin32_Event routines given below are really low-level
- *       routines implemented directly by VWin32. The user-mode libraries
- *       implement Win32 synchronisation routines on top of these low-level
- *       primitives. We do it the other way around here :-)
- */
-
-/***********************************************************************
- *       VWin32_EventCreate	(KERNEL.442)
- */
-HANDLE WINAPI VWin32_EventCreate(VOID)
-{
-    HANDLE hEvent = CreateEventA( NULL, FALSE, 0, NULL );
-    return ConvertToGlobalHandle( hEvent );
-}
-
-/***********************************************************************
- *       VWin32_EventDestroy	(KERNEL.443)
- */
-VOID WINAPI VWin32_EventDestroy(HANDLE event)
-{
-    CloseHandle( event );
-}
-
-/***********************************************************************
- *       VWin32_EventWait	(KERNEL.450) 
- */
-VOID WINAPI VWin32_EventWait(HANDLE event)
-{
-    SYSLEVEL_ReleaseWin16Lock();
-    WaitForSingleObject( event, INFINITE );
-    SYSLEVEL_RestoreWin16Lock();
-}
-
-/***********************************************************************
- *       VWin32_EventSet	(KERNEL.451)
- */
-VOID WINAPI VWin32_EventSet(HANDLE event)
-{
-    SetEvent( event );
-}
-
diff --git a/scheduler/mutex.c b/scheduler/mutex.c
deleted file mode 100644
index 0816d8d..0000000
--- a/scheduler/mutex.c
+++ /dev/null
@@ -1,143 +0,0 @@
-/*
- * Win32 mutexes
- *
- * Copyright 1998 Alexandre Julliard
- */
-
-#include <assert.h>
-#include <string.h>
-#include "winerror.h"
-#include "winnls.h"
-#include "wine/unicode.h"
-#include "server.h"
-
-
-/***********************************************************************
- *           CreateMutexA   (KERNEL32.166)
- */
-HANDLE WINAPI CreateMutexA( SECURITY_ATTRIBUTES *sa, BOOL owner, LPCSTR name )
-{
-    HANDLE ret;
-    DWORD len = name ? MultiByteToWideChar( CP_ACP, 0, name, strlen(name), NULL, 0 ) : 0;
-    if (len >= MAX_PATH)
-    {
-        SetLastError( ERROR_FILENAME_EXCED_RANGE );
-        return 0;
-    }
-    SERVER_START_REQ
-    {
-        struct create_mutex_request *req = server_alloc_req( sizeof(*req), len * sizeof(WCHAR) );
-
-        req->owned   = owner;
-        req->inherit = (sa && (sa->nLength>=sizeof(*sa)) && sa->bInheritHandle);
-        if (len) MultiByteToWideChar( CP_ACP, 0, name, strlen(name), server_data_ptr(req), len );
-        SetLastError(0);
-        server_call( REQ_CREATE_MUTEX );
-        ret = req->handle;
-    }
-    SERVER_END_REQ;
-    if (ret == -1) ret = 0; /* must return 0 on failure, not -1 */
-    return ret;
-}
-
-
-/***********************************************************************
- *           CreateMutexW   (KERNEL32.167)
- */
-HANDLE WINAPI CreateMutexW( SECURITY_ATTRIBUTES *sa, BOOL owner, LPCWSTR name )
-{
-    HANDLE ret;
-    DWORD len = name ? strlenW(name) : 0;
-    if (len >= MAX_PATH)
-    {
-        SetLastError( ERROR_FILENAME_EXCED_RANGE );
-        return 0;
-    }
-    SERVER_START_REQ
-    {
-        struct create_mutex_request *req = server_alloc_req( sizeof(*req), len * sizeof(WCHAR) );
-
-        req->owned   = owner;
-        req->inherit = (sa && (sa->nLength>=sizeof(*sa)) && sa->bInheritHandle);
-        memcpy( server_data_ptr(req), name, len * sizeof(WCHAR) );
-        SetLastError(0);
-        server_call( REQ_CREATE_MUTEX );
-        ret = req->handle;
-    }
-    SERVER_END_REQ;
-    if (ret == -1) ret = 0; /* must return 0 on failure, not -1 */
-    return ret;
-}
-
-
-/***********************************************************************
- *           OpenMutexA   (KERNEL32.541)
- */
-HANDLE WINAPI OpenMutexA( DWORD access, BOOL inherit, LPCSTR name )
-{
-    HANDLE ret;
-    DWORD len = name ? MultiByteToWideChar( CP_ACP, 0, name, strlen(name), NULL, 0 ) : 0;
-    if (len >= MAX_PATH)
-    {
-        SetLastError( ERROR_FILENAME_EXCED_RANGE );
-        return 0;
-    }
-    SERVER_START_REQ
-    {
-        struct open_mutex_request *req = server_alloc_req( sizeof(*req), len * sizeof(WCHAR) );
-
-        req->access  = access;
-        req->inherit = inherit;
-        if (len) MultiByteToWideChar( CP_ACP, 0, name, strlen(name), server_data_ptr(req), len );
-        server_call( REQ_OPEN_MUTEX );
-        ret = req->handle;
-    }
-    SERVER_END_REQ;
-    if (ret == -1) ret = 0; /* must return 0 on failure, not -1 */
-    return ret;
-}
-
-
-/***********************************************************************
- *           OpenMutexW   (KERNEL32.542)
- */
-HANDLE WINAPI OpenMutexW( DWORD access, BOOL inherit, LPCWSTR name )
-{
-    HANDLE ret;
-    DWORD len = name ? strlenW(name) : 0;
-    if (len >= MAX_PATH)
-    {
-        SetLastError( ERROR_FILENAME_EXCED_RANGE );
-        return 0;
-    }
-    SERVER_START_REQ
-    {
-        struct open_mutex_request *req = server_alloc_req( sizeof(*req), len * sizeof(WCHAR) );
-
-        req->access  = access;
-        req->inherit = inherit;
-        memcpy( server_data_ptr(req), name, len * sizeof(WCHAR) );
-        server_call( REQ_OPEN_MUTEX );
-        ret = req->handle;
-    }
-    SERVER_END_REQ;
-    if (ret == -1) ret = 0; /* must return 0 on failure, not -1 */
-    return ret;
-}
-
-
-/***********************************************************************
- *           ReleaseMutex   (KERNEL32.582)
- */
-BOOL WINAPI ReleaseMutex( HANDLE handle )
-{
-    BOOL ret;
-    SERVER_START_REQ
-    {
-        struct release_mutex_request *req = server_alloc_req( sizeof(*req), 0 );
-        req->handle = handle;
-        ret = !server_call( REQ_RELEASE_MUTEX );
-    }
-    SERVER_END_REQ;
-    return ret;
-}
diff --git a/scheduler/semaphore.c b/scheduler/semaphore.c
deleted file mode 100644
index 0a5fee4..0000000
--- a/scheduler/semaphore.c
+++ /dev/null
@@ -1,159 +0,0 @@
-/*
- * Win32 semaphores
- *
- * Copyright 1998 Alexandre Julliard
- */
-
-#include <assert.h>
-#include <string.h>
-#include "winerror.h"
-#include "winnls.h"
-#include "wine/unicode.h"
-#include "server.h"
-
-
-/***********************************************************************
- *           CreateSemaphoreA   (KERNEL32.174)
- */
-HANDLE WINAPI CreateSemaphoreA( SECURITY_ATTRIBUTES *sa, LONG initial, LONG max, LPCSTR name )
-{
-    HANDLE ret;
-    DWORD len = name ? MultiByteToWideChar( CP_ACP, 0, name, strlen(name), NULL, 0 ) : 0;
-
-    /* Check parameters */
-
-    if ((max <= 0) || (initial < 0) || (initial > max))
-    {
-        SetLastError( ERROR_INVALID_PARAMETER );
-        return 0;
-    }
-    if (len >= MAX_PATH)
-    {
-        SetLastError( ERROR_FILENAME_EXCED_RANGE );
-        return 0;
-    }
-
-    SERVER_START_REQ
-    {
-        struct create_semaphore_request *req = server_alloc_req( sizeof(*req),
-                                                                 len * sizeof(WCHAR) );
-
-        req->initial = (unsigned int)initial;
-        req->max     = (unsigned int)max;
-        req->inherit = (sa && (sa->nLength>=sizeof(*sa)) && sa->bInheritHandle);
-        if (len) MultiByteToWideChar( CP_ACP, 0, name, strlen(name), server_data_ptr(req), len );
-        SetLastError(0);
-        server_call( REQ_CREATE_SEMAPHORE );
-        ret = req->handle;
-    }
-    SERVER_END_REQ;
-    if (ret == -1) ret = 0; /* must return 0 on failure, not -1 */
-    return ret;
-}
-
-
-/***********************************************************************
- *           CreateSemaphoreW   (KERNEL32.175)
- */
-HANDLE WINAPI CreateSemaphoreW( SECURITY_ATTRIBUTES *sa, LONG initial,
-                                    LONG max, LPCWSTR name )
-{
-    HANDLE ret;
-    DWORD len = name ? strlenW(name) : 0;
-
-    /* Check parameters */
-
-    if ((max <= 0) || (initial < 0) || (initial > max))
-    {
-        SetLastError( ERROR_INVALID_PARAMETER );
-        return 0;
-    }
-    if (len >= MAX_PATH)
-    {
-        SetLastError( ERROR_FILENAME_EXCED_RANGE );
-        return 0;
-    }
-
-    SERVER_START_REQ
-    {
-        struct create_semaphore_request *req = server_alloc_req( sizeof(*req),
-                                                                 len * sizeof(WCHAR) );
-
-        req->initial = (unsigned int)initial;
-        req->max     = (unsigned int)max;
-        req->inherit = (sa && (sa->nLength>=sizeof(*sa)) && sa->bInheritHandle);
-        memcpy( server_data_ptr(req), name, len * sizeof(WCHAR) );
-        SetLastError(0);
-        server_call( REQ_CREATE_SEMAPHORE );
-        ret = req->handle;
-    }
-    SERVER_END_REQ;
-    if (ret == -1) ret = 0; /* must return 0 on failure, not -1 */
-    return ret;
-}
-
-
-/***********************************************************************
- *           OpenSemaphoreA   (KERNEL32.545)
- */
-HANDLE WINAPI OpenSemaphoreA( DWORD access, BOOL inherit, LPCSTR name )
-{
-    HANDLE ret;
-    DWORD len = name ? MultiByteToWideChar( CP_ACP, 0, name, strlen(name), NULL, 0 ) : 0;
-    if (len >= MAX_PATH)
-    {
-        SetLastError( ERROR_FILENAME_EXCED_RANGE );
-        return 0;
-    }
-    SERVER_START_REQ
-    {
-        struct open_semaphore_request *req = server_alloc_req( sizeof(*req),
-                                                               len * sizeof(WCHAR) );
-        req->access  = access;
-        req->inherit = inherit;
-        if (len) MultiByteToWideChar( CP_ACP, 0, name, strlen(name), server_data_ptr(req), len );
-        server_call( REQ_OPEN_SEMAPHORE );
-        ret = req->handle;
-    }
-    SERVER_END_REQ;
-    if (ret == -1) ret = 0; /* must return 0 on failure, not -1 */
-    return ret;
-}
-
-
-/***********************************************************************
- *           OpenSemaphoreW   (KERNEL32.546)
- */
-HANDLE WINAPI OpenSemaphoreW( DWORD access, BOOL inherit, LPCWSTR name )
-{
-    HANDLE ret;
-    DWORD len = name ? strlenW(name) : 0;
-    if (len >= MAX_PATH)
-    {
-        SetLastError( ERROR_FILENAME_EXCED_RANGE );
-        return 0;
-    }
-    SERVER_START_REQ
-    {
-        struct open_semaphore_request *req = server_alloc_req( sizeof(*req), len * sizeof(WCHAR) );
-        req->access  = access;
-        req->inherit = inherit;
-        memcpy( server_data_ptr(req), name, len * sizeof(WCHAR) );
-        server_call( REQ_OPEN_SEMAPHORE );
-        ret = req->handle;
-    }
-    SERVER_END_REQ;
-    if (ret == -1) ret = 0; /* must return 0 on failure, not -1 */
-    return ret;
-}
-
-
-/***********************************************************************
- *           ReleaseSemaphore   (KERNEL32.583)
- */
-BOOL WINAPI ReleaseSemaphore( HANDLE handle, LONG count, LONG *previous )
-{
-    NTSTATUS status = NtReleaseSemaphore( handle, count, previous );
-    if (status) SetLastError( RtlNtStatusToDosError(status) );
-    return !status;
-}
diff --git a/scheduler/syslevel.c b/scheduler/syslevel.c
index 5a7523e..e6bb112 100644
--- a/scheduler/syslevel.c
+++ b/scheduler/syslevel.c
@@ -6,13 +6,14 @@
 
 #include <unistd.h>
 #include <sys/types.h>
+#include "ntddk.h"
 #include "syslevel.h"
 #include "heap.h"
 #include "selectors.h"
 #include "stackframe.h"
 #include "debugtools.h"
 
-DEFAULT_DEBUG_CHANNEL(win32)
+DEFAULT_DEBUG_CHANNEL(win32);
 
 static SYSLEVEL Win16Mutex;
 static SEGPTR segpWin16Mutex;
@@ -230,7 +231,7 @@
         {
             ERR("(%d): Holding lock of level %d!\n", 
                        level, i );
-            DebugBreak();
+            DbgBreakPoint();
             break;
         }
 }
