You've already forked wine-staging
mirror of
https://gitlab.winehq.org/wine/wine-staging.git
synced 2025-09-12 18:50:20 -07:00
Rebase against 00b08fad99745db326ef060627c3e9dc668a734a
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user