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 <thfabba@gmx.de>
11 #define KERNEL_HANDLE_FLAG 0xFFFFFFFF80000000ULL
13 #define KERNEL_HANDLE_FLAG 0x80000000
16 #define CheckEventObject(Handle, Pointers, Handles) do \
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); \
33 PRKEVENT (NTAPI
*CreateEvent
)(PUNICODE_STRING
, PHANDLE
),
34 PUNICODE_STRING EventName
,
38 NTSTATUS ExceptionStatus
;
39 PKEVENT Event
, Event2
;
40 HANDLE EventHandle
, EventHandle2
;
45 Event
= CreateEvent(NULL
, &EventHandle
);
46 ok(Event
!= NULL
, "Event is NULL\n");
47 ok(EventHandle
!= NULL
, "EventHandle is NULL\n");
48 if (!skip(EventHandle
!= NULL
, "No event\n"))
50 ok_eq_uint(Event
->Header
.Type
, Type
);
51 State
= KeReadStateEvent(Event
);
52 ok_eq_long(State
, 1L);
53 CheckEventObject(EventHandle
, 2UL, 1UL);
54 Status
= ZwClose(EventHandle
);
55 ok_eq_hex(Status
, STATUS_SUCCESS
);
57 KmtEndSeh(STATUS_SUCCESS
);
61 Event
= CreateEvent(EventName
, &EventHandle
);
62 ok(Event
!= NULL
, "Event is NULL\n");
63 ok(EventHandle
!= NULL
, "EventHandle is NULL\n");
64 if (!skip(EventHandle
!= NULL
, "No event\n"))
66 ok_eq_uint(Event
->Header
.Type
, Type
);
67 State
= KeReadStateEvent(Event
);
68 ok_eq_long(State
, 1L);
69 CheckEventObject(EventHandle
, 3UL, 1UL);
71 /* Open the existing one */
73 Event2
= CreateEvent(EventName
, &EventHandle2
);
74 CheckEventObject(EventHandle
, 4UL, 2UL);
75 ok(Event2
!= NULL
, "Event is NULL\n");
76 ok(EventHandle2
!= NULL
, "EventHandle is NULL\n");
77 if (!skip(EventHandle2
!= NULL
, "No event\n"))
79 CheckEventObject(EventHandle2
, 4UL, 2UL);
80 ZwClose(EventHandle2
);
83 CheckEventObject(EventHandle
, 3UL, 1UL);
84 Status
= ZwClose(EventHandle
);
85 ok_eq_hex(Status
, STATUS_SUCCESS
);
91 PKEVENT Event
, Event2
;
92 HANDLE EventHandle
= NULL
, EventHandle2
= NULL
;
93 UNICODE_STRING NotificationEventName
= RTL_CONSTANT_STRING(L
"\\BaseNamedObjects\\KmTestIoEventNotificationEvent");
94 UNICODE_STRING SynchronizationEventName
= RTL_CONSTANT_STRING(L
"\\BaseNamedObjects\\KmTestIoEventSynchronizationEvent");
96 TestCreateEvent(IoCreateNotificationEvent
, &NotificationEventName
, NotificationEvent
);
97 TestCreateEvent(IoCreateSynchronizationEvent
, &SynchronizationEventName
, SynchronizationEvent
);
99 /* Create different types with the same name */
100 Event
= IoCreateNotificationEvent(&NotificationEventName
, &EventHandle
);
101 ok(Event
!= NULL
, "Event is NULL\n");
102 ok(EventHandle
!= NULL
, "EventHandle is NULL\n");
103 if (!skip(EventHandle
!= NULL
, "No event\n"))
105 ok_eq_uint(Event
->Header
.Type
, NotificationEvent
);
106 Event2
= IoCreateSynchronizationEvent(&NotificationEventName
, &EventHandle2
);
107 ok(Event2
!= NULL
, "Event is NULL\n");
108 ok(EventHandle2
!= NULL
, "EventHandle is NULL\n");
109 if (!skip(EventHandle2
!= NULL
, "No event\n"))
111 ok_eq_uint(Event2
->Header
.Type
, NotificationEvent
);
112 ZwClose(EventHandle2
);
114 ZwClose(EventHandle
);