[KERNEL32] implement CreateSemaphoreExW/A and adjust macroses for it

This commit is contained in:
Denis Malikov 2018-11-18 23:51:20 +07:00 committed by Mark Jansen
parent 40ab30d6a0
commit 18a9993d69
4 changed files with 63 additions and 14 deletions

View file

@ -39,7 +39,7 @@ CreateJobObjectW(IN LPSECURITY_ATTRIBUTES lpJobAttributes,
IN LPCWSTR lpName) IN LPCWSTR lpName)
{ {
/* Create the NT object */ /* Create the NT object */
CreateNtObjectFromWin32Api(JobObject, JobObject, JOB_OBJECT, lpJobAttributes, lpName); CreateNtObjectFromWin32Api(JobObject, JobObject, JOB_OBJECT_ALL_ACCESS, lpJobAttributes, lpName);
} }
/* /*

View file

@ -332,7 +332,7 @@ CreateWaitableTimerW(IN LPSECURITY_ATTRIBUTES lpTimerAttributes OPTIONAL,
IN BOOL bManualReset, IN BOOL bManualReset,
IN LPCWSTR lpTimerName OPTIONAL) IN LPCWSTR lpTimerName OPTIONAL)
{ {
CreateNtObjectFromWin32Api(WaitableTimer, Timer, TIMER, CreateNtObjectFromWin32Api(WaitableTimer, Timer, TIMER_ALL_ACCESS,
lpTimerAttributes, lpTimerAttributes,
lpTimerName, lpTimerName,
bManualReset ? NotificationTimer : SynchronizationTimer); bManualReset ? NotificationTimer : SynchronizationTimer);
@ -446,13 +446,67 @@ CreateSemaphoreW(IN LPSECURITY_ATTRIBUTES lpSemaphoreAttributes OPTIONAL,
IN LONG lMaximumCount, IN LONG lMaximumCount,
IN LPCWSTR lpName OPTIONAL) IN LPCWSTR lpName OPTIONAL)
{ {
CreateNtObjectFromWin32Api(Semaphore, Semaphore, SEMAPHORE, CreateNtObjectFromWin32Api(Semaphore, Semaphore, SEMAPHORE_ALL_ACCESS,
lpSemaphoreAttributes, lpSemaphoreAttributes,
lpName, lpName,
lInitialCount, lInitialCount,
lMaximumCount); lMaximumCount);
} }
HANDLE
WINAPI
DECLSPEC_HOTPATCH
CreateSemaphoreExW(IN LPSECURITY_ATTRIBUTES lpSemaphoreAttributes OPTIONAL,
IN LONG lInitialCount,
IN LONG lMaximumCount,
IN LPCWSTR lpName OPTIONAL,
IN DWORD dwFlags OPTIONAL,
IN DWORD dwDesiredAccess OPTIONAL)
{
CreateNtObjectFromWin32Api(Semaphore, Semaphore, dwDesiredAccess,
lpSemaphoreAttributes,
lpName,
lInitialCount,
lMaximumCount);
}
HANDLE
WINAPI
DECLSPEC_HOTPATCH
CreateSemaphoreExA(IN LPSECURITY_ATTRIBUTES lpSemaphoreAttributes OPTIONAL,
IN LONG lInitialCount,
IN LONG lMaximumCount,
IN LPCSTR lpName OPTIONAL,
IN DWORD dwFlags OPTIONAL,
IN DWORD dwDesiredAccess OPTIONAL)
{
ConvertAnsiToUnicodePrologue
if (!lpName)
{
return CreateSemaphoreExW(lpSemaphoreAttributes,
lInitialCount,
lMaximumCount,
NULL,
dwFlags,
dwDesiredAccess);
}
ConvertAnsiToUnicodeBody(lpName)
if (NT_SUCCESS(Status))
{
return CreateSemaphoreExW(lpSemaphoreAttributes,
lInitialCount,
lMaximumCount,
UnicodeCache->Buffer,
dwFlags,
dwDesiredAccess);
}
ConvertAnsiToUnicodeEpilogue
}
/* /*
* @implemented * @implemented
*/ */
@ -523,7 +577,7 @@ CreateMutexW(IN LPSECURITY_ATTRIBUTES lpMutexAttributes OPTIONAL,
IN BOOL bInitialOwner, IN BOOL bInitialOwner,
IN LPCWSTR lpName OPTIONAL) IN LPCWSTR lpName OPTIONAL)
{ {
CreateNtObjectFromWin32Api(Mutex, Mutant, MUTEX, CreateNtObjectFromWin32Api(Mutex, Mutant, MUTEX_ALL_ACCESS,
lpMutexAttributes, lpMutexAttributes,
lpName, lpName,
bInitialOwner); bInitialOwner);
@ -599,7 +653,7 @@ CreateEventW(IN LPSECURITY_ATTRIBUTES lpEventAttributes OPTIONAL,
IN BOOL bInitialState, IN BOOL bInitialState,
IN LPCWSTR lpName OPTIONAL) IN LPCWSTR lpName OPTIONAL)
{ {
CreateNtObjectFromWin32Api(Event, Event, EVENT, CreateNtObjectFromWin32Api(Event, Event, EVENT_ALL_ACCESS,
lpEventAttributes, lpEventAttributes,
lpName, lpName,
bManualReset ? NotificationEvent : SynchronizationEvent, bManualReset ? NotificationEvent : SynchronizationEvent,

View file

@ -132,14 +132,9 @@
// This macro uses the CreateNtObjectFromWin32Api macros from above to create an // This macro uses the CreateNtObjectFromWin32Api macros from above to create an
// NT object based on the Win32 API settings. // NT object based on the Win32 API settings.
// //
// Note that it is hardcoded to always use XXX_ALL_ACCESS permissions, which is #define CreateNtObjectFromWin32Api(obj, ntobj, access, sec, name, ...) \
// the behavior up until Vista. When/if the target moves to Vista, the macro can
// be improved to support caller-specified access masks, as the underlying macro
// above does support this.
//
#define CreateNtObjectFromWin32Api(obj, ntobj, capsobj, sec, name, ...) \
CreateNtObjectFromWin32ApiPrologue \ CreateNtObjectFromWin32ApiPrologue \
CreateNtObjectFromWin32ApiBody(ntobj, sec, name, capsobj##_ALL_ACCESS, ##__VA_ARGS__); \ CreateNtObjectFromWin32ApiBody(ntobj, sec, name, access, ##__VA_ARGS__); \
CreateNtObjectFromWin32ApiEpilogue CreateNtObjectFromWin32ApiEpilogue
// //

View file

@ -158,8 +158,8 @@
@ stdcall CreateProcessW(wstr wstr ptr ptr long long ptr wstr ptr ptr) @ stdcall CreateProcessW(wstr wstr ptr ptr long long ptr wstr ptr ptr)
@ stdcall CreateRemoteThread(long ptr long ptr long long ptr) @ stdcall CreateRemoteThread(long ptr long ptr long long ptr)
@ stdcall CreateSemaphoreA(ptr long long str) @ stdcall CreateSemaphoreA(ptr long long str)
@ stdcall -stub -version=0x600+ CreateSemaphoreExA(ptr long long str long long) @ stdcall -version=0x600+ CreateSemaphoreExA(ptr long long str long long)
@ stdcall -stub -version=0x600+ CreateSemaphoreExW(ptr long long wstr long long) @ stdcall -version=0x600+ CreateSemaphoreExW(ptr long long wstr long long)
@ stdcall CreateSemaphoreW(ptr long long wstr) @ stdcall CreateSemaphoreW(ptr long long wstr)
@ stdcall -i386 CreateSocketHandle() @ stdcall -i386 CreateSocketHandle()
@ stdcall -version=0x600+ CreateSymbolicLinkA(str str long) @ stdcall -version=0x600+ CreateSymbolicLinkA(str str long)