mirror of
https://github.com/reactos/reactos.git
synced 2025-08-04 08:15:41 +00:00
[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:
parent
761add0ea0
commit
defe10424f
2 changed files with 25 additions and 198 deletions
|
@ -1031,113 +1031,9 @@ ReleaseMutex(IN HANDLE hMutex)
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
HANDLE
|
/*
|
||||||
WINAPI
|
* @implemented
|
||||||
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;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
HANDLE
|
HANDLE
|
||||||
WINAPI
|
WINAPI
|
||||||
CreateEventA(IN LPSECURITY_ATTRIBUTES lpEventAttributes OPTIONAL,
|
CreateEventA(IN LPSECURITY_ATTRIBUTES lpEventAttributes OPTIONAL,
|
||||||
|
@ -1145,19 +1041,12 @@ CreateEventA(IN LPSECURITY_ATTRIBUTES lpEventAttributes OPTIONAL,
|
||||||
IN BOOL bInitialState,
|
IN BOOL bInitialState,
|
||||||
IN LPCSTR lpName OPTIONAL)
|
IN LPCSTR lpName OPTIONAL)
|
||||||
{
|
{
|
||||||
DWORD dwFlags = 0;
|
ConvertWin32AnsiObjectApiToUnicodeApi(Event, lpName, lpEventAttributes, bManualReset, bInitialState);
|
||||||
|
|
||||||
/* 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);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* @implemented
|
||||||
|
*/
|
||||||
HANDLE
|
HANDLE
|
||||||
WINAPI
|
WINAPI
|
||||||
CreateEventW(IN LPSECURITY_ATTRIBUTES lpEventAttributes OPTIONAL,
|
CreateEventW(IN LPSECURITY_ATTRIBUTES lpEventAttributes OPTIONAL,
|
||||||
|
@ -1165,96 +1054,35 @@ CreateEventW(IN LPSECURITY_ATTRIBUTES lpEventAttributes OPTIONAL,
|
||||||
IN BOOL bInitialState,
|
IN BOOL bInitialState,
|
||||||
IN LPCWSTR lpName OPTIONAL)
|
IN LPCWSTR lpName OPTIONAL)
|
||||||
{
|
{
|
||||||
DWORD dwFlags = 0;
|
CreateNtObjectFromWin32Api(Event, Event, EVENT,
|
||||||
|
lpEventAttributes,
|
||||||
/* 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,
|
lpName,
|
||||||
dwFlags,
|
bManualReset ? NotificationTimer : SynchronizationTimer,
|
||||||
EVENT_ALL_ACCESS);
|
bInitialState);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* @implemented
|
||||||
|
*/
|
||||||
HANDLE
|
HANDLE
|
||||||
WINAPI
|
WINAPI
|
||||||
OpenEventA(IN DWORD dwDesiredAccess,
|
OpenEventA(IN DWORD dwDesiredAccess,
|
||||||
IN BOOL bInheritHandle,
|
IN BOOL bInheritHandle,
|
||||||
IN LPCSTR lpName)
|
IN LPCSTR lpName)
|
||||||
{
|
{
|
||||||
NTSTATUS Status;
|
ConvertOpenWin32AnsiObjectApiToUnicodeApi(Event, dwDesiredAccess, bInheritHandle, lpName);
|
||||||
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);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* @implemented
|
||||||
|
*/
|
||||||
HANDLE
|
HANDLE
|
||||||
WINAPI
|
WINAPI
|
||||||
OpenEventW(IN DWORD dwDesiredAccess,
|
OpenEventW(IN DWORD dwDesiredAccess,
|
||||||
IN BOOL bInheritHandle,
|
IN BOOL bInheritHandle,
|
||||||
IN LPCWSTR lpName)
|
IN LPCWSTR lpName)
|
||||||
{
|
{
|
||||||
OBJECT_ATTRIBUTES ObjectAttributes;
|
OpenNtObjectFromWin32Api(Event, dwDesiredAccess, bInheritHandle, lpName);
|
||||||
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;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -90,10 +90,10 @@
|
||||||
#define CreateNtObjectFromWin32ApiPrologue \
|
#define CreateNtObjectFromWin32ApiPrologue \
|
||||||
{ \
|
{ \
|
||||||
NTSTATUS Status; \
|
NTSTATUS Status; \
|
||||||
POBJECT_ATTRIBUTES ObjectAttributes; \
|
|
||||||
HANDLE Handle; \
|
HANDLE Handle; \
|
||||||
UNICODE_STRING ObjectName; \
|
UNICODE_STRING ObjectName; \
|
||||||
OBJECT_ATTRIBUTES LocalAttributes;
|
OBJECT_ATTRIBUTES LocalAttributes; \
|
||||||
|
POBJECT_ATTRIBUTES ObjectAttributes = &LocalAttributes;
|
||||||
#define CreateNtObjectFromWin32ApiBody(ntobj, sec, name, access, ...) \
|
#define CreateNtObjectFromWin32ApiBody(ntobj, sec, name, access, ...) \
|
||||||
if (name) RtlInitUnicodeString(&ObjectName, name); \
|
if (name) RtlInitUnicodeString(&ObjectName, name); \
|
||||||
ObjectAttributes = BasepConvertObjectAttributes(&LocalAttributes, \
|
ObjectAttributes = BasepConvertObjectAttributes(&LocalAttributes, \
|
||||||
|
@ -132,15 +132,14 @@
|
||||||
//
|
//
|
||||||
#define OpenNtObjectFromWin32Api(ntobj, acc, inh, name) \
|
#define OpenNtObjectFromWin32Api(ntobj, acc, inh, name) \
|
||||||
CreateNtObjectFromWin32ApiPrologue \
|
CreateNtObjectFromWin32ApiPrologue \
|
||||||
UNREFERENCED_PARAMETER(ObjectAttributes) \
|
|
||||||
if (!name) SetLastErrorByStatus(STATUS_INVALID_PARAMETER); return NULL; \
|
if (!name) SetLastErrorByStatus(STATUS_INVALID_PARAMETER); return NULL; \
|
||||||
RtlInitUnicodeString(&ObjectName, name); \
|
RtlInitUnicodeString(&ObjectName, name); \
|
||||||
InitializeObjectAttributes(&LocalAttributes, \
|
InitializeObjectAttributes(ObjectAttributes, \
|
||||||
&ObjectName, \
|
&ObjectName, \
|
||||||
inh ? OBJ_INHERIT : 0, \
|
inh ? OBJ_INHERIT : 0, \
|
||||||
hBaseDir, \
|
hBaseDir, \
|
||||||
NULL); \
|
NULL); \
|
||||||
Status = NtOpen##ntobj(&Handle, acc, &LocalAttributes); \
|
Status = NtOpen##ntobj(&Handle, acc, ObjectAttributes); \
|
||||||
if (!NT_SUCCESS(Status)) SetLastErrorByStatus(Status); return NULL; \
|
if (!NT_SUCCESS(Status)) SetLastErrorByStatus(Status); return NULL; \
|
||||||
return Handle; \
|
return Handle; \
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue