* Sync up to trunk head (r65074).
[reactos.git] / dll / win32 / kernel32 / client / resntfy.c
1 /*
2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: ReactOS Win32 Base API
4 * FILE: dll/win32/kernel32/client/resnotify.c
5 * PURPOSE: Memory Resource Notifications
6 * PROGRAMMER: Thomas Weidenmueller <w3seek@reactos.com>
7 */
8
9 /* INCLUDES *******************************************************************/
10
11 #include <k32.h>
12
13 #define NDEBUG
14 #include <debug.h>
15
16 /* FUNCTIONS ******************************************************************/
17
18 /*
19 * @implemented
20 */
21 HANDLE
22 WINAPI
23 CreateMemoryResourceNotification(IN MEMORY_RESOURCE_NOTIFICATION_TYPE NotificationType)
24 {
25 UNICODE_STRING EventName;
26 OBJECT_ATTRIBUTES ObjectAttributes;
27 HANDLE hEvent;
28 NTSTATUS Status;
29
30 if (NotificationType > HighMemoryResourceNotification)
31 {
32 SetLastError(ERROR_INVALID_PARAMETER);
33 return NULL;
34 }
35
36 RtlInitUnicodeString(&EventName,
37 NotificationType ?
38 L"\\KernelObjects\\HighMemoryCondition" :
39 L"\\KernelObjects\\LowMemoryCondition");
40
41 InitializeObjectAttributes(&ObjectAttributes,
42 &EventName,
43 0,
44 NULL,
45 NULL);
46
47 Status = NtOpenEvent(&hEvent,
48 EVENT_QUERY_STATE | SYNCHRONIZE,
49 &ObjectAttributes);
50 if (!NT_SUCCESS(Status))
51 {
52 BaseSetLastNTError(Status);
53 return NULL;
54 }
55
56 return hEvent;
57 }
58
59 /*
60 * @implemented
61 */
62 BOOL
63 WINAPI
64 QueryMemoryResourceNotification(IN HANDLE ResourceNotificationHandle,
65 OUT PBOOL ResourceState)
66 {
67 EVENT_BASIC_INFORMATION EventInfo;
68 NTSTATUS Status;
69
70 if ((ResourceNotificationHandle) &&
71 (ResourceNotificationHandle != INVALID_HANDLE_VALUE) &&
72 (ResourceState))
73 {
74 Status = NtQueryEvent(ResourceNotificationHandle,
75 EventBasicInformation,
76 &EventInfo,
77 sizeof(EventInfo),
78 NULL);
79 if (NT_SUCCESS(Status))
80 {
81 *ResourceState = (EventInfo.EventState == 1);
82 return TRUE;
83 }
84
85 BaseSetLastNTError(Status);
86 }
87 else
88 {
89 SetLastError(ERROR_INVALID_PARAMETER);
90 }
91
92 return FALSE;
93 }
94
95 /* EOF */