1 /* 2 * PROJECT: ReactOS kernel-mode tests 3 * LICENSE: GPLv2+ - See COPYING in the top level directory 4 * PURPOSE: Kernel-Mode Test Suite Event creation test 5 * PROGRAMMER: Thomas Faber <thomas.faber@reactos.org> 6 */ 7 8 #include <kmt_test.h> 9 10 #ifdef _WIN64 11 #define KERNEL_HANDLE_FLAG 0xFFFFFFFF80000000ULL 12 #else 13 #define KERNEL_HANDLE_FLAG 0x80000000 14 #endif 15 16 #define CheckEventObject(Handle, Pointers, Handles) do \ 17 { \ 18 PUBLIC_OBJECT_BASIC_INFORMATION ObjectInfo; \ 19 Status = ZwQueryObject(Handle, ObjectBasicInformation, \ 20 &ObjectInfo, sizeof ObjectInfo, NULL); \ 21 ok_eq_hex(Status, STATUS_SUCCESS); \ 22 ok_eq_ulong(ObjectInfo.PointerCount, Pointers); \ 23 ok_eq_ulong(ObjectInfo.HandleCount, Handles); \ 24 ok_eq_ulong(ObjectInfo.Attributes, 0); \ 25 ok_eq_ulong(ObjectInfo.GrantedAccess, EVENT_ALL_ACCESS); \ 26 ok(((ULONG_PTR)Handle & KERNEL_HANDLE_FLAG) == KERNEL_HANDLE_FLAG, \ 27 "Handle %p is not a kernel handle\n", Handle); \ 28 } while (0) 29 30 static 31 VOID 32 TestCreateEvent( 33 PRKEVENT (NTAPI *CreateEvent)(PUNICODE_STRING, PHANDLE), 34 PUNICODE_STRING EventName, 35 EVENT_TYPE Type) 36 { 37 NTSTATUS Status; 38 PKEVENT Event, Event2; 39 HANDLE EventHandle, EventHandle2; 40 LONG State; 41 42 /* Nameless event */ 43 KmtStartSeh() 44 Event = CreateEvent(NULL, &EventHandle); 45 ok(Event != NULL, "Event is NULL\n"); 46 ok(EventHandle != NULL, "EventHandle is NULL\n"); 47 if (!skip(EventHandle != NULL, "No event\n")) 48 { 49 ok_eq_uint(Event->Header.Type, Type); 50 State = KeReadStateEvent(Event); 51 ok_eq_long(State, 1L); 52 CheckEventObject(EventHandle, 2UL, 1UL); 53 Status = ZwClose(EventHandle); 54 ok_eq_hex(Status, STATUS_SUCCESS); 55 } 56 KmtEndSeh(STATUS_SUCCESS); 57 58 /* Named event */ 59 EventHandle = NULL; 60 Event = CreateEvent(EventName, &EventHandle); 61 ok(Event != NULL, "Event is NULL\n"); 62 ok(EventHandle != NULL, "EventHandle is NULL\n"); 63 if (!skip(EventHandle != NULL, "No event\n")) 64 { 65 ok_eq_uint(Event->Header.Type, Type); 66 State = KeReadStateEvent(Event); 67 ok_eq_long(State, 1L); 68 CheckEventObject(EventHandle, 3UL, 1UL); 69 70 /* Open the existing one */ 71 EventHandle2 = NULL; 72 Event2 = CreateEvent(EventName, &EventHandle2); 73 CheckEventObject(EventHandle, 4UL, 2UL); 74 ok(Event2 != NULL, "Event is NULL\n"); 75 ok(EventHandle2 != NULL, "EventHandle is NULL\n"); 76 if (!skip(EventHandle2 != NULL, "No event\n")) 77 { 78 CheckEventObject(EventHandle2, 4UL, 2UL); 79 ZwClose(EventHandle2); 80 } 81 82 CheckEventObject(EventHandle, 3UL, 1UL); 83 Status = ZwClose(EventHandle); 84 ok_eq_hex(Status, STATUS_SUCCESS); 85 } 86 } 87 88 START_TEST(IoEvent) 89 { 90 PKEVENT Event, Event2; 91 HANDLE EventHandle = NULL, EventHandle2 = NULL; 92 UNICODE_STRING NotificationEventName = RTL_CONSTANT_STRING(L"\\BaseNamedObjects\\KmTestIoEventNotificationEvent"); 93 UNICODE_STRING SynchronizationEventName = RTL_CONSTANT_STRING(L"\\BaseNamedObjects\\KmTestIoEventSynchronizationEvent"); 94 95 TestCreateEvent(IoCreateNotificationEvent, &NotificationEventName, NotificationEvent); 96 TestCreateEvent(IoCreateSynchronizationEvent, &SynchronizationEventName, SynchronizationEvent); 97 98 /* Create different types with the same name */ 99 Event = IoCreateNotificationEvent(&NotificationEventName, &EventHandle); 100 ok(Event != NULL, "Event is NULL\n"); 101 ok(EventHandle != NULL, "EventHandle is NULL\n"); 102 if (!skip(EventHandle != NULL, "No event\n")) 103 { 104 ok_eq_uint(Event->Header.Type, NotificationEvent); 105 Event2 = IoCreateSynchronizationEvent(&NotificationEventName, &EventHandle2); 106 ok(Event2 != NULL, "Event is NULL\n"); 107 ok(EventHandle2 != NULL, "EventHandle is NULL\n"); 108 if (!skip(EventHandle2 != NULL, "No event\n")) 109 { 110 ok_eq_uint(Event2->Header.Type, NotificationEvent); 111 ZwClose(EventHandle2); 112 } 113 ZwClose(EventHandle); 114 } 115 116 } 117 118