Rebase against 92f38bc8790cbfb31badf97a211ed890ac00c1db.

This commit is contained in:
Zebediah Figura
2018-11-26 18:45:43 -06:00
parent c45c01449e
commit bfff924f04
18 changed files with 34 additions and 1205 deletions

View File

@@ -1,229 +0,0 @@
From 48adc4c6f5342cc5b0299b4890a92684d5762756 Mon Sep 17 00:00:00 2001
From: Zebediah Figura <z.figura12@gmail.com>
Date: Sun, 19 Aug 2018 17:10:47 -0500
Subject: [PATCH 01/17] ntoskrnl.exe: Implement KeWaitForMultipleObjects().
We have plenty of space in which to store a kernel handle inside a
DISPATCHER_HEADER. However, the storage is volatile, and there is no way to
know when to close it. Therefore, we create the handle when
KeWaitForMultipleObjects() is called, and keep it open as long as at least
one thread is waiting on the object.
Signed-off-by: Zebediah Figura <z.figura12@gmail.com>
---
dlls/ntoskrnl.exe/Makefile.in | 3 +-
dlls/ntoskrnl.exe/ntoskrnl.c | 13 -----
dlls/ntoskrnl.exe/sync.c | 114 ++++++++++++++++++++++++++++++++++++++++++
include/ddk/ntddk.h | 9 ----
include/ddk/wdm.h | 10 ++++
5 files changed, 126 insertions(+), 23 deletions(-)
create mode 100644 dlls/ntoskrnl.exe/sync.c
diff --git a/dlls/ntoskrnl.exe/Makefile.in b/dlls/ntoskrnl.exe/Makefile.in
index 5b03c59..b8128fc 100644
--- a/dlls/ntoskrnl.exe/Makefile.in
+++ b/dlls/ntoskrnl.exe/Makefile.in
@@ -5,6 +5,7 @@ DELAYIMPORTS = user32
C_SRCS = \
instr.c \
- ntoskrnl.c
+ ntoskrnl.c \
+ sync.c
RC_SRCS = ntoskrnl.rc
diff --git a/dlls/ntoskrnl.exe/ntoskrnl.c b/dlls/ntoskrnl.exe/ntoskrnl.c
index 9fbf22d..28671c8 100644
--- a/dlls/ntoskrnl.exe/ntoskrnl.c
+++ b/dlls/ntoskrnl.exe/ntoskrnl.c
@@ -2297,19 +2297,6 @@ NTSTATUS WINAPI KeWaitForSingleObject(PVOID Object,
}
/***********************************************************************
- * KeWaitForMultipleObjects (NTOSKRNL.EXE.@)
- */
-NTSTATUS WINAPI KeWaitForMultipleObjects(ULONG Count, PVOID Object[], WAIT_TYPE WaitType,
- KWAIT_REASON WaitReason, KPROCESSOR_MODE WaitMode,
- BOOLEAN Alertable, PLARGE_INTEGER Timeout,
- PKWAIT_BLOCK WaitBlockArray)
-{
- FIXME( "stub: %u, %p, %d, %d, %d, %d, %p, %p\n", Count, Object, WaitType, WaitReason, WaitMode,
- Alertable, Timeout, WaitBlockArray );
- return STATUS_NOT_IMPLEMENTED;
-}
-
-/***********************************************************************
* IoRegisterFileSystem (NTOSKRNL.EXE.@)
*/
VOID WINAPI IoRegisterFileSystem(PDEVICE_OBJECT DeviceObject)
diff --git a/dlls/ntoskrnl.exe/sync.c b/dlls/ntoskrnl.exe/sync.c
new file mode 100644
index 0000000..19af4f6
--- /dev/null
+++ b/dlls/ntoskrnl.exe/sync.c
@@ -0,0 +1,114 @@
+/*
+ * Kernel synchronization
+ *
+ * Copyright (C) 2018 Zebediah Figura
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#include <stdarg.h>
+
+#include "ntstatus.h"
+#define WIN32_NO_STATUS
+#include "windef.h"
+#include "winbase.h"
+#include "winternl.h"
+#include "ddk/ntddk.h"
+#include "ddk/wdm.h"
+
+#include "wine/debug.h"
+
+WINE_DEFAULT_DEBUG_CHANNEL(ntoskrnl);
+
+enum object_type
+{
+ TYPE_MANUAL_EVENT = 0,
+ TYPE_AUTO_EVENT = 1,
+};
+
+static CRITICAL_SECTION sync_cs;
+static CRITICAL_SECTION_DEBUG sync_cs_debug =
+{
+ 0, 0, &sync_cs,
+ { &sync_cs_debug.ProcessLocksList, &sync_cs_debug.ProcessLocksList },
+ 0, 0, { (DWORD_PTR)(__FILE__ ": sync_cs") }
+};
+static CRITICAL_SECTION sync_cs = { &sync_cs_debug, -1, 0, 0, 0, 0 };
+
+/***********************************************************************
+ * KeWaitForMultipleObjects (NTOSKRNL.EXE.@)
+ */
+NTSTATUS WINAPI KeWaitForMultipleObjects(ULONG count, void *pobjs[],
+ WAIT_TYPE wait_type, KWAIT_REASON reason, KPROCESSOR_MODE mode,
+ BOOLEAN alertable, LARGE_INTEGER *timeout, KWAIT_BLOCK *wait_blocks)
+{
+ DISPATCHER_HEADER **objs = (DISPATCHER_HEADER **)pobjs;
+ HANDLE handles[MAXIMUM_WAIT_OBJECTS];
+ NTSTATUS ret;
+ ULONG i;
+
+ TRACE("count %u, objs %p, wait_type %u, reason %u, mode %d, alertable %u, timeout %p, wait_blocks %p.\n",
+ count, objs, wait_type, reason, mode, alertable, timeout, wait_blocks);
+
+ /* We co-opt DISPATCHER_HEADER.WaitListHead:
+ * Blink stores a handle to the synchronization object,
+ * Flink stores the number of threads currently waiting on this object. */
+
+ EnterCriticalSection( &sync_cs );
+ for (i = 0; i < count; i++)
+ {
+ ++*((ULONG_PTR *)&objs[i]->WaitListHead.Flink);
+ if (!objs[i]->WaitListHead.Blink)
+ {
+ switch (objs[i]->Type)
+ {
+ case TYPE_MANUAL_EVENT:
+ objs[i]->WaitListHead.Blink = CreateEventW( NULL, TRUE, objs[i]->SignalState, NULL );
+ break;
+ case TYPE_AUTO_EVENT:
+ objs[i]->WaitListHead.Blink = CreateEventW( NULL, FALSE, objs[i]->SignalState, NULL );
+ break;
+ }
+ }
+
+ handles[i] = objs[i]->WaitListHead.Blink;
+ }
+ LeaveCriticalSection( &sync_cs );
+
+ ret = NtWaitForMultipleObjects( count, handles, (wait_type == WaitAny), alertable, timeout );
+
+ EnterCriticalSection( &sync_cs );
+ for (i = 0; i < count; i++)
+ {
+ if (ret == i || (!ret && wait_type == WaitAll))
+ {
+ switch (objs[i]->Type)
+ {
+ case TYPE_AUTO_EVENT:
+ objs[i]->SignalState = FALSE;
+ break;
+ }
+ }
+
+ if (!--*((ULONG_PTR *)&objs[i]->WaitListHead.Flink))
+ {
+ CloseHandle(objs[i]->WaitListHead.Blink);
+ objs[i]->WaitListHead.Blink = NULL;
+ }
+ }
+ LeaveCriticalSection( &sync_cs );
+
+ return ret;
+}
diff --git a/include/ddk/ntddk.h b/include/ddk/ntddk.h
index e76ccc9..6b3a30e 100644
--- a/include/ddk/ntddk.h
+++ b/include/ddk/ntddk.h
@@ -140,15 +140,6 @@ typedef struct _FILE_VALID_DATA_LENGTH_INFORMATION
LARGE_INTEGER ValidDataLength;
} FILE_VALID_DATA_LENGTH_INFORMATION, *PFILE_VALID_DATA_LENGTH_INFORMATION;
-typedef struct _KWAIT_BLOCK {
- LIST_ENTRY WaitListEntry;
- struct _KTHREAD *RESTRICTED_POINTER Thread;
- PVOID Object;
- struct _KWAIT_BLOCK *RESTRICTED_POINTER NextWaitBlock;
- USHORT WaitKey;
- USHORT WaitType;
-} KWAIT_BLOCK, *PKWAIT_BLOCK, *RESTRICTED_POINTER PRKWAIT_BLOCK;
-
typedef struct _RTL_BALANCED_LINKS {
struct _RTL_BALANCED_LINKS *Parent;
struct _RTL_BALANCED_LINKS *LeftChild;
diff --git a/include/ddk/wdm.h b/include/ddk/wdm.h
index 0cd1673..32e8f8b 100644
--- a/include/ddk/wdm.h
+++ b/include/ddk/wdm.h
@@ -144,6 +144,15 @@ typedef enum _KWAIT_REASON
MaximumWaitReason,
} KWAIT_REASON;
+typedef struct _KWAIT_BLOCK {
+ LIST_ENTRY WaitListEntry;
+ struct _KTHREAD *RESTRICTED_POINTER Thread;
+ PVOID Object;
+ struct _KWAIT_BLOCK *RESTRICTED_POINTER NextWaitBlock;
+ USHORT WaitKey;
+ USHORT WaitType;
+} KWAIT_BLOCK, *PKWAIT_BLOCK, *RESTRICTED_POINTER PRKWAIT_BLOCK;
+
typedef struct _ALLOCATE_FUNCTION *PALLOCATE_FUNCTION;
typedef struct _IO_TIMER *PIO_TIMER;
typedef struct _IO_TIMER_ROUTINE *PIO_TIMER_ROUTINE;
@@ -1421,6 +1430,7 @@ LONG WINAPI KeResetEvent(PRKEVENT);
LONG WINAPI KeSetEvent(PRKEVENT,KPRIORITY,BOOLEAN);
KPRIORITY WINAPI KeSetPriorityThread(PKTHREAD,KPRIORITY);
void WINAPI KeSetSystemAffinityThread(KAFFINITY);
+NTSTATUS WINAPI KeWaitForMultipleObjects(ULONG,void*[],WAIT_TYPE,KWAIT_REASON,KPROCESSOR_MODE,BOOLEAN,LARGE_INTEGER*,KWAIT_BLOCK*);
PVOID WINAPI MmAllocateContiguousMemory(SIZE_T,PHYSICAL_ADDRESS);
PVOID WINAPI MmAllocateNonCachedMemory(SIZE_T);
--
2.7.4

