2 * PROJECT: ReactOS kernel-mode tests
3 * LICENSE: GPLv2+ - See COPYING in the top level directory
4 * PURPOSE: Kernel-Mode Test Suite Executive Callback test
5 * PROGRAMMER: Thomas Faber <thomas.faber@reactos.org>
11 PEX_CALLBACK_ROUTINE_BLOCK
14 IN PEX_CALLBACK_FUNCTION Function
,
17 //= (PVOID)0x809af1f4 // 2003 sp1 x86
18 //= (PVOID)0x80a7f04a // 2003 sp1 x86 checked
25 IN PEX_CALLBACK_ROUTINE_BLOCK CallbackBlock
27 //= (PVOID)0x80918bb5 // 2003 sp1 x86
28 //= (PVOID)0x80a355f0 // 2003 sp1 x86 checked
31 static INT CallbackArgument1
;
32 static INT CallbackArgument2
;
38 IN PVOID CallbackContext
,
39 IN PVOID Argument1 OPTIONAL
,
40 IN PVOID Argument2 OPTIONAL
)
42 ok(0, "Callback function unexpectedly called\n");
43 return STATUS_SUCCESS
;
48 TestPrivateFunctions(VOID
)
50 UNICODE_STRING ExAllocateCallBackName
= RTL_CONSTANT_STRING(L
"ExAllocateCallBack");
51 UNICODE_STRING ExFreeCallBackName
= RTL_CONSTANT_STRING(L
"ExFreeCallBack");
52 PEX_CALLBACK_ROUTINE_BLOCK CallbackBlock
;
55 if (!ExAllocateCallBack
)
56 ExAllocateCallBack
= MmGetSystemRoutineAddress(&ExAllocateCallBackName
);
58 ExFreeCallBack
= MmGetSystemRoutineAddress(&ExFreeCallBackName
);
60 if (skip(ExAllocateCallBack
&& ExFreeCallBack
,
61 "ExAllocateCallBack and/or ExFreeCallBack unavailable\n"))
64 CallbackBlock
= ExAllocateCallBack(ExCallbackFunction
, &CallbackContext
);
65 ok(CallbackBlock
!= NULL
, "CallbackBlock = NULL\n");
67 if (skip(CallbackBlock
!= NULL
, "Allocating callback failed\n"))
70 ok_eq_pointer(CallbackBlock
->Function
, ExCallbackFunction
);
71 ok_eq_pointer(CallbackBlock
->Context
, &CallbackContext
);
72 ok_eq_hex(KmtGetPoolTag(CallbackBlock
), 'brbC');
74 ExFreeCallBack(CallbackBlock
);
81 IN PVOID CallbackContext
,
85 INT
*InvocationCount
= CallbackContext
;
87 ok_irql(PASSIVE_LEVEL
);
90 ok_eq_pointer(Argument1
, &CallbackArgument1
);
91 ok_eq_pointer(Argument2
, &CallbackArgument2
);
94 START_TEST(ExCallback
)
97 PCALLBACK_OBJECT CallbackObject
;
98 OBJECT_ATTRIBUTES ObjectAttributes
;
99 UNICODE_STRING CallbackName
= RTL_CONSTANT_STRING(L
"\\Callback\\KmtestExCallbackTestCallback");
100 PVOID CallbackRegistration
;
101 INT InvocationCount
= 0;
103 TestPrivateFunctions();
105 /* TODO: Parameter tests */
106 /* TODO: Test the three predefined callbacks */
107 /* TODO: Test opening an existing callback */
108 /* TODO: Test AllowMultipleCallbacks */
109 /* TODO: Test calling multiple callbacks */
110 /* TODO: Test registering the same function twice */
111 /* TODO: Test callback object fields */
112 /* TODO: Test callback registration fields */
113 InitializeObjectAttributes(&ObjectAttributes
,
115 OBJ_CASE_INSENSITIVE
,
119 CallbackObject
= KmtInvalidPointer
;
120 Status
= ExCreateCallback(&CallbackObject
,
124 ok_eq_hex(Status
, STATUS_SUCCESS
);
125 ok(CallbackObject
!= NULL
&& CallbackObject
!= KmtInvalidPointer
,
126 "CallbackObject = %p", CallbackObject
);
128 if (skip(NT_SUCCESS(Status
), "Creating callback failed\n"))
131 CallbackRegistration
= ExRegisterCallback(CallbackObject
,
134 ok(CallbackRegistration
!= NULL
, "CallbackRegistration = NULL\n");
136 if (!skip(CallbackRegistration
!= NULL
, "Registering callback failed\n"))
138 ok_eq_hex(KmtGetPoolTag(CallbackRegistration
), 'eRBC');
139 ok_eq_int(InvocationCount
, 0);
140 ExNotifyCallback(CallbackObject
,
143 ok_eq_int(InvocationCount
, 1);
144 ExNotifyCallback(CallbackObject
,
147 ok_eq_int(InvocationCount
, 2);
149 ExUnregisterCallback(CallbackRegistration
);
152 ObDereferenceObject(CallbackObject
);