50{
55
58
59
68 DWORD Value1 = 0x12345678, Value2 = 0x87654321;
69
70
74
75
78 {
79 skip(
"Failed to create event");
80 return;
81 }
82
85 {
86 skip(
"Failed to create registry key");
88 }
91 {
92 skip(
"Failed to set initial test value");
94 }
95
96
97
98
100 if (WatchThread1State ==
NULL)
101 {
102 skip(
"Failed to allocate memory for watch thread state");
104 }
108 if (WatchThread1Handle)
109 {
110
113
116
119
122
124 WatchThread1Handle =
NULL;
125 }
126 else
127 {
128 skip(
"Failed to create watch thread");
129 }
131 WatchThread1State =
NULL;
132
134 if (WatchThread2State ==
NULL)
135 {
136 skip(
"Failed to allocate memory for watch thread state");
138 }
139 WatchThread2State->KeyHandle =
KeyHandle;
142 if (WatchThread2Handle)
143 {
152
154 WatchThread2Handle =
NULL;
155 }
156 else
157 {
158 skip(
"Failed to create watch thread");
159 }
161 WatchThread2State =
NULL;
162
163
164
166 {
169 {
170 skip(
"Failed to open registry key");
172 }
173 }
174
181
184
187
191
193
194
209
210
211
213 {
216 {
217 skip(
"Failed to open registry key");
219 }
220 }
223 {
224
231
234
237
241 }
242 else
243 {
244 skip(
"Failed to create subkey");
245 }
246
247
248
251 {
256 SubordinateObjects,
264 0,
267
270
273 {
277 }
278
282 }
283 else
284 {
285 skip(
"Failed to create secondary key");
286 }
287
291 SubordinateObjects,
299 0,
301
303
307 SubordinateObjects,
315 0,
318
319
322 {
323 skip(
"Failed to allocate memory for APC context");
325 }
332
335
338
340 if (WatchThread1Handle)
341 {
343 }
344 if (WatchThread2Handle)
345 {
347 }
349 {
351 }
353 {
355 }
357 {
360 }
362 {
365 {
367 }
368 }
370 {
373 }
376 {
379 }
380}
VOID WINAPI NtNotifyChangeMultipleKeys_ApcRoutine(PVOID ApcContext, PIO_STATUS_BLOCK IoStatusBlock, ULONG Reserved)
DWORD WINAPI NtNotifyChangeMultipleKeys_WatchThread(LPVOID lpParameter)
#define ok_eq_ulong(value, expected)
#define ok_ntstatus(status, expected)
IN PUNICODE_STRING IN POBJECT_ATTRIBUTES ObjectAttributes
#define NT_SUCCESS(StatCode)
#define RTL_CONSTANT_STRING(s)
#define HeapFree(x, y, z)
HANDLE WINAPI DECLSPEC_HOTPATCH CreateThread(IN LPSECURITY_ATTRIBUTES lpThreadAttributes, IN DWORD dwStackSize, IN LPTHREAD_START_ROUTINE lpStartAddress, IN LPVOID lpParameter, IN DWORD dwCreationFlags, OUT LPDWORD lpThreadId)
static const WCHAR Cleanup[]
#define InitializeObjectAttributes(p, n, a, r, s)
_Must_inspect_result_ _Out_ PNDIS_STATUS _In_ NDIS_HANDLE _In_ PNDIS_STRING SubKeyName
_Must_inspect_result_ _Out_ PNDIS_STATUS _In_ NDIS_HANDLE _In_ PNDIS_STRING _Out_ PNDIS_HANDLE SubKeyHandle
_Must_inspect_result_ _Out_ PNDIS_STATUS _In_ NDIS_HANDLE _In_ ULONG _Out_ PNDIS_STRING _Out_ PNDIS_HANDLE KeyHandle
NTSYSAPI NTSTATUS NTAPI NtOpenKey(OUT PHANDLE KeyHandle, IN ACCESS_MASK DesiredAccess, IN POBJECT_ATTRIBUTES ObjectAttributes)
NTSYSAPI NTSTATUS NTAPI NtSetValueKey(IN HANDLE KeyHandle, IN PUNICODE_STRING ValueName, IN ULONG TitleIndex OPTIONAL, IN ULONG Type, IN PVOID Data, IN ULONG DataSize)
#define REG_OPTION_NON_VOLATILE
NTSTATUS NTAPI NtClose(IN HANDLE Handle)
NTSTATUS NTAPI NtDeleteKey(IN HANDLE KeyHandle)
NTSTATUS NTAPI NtCreateKey(OUT PHANDLE KeyHandle, IN ACCESS_MASK DesiredAccess, IN POBJECT_ATTRIBUTES ObjectAttributes, IN ULONG TitleIndex, IN PUNICODE_STRING Class OPTIONAL, IN ULONG CreateOptions, OUT PULONG Disposition OPTIONAL)
#define RTL_CONSTANT_OBJECT_ATTRIBUTES(n, a)
NTSTATUS NTAPI NtTestAlert(VOID)
#define STATUS_NOTIFY_CLEANUP
#define STATUS_NOTIFY_ENUM_DIR
#define OBJ_CASE_INSENSITIVE
PIO_STATUS_BLOCK IoStatusBlock
DWORD WINAPI WaitForSingleObject(IN HANDLE hHandle, IN DWORD dwMilliseconds)
_Must_inspect_result_ _In_ WDFDEVICE _In_ PCUNICODE_STRING KeyName
_Must_inspect_result_ _In_ WDFKEY _In_ PCUNICODE_STRING ValueName
_Out_ PHANDLE EventHandle