View File

@@ -1,68 +0,0 @@
From 6b6a079747a9d92f5cd2b3b11a3b350c24f2ceb1 Mon Sep 17 00:00:00 2001
From: Zebediah Figura <z.figura12@gmail.com>
Date: Sun, 19 Aug 2018 17:34:35 -0500
Subject: [PATCH 02/17] ntoskrnl.exe: Implement KeInitializeEvent().
Signed-off-by: Zebediah Figura <z.figura12@gmail.com>
---
dlls/ntoskrnl.exe/ntoskrnl.c | 9 ---------
dlls/ntoskrnl.exe/sync.c | 13 +++++++++++++
include/ddk/wdm.h | 1 +
3 files changed, 14 insertions(+), 9 deletions(-)
diff --git a/dlls/ntoskrnl.exe/ntoskrnl.c b/dlls/ntoskrnl.exe/ntoskrnl.c
index 28671c8..e61b18d 100644
--- a/dlls/ntoskrnl.exe/ntoskrnl.c
+++ b/dlls/ntoskrnl.exe/ntoskrnl.c
@@ -2085,15 +2085,6 @@ PRKTHREAD WINAPI KeGetCurrentThread(void)
return NULL;
}
-/***********************************************************************
- * KeInitializeEvent (NTOSKRNL.EXE.@)
- */
-void WINAPI KeInitializeEvent( PRKEVENT Event, EVENT_TYPE Type, BOOLEAN State )
-{
- FIXME( "stub: %p %d %d\n", Event, Type, State );
-}
-
-
/***********************************************************************
* KeInitializeMutex (NTOSKRNL.EXE.@)
*/
diff --git a/dlls/ntoskrnl.exe/sync.c b/dlls/ntoskrnl.exe/sync.c
index 19af4f6..e7ff7ec 100644
--- a/dlls/ntoskrnl.exe/sync.c
+++ b/dlls/ntoskrnl.exe/sync.c
@@ -112,3 +112,16 @@ NTSTATUS WINAPI KeWaitForMultipleObjects(ULONG count, void *pobjs[],
return ret;
}
+
+/***********************************************************************
+ * KeInitializeEvent (NTOSKRNL.EXE.@)
+ */
+void WINAPI KeInitializeEvent( PRKEVENT event, EVENT_TYPE type, BOOLEAN state )
+{
+ TRACE("event %p, type %u, state %u.\n", event, type, state);
+
+ event->Header.Type = type;
+ event->Header.SignalState = state;
+ event->Header.WaitListHead.Blink = NULL;
+ event->Header.WaitListHead.Flink = NULL;
+}
diff --git a/include/ddk/wdm.h b/include/ddk/wdm.h
index 32e8f8b..350a08e 100644
--- a/include/ddk/wdm.h
+++ b/include/ddk/wdm.h
@@ -1419,6 +1419,7 @@ NTSTATUS WINAPI IoSetDeviceInterfaceState(UNICODE_STRING*,BOOLEAN);
NTSTATUS WINAPI IoWMIRegistrationControl(PDEVICE_OBJECT,ULONG);
PKTHREAD WINAPI KeGetCurrentThread(void);
+void WINAPI KeInitializeEvent(PRKEVENT,EVENT_TYPE,BOOLEAN);
void WINAPI KeInitializeSemaphore(PRKSEMAPHORE,LONG,LONG);
void WINAPI KeInitializeTimerEx(PKTIMER,TIMER_TYPE);
void WINAPI KeQuerySystemTime(LARGE_INTEGER*);
--
2.7.4

