IN BOOL bManualReset,
IN LPCWSTR lpTimerName OPTIONAL)
{
- CreateNtObjectFromWin32Api(WaitableTimer, Timer, TIMER,
+ CreateNtObjectFromWin32Api(WaitableTimer, Timer, TIMER_ALL_ACCESS,
lpTimerAttributes,
lpTimerName,
bManualReset ? NotificationTimer : SynchronizationTimer);
IN LONG lMaximumCount,
IN LPCWSTR lpName OPTIONAL)
{
- CreateNtObjectFromWin32Api(Semaphore, Semaphore, SEMAPHORE,
+ CreateNtObjectFromWin32Api(Semaphore, Semaphore, SEMAPHORE_ALL_ACCESS,
lpSemaphoreAttributes,
lpName,
lInitialCount,
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
*/
IN BOOL bInitialOwner,
IN LPCWSTR lpName OPTIONAL)
{
- CreateNtObjectFromWin32Api(Mutex, Mutant, MUTEX,
+ CreateNtObjectFromWin32Api(Mutex, Mutant, MUTEX_ALL_ACCESS,
lpMutexAttributes,
lpName,
bInitialOwner);
IN BOOL bInitialState,
IN LPCWSTR lpName OPTIONAL)
{
- CreateNtObjectFromWin32Api(Event, Event, EVENT,
+ CreateNtObjectFromWin32Api(Event, Event, EVENT_ALL_ACCESS,
lpEventAttributes,
lpName,
bManualReset ? NotificationEvent : SynchronizationEvent,
// This macro uses the CreateNtObjectFromWin32Api macros from above to create an
// NT object based on the Win32 API settings.
//
-// Note that it is hardcoded to always use XXX_ALL_ACCESS permissions, which is
-// 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, ...) \
+#define CreateNtObjectFromWin32Api(obj, ntobj, access, sec, name, ...) \
CreateNtObjectFromWin32ApiPrologue \
- CreateNtObjectFromWin32ApiBody(ntobj, sec, name, capsobj##_ALL_ACCESS, ##__VA_ARGS__); \
+ CreateNtObjectFromWin32ApiBody(ntobj, sec, name, access, ##__VA_ARGS__); \
CreateNtObjectFromWin32ApiEpilogue
//
@ stdcall CreateProcessW(wstr wstr ptr ptr long long ptr wstr ptr ptr)
@ stdcall CreateRemoteThread(long ptr long ptr long long ptr)
@ stdcall CreateSemaphoreA(ptr long long str)
-@ stdcall -stub -version=0x600+ CreateSemaphoreExA(ptr long long str long long)
-@ stdcall -stub -version=0x600+ CreateSemaphoreExW(ptr long long wstr long long)
+@ stdcall -version=0x600+ CreateSemaphoreExA(ptr long long str long long)
+@ stdcall -version=0x600+ CreateSemaphoreExW(ptr long long wstr long long)
@ stdcall CreateSemaphoreW(ptr long long wstr)
@ stdcall -i386 CreateSocketHandle()
@ stdcall -version=0x600+ CreateSymbolicLinkA(str str long)