[PATCH 5/5] ntoskrnl.exe/tests: Add tests for remove locks.

Zebediah Figura z.figura12 at gmail.com
Mon Aug 19 19:56:03 CDT 2019


Signed-off-by: Zebediah Figura <z.figura12 at gmail.com>
---
 dlls/ntoskrnl.exe/tests/driver.c | 55 +++++++++++++++++++++++++++++++-
 1 file changed, 54 insertions(+), 1 deletion(-)

diff --git a/dlls/ntoskrnl.exe/tests/driver.c b/dlls/ntoskrnl.exe/tests/driver.c
index c275e67ae5..974a12177a 100644
--- a/dlls/ntoskrnl.exe/tests/driver.c
+++ b/dlls/ntoskrnl.exe/tests/driver.c
@@ -427,16 +427,33 @@ static void WINAPI mutex_thread(void *arg)
     PsTerminateSystemThread(STATUS_SUCCESS);
 }
 
+static KEVENT remove_lock_ready;
+
+static void WINAPI remove_lock_thread(void *arg)
+{
+    IO_REMOVE_LOCK *lock = arg;
+    NTSTATUS ret;
+
+    ret = IoAcquireRemoveLockEx(lock, NULL, "", 1, sizeof(IO_REMOVE_LOCK_COMMON_BLOCK));
+    ok(ret == STATUS_SUCCESS, "got %#x\n", ret);
+    KeSetEvent(&remove_lock_ready, 0, FALSE);
+
+    IoReleaseRemoveLockAndWaitEx(lock, NULL, sizeof(IO_REMOVE_LOCK_COMMON_BLOCK));
+    PsTerminateSystemThread(STATUS_SUCCESS);
+}
+
 static void test_sync(void)
 {
+    static const ULONG wine_tag = 0x454e4957; /* WINE */
     KSEMAPHORE semaphore, semaphore2;
     KEVENT manual_event, auto_event, *event;
     KTIMER timer;
+    IO_REMOVE_LOCK remove_lock;
     LARGE_INTEGER timeout;
     OBJECT_ATTRIBUTES attr;
+    HANDLE handle, thread;
     void *objs[2];
     NTSTATUS ret;
-    HANDLE handle;
     int i;
 
     KeInitializeEvent(&manual_event, NotificationEvent, FALSE);
@@ -719,6 +736,42 @@ static void test_sync(void)
     ok(ret == 0, "got %#x\n", ret);
 
     KeCancelTimer(&timer);
+
+    /* remove locks */
+
+    IoInitializeRemoveLockEx(&remove_lock, wine_tag, 0, 0, sizeof(IO_REMOVE_LOCK_COMMON_BLOCK));
+
+    ret = IoAcquireRemoveLockEx(&remove_lock, NULL, "", 1, sizeof(IO_REMOVE_LOCK_COMMON_BLOCK));
+    ok(ret == STATUS_SUCCESS, "got %#x\n", ret);
+
+    IoReleaseRemoveLockEx(&remove_lock, NULL, sizeof(IO_REMOVE_LOCK_COMMON_BLOCK));
+
+    ret = IoAcquireRemoveLockEx(&remove_lock, NULL, "", 1, sizeof(IO_REMOVE_LOCK_COMMON_BLOCK));
+    ok(ret == STATUS_SUCCESS, "got %#x\n", ret);
+
+    ret = IoAcquireRemoveLockEx(&remove_lock, NULL, "", 1, sizeof(IO_REMOVE_LOCK_COMMON_BLOCK));
+    ok(ret == STATUS_SUCCESS, "got %#x\n", ret);
+
+    KeInitializeEvent(&remove_lock_ready, SynchronizationEvent, FALSE);
+    thread = create_thread(remove_lock_thread, &remove_lock);
+    ret = wait_single(&remove_lock_ready, -100 * 10000);
+    ok(!ret, "got %#x\n", ret);
+    ret = wait_single_handle(thread, 0);
+    ok(ret == STATUS_TIMEOUT, "got %#x\n", ret);
+
+    ret = IoAcquireRemoveLockEx(&remove_lock, NULL, "", 1, sizeof(IO_REMOVE_LOCK_COMMON_BLOCK));
+    ok(ret == STATUS_DELETE_PENDING, "got %#x\n", ret);
+
+    IoReleaseRemoveLockEx(&remove_lock, NULL, sizeof(IO_REMOVE_LOCK_COMMON_BLOCK));
+    ret = wait_single_handle(thread, 0);
+    ok(ret == STATUS_TIMEOUT, "got %#x\n", ret);
+
+    IoReleaseRemoveLockEx(&remove_lock, NULL, sizeof(IO_REMOVE_LOCK_COMMON_BLOCK));
+    ret = wait_single_handle(thread, -100 * 10000);
+    ok(ret == STATUS_SUCCESS, "got %#x\n", ret);
+
+    ret = IoAcquireRemoveLockEx(&remove_lock, NULL, "", 1, sizeof(IO_REMOVE_LOCK_COMMON_BLOCK));
+    ok(ret == STATUS_DELETE_PENDING, "got %#x\n", ret);
 }
 
 static void test_call_driver(DEVICE_OBJECT *device)
-- 
2.22.0




More information about the wine-devel mailing list