mirror of
https://github.com/reactos/reactos.git
synced 2024-10-01 06:57:08 +00:00
[KERNEL32]: Apply macros to Semaphore APIs. Fix bugs #18/#19 (same as before).
svn path=/trunk/; revision=52795
This commit is contained in:
parent
d99b2bd865
commit
5e0d0909a0
|
@ -530,117 +530,6 @@ CancelWaitableTimer(IN HANDLE hTimer)
|
|||
return FALSE;
|
||||
}
|
||||
|
||||
/*
|
||||
* @implemented
|
||||
*/
|
||||
HANDLE
|
||||
WINAPI
|
||||
CreateSemaphoreExA(IN LPSECURITY_ATTRIBUTES lpSemaphoreAttributes OPTIONAL,
|
||||
IN LONG lInitialCount,
|
||||
IN LONG lMaximumCount,
|
||||
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 CreateSemaphoreExW(lpSemaphoreAttributes,
|
||||
lInitialCount,
|
||||
lMaximumCount,
|
||||
UnicodeName,
|
||||
dwFlags,
|
||||
dwDesiredAccess);
|
||||
}
|
||||
|
||||
/*
|
||||
* @implemented
|
||||
*/
|
||||
HANDLE
|
||||
WINAPI
|
||||
CreateSemaphoreExW(IN LPSECURITY_ATTRIBUTES lpSemaphoreAttributes OPTIONAL,
|
||||
IN LONG lInitialCount,
|
||||
IN LONG lMaximumCount,
|
||||
IN LPCWSTR lpName OPTIONAL,
|
||||
IN DWORD dwFlags,
|
||||
IN DWORD dwDesiredAccess)
|
||||
{
|
||||
NTSTATUS Status;
|
||||
OBJECT_ATTRIBUTES LocalAttributes;
|
||||
POBJECT_ATTRIBUTES ObjectAttributes;
|
||||
HANDLE Handle;
|
||||
UNICODE_STRING ObjectName;
|
||||
|
||||
/* Now check if we got a name */
|
||||
if (lpName) RtlInitUnicodeString(&ObjectName, lpName);
|
||||
|
||||
if (dwFlags != 0)
|
||||
{
|
||||
SetLastError(ERROR_INVALID_PARAMETER);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/* Now convert the object attributes */
|
||||
ObjectAttributes = BasepConvertObjectAttributes(&LocalAttributes,
|
||||
lpSemaphoreAttributes,
|
||||
lpName ? &ObjectName : NULL);
|
||||
|
||||
/* Create the semaphore */
|
||||
Status = NtCreateSemaphore(&Handle,
|
||||
(ACCESS_MASK)dwDesiredAccess,
|
||||
ObjectAttributes,
|
||||
lInitialCount,
|
||||
lMaximumCount);
|
||||
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
|
||||
*/
|
||||
|
@ -651,12 +540,7 @@ CreateSemaphoreA(IN LPSECURITY_ATTRIBUTES lpSemaphoreAttributes OPTIONAL,
|
|||
IN LONG lMaximumCount,
|
||||
IN LPCSTR lpName OPTIONAL)
|
||||
{
|
||||
return CreateSemaphoreExA(lpSemaphoreAttributes,
|
||||
lInitialCount,
|
||||
lMaximumCount,
|
||||
lpName,
|
||||
0,
|
||||
SEMAPHORE_ALL_ACCESS);
|
||||
ConvertWin32AnsiObjectApiToUnicodeApi(Semaphore, lpName, lpSemaphoreAttributes, lInitialCount, lMaximumCount);
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -669,12 +553,11 @@ CreateSemaphoreW(IN LPSECURITY_ATTRIBUTES lpSemaphoreAttributes OPTIONAL,
|
|||
IN LONG lMaximumCount,
|
||||
IN LPCWSTR lpName OPTIONAL)
|
||||
{
|
||||
return CreateSemaphoreExW(lpSemaphoreAttributes,
|
||||
lInitialCount,
|
||||
lMaximumCount,
|
||||
lpName,
|
||||
0,
|
||||
SEMAPHORE_ALL_ACCESS);
|
||||
CreateNtObjectFromWin32Api(Semaphore, Semaphore, SEMAPHORE,
|
||||
lpSemaphoreAttributes,
|
||||
lpName,
|
||||
lInitialCount,
|
||||
lMaximumCount);
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -686,37 +569,7 @@ OpenSemaphoreA(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 OpenSemaphoreW(dwDesiredAccess,
|
||||
bInheritHandle,
|
||||
(LPCWSTR)UnicodeCache->Buffer);
|
||||
ConvertOpenWin32AnsiObjectApiToUnicodeApi(Semaphore, dwDesiredAccess, bInheritHandle, lpName);
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -728,38 +581,7 @@ OpenSemaphoreW(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 semaphore */
|
||||
Status = NtOpenSemaphore(&Handle, dwDesiredAccess, &ObjectAttributes);
|
||||
if (!NT_SUCCESS(Status))
|
||||
{
|
||||
/* Convert the status and fail */
|
||||
SetLastErrorByStatus(Status);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/* Return the handle */
|
||||
return Handle;
|
||||
OpenNtObjectFromWin32Api(Semaphore, dwDesiredAccess, bInheritHandle, lpName);
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
Loading…
Reference in a new issue