Rebase against 00b08fad99745db326ef060627c3e9dc668a734a

This commit is contained in:
Alistair Leslie-Hughes
2018-11-28 09:19:40 +11:00
parent 7d49250016
commit c30bad1531
13 changed files with 46 additions and 1380 deletions

View File

@@ -1,62 +0,0 @@
From c5f36ac202c20faa00fc67c9d1cdc977ce877933 Mon Sep 17 00:00:00 2001
From: Zebediah Figura <z.figura12@gmail.com>
Date: Sun, 19 Aug 2018 17:42:12 -0500
Subject: [PATCH 05/17] ntoskrnl.exe: Implement KeClearEvent().
Signed-off-by: Zebediah Figura <z.figura12@gmail.com>
---
dlls/ntoskrnl.exe/ntoskrnl.c | 8 --------
dlls/ntoskrnl.exe/sync.c | 8 ++++++++
include/ddk/wdm.h | 1 +
3 files changed, 9 insertions(+), 8 deletions(-)
diff --git a/dlls/ntoskrnl.exe/ntoskrnl.c b/dlls/ntoskrnl.exe/ntoskrnl.c
index 99fa910..646c528 100644
--- a/dlls/ntoskrnl.exe/ntoskrnl.c
+++ b/dlls/ntoskrnl.exe/ntoskrnl.c
@@ -3730,14 +3730,6 @@ NTSTATUS WINAPI IoCreateFile(HANDLE *handle, ACCESS_MASK access, OBJECT_ATTRIBUT
}
/***********************************************************************
- * KeClearEvent (NTOSKRNL.EXE.@)
- */
-VOID WINAPI KeClearEvent(PRKEVENT event)
-{
- FIXME("stub: %p\n", event);
-}
-
-/***********************************************************************
* KeAcquireInStackQueuedSpinLock (NTOSKRNL.EXE.@)
*/
#ifdef DEFINE_FASTCALL2_ENTRYPOINT
diff --git a/dlls/ntoskrnl.exe/sync.c b/dlls/ntoskrnl.exe/sync.c
index f011a60..a905fb3 100644
--- a/dlls/ntoskrnl.exe/sync.c
+++ b/dlls/ntoskrnl.exe/sync.c
@@ -165,3 +165,11 @@ LONG WINAPI KeResetEvent( PRKEVENT event )
return ret;
}
+
+/***********************************************************************
+ * KeClearEvent (NTOSKRNL.EXE.@)
+ */
+void WINAPI KeClearEvent( PRKEVENT event )
+{
+ KeResetEvent( event );
+}
diff --git a/include/ddk/wdm.h b/include/ddk/wdm.h
index 350a08e..0fe73f2 100644
--- a/include/ddk/wdm.h
+++ b/include/ddk/wdm.h
@@ -1418,6 +1418,7 @@ void WINAPI IoReleaseCancelSpinLock(KIRQL);
NTSTATUS WINAPI IoSetDeviceInterfaceState(UNICODE_STRING*,BOOLEAN);
NTSTATUS WINAPI IoWMIRegistrationControl(PDEVICE_OBJECT,ULONG);
+void WINAPI KeClearEvent(PRKEVENT);
PKTHREAD WINAPI KeGetCurrentThread(void);
void WINAPI KeInitializeEvent(PRKEVENT,EVENT_TYPE,BOOLEAN);
void WINAPI KeInitializeSemaphore(PRKSEMAPHORE,LONG,LONG);
--
2.7.4

View File