View File

@@ -1,71 +0,0 @@
From e79d53d2194bc662be4853e2adf9e98be03751ce Mon Sep 17 00:00:00 2001
From: Zebediah Figura <z.figura12@gmail.com>
Date: Sun, 19 Aug 2018 17:39:23 -0500
Subject: [PATCH 03/17] ntoskrnl.exe: Implement KeSetEvent().
Signed-off-by: Zebediah Figura <z.figura12@gmail.com>
---
dlls/ntoskrnl.exe/ntoskrnl.c | 10 ----------
dlls/ntoskrnl.exe/sync.c | 21 +++++++++++++++++++++
2 files changed, 21 insertions(+), 10 deletions(-)
diff --git a/dlls/ntoskrnl.exe/ntoskrnl.c b/dlls/ntoskrnl.exe/ntoskrnl.c
index e61b18d..97bb30b 100644
--- a/dlls/ntoskrnl.exe/ntoskrnl.c
+++ b/dlls/ntoskrnl.exe/ntoskrnl.c
@@ -2248,16 +2248,6 @@ LONG WINAPI KeResetEvent( PRKEVENT Event )
/***********************************************************************
- * KeSetEvent (NTOSKRNL.EXE.@)
- */
-LONG WINAPI KeSetEvent( PRKEVENT Event, KPRIORITY Increment, BOOLEAN Wait )
-{
- FIXME("(%p, %d, %d): stub\n", Event, Increment, Wait);
- return 0;
-}
-
-
-/***********************************************************************
* KeSetPriorityThread (NTOSKRNL.EXE.@)
*/
KPRIORITY WINAPI KeSetPriorityThread( PKTHREAD Thread, KPRIORITY Priority )
diff --git a/dlls/ntoskrnl.exe/sync.c b/dlls/ntoskrnl.exe/sync.c
index e7ff7ec..05d50ef 100644
--- a/dlls/ntoskrnl.exe/sync.c
+++ b/dlls/ntoskrnl.exe/sync.c
@@ -18,6 +18,8 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
+#include "config.h"
+#include "wine/port.h"
#include <stdarg.h>
#include "ntstatus.h"
@@ -125,3 +127,22 @@ void WINAPI KeInitializeEvent( PRKEVENT event, EVENT_TYPE type, BOOLEAN state )
event->Header.WaitListHead.Blink = NULL;
event->Header.WaitListHead.Flink = NULL;
}
+
+/***********************************************************************
+ * KeSetEvent (NTOSKRNL.EXE.@)
+ */
+LONG WINAPI KeSetEvent( PRKEVENT event, KPRIORITY increment, BOOLEAN wait )
+{
+ HANDLE handle = event->Header.WaitListHead.Blink;
+ LONG ret;
+
+ TRACE("event %p, increment %d, wait %u.\n", event, increment, wait);
+
+ EnterCriticalSection( &sync_cs );
+ ret = interlocked_xchg( &event->Header.SignalState, TRUE );
+ if (handle)
+ SetEvent( handle );
+ LeaveCriticalSection( &sync_cs );
+
+ return ret;
+}
--
2.7.4

