From e740eaee08479c71f2d3021fef620a99ea7fd7d4 Mon Sep 17 00:00:00 2001
From: Etaash Mathamsetty <etaash.mathamsetty@gmail.com>
Date: Thu, 13 Oct 2022 19:42:22 -0400
Subject: [PATCH] ntoskrnl.exe: Implement IoCreateNotificationEvent.

---
 dlls/ntoskrnl.exe/ntoskrnl.c | 10 ----------
 dlls/ntoskrnl.exe/sync.c     | 26 ++++++++++++++++++++++++++
 2 files changed, 26 insertions(+), 10 deletions(-)

diff --git a/dlls/ntoskrnl.exe/ntoskrnl.c b/dlls/ntoskrnl.exe/ntoskrnl.c
index 6f5564042a6..2c080eaf9f6 100644
--- a/dlls/ntoskrnl.exe/ntoskrnl.c
+++ b/dlls/ntoskrnl.exe/ntoskrnl.c
@@ -4075,16 +4075,6 @@ NTSTATUS WINAPI IoCreateFile(HANDLE *handle, ACCESS_MASK access, OBJECT_ATTRIBUT
                           create_options, ea_buffer, ea_length, file_type, parameters, options, NULL);
 }
 
-/***********************************************************************
- *           IoCreateNotificationEvent (NTOSKRNL.EXE.@)
- */
-PKEVENT WINAPI IoCreateNotificationEvent(UNICODE_STRING *name, HANDLE *handle)
-{
-    FIXME( "stub: %s %p\n", debugstr_us(name), handle );
-    return NULL;
-}
-
-
 /**************************************************************************
  *		__chkstk (NTOSKRNL.@)
  */
diff --git a/dlls/ntoskrnl.exe/sync.c b/dlls/ntoskrnl.exe/sync.c
index b8239b0cd7d..409d5752547 100644
--- a/dlls/ntoskrnl.exe/sync.c
+++ b/dlls/ntoskrnl.exe/sync.c
@@ -231,6 +231,32 @@ PKEVENT WINAPI IoCreateSynchronizationEvent( UNICODE_STRING *name, HANDLE *ret_h
     return event;
 }
 
+/***********************************************************************
+ *           IoCreateNotificationEvent (NTOSKRNL.EXE.@)
+ */
+PKEVENT WINAPI IoCreateNotificationEvent( UNICODE_STRING *name, HANDLE *ret_handle )
+{
+    OBJECT_ATTRIBUTES attr;
+    HANDLE handle;
+    KEVENT *event;
+    NTSTATUS ret;
+
+    TRACE( "(%s %p)\n", debugstr_us(name), ret_handle );
+
+    InitializeObjectAttributes( &attr, name, 0, 0, NULL );
+    ret = NtCreateEvent( &handle, EVENT_ALL_ACCESS, &attr, NotificationEvent, TRUE );
+    if (ret) return NULL;
+
+    if (kernel_object_from_handle( handle, ExEventObjectType, (void**)&event ))
+    {
+        NtClose(handle);
+        return NULL;
+    }
+
+    *ret_handle = handle;
+    return event;
+}
+
 /***********************************************************************
  *           KeSetEvent   (NTOSKRNL.EXE.@)
  */