[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
This commit is contained in:
Alex Ionescu 2011-07-23 09:58:33 +00:00
parent 761add0ea0
commit defe10424f
2 changed files with 25 additions and 198 deletions

View file

@ -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);
}
/*

View file

@ -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; \
}