From defe10424f5ee88fe53e1ac0f712f6593e54e0bf Mon Sep 17 00:00:00 2001 From: Alex Ionescu Date: Sat, 23 Jul 2011 09:58:33 +0000 Subject: [PATCH] [KERNEL32]: Small fix to the macros (not functional, just for compiler's sake). [KERNEL32]: Update Event APIs to use the new macros. Fixes bugs #14, #15: the create/open ANSI APIs were not returning the right error in case of object names that were too large. svn path=/trunk/; revision=52791 --- reactos/dll/win32/kernel32/client/synch.c | 214 ++------------------ reactos/dll/win32/kernel32/include/base_x.h | 9 +- 2 files changed, 25 insertions(+), 198 deletions(-) diff --git a/reactos/dll/win32/kernel32/client/synch.c b/reactos/dll/win32/kernel32/client/synch.c index 13ac167e13f..f4ef89a41b3 100644 --- a/reactos/dll/win32/kernel32/client/synch.c +++ b/reactos/dll/win32/kernel32/client/synch.c @@ -1031,133 +1031,22 @@ ReleaseMutex(IN HANDLE hMutex) return FALSE; } -HANDLE -WINAPI -CreateEventExA(IN LPSECURITY_ATTRIBUTES lpEventAttributes OPTIONAL, - IN LPCSTR lpName OPTIONAL, - IN DWORD dwFlags, - IN DWORD dwDesiredAccess) -{ - NTSTATUS Status; - ANSI_STRING AnsiName; - PUNICODE_STRING UnicodeCache; - LPCWSTR UnicodeName = NULL; - - /* Check for a name */ - if (lpName) - { - /* Use TEB Cache */ - UnicodeCache = &NtCurrentTeb()->StaticUnicodeString; - - /* Convert to unicode */ - RtlInitAnsiString(&AnsiName, lpName); - Status = RtlAnsiStringToUnicodeString(UnicodeCache, &AnsiName, FALSE); - if (!NT_SUCCESS(Status)) - { - /* Conversion failed */ - SetLastErrorByStatus(Status); - return NULL; - } - - /* Otherwise, save the buffer */ - UnicodeName = (LPCWSTR)UnicodeCache->Buffer; - } - - /* Call the Unicode API */ - return CreateEventExW(lpEventAttributes, - UnicodeName, - dwFlags, - dwDesiredAccess); - -} - -HANDLE -WINAPI -CreateEventExW(IN LPSECURITY_ATTRIBUTES lpEventAttributes OPTIONAL, - IN LPCWSTR lpName OPTIONAL, - IN DWORD dwFlags, - IN DWORD dwDesiredAccess) -{ - NTSTATUS Status; - OBJECT_ATTRIBUTES LocalAttributes; - POBJECT_ATTRIBUTES ObjectAttributes; - HANDLE Handle; - UNICODE_STRING ObjectName; - BOOLEAN InitialState; - EVENT_TYPE EventType; - - /* Now check if we got a name */ - if (lpName) RtlInitUnicodeString(&ObjectName, lpName); - - /* Check for invalid flags */ - if (dwFlags & ~(CREATE_EVENT_INITIAL_SET | CREATE_EVENT_MANUAL_RESET)) - { - /* Fail */ - SetLastError(ERROR_INVALID_PARAMETER); - return NULL; - } - - /* Set initial state and event type */ - InitialState = (dwFlags & CREATE_EVENT_INITIAL_SET) ? TRUE : FALSE; - EventType = (dwFlags & CREATE_EVENT_MANUAL_RESET) ? NotificationEvent : SynchronizationEvent; - - /* Now convert the object attributes */ - ObjectAttributes = BasepConvertObjectAttributes(&LocalAttributes, - lpEventAttributes, - lpName ? &ObjectName : NULL); - - /* Create the event */ - Status = NtCreateEvent(&Handle, - (ACCESS_MASK)dwDesiredAccess, - ObjectAttributes, - EventType, - InitialState); - if (NT_SUCCESS(Status)) - { - /* Check if the object already existed */ - if (Status == STATUS_OBJECT_NAME_EXISTS) - { - /* Set distinguished Win32 error code */ - SetLastError(ERROR_ALREADY_EXISTS); - } - else - { - /* Otherwise, set success */ - SetLastError(ERROR_SUCCESS); - } - - /* Return the handle */ - return Handle; - } - else - { - /* Convert the NT Status and fail */ - SetLastErrorByStatus(Status); - return NULL; - } - -} - +/* + * @implemented + */ HANDLE WINAPI CreateEventA(IN LPSECURITY_ATTRIBUTES lpEventAttributes OPTIONAL, IN BOOL bManualReset, IN BOOL bInitialState, - IN LPCSTR lpName OPTIONAL) + IN LPCSTR lpName OPTIONAL) { - DWORD dwFlags = 0; - - /* Set new flags */ - if (bManualReset) dwFlags |= CREATE_EVENT_MANUAL_RESET; - if (bInitialState) dwFlags |= CREATE_EVENT_INITIAL_SET; - - /* Call the newer API */ - return CreateEventExA(lpEventAttributes, - lpName, - dwFlags, - EVENT_ALL_ACCESS); + ConvertWin32AnsiObjectApiToUnicodeApi(Event, lpName, lpEventAttributes, bManualReset, bInitialState); } +/* + * @implemented + */ HANDLE WINAPI CreateEventW(IN LPSECURITY_ATTRIBUTES lpEventAttributes OPTIONAL, @@ -1165,96 +1054,35 @@ CreateEventW(IN LPSECURITY_ATTRIBUTES lpEventAttributes OPTIONAL, IN BOOL bInitialState, IN LPCWSTR lpName OPTIONAL) { - DWORD dwFlags = 0; - - /* Set new flags */ - if (bManualReset) dwFlags |= CREATE_EVENT_MANUAL_RESET; - if (bInitialState) dwFlags |= CREATE_EVENT_INITIAL_SET; - - /* Call the newer API */ - return CreateEventExW(lpEventAttributes, - lpName, - dwFlags, - EVENT_ALL_ACCESS); + CreateNtObjectFromWin32Api(Event, Event, EVENT, + lpEventAttributes, + lpName, + bManualReset ? NotificationTimer : SynchronizationTimer, + bInitialState); } +/* + * @implemented + */ HANDLE WINAPI OpenEventA(IN DWORD dwDesiredAccess, IN BOOL bInheritHandle, IN LPCSTR lpName) { - NTSTATUS Status; - ANSI_STRING AnsiName; - PUNICODE_STRING UnicodeCache; - - /* Check for a name */ - if (lpName) - { - /* Use TEB Cache */ - UnicodeCache = &NtCurrentTeb()->StaticUnicodeString; - - /* Convert to unicode */ - RtlInitAnsiString(&AnsiName, lpName); - Status = RtlAnsiStringToUnicodeString(UnicodeCache, &AnsiName, FALSE); - if (!NT_SUCCESS(Status)) - { - /* Conversion failed */ - SetLastErrorByStatus(Status); - return NULL; - } - } - else - { - /* We need a name */ - SetLastError(ERROR_INVALID_PARAMETER); - return NULL; - } - - /* Call the Unicode API */ - return OpenEventW(dwDesiredAccess, - bInheritHandle, - (LPCWSTR)UnicodeCache->Buffer); + ConvertOpenWin32AnsiObjectApiToUnicodeApi(Event, dwDesiredAccess, bInheritHandle, lpName); } +/* + * @implemented + */ HANDLE WINAPI OpenEventW(IN DWORD dwDesiredAccess, IN BOOL bInheritHandle, IN LPCWSTR lpName) { - OBJECT_ATTRIBUTES ObjectAttributes; - UNICODE_STRING ObjectName; - NTSTATUS Status; - HANDLE Handle; - - /* Make sure we got a name */ - if (!lpName) - { - /* Fail without one */ - SetLastErrorByStatus(STATUS_INVALID_PARAMETER); - return NULL; - } - - /* Initialize the object name and attributes */ - RtlInitUnicodeString(&ObjectName, lpName); - InitializeObjectAttributes(&ObjectAttributes, - &ObjectName, - bInheritHandle ? OBJ_INHERIT : 0, - hBaseDir, - NULL); - - /* Open the event */ - Status = NtOpenEvent(&Handle, dwDesiredAccess, &ObjectAttributes); - if (!NT_SUCCESS(Status)) - { - /* Convert the status and fail */ - SetLastErrorByStatus(Status); - return NULL; - } - - /* Return the handle */ - return Handle; + OpenNtObjectFromWin32Api(Event, dwDesiredAccess, bInheritHandle, lpName); } /* diff --git a/reactos/dll/win32/kernel32/include/base_x.h b/reactos/dll/win32/kernel32/include/base_x.h index 5fa6fee8876..f71147c3d0a 100644 --- a/reactos/dll/win32/kernel32/include/base_x.h +++ b/reactos/dll/win32/kernel32/include/base_x.h @@ -90,10 +90,10 @@ #define CreateNtObjectFromWin32ApiPrologue \ { \ NTSTATUS Status; \ - POBJECT_ATTRIBUTES ObjectAttributes; \ HANDLE Handle; \ UNICODE_STRING ObjectName; \ - OBJECT_ATTRIBUTES LocalAttributes; + OBJECT_ATTRIBUTES LocalAttributes; \ + POBJECT_ATTRIBUTES ObjectAttributes = &LocalAttributes; #define CreateNtObjectFromWin32ApiBody(ntobj, sec, name, access, ...) \ if (name) RtlInitUnicodeString(&ObjectName, name); \ ObjectAttributes = BasepConvertObjectAttributes(&LocalAttributes, \ @@ -132,15 +132,14 @@ // #define OpenNtObjectFromWin32Api(ntobj, acc, inh, name) \ CreateNtObjectFromWin32ApiPrologue \ - UNREFERENCED_PARAMETER(ObjectAttributes) \ if (!name) SetLastErrorByStatus(STATUS_INVALID_PARAMETER); return NULL; \ RtlInitUnicodeString(&ObjectName, name); \ - InitializeObjectAttributes(&LocalAttributes, \ + InitializeObjectAttributes(ObjectAttributes, \ &ObjectName, \ inh ? OBJ_INHERIT : 0, \ hBaseDir, \ NULL); \ - Status = NtOpen##ntobj(&Handle, acc, &LocalAttributes); \ + Status = NtOpen##ntobj(&Handle, acc, ObjectAttributes); \ if (!NT_SUCCESS(Status)) SetLastErrorByStatus(Status); return NULL; \ return Handle; \ }