View File

@@ -1,62 +0,0 @@
From 87d1900d05c4944b1d1d2cc046e6adf89ae53b78 Mon Sep 17 00:00:00 2001
From: Zebediah Figura <z.figura12@gmail.com>
Date: Sun, 19 Aug 2018 17:41:17 -0500
Subject: [PATCH 04/17] ntoskrnl.exe: Implement KeResetEvent().
Signed-off-by: Zebediah Figura <z.figura12@gmail.com>
---
dlls/ntoskrnl.exe/ntoskrnl.c | 10 ----------
dlls/ntoskrnl.exe/sync.c | 19 +++++++++++++++++++
2 files changed, 19 insertions(+), 10 deletions(-)
diff --git a/dlls/ntoskrnl.exe/ntoskrnl.c b/dlls/ntoskrnl.exe/ntoskrnl.c
index 97bb30b..99fa910 100644
--- a/dlls/ntoskrnl.exe/ntoskrnl.c
+++ b/dlls/ntoskrnl.exe/ntoskrnl.c
@@ -2238,16 +2238,6 @@ ULONG WINAPI KeQueryTimeIncrement(void)
/***********************************************************************
- * KeResetEvent (NTOSKRNL.EXE.@)
- */
-LONG WINAPI KeResetEvent( PRKEVENT Event )
-{
- FIXME("(%p): stub\n", Event);
- return 0;
-}
-
-
-/***********************************************************************
* KeSetPriorityThread (NTOSKRNL.EXE.@)
*/
KPRIORITY WINAPI KeSetPriorityThread( PKTHREAD Thread, KPRIORITY Priority )
diff --git a/dlls/ntoskrnl.exe/sync.c b/dlls/ntoskrnl.exe/sync.c
index 05d50ef..f011a60 100644
--- a/dlls/ntoskrnl.exe/sync.c
+++ b/dlls/ntoskrnl.exe/sync.c
@@ -146,3 +146,22 @@ LONG WINAPI KeSetEvent( PRKEVENT event, KPRIORITY increment, BOOLEAN wait )
return ret;
}
+
+/***********************************************************************
+ * KeResetEvent (NTOSKRNL.EXE.@)
+ */
+LONG WINAPI KeResetEvent( PRKEVENT event )
+{
+ HANDLE handle = event->Header.WaitListHead.Blink;
+ LONG ret;
+
+ TRACE("event %p.\n", event);
+
+ EnterCriticalSection( &sync_cs );
+ ret = interlocked_xchg( &event->Header.SignalState, FALSE );
+ if (handle)
+ ResetEvent( handle );
+ LeaveCriticalSection( &sync_cs );
+
+ return ret;
+}
--
2.7.4

