Source code of Windows XP (NT5)
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.
 
 
 
 
 
 

267 lines
5.4 KiB

/*++
Copyright (c) 1991 Microsoft Corporation
Module Name:
ixinfo.c
Abstract:
Author:
Ken Reneris (kenr) 08-Aug-1994
Environment:
Kernel mode only.
Revision History:
--*/
#include "halp.h"
VOID
HalInitSystemPhase2 (
VOID
);
#ifdef _PNP_POWER_
HAL_CALLBACKS HalCallback;
extern WCHAR rgzSuspendCallbackName[];
VOID
HalpLockSuspendCode (
IN PVOID CallbackContext,
IN PVOID Argument1,
IN PVOID Argument2
);
#endif
NTSTATUS
HalpQueryInstalledBusInformation (
OUT PVOID Buffer,
IN ULONG BufferLength,
OUT PULONG ReturnedLength
);
#ifdef ALLOC_PRAGMA
#pragma alloc_text(PAGE,HaliQuerySystemInformation)
#pragma alloc_text(PAGE,HaliSetSystemInformation)
#pragma alloc_text(INIT,HalInitSystemPhase2)
#ifdef _PNP_POWER_
#pragma alloc_text(PAGE,HalpLockSuspendCode)
#endif
#endif
VOID
HalInitSystemPhase2 (
VOID
)
{
#ifdef _PNP_POWER_
OBJECT_ATTRIBUTES ObjectAttributes;
NTSTATUS Status;
UNICODE_STRING unicodeString;
PCALLBACK_OBJECT CallbackObject;
//
// Create hal callbacks
//
InitializeObjectAttributes(
&ObjectAttributes,
NULL,
OBJ_CASE_INSENSITIVE,
NULL,
NULL
);
ExCreateCallback (&HalCallback.SetSystemInformation, &ObjectAttributes, TRUE, TRUE);
ExCreateCallback (&HalCallback.BusCheck, &ObjectAttributes, TRUE, TRUE);
//
// Connect to suspend callback to lock hal hibaration code
//
RtlInitUnicodeString(&unicodeString, rgzSuspendCallbackName);
InitializeObjectAttributes(
&ObjectAttributes,
&unicodeString,
OBJ_CASE_INSENSITIVE,
NULL,
NULL
);
Status = ExCreateCallback (&CallbackObject, &ObjectAttributes, FALSE, FALSE);
if (NT_SUCCESS(Status)) {
ExRegisterCallback (
CallbackObject,
HalpLockSuspendCode,
NULL
);
ObDereferenceObject (CallbackObject);
}
#endif
}
NTSTATUS
HaliQuerySystemInformation(
IN HAL_QUERY_INFORMATION_CLASS InformationClass,
IN ULONG BufferSize,
OUT PVOID Buffer,
OUT PULONG ReturnedLength
)
{
NTSTATUS Status;
PVOID InternalBuffer;
ULONG Length;
union {
HAL_POWER_INFORMATION PowerInf;
HAL_PROCESSOR_SPEED_INFORMATION ProcessorInf;
HAL_DISPLAY_BIOS_INFORMATION DisplayBiosInf;
} U;
BOOLEAN bUseFrameBufferCaching;
PAGED_CODE();
Status = STATUS_SUCCESS;
*ReturnedLength = 0;
Length = 0;
switch (InformationClass) {
case HalInstalledBusInformation:
Status = HalpQueryInstalledBusInformation (
Buffer,
BufferSize,
ReturnedLength
);
break;
case HalFrameBufferCachingInformation:
// Note - we want to return TRUE here to enable USWC in all
// cases except in a "Shared Memory Cluster" machine.
bUseFrameBufferCaching = TRUE;
InternalBuffer = &bUseFrameBufferCaching;
Length = sizeof (BOOLEAN);
break;
#ifdef _PNP_POWER_
case HalPowerInformation:
RtlZeroMemory (&U.PowerInf, sizeof(HAL_POWER_INFORMATION));
InternalBuffer = &U.PowerInf;
Length = sizeof (HAL_POWER_INFORMATION);
break;
case HalProcessorSpeedInformation:
RtlZeroMemory (&U.ProcessorInf, sizeof(HAL_POWER_INFORMATION));
U.ProcessorInf.MaximumProcessorSpeed = 100;
U.ProcessorInf.CurrentAvailableSpeed = 100;
U.ProcessorInf.ConfiguredSpeedLimit = 100;
InternalBuffer = &U.PowerInf;
Length = sizeof (HAL_PROCESSOR_SPEED_INFORMATION);
break;
case HalCallbackInformation:
InternalBuffer = &HalCallback;
Length = sizeof (HAL_CALLBACKS);
break;
#endif
default:
Status = STATUS_INVALID_LEVEL;
break;
}
//
// If non-zero Length copy data to callers buffer
//
if (Length) {
if (BufferSize < Length) {
Length = BufferSize;
}
*ReturnedLength = Length;
RtlCopyMemory (Buffer, InternalBuffer, Length);
}
return Status;
}
NTSTATUS
HaliSetSystemInformation (
IN HAL_SET_INFORMATION_CLASS InformationClass,
IN ULONG BufferSize,
IN PVOID Buffer
)
{
NTSTATUS Status;
PAGED_CODE();
Status = STATUS_SUCCESS;
switch (InformationClass) {
default:
Status = STATUS_INVALID_LEVEL;
break;
}
return Status;
}
#ifdef _PNP_POWER_
VOID
HalpLockSuspendCode (
IN PVOID CallbackContext,
IN PVOID Argument1,
IN PVOID Argument2
)
{
static PVOID CodeLock;
switch ((ULONG) Argument1) {
case 0:
//
// Lock code down which might be needed to perform a suspend
//
ASSERT (CodeLock == NULL);
CodeLock = MmLockPagableCodeSection (&HaliSuspendHibernateSystem);
break;
case 1:
//
// Release the code lock
//
MmUnlockPagableImageSection (CodeLock);
CodeLock = NULL;
break;
}
}
#endif