You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
206 lines
4.7 KiB
206 lines
4.7 KiB
/*++
|
|
|
|
Copyright (c) 2001 Microsoft Corporation
|
|
|
|
Module Name:
|
|
|
|
res.c
|
|
|
|
Abstract:
|
|
|
|
This module implements Win32 Resource Manager APIs
|
|
|
|
Author:
|
|
|
|
Rob Earhart (Earhart) 04-Apr-2001
|
|
|
|
Revision History:
|
|
|
|
--*/
|
|
|
|
#include "basedll.h"
|
|
|
|
//
|
|
// N.B. This is a stub implementation intended to provide basic
|
|
// resource management interfaces for applications which care
|
|
// about their memory usage. It is NOT the final version of the
|
|
// usermode side of the resource manager.
|
|
//
|
|
|
|
|
|
//
|
|
// Globals used by the routines in this module
|
|
//
|
|
|
|
const WCHAR BasepMmLowMemoryConditionEventName[] = L"\\KernelObjects\\LowMemoryCondition";
|
|
const WCHAR BasepMmHighMemoryConditionEventName[] = L"\\KernelObjects\\HighMemoryCondition";
|
|
|
|
HANDLE
|
|
APIENTRY
|
|
CreateMemoryResourceNotification(
|
|
IN MEMORY_RESOURCE_NOTIFICATION_TYPE NotificationType
|
|
)
|
|
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Creates a memory resource notification handle. Memory resource
|
|
notification handles monitor memory for changes, and are used
|
|
to query information about memory.
|
|
|
|
Arguments:
|
|
|
|
NotificationType -- the type of notification requested
|
|
|
|
Return Value:
|
|
|
|
Non-NULL - a handle to the new subscription object.
|
|
|
|
NULL - The operation failed. Extended error status is available
|
|
using GetLastError.
|
|
|
|
--*/
|
|
|
|
{
|
|
LPCWSTR EventName;
|
|
HANDLE Handle;
|
|
OBJECT_ATTRIBUTES Obja;
|
|
UNICODE_STRING ObjectName;
|
|
NTSTATUS Status;
|
|
|
|
//
|
|
// Determine the event in which the caller's interested.
|
|
//
|
|
switch (NotificationType) {
|
|
case LowMemoryResourceNotification:
|
|
//
|
|
// It's the low memory condition event
|
|
//
|
|
EventName = BasepMmLowMemoryConditionEventName;
|
|
break;
|
|
|
|
case HighMemoryResourceNotification:
|
|
//
|
|
// It's the high memory condition event
|
|
//
|
|
EventName = BasepMmHighMemoryConditionEventName;
|
|
break;
|
|
|
|
default:
|
|
//
|
|
// Not one of our known event-of-interest types; all we can do
|
|
// is indicate an invalid parameter, and return a failure
|
|
// condition.
|
|
//
|
|
|
|
SetLastError(ERROR_INVALID_PARAMETER);
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
|
//
|
|
// Attempt the actual event open
|
|
//
|
|
RtlInitUnicodeString(&ObjectName, EventName);
|
|
|
|
InitializeObjectAttributes(&Obja,
|
|
&ObjectName,
|
|
0,
|
|
NULL,
|
|
NULL);
|
|
|
|
Status = NtOpenEvent(&Handle,
|
|
SYNCHRONIZE | EVENT_QUERY_STATE,
|
|
&Obja);
|
|
|
|
if (! NT_SUCCESS(Status)) {
|
|
//
|
|
// We failed to open the event for some reason.
|
|
//
|
|
BaseSetLastNTError(Status);
|
|
return NULL;
|
|
}
|
|
|
|
//
|
|
// Otherwise, we have the handle, so we're all set; just return it.
|
|
//
|
|
|
|
return Handle;
|
|
}
|
|
|
|
BOOL
|
|
APIENTRY
|
|
QueryMemoryResourceNotification(
|
|
IN HANDLE ResourceNotificationHandle,
|
|
IN PBOOL ResourceState
|
|
)
|
|
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Query a memory resource notification handle for information about
|
|
the associated memory resources.
|
|
|
|
Arguments:
|
|
|
|
ResourceNotificationHandle - a handle to the memory resource
|
|
notification to query.
|
|
|
|
ResourceState - location to put the information about the memory
|
|
resource
|
|
|
|
Return Value:
|
|
|
|
TRUE - The query succeeded.
|
|
|
|
FALSE - The query failed. Extended error status is available
|
|
using GetLastError.
|
|
|
|
--*/
|
|
|
|
{
|
|
EVENT_BASIC_INFORMATION EventInfo;
|
|
NTSTATUS Status;
|
|
|
|
//
|
|
// Check parameter validity
|
|
//
|
|
if (! ResourceNotificationHandle
|
|
|| ResourceNotificationHandle == INVALID_HANDLE_VALUE
|
|
|| ! ResourceState) {
|
|
|
|
SetLastError(ERROR_INVALID_PARAMETER);
|
|
return FALSE;
|
|
}
|
|
|
|
//
|
|
// Get the event's current state
|
|
//
|
|
Status = NtQueryEvent(ResourceNotificationHandle,
|
|
EventBasicInformation,
|
|
&EventInfo,
|
|
sizeof(EventInfo),
|
|
NULL);
|
|
|
|
if (! NT_SUCCESS(Status)) {
|
|
//
|
|
// On failure, set the last NT error and indicate the failure
|
|
// condition to our caller.
|
|
//
|
|
BaseSetLastNTError(Status);
|
|
return FALSE;
|
|
}
|
|
|
|
//
|
|
// Fill in the state
|
|
//
|
|
*ResourceState = (EventInfo.EventState == 1);
|
|
|
|
//
|
|
// And we're done -- return success to our caller.
|
|
//
|
|
return TRUE;
|
|
}
|