View File

@@ -1,71 +0,0 @@
From cd87de5d368ccc030a11ddbcd409e8e1866f123a Mon Sep 17 00:00:00 2001
From: Zebediah Figura <z.figura12@gmail.com>
Date: Sun, 19 Aug 2018 17:44:30 -0500
Subject: [PATCH 06/17] ntoskrnl.exe: Implement KeWaitForSingleObject().
Signed-off-by: Zebediah Figura <z.figura12@gmail.com>
---
dlls/ntoskrnl.exe/ntoskrnl.c | 13 -------------
dlls/ntoskrnl.exe/sync.c | 9 +++++++++
include/ddk/wdm.h | 1 +
3 files changed, 10 insertions(+), 13 deletions(-)
diff --git a/dlls/ntoskrnl.exe/ntoskrnl.c b/dlls/ntoskrnl.exe/ntoskrnl.c
index 646c528..3002d4e 100644
--- a/dlls/ntoskrnl.exe/ntoskrnl.c
+++ b/dlls/ntoskrnl.exe/ntoskrnl.c
@@ -2255,19 +2255,6 @@ VOID WINAPI KeSetSystemAffinityThread(KAFFINITY Affinity)
}
/***********************************************************************
- * KeWaitForSingleObject (NTOSKRNL.EXE.@)
- */
-NTSTATUS WINAPI KeWaitForSingleObject(PVOID Object,
- KWAIT_REASON WaitReason,
- KPROCESSOR_MODE WaitMode,
- BOOLEAN Alertable,
- PLARGE_INTEGER Timeout)
-{
- FIXME( "stub: %p, %d, %d, %d, %p\n", Object, WaitReason, WaitMode, Alertable, Timeout );
- return STATUS_NOT_IMPLEMENTED;
-}
-
-/***********************************************************************
* IoRegisterFileSystem (NTOSKRNL.EXE.@)
*/
VOID WINAPI IoRegisterFileSystem(PDEVICE_OBJECT DeviceObject)
diff --git a/dlls/ntoskrnl.exe/sync.c b/dlls/ntoskrnl.exe/sync.c
index a905fb3..423fdcf 100644
--- a/dlls/ntoskrnl.exe/sync.c
+++ b/dlls/ntoskrnl.exe/sync.c
@@ -116,6 +116,15 @@ NTSTATUS WINAPI KeWaitForMultipleObjects(ULONG count, void *pobjs[],
}
/***********************************************************************
+ * KeWaitForSingleObject (NTOSKRNL.EXE.@)
+ */
+NTSTATUS WINAPI KeWaitForSingleObject( void *obj, KWAIT_REASON reason,
+ KPROCESSOR_MODE mode, BOOLEAN alertable, LARGE_INTEGER *timeout )
+{
+ return KeWaitForMultipleObjects( 1, &obj, WaitAny, reason, mode, alertable, timeout, NULL );
+}
+
+/***********************************************************************
* KeInitializeEvent (NTOSKRNL.EXE.@)
*/
void WINAPI KeInitializeEvent( PRKEVENT event, EVENT_TYPE type, BOOLEAN state )
diff --git a/include/ddk/wdm.h b/include/ddk/wdm.h
index 0fe73f2..6b6ac19 100644
--- a/include/ddk/wdm.h
+++ b/include/ddk/wdm.h
@@ -1433,6 +1433,7 @@ LONG WINAPI KeSetEvent(PRKEVENT,KPRIORITY,BOOLEAN);
KPRIORITY WINAPI KeSetPriorityThread(PKTHREAD,KPRIORITY);
void WINAPI KeSetSystemAffinityThread(KAFFINITY);
NTSTATUS WINAPI KeWaitForMultipleObjects(ULONG,void*[],WAIT_TYPE,KWAIT_REASON,KPROCESSOR_MODE,BOOLEAN,LARGE_INTEGER*,KWAIT_BLOCK*);
+NTSTATUS WINAPI KeWaitForSingleObject(void*,KWAIT_REASON,KPROCESSOR_MODE,BOOLEAN,LARGE_INTEGER*);
PVOID WINAPI MmAllocateContiguousMemory(SIZE_T,PHYSICAL_ADDRESS);
PVOID WINAPI MmAllocateNonCachedMemory(SIZE_T);
--
2.7.4