@@ -1,64 +0,0 @@
From 26324192918d2d16d92978abebed83d63c7ffc3f Mon Sep 17 00:00:00 2001
From: Zebediah Figura <z.figura12@gmail.com>
Date: Sun, 19 Aug 2018 20:22:29 -0500
Subject: [PATCH 08/17] ntoskrnl.exe: Implement KeInitializeSemaphore().
Signed-off-by: Zebediah Figura <z.figura12@gmail.com>
---
dlls/ntoskrnl.exe/ntoskrnl.c | 9 ---------
dlls/ntoskrnl.exe/sync.c | 15 +++++++++++++++
2 files changed, 15 insertions(+), 9 deletions(-)
diff --git a/dlls/ntoskrnl.exe/ntoskrnl.c b/dlls/ntoskrnl.exe/ntoskrnl.c
index 3002d4e..db8af82 100644
--- a/dlls/ntoskrnl.exe/ntoskrnl.c
+++ b/dlls/ntoskrnl.exe/ntoskrnl.c
@@ -2116,15 +2116,6 @@ LONG WINAPI KeReleaseMutex(PRKMUTEX Mutex, BOOLEAN Wait)
/***********************************************************************
- * KeInitializeSemaphore (NTOSKRNL.EXE.@)
- */
-void WINAPI KeInitializeSemaphore( PRKSEMAPHORE Semaphore, LONG Count, LONG Limit )
-{
- FIXME( "(%p %d %d) stub\n", Semaphore , Count, Limit );
-}
-
-
-/***********************************************************************
* KeInitializeSpinLock (NTOSKRNL.EXE.@)
*/
void WINAPI KeInitializeSpinLock( PKSPIN_LOCK SpinLock )
diff --git a/dlls/ntoskrnl.exe/sync.c b/dlls/ntoskrnl.exe/sync.c
index 423fdcf..c072d36 100644
--- a/dlls/ntoskrnl.exe/sync.c
+++ b/dlls/ntoskrnl.exe/sync.c
@@ -38,6 +38,7 @@ enum object_type
{
TYPE_MANUAL_EVENT = 0,
TYPE_AUTO_EVENT = 1,
+ TYPE_SEMAPHORE = 5,
};
static CRITICAL_SECTION sync_cs;
@@ -182,3 +183,17 @@ void WINAPI KeClearEvent( PRKEVENT event )
{
KeResetEvent( event );
}
+
+/***********************************************************************
+ * KeInitializeSemaphore (NTOSKRNL.EXE.@)
+ */
+void WINAPI KeInitializeSemaphore( PRKSEMAPHORE semaphore, LONG count, LONG limit )
+{
+ TRACE("semaphore %p, count %d, limit %d.\n", semaphore, count, limit);
+
+ semaphore->Header.Type = TYPE_SEMAPHORE;
+ semaphore->Header.SignalState = count;
+ semaphore->Header.WaitListHead.Blink = NULL;
+ semaphore->Header.WaitListHead.Flink = NULL;
+ semaphore->Limit = limit;
+}
--
2.7.4

View File