View File

@@ -1,148 +0,0 @@
From 87f7e2ba60c625a3d409f49842c2311f8396b873 Mon Sep 17 00:00:00 2001
From: Zebediah Figura <z.figura12@gmail.com>
Date: Sun, 19 Aug 2018 18:31:40 -0500
Subject: [PATCH 07/17] ntoskrnl.exe/tests: Add some tests for synchronization
functions.
Signed-off-by: Zebediah Figura <z.figura12@gmail.com>
---
dlls/ntoskrnl.exe/tests/driver.c | 116 +++++++++++++++++++++++++++++++++++++++
1 file changed, 116 insertions(+)
diff --git a/dlls/ntoskrnl.exe/tests/driver.c b/dlls/ntoskrnl.exe/tests/driver.c
index 68b6730..07a0adb 100644
--- a/dlls/ntoskrnl.exe/tests/driver.c
+++ b/dlls/ntoskrnl.exe/tests/driver.c
@@ -210,6 +210,121 @@ static void test_load_driver(void)
ok(!ret, "got %#x\n", ret);
}
+static NTSTATUS wait_single(void *obj, ULONGLONG timeout)
+{
+ LARGE_INTEGER integer;
+
+ integer.QuadPart = timeout;
+ return KeWaitForSingleObject(obj, Executive, KernelMode, FALSE, &integer);
+}
+
+static NTSTATUS wait_multiple(ULONG count, void *objs[], WAIT_TYPE wait_type, ULONGLONG timeout)
+{
+ LARGE_INTEGER integer;
+
+ integer.QuadPart = timeout;
+ return KeWaitForMultipleObjects(count, objs, wait_type, Executive, KernelMode, FALSE, &integer, NULL);
+}
+
+static void test_sync(void)
+{
+ KEVENT manual_event, auto_event;
+ void *objs[2];
+ NTSTATUS ret;
+
+ KeInitializeEvent(&manual_event, NotificationEvent, FALSE);
+
+ ret = wait_single(&manual_event, 0);
+ ok(ret == STATUS_TIMEOUT, "got %#x\n", ret);
+
+ KeSetEvent(&manual_event, 0, FALSE);
+
+ ret = wait_single(&manual_event, 0);
+ ok(ret == 0, "got %#x\n", ret);
+
+ ret = wait_single(&manual_event, 0);
+ ok(ret == 0, "got %#x\n", ret);
+
+ KeResetEvent(&manual_event);
+
+ ret = wait_single(&manual_event, 0);
+ ok(ret == STATUS_TIMEOUT, "got %#x\n", ret);
+
+ KeInitializeEvent(&auto_event, SynchronizationEvent, FALSE);
+
+ ret = wait_single(&auto_event, 0);
+ ok(ret == STATUS_TIMEOUT, "got %#x\n", ret);
+
+ KeSetEvent(&auto_event, 0, FALSE);
+
+ ret = wait_single(&auto_event, 0);
+ ok(ret == 0, "got %#x\n", ret);
+
+ ret = wait_single(&auto_event, 0);
+ ok(ret == STATUS_TIMEOUT, "got %#x\n", ret);
+
+ KeInitializeEvent(&auto_event, SynchronizationEvent, TRUE);
+
+ ret = wait_single(&auto_event, 0);
+ ok(ret == 0, "got %#x\n", ret);
+
+ objs[0] = &manual_event;
+ objs[1] = &auto_event;
+
+ ret = wait_multiple(2, objs, WaitAny, 0);
+ ok(ret == STATUS_TIMEOUT, "got %#x\n", ret);
+
+ KeSetEvent(&manual_event, 0, FALSE);
+ KeSetEvent(&auto_event, 0, FALSE);
+
+ ret = wait_multiple(2, objs, WaitAny, 0);
+ ok(ret == 0, "got %#x\n", ret);
+
+ ret = wait_single(&auto_event, 0);
+ ok(ret == 0, "got %#x\n", ret);
+
+ KeResetEvent(&manual_event);
+ KeSetEvent(&auto_event, 0, FALSE);
+
+ 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);
+
+ KeSetEvent(&manual_event, 0, FALSE);
+ KeSetEvent(&auto_event, 0, FALSE);
+
+ ret = wait_multiple(2, objs, WaitAll, 0);
+ ok(ret == 0, "got %#x\n", ret);
+
+ ret = wait_multiple(2, objs, WaitAll, 0);
+ ok(ret == STATUS_TIMEOUT, "got %#x\n", ret);
+
+ KeSetEvent(&auto_event, 0, FALSE);
+ KeResetEvent(&manual_event);
+
+ ret = wait_multiple(2, objs, WaitAll, 0);
+ ok(ret == STATUS_TIMEOUT, "got %#x\n", ret);
+
+ ret = wait_single(&auto_event, 0);
+ ok(ret == 0, "got %#x\n", ret);
+
+ objs[0] = &auto_event;
+ objs[1] = &manual_event;
+ KeSetEvent(&manual_event, 0, FALSE);
+ KeSetEvent(&auto_event, 0, 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 == 1, "got %#x\n", ret);
+}
+
static NTSTATUS main_test(IRP *irp, IO_STACK_LOCATION *stack, ULONG_PTR *info)
{
ULONG length = stack->Parameters.DeviceIoControl.OutputBufferLength;
@@ -237,6 +352,7 @@ static NTSTATUS main_test(IRP *irp, IO_STACK_LOCATION *stack, ULONG_PTR *info)
test_mdl_map();
test_init_funcs();
test_load_driver();
+ test_sync();
/* print process report */
if (test_input->winetest_debug)
--
2.7.4