@@ -1,176 +0,0 @@
From 503285d89d3c0d63331697d6e87d0b225d2ccb05 Mon Sep 17 00:00:00 2001
From: Zebediah Figura <z.figura12@gmail.com>
Date: Sun, 19 Aug 2018 20:45:54 -0500
Subject: [PATCH 09/17] ntoskrnl.exe: Implement KeReleaseSemaphore() and
waiting on semaphores.
Signed-off-by: Zebediah Figura <z.figura12@gmail.com>
---
dlls/ntoskrnl.exe/ntoskrnl.c | 11 -------
dlls/ntoskrnl.exe/sync.c | 31 +++++++++++++++++++
dlls/ntoskrnl.exe/tests/driver.c | 64 ++++++++++++++++++++++++++++++++++++++++
3 files changed, 95 insertions(+), 11 deletions(-)
diff --git a/dlls/ntoskrnl.exe/ntoskrnl.c b/dlls/ntoskrnl.exe/ntoskrnl.c
index db8af82..b367323 100644
--- a/dlls/ntoskrnl.exe/ntoskrnl.c
+++ b/dlls/ntoskrnl.exe/ntoskrnl.c
@@ -2209,17 +2209,6 @@ void WINAPI KeQueryTickCount( LARGE_INTEGER *count )
/***********************************************************************
- * KeReleaseSemaphore (NTOSKRNL.EXE.@)
- */
-LONG WINAPI KeReleaseSemaphore( PRKSEMAPHORE Semaphore, KPRIORITY Increment,
- LONG Adjustment, BOOLEAN Wait )
-{
- FIXME("(%p %d %d %d) stub\n", Semaphore, Increment, Adjustment, Wait );
- return 0;
-}
-
-
-/***********************************************************************
* KeQueryTimeIncrement (NTOSKRNL.EXE.@)
*/
ULONG WINAPI KeQueryTimeIncrement(void)
diff --git a/dlls/ntoskrnl.exe/sync.c b/dlls/ntoskrnl.exe/sync.c
index c072d36..30160f7 100644
--- a/dlls/ntoskrnl.exe/sync.c
+++ b/dlls/ntoskrnl.exe/sync.c
@@ -83,6 +83,13 @@ NTSTATUS WINAPI KeWaitForMultipleObjects(ULONG count, void *pobjs[],
case TYPE_AUTO_EVENT:
objs[i]->WaitListHead.Blink = CreateEventW( NULL, FALSE, objs[i]->SignalState, NULL );
break;
+ case TYPE_SEMAPHORE:
+ {
+ KSEMAPHORE *semaphore = CONTAINING_RECORD(objs[i], KSEMAPHORE, Header);
+ objs[i]->WaitListHead.Blink = CreateSemaphoreW( NULL,
+ semaphore->Header.SignalState, semaphore->Limit, NULL );
+ break;
+ }
}
}
@@ -102,6 +109,9 @@ NTSTATUS WINAPI KeWaitForMultipleObjects(ULONG count, void *pobjs[],
case TYPE_AUTO_EVENT:
objs[i]->SignalState = FALSE;
break;
+ case TYPE_SEMAPHORE:
+ --objs[i]->SignalState;
+ break;
}
}
@@ -197,3 +207,24 @@ void WINAPI KeInitializeSemaphore( PRKSEMAPHORE semaphore, LONG count, LONG limi
semaphore->Header.WaitListHead.Flink = NULL;
semaphore->Limit = limit;
}
+
+/***********************************************************************
+ * KeReleaseSemaphore (NTOSKRNL.EXE.@)
+ */
+LONG WINAPI KeReleaseSemaphore( PRKSEMAPHORE semaphore, KPRIORITY increment,
+ LONG count, BOOLEAN wait )
+{
+ HANDLE handle = semaphore->Header.WaitListHead.Blink;
+ LONG ret;
+
+ TRACE("semaphore %p, increment %d, count %d, wait %u.\n",
+ semaphore, increment, count, wait);
+
+ EnterCriticalSection( &sync_cs );
+ ret = interlocked_xchg_add( &semaphore->Header.SignalState, count );
+ if (handle)
+ ReleaseSemaphore( handle, count, NULL );
+ LeaveCriticalSection( &sync_cs );
+
+ return ret;
+}
diff --git a/dlls/ntoskrnl.exe/tests/driver.c b/dlls/ntoskrnl.exe/tests/driver.c
index 07a0adb..852a726 100644
--- a/dlls/ntoskrnl.exe/tests/driver.c
+++ b/dlls/ntoskrnl.exe/tests/driver.c
@@ -228,9 +228,11 @@ static NTSTATUS wait_multiple(ULONG count, void *objs[], WAIT_TYPE wait_type, UL
static void test_sync(void)
{
+ KSEMAPHORE semaphore, semaphore2;
KEVENT manual_event, auto_event;
void *objs[2];
NTSTATUS ret;
+ int i;
KeInitializeEvent(&manual_event, NotificationEvent, FALSE);
@@ -323,6 +325,68 @@ static void test_sync(void)
ret = wait_multiple(2, objs, WaitAny, 0);
ok(ret == 1, "got %#x\n", ret);
+
+ /* test semaphores */
+ KeInitializeSemaphore(&semaphore, 0, 5);
+
+ ret = wait_single(&semaphore, 0);
+ ok(ret == STATUS_TIMEOUT, "got %u\n", ret);
+
+ ret = KeReleaseSemaphore(&semaphore, 0, 1, FALSE);
+ ok(ret == 0, "got prev %d\n", ret);
+
+ ret = KeReleaseSemaphore(&semaphore, 0, 2, FALSE);
+ ok(ret == 1, "got prev %d\n", ret);
+
+ ret = KeReleaseSemaphore(&semaphore, 0, 1, FALSE);
+ ok(ret == 3, "got prev %d\n", ret);
+
+ for (i = 0; i < 4; i++)
+ {
+ ret = wait_single(&semaphore, 0);
+ ok(ret == 0, "got %#x\n", ret);
+ }
+
+ ret = wait_single(&semaphore, 0);
+ ok(ret == STATUS_TIMEOUT, "got %#x\n", ret);
+
+ KeInitializeSemaphore(&semaphore2, 3, 5);
+
+ ret = KeReleaseSemaphore(&semaphore2, 0, 1, FALSE);
+ ok(ret == 3, "got prev %d\n", ret);
+
+ for (i = 0; i < 4; i++)
+ {
+ ret = wait_single(&semaphore2, 0);
+ ok(ret == 0, "got %#x\n", ret);
+ }
+
+ objs[0] = &semaphore;
+ objs[1] = &semaphore2;
+
+ ret = wait_multiple(2, objs, WaitAny, 0);
+ ok(ret == STATUS_TIMEOUT, "got %#x\n", ret);
+
+ KeReleaseSemaphore(&semaphore, 0, 1, FALSE);
+ KeReleaseSemaphore(&semaphore2, 0, 1, FALSE);
+
+ ret = wait_multiple(2, objs, WaitAny, 0);
+ ok(ret == 0, "got %#x\n", ret);
+
+ ret = wait_multiple(2, objs, WaitAny, 0);
+ ok(ret == 1, "got %#x\n", ret);
+
+ ret = wait_multiple(2, objs, WaitAny, 0);
+ ok(ret == STATUS_TIMEOUT, "got %#x\n", ret);
+
+ KeReleaseSemaphore(&semaphore, 0, 1, FALSE);
+ KeReleaseSemaphore(&semaphore2, 0, 1, FALSE);
+
+ ret = wait_multiple(2, objs, WaitAll, 0);
+ ok(ret == 0, "got %#x\n", ret);
+
+ ret = wait_multiple(2, objs, WaitAny, 0);
+ ok(ret == STATUS_TIMEOUT, "got %#x\n", ret);
}
static NTSTATUS main_test(IRP *irp, IO_STACK_LOCATION *stack, ULONG_PTR *info)
--
2.7.4

View File

@@ -1,76 +0,0 @@
From 07bc793086700ec42b25667e3e019a616ed13723 Mon Sep 17 00:00:00 2001
From: Zebediah Figura <z.figura12@gmail.com>
Date: Sun, 19 Aug 2018 21:24:51 -0500
Subject: [PATCH 10/17] ntoskrnl.exe: Implement KeInitializeMutex().
Signed-off-by: Zebediah Figura <z.figura12@gmail.com>
---
dlls/ntoskrnl.exe/ntoskrnl.c | 9 ---------
dlls/ntoskrnl.exe/sync.c | 14 ++++++++++++++
include/ddk/wdm.h | 1 +
3 files changed, 15 insertions(+), 9 deletions(-)
diff --git a/dlls/ntoskrnl.exe/ntoskrnl.c b/dlls/ntoskrnl.exe/ntoskrnl.c
index b367323..920fb74 100644
--- a/dlls/ntoskrnl.exe/ntoskrnl.c
+++ b/dlls/ntoskrnl.exe/ntoskrnl.c
@@ -2086,15 +2086,6 @@ PRKTHREAD WINAPI KeGetCurrentThread(void)
}
/***********************************************************************
- * KeInitializeMutex (NTOSKRNL.EXE.@)
- */
-void WINAPI KeInitializeMutex(PRKMUTEX Mutex, ULONG Level)
-{
- FIXME( "stub: %p, %u\n", Mutex, Level );
-}
-
-
- /***********************************************************************
* KeWaitForMutexObject (NTOSKRNL.EXE.@)
*/
NTSTATUS WINAPI KeWaitForMutexObject(PRKMUTEX Mutex, KWAIT_REASON WaitReason, KPROCESSOR_MODE WaitMode,
diff --git a/dlls/ntoskrnl.exe/sync.c b/dlls/ntoskrnl.exe/sync.c
index 30160f7..7535ae8 100644
--- a/dlls/ntoskrnl.exe/sync.c
+++ b/dlls/ntoskrnl.exe/sync.c
@@ -38,6 +38,7 @@ enum object_type
{
TYPE_MANUAL_EVENT = 0,
TYPE_AUTO_EVENT = 1,
+ TYPE_MUTEX = 2,
TYPE_SEMAPHORE = 5,
};
@@ -228,3 +229,16 @@ LONG WINAPI KeReleaseSemaphore( PRKSEMAPHORE semaphore, KPRIORITY increment,
return ret;
}
+
+/***********************************************************************
+ * KeInitializeMutex (NTOSKRNL.EXE.@)
+ */
+void WINAPI KeInitializeMutex( PRKMUTEX mutex, ULONG level )
+{
+ TRACE("mutex %p, level %u.\n", mutex, level);
+
+ mutex->Header.Type = TYPE_MUTEX;
+ mutex->Header.SignalState = 1;
+ mutex->Header.WaitListHead.Blink = NULL;
+ mutex->Header.WaitListHead.Flink = NULL;
+}
diff --git a/include/ddk/wdm.h b/include/ddk/wdm.h
index 6b6ac19..c8adc7d 100644
--- a/include/ddk/wdm.h
+++ b/include/ddk/wdm.h
@@ -1421,6 +1421,7 @@ NTSTATUS WINAPI IoWMIRegistrationControl(PDEVICE_OBJECT,ULONG);
void WINAPI KeClearEvent(PRKEVENT);
PKTHREAD WINAPI KeGetCurrentThread(void);
void WINAPI KeInitializeEvent(PRKEVENT,EVENT_TYPE,BOOLEAN);
+void WINAPI KeInitializeMutex(PRKMUTEX,ULONG);
void WINAPI KeInitializeSemaphore(PRKSEMAPHORE,LONG,LONG);
void WINAPI KeInitializeTimerEx(PKTIMER,TIMER_TYPE);
void WINAPI KeQuerySystemTime(LARGE_INTEGER*);
--
2.7.4

View File

@@ -1,214 +0,0 @@
From 7505150045f3ce4cd805e863913289156322b41d Mon Sep 17 00:00:00 2001
From: Zebediah Figura <z.figura12@gmail.com>
Date: Sun, 19 Aug 2018 21:43:37 -0500
Subject: [PATCH 11/17] ntoskrnl.exe: Implement KeReleaseMutex() and waiting on
mutexes.
We can get away with storing the mutex object in the KMUTEX for as long as
it's held, since on Windows it's illegal to destroy a mutex until it's
released.
Setting the flag OBJ_KERNEL_HANDLE on okfile is necessary to allow it to be
written to by system threads.
Signed-off-by: Zebediah Figura <z.figura12@gmail.com>
---
dlls/ntoskrnl.exe/ntoskrnl.c | 10 -------
dlls/ntoskrnl.exe/ntoskrnl.exe.spec | 2 +-
dlls/ntoskrnl.exe/sync.c | 44 ++++++++++++++++++++++++++--
dlls/ntoskrnl.exe/tests/driver.c | 58 +++++++++++++++++++++++++++++++++++++
4 files changed, 101 insertions(+), 13 deletions(-)
diff --git a/dlls/ntoskrnl.exe/ntoskrnl.c b/dlls/ntoskrnl.exe/ntoskrnl.c
index 920fb74..cc88100 100644
--- a/dlls/ntoskrnl.exe/ntoskrnl.c
+++ b/dlls/ntoskrnl.exe/ntoskrnl.c
@@ -2096,16 +2096,6 @@ NTSTATUS WINAPI KeWaitForMutexObject(PRKMUTEX Mutex, KWAIT_REASON WaitReason, KP
}
- /***********************************************************************
- * KeReleaseMutex (NTOSKRNL.EXE.@)
- */
-LONG WINAPI KeReleaseMutex(PRKMUTEX Mutex, BOOLEAN Wait)
-{
- FIXME( "stub: %p, %d\n", Mutex, Wait );
- return STATUS_NOT_IMPLEMENTED;
-}
-
-
/***********************************************************************
* KeInitializeSpinLock (NTOSKRNL.EXE.@)
*/
diff --git a/dlls/ntoskrnl.exe/ntoskrnl.exe.spec b/dlls/ntoskrnl.exe/ntoskrnl.exe.spec
index 422d575..f089f41 100644
--- a/dlls/ntoskrnl.exe/ntoskrnl.exe.spec
+++ b/dlls/ntoskrnl.exe/ntoskrnl.exe.spec
@@ -1402,7 +1402,7 @@
@ stdcall -private ZwUnloadKey(ptr) NtUnloadKey
@ stdcall -private ZwUnmapViewOfSection(long ptr) NtUnmapViewOfSection
@ stdcall -private ZwWaitForMultipleObjects(long ptr long long ptr) NtWaitForMultipleObjects
-@ stdcall -private ZwWaitForSingleObject(long long ptr) NtWaitForSingleObject
+@ stdcall ZwWaitForSingleObject(long long ptr) NtWaitForSingleObject
@ stdcall ZwWriteFile(long long ptr ptr ptr ptr long ptr ptr) NtWriteFile
@ stdcall -private ZwYieldExecution() NtYieldExecution
@ stdcall -private -arch=arm,x86_64 -norelay __chkstk()
diff --git a/dlls/ntoskrnl.exe/sync.c b/dlls/ntoskrnl.exe/sync.c
index 7535ae8..a038a07 100644
--- a/dlls/ntoskrnl.exe/sync.c
+++ b/dlls/ntoskrnl.exe/sync.c
@@ -84,6 +84,9 @@ NTSTATUS WINAPI KeWaitForMultipleObjects(ULONG count, void *pobjs[],
case TYPE_AUTO_EVENT:
objs[i]->WaitListHead.Blink = CreateEventW( NULL, FALSE, objs[i]->SignalState, NULL );
break;
+ case TYPE_MUTEX:
+ objs[i]->WaitListHead.Blink = CreateMutexW( NULL, FALSE, NULL );
+ break;
case TYPE_SEMAPHORE:
{
KSEMAPHORE *semaphore = CONTAINING_RECORD(objs[i], KSEMAPHORE, Header);
@@ -110,6 +113,7 @@ NTSTATUS WINAPI KeWaitForMultipleObjects(ULONG count, void *pobjs[],
case TYPE_AUTO_EVENT:
objs[i]->SignalState = FALSE;
break;
+ case TYPE_MUTEX:
case TYPE_SEMAPHORE:
--objs[i]->SignalState;
break;
@@ -118,8 +122,22 @@ NTSTATUS WINAPI KeWaitForMultipleObjects(ULONG count, void *pobjs[],
if (!--*((ULONG_PTR *)&objs[i]->WaitListHead.Flink))
{
- CloseHandle(objs[i]->WaitListHead.Blink);
- objs[i]->WaitListHead.Blink = NULL;
+ switch (objs[i]->Type)
+ {
+ case TYPE_MANUAL_EVENT:
+ case TYPE_AUTO_EVENT:
+ case TYPE_SEMAPHORE:
+ CloseHandle(objs[i]->WaitListHead.Blink);
+ objs[i]->WaitListHead.Blink = NULL;
+ break;
+ case TYPE_MUTEX:
+ if (objs[i]->SignalState == 1)
+ {
+ CloseHandle(objs[i]->WaitListHead.Blink);
+ objs[i]->WaitListHead.Blink = NULL;
+ }
+ break;
+ }
}
}
LeaveCriticalSection( &sync_cs );
@@ -242,3 +260,25 @@ void WINAPI KeInitializeMutex( PRKMUTEX mutex, ULONG level )
mutex->Header.WaitListHead.Blink = NULL;
mutex->Header.WaitListHead.Flink = NULL;
}
+
+/***********************************************************************
+ * KeReleaseMutex (NTOSKRNL.EXE.@)
+ */
+LONG WINAPI KeReleaseMutex( PRKMUTEX mutex, BOOLEAN wait )
+{
+ HANDLE handle = mutex->Header.WaitListHead.Blink;
+ LONG ret;
+
+ TRACE("mutex %p, wait %u.\n", mutex, wait);
+
+ EnterCriticalSection( &sync_cs );
+ ret = mutex->Header.SignalState++;
+ if (!ret && !mutex->Header.WaitListHead.Flink)
+ {
+ CloseHandle( handle );
+ mutex->Header.WaitListHead.Blink = NULL;
+ }
+ LeaveCriticalSection( &sync_cs );
+
+ return ret;
+}
diff --git a/dlls/ntoskrnl.exe/tests/driver.c b/dlls/ntoskrnl.exe/tests/driver.c
index 852a726..e758e3f 100644
--- a/dlls/ntoskrnl.exe/tests/driver.c
+++ b/dlls/ntoskrnl.exe/tests/driver.c
@@ -226,6 +226,36 @@ static NTSTATUS wait_multiple(ULONG count, void *objs[], WAIT_TYPE wait_type, UL
return KeWaitForMultipleObjects(count, objs, wait_type, Executive, KernelMode, FALSE, &integer, NULL);
}
+static void run_thread(PKSTART_ROUTINE proc, void *arg)
+{
+ OBJECT_ATTRIBUTES attr = {0};
+ HANDLE thread;
+ NTSTATUS ret;
+
+ attr.Length = sizeof(attr);
+ attr.Attributes = OBJ_KERNEL_HANDLE;
+ ret = PsCreateSystemThread(&thread, THREAD_ALL_ACCESS, &attr, NULL, NULL, proc, arg);
+ ok(!ret, "got %#x\n", ret);
+
+ ret = ZwWaitForSingleObject(thread, FALSE, NULL);
+ ok(!ret, "got %#x\n", ret);
+ ret = ZwClose(thread);
+ ok(!ret, "got %#x\n", ret);
+}
+
+static KMUTEX test_mutex;
+
+static void WINAPI mutex_thread(void *arg)
+{
+ NTSTATUS ret, expect = (NTSTATUS)(DWORD_PTR)arg;
+
+ ret = wait_single(&test_mutex, 0);
+ ok(ret == expect, "expected %#x, got %#x\n", expect, ret);
+
+ if (!ret) KeReleaseMutex(&test_mutex, FALSE);
+ PsTerminateSystemThread(STATUS_SUCCESS);
+}
+
static void test_sync(void)
{
KSEMAPHORE semaphore, semaphore2;
@@ -387,6 +417,33 @@ static void test_sync(void)
ret = wait_multiple(2, objs, WaitAny, 0);
ok(ret == STATUS_TIMEOUT, "got %#x\n", ret);
+
+ /* test mutexes */
+ KeInitializeMutex(&test_mutex, 0);
+
+ for (i = 0; i < 10; i++)
+ {
+ ret = wait_single(&test_mutex, 0);
+ ok(ret == 0, "got %#x\n", ret);
+ }
+
+ for (i = 0; i < 10; i++)
+ {
+ ret = KeReleaseMutex(&test_mutex, FALSE);
+ ok(ret == i - 9, "expected %d, got %d\n", i - 9, ret);
+ }
+
+ run_thread(mutex_thread, (void *)0);
+
+ ret = wait_single(&test_mutex, 0);
+ ok(ret == 0, "got %#x\n", ret);
+
+ run_thread(mutex_thread, (void *)STATUS_TIMEOUT);
+
+ ret = KeReleaseMutex(&test_mutex, 0);
+ ok(ret == 0, "got %#x\n", ret);
+
+ run_thread(mutex_thread, (void *)0);
}
static NTSTATUS main_test(IRP *irp, IO_STACK_LOCATION *stack, ULONG_PTR *info)
@@ -410,6 +467,7 @@ static NTSTATUS main_test(IRP *irp, IO_STACK_LOCATION *stack, ULONG_PTR *info)
winetest_debug = test_input->winetest_debug;
winetest_report_success = test_input->winetest_report_success;
attr.ObjectName = &pathU;
+ attr.Attributes = OBJ_KERNEL_HANDLE;
ZwOpenFile(&okfile, FILE_APPEND_DATA, &attr, &io, 0, 0);
test_currentprocess();
--
2.7.4

View File

@@ -1,57 +0,0 @@
From 6f82120ba57b09b999bf02bf73828cf834601526 Mon Sep 17 00:00:00 2001
From: Zebediah Figura <z.figura12@gmail.com>
Date: Sun, 19 Aug 2018 22:54:07 -0500
Subject: [PATCH 12/17] ntoskrnl.exe: Implement KeWaitForMutexObject().
Signed-off-by: Zebediah Figura <z.figura12@gmail.com>
---
dlls/ntoskrnl.exe/ntoskrnl.c | 11 -----------
dlls/ntoskrnl.exe/sync.c | 10 ++++++++++
2 files changed, 10 insertions(+), 11 deletions(-)
diff --git a/dlls/ntoskrnl.exe/ntoskrnl.c b/dlls/ntoskrnl.exe/ntoskrnl.c
index cc88100..5034c5d 100644
--- a/dlls/ntoskrnl.exe/ntoskrnl.c
+++ b/dlls/ntoskrnl.exe/ntoskrnl.c
@@ -2085,17 +2085,6 @@ PRKTHREAD WINAPI KeGetCurrentThread(void)
return NULL;
}
- /***********************************************************************
- * KeWaitForMutexObject (NTOSKRNL.EXE.@)
- */
-NTSTATUS WINAPI KeWaitForMutexObject(PRKMUTEX Mutex, KWAIT_REASON WaitReason, KPROCESSOR_MODE WaitMode,
- BOOLEAN Alertable, PLARGE_INTEGER Timeout)
-{
- FIXME( "stub: %p, %d, %d, %d, %p\n", Mutex, WaitReason, WaitMode, Alertable, Timeout );
- return STATUS_NOT_IMPLEMENTED;
-}
-
-
/***********************************************************************
* KeInitializeSpinLock (NTOSKRNL.EXE.@)
*/
diff --git a/dlls/ntoskrnl.exe/sync.c b/dlls/ntoskrnl.exe/sync.c
index a038a07..acbbe3b 100644
--- a/dlls/ntoskrnl.exe/sync.c
+++ b/dlls/ntoskrnl.exe/sync.c
@@ -155,6 +155,16 @@ NTSTATUS WINAPI KeWaitForSingleObject( void *obj, KWAIT_REASON reason,
}
/***********************************************************************
+ * KeWaitForMutexObject (NTOSKRNL.EXE.@)
+ */
+NTSTATUS WINAPI KeWaitForMutexObject( PRKMUTEX mutex, KWAIT_REASON reason,
+ KPROCESSOR_MODE mode, BOOLEAN alertable, LARGE_INTEGER *timeout)
+{
+ return KeWaitForSingleObject( mutex, reason, mode, alertable, timeout );
+}
+
+
+/***********************************************************************
* KeInitializeEvent (NTOSKRNL.EXE.@)
*/
void WINAPI KeInitializeEvent( PRKEVENT event, EVENT_TYPE type, BOOLEAN state )
--
2.7.4