[KERNEL32]: Cleanup GetSystemInfo and friends, fix some bugs, mainly removing support for unsupported CPUs/architectures, and adding support for PROCESSOR_ARCHITECTURE_AMD64. Did some refactoring to support WoW64 in the future as well.

svn path=/trunk/; revision=53057
This commit is contained in:
Alex Ionescu 2011-08-04 00:55:52 +00:00
parent 17d451a6ae
commit 6da0958817

View file

@ -1,25 +1,81 @@
/* $Id$
*
* COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS system libraries
* FILE: dll/win32/kernel32/misc/sysinfo.c
* PURPOSE: SystemInfo functions
* PROGRAMMER: Emanuele Aliberti
/*
* PROJECT: ReactOS Win32 Base API
* LICENSE: See COPYING in the top level directory
* FILE: dll/win32/kernel32/client/sysinfo.c
* PURPOSE: System Information Functions
* PROGRAMMERS: Emanuele Aliberti
* Christoph von Wittich
* Thomas Weidenmueller
* Gunnar Andre Dalsnes
* UPDATE HISTORY:
* 2000-04-26 created
*/
/* INCLUDES *******************************************************************/
#include <k32.h>
#define NDEBUG
#include <debug.h>
#define PV_NT351 0x00030033
/* PRIVATE FUNCTIONS **********************************************************/
VOID
WINAPI
GetSystemInfoInternal(IN PSYSTEM_BASIC_INFORMATION BasicInfo,
IN PSYSTEM_PROCESSOR_INFORMATION ProcInfo,
OUT LPSYSTEM_INFO SystemInfo)
{
RtlZeroMemory(SystemInfo, sizeof (SYSTEM_INFO));
SystemInfo->wProcessorArchitecture = ProcInfo->ProcessorArchitecture;
SystemInfo->wReserved = 0;
SystemInfo->dwPageSize = BasicInfo->PageSize;
SystemInfo->lpMinimumApplicationAddress = (PVOID)BasicInfo->MinimumUserModeAddress;
SystemInfo->lpMaximumApplicationAddress = (PVOID)BasicInfo->MaximumUserModeAddress;
SystemInfo->dwActiveProcessorMask = BasicInfo->ActiveProcessorsAffinityMask;
SystemInfo->dwNumberOfProcessors = BasicInfo->NumberOfProcessors;
SystemInfo->wProcessorLevel = ProcInfo->ProcessorLevel;
SystemInfo->wProcessorRevision = ProcInfo->ProcessorRevision;
SystemInfo->dwAllocationGranularity = BasicInfo->AllocationGranularity;
switch (ProcInfo->ProcessorArchitecture)
{
case PROCESSOR_ARCHITECTURE_INTEL:
switch (ProcInfo->ProcessorLevel)
{
case 3:
SystemInfo->dwProcessorType = PROCESSOR_INTEL_386;
break;
case 4:
SystemInfo->dwProcessorType = PROCESSOR_INTEL_486;
break;
default:
SystemInfo->dwProcessorType = PROCESSOR_INTEL_PENTIUM;
}
break;
case PROCESSOR_ARCHITECTURE_AMD64:
SystemInfo->dwProcessorType = PROCESSOR_AMD_X8664;
break;
case PROCESSOR_ARCHITECTURE_IA64:
SystemInfo->dwProcessorType = PROCESSOR_INTEL_IA64;
break;
default:
SystemInfo->dwProcessorType = 0;
break;
}
if (PV_NT351 > GetProcessVersion(0))
{
SystemInfo->wProcessorLevel = 0;
SystemInfo->wProcessorRevision = 0;
}
}
/* PUBLIC FUNCTIONS ***********************************************************/
/*
* @implemented
*/
@ -27,189 +83,66 @@ SIZE_T
WINAPI
GetLargePageMinimum(VOID)
{
return SharedUserData->LargePageMinimum;
return SharedUserData->LargePageMinimum;
}
/*
* @unimplemented
*/
VOID
WINAPI
GetSystemInfo (
LPSYSTEM_INFO Si
)
{
SYSTEM_BASIC_INFORMATION Sbi;
SYSTEM_PROCESSOR_INFORMATION Spi;
DWORD ProcessVersion;
NTSTATUS Status;
RtlZeroMemory (Si, sizeof (SYSTEM_INFO));
Status = NtQuerySystemInformation (
SystemBasicInformation, /* 0 */
& Sbi,
sizeof Sbi, /* 44 */
0
);
if (STATUS_SUCCESS != Status)
{
BaseSetLastNTError (Status);
return;
}
Status = NtQuerySystemInformation (
SystemProcessorInformation, /* 1 */
& Spi,
sizeof Spi, /* 12 */
0
);
if (STATUS_SUCCESS != Status)
{
BaseSetLastNTError (Status);
return;
}
/*
* PROCESSOR_ARCHITECTURE_INTEL 0
* PROCESSOR_ARCHITECTURE_MIPS 1
* PROCESSOR_ARCHITECTURE_ALPHA 2
* PROCESSOR_ARCHITECTURE_PPC 3
* PROCESSOR_ARCHITECTURE_UNKNOWN 0xFFFF
*/
Si->wProcessorArchitecture = Spi.ProcessorArchitecture;
/* For future use: always zero */
Si->wReserved = 0;
Si->dwPageSize = Sbi.PageSize;
Si->lpMinimumApplicationAddress = (PVOID)Sbi.MinimumUserModeAddress;
Si->lpMaximumApplicationAddress = (PVOID)Sbi.MaximumUserModeAddress;
Si->dwActiveProcessorMask = Sbi.ActiveProcessorsAffinityMask;
Si->dwNumberOfProcessors = Sbi.NumberOfProcessors;
/*
* Compatibility (no longer relevant):
* PROCESSOR_INTEL_386 386
* PROCESSOR_INTEL_486 486
* PROCESSOR_INTEL_PENTIUM 586
* PROCESSOR_MIPS_R4000 4000
* PROCESSOR_ALPHA_21064 21064
*/
switch (Spi.ProcessorArchitecture)
{
case PROCESSOR_ARCHITECTURE_INTEL:
switch (Spi.ProcessorLevel)
{
case 3:
Si->dwProcessorType = PROCESSOR_INTEL_386;
break;
case 4:
Si->dwProcessorType = PROCESSOR_INTEL_486;
break;
case 5:
Si->dwProcessorType = PROCESSOR_INTEL_PENTIUM;
break;
default:
/* FIXME: P2, P3, P4...? */
Si->dwProcessorType = PROCESSOR_INTEL_PENTIUM;
}
break;
case PROCESSOR_ARCHITECTURE_MIPS:
Si->dwProcessorType = PROCESSOR_MIPS_R4000;
break;
case PROCESSOR_ARCHITECTURE_ALPHA:
Si->dwProcessorType = PROCESSOR_ALPHA_21064;
break;
case PROCESSOR_ARCHITECTURE_IA64:
Si->dwProcessorType = PROCESSOR_INTEL_IA64;
break;
case PROCESSOR_ARCHITECTURE_PPC:
switch (Spi.ProcessorLevel)
{
case 1:
Si->dwProcessorType = PROCESSOR_PPC_601;
break;
case 3:
Si->dwProcessorType = PROCESSOR_PPC_603;
break;
case 4:
Si->dwProcessorType = PROCESSOR_PPC_604;
break;
case 6:
/* PPC 603+ */
Si->dwProcessorType = PROCESSOR_PPC_603;
break;
case 9:
/* PPC 604+ */
Si->dwProcessorType = PROCESSOR_PPC_604;
break;
case 20:
Si->dwProcessorType = PROCESSOR_PPC_620;
break;
default:
Si->dwProcessorType = 0;
}
break;
}
/* Once hardcoded to 64kb */
Si->dwAllocationGranularity = Sbi.AllocationGranularity;
/* */
Si->wProcessorLevel = Spi.ProcessorLevel;
Si->wProcessorRevision = Spi.ProcessorRevision;
/*
* Get the version of Windows on which
* the process expects to run.
*/
ProcessVersion = GetProcessVersion (0); /* current process */
/* In NT 3.1 and 3.5 these fields were always zero. */
if (PV_NT351 > ProcessVersion)
{
Si->wProcessorLevel = 0;
Si->wProcessorRevision = 0;
}
}
/*
* @implemented
*/
BOOL WINAPI
IsProcessorFeaturePresent(DWORD ProcessorFeature)
VOID
WINAPI
GetSystemInfo(IN LPSYSTEM_INFO lpSystemInfo)
{
if (ProcessorFeature >= PROCESSOR_FEATURE_MAX)
return(FALSE);
SYSTEM_BASIC_INFORMATION BasicInfo;
SYSTEM_PROCESSOR_INFORMATION ProcInfo;
NTSTATUS Status;
return((BOOL)SharedUserData->ProcessorFeatures[ProcessorFeature]);
Status = NtQuerySystemInformation(SystemBasicInformation,
&BasicInfo,
sizeof(BasicInfo),
0);
if (!NT_SUCCESS(Status)) return;
Status = NtQuerySystemInformation(SystemProcessorInformation,
&ProcInfo,
sizeof(ProcInfo),
0);
if (!NT_SUCCESS(Status)) return;
GetSystemInfoInternal(&BasicInfo, &ProcInfo, lpSystemInfo);
}
/*
* @implemented
*/
BOOL
WINAPI
GetSystemRegistryQuota(PDWORD pdwQuotaAllowed,
PDWORD pdwQuotaUsed)
IsProcessorFeaturePresent(IN DWORD ProcessorFeature)
{
SYSTEM_REGISTRY_QUOTA_INFORMATION srqi;
if (ProcessorFeature >= PROCESSOR_FEATURE_MAX) return FALSE;
return ((BOOL)SharedUserData->ProcessorFeatures[ProcessorFeature]);
}
/*
* @implemented
*/
BOOL
WINAPI
GetSystemRegistryQuota(OUT PDWORD pdwQuotaAllowed,
OUT PDWORD pdwQuotaUsed)
{
SYSTEM_REGISTRY_QUOTA_INFORMATION QuotaInfo;
ULONG BytesWritten;
NTSTATUS Status;
Status = NtQuerySystemInformation(SystemRegistryQuotaInformation,
&srqi,
sizeof(srqi),
&QuotaInfo,
sizeof(QuotaInfo),
&BytesWritten);
if(NT_SUCCESS(Status))
if (NT_SUCCESS(Status))
{
if(pdwQuotaAllowed != NULL)
{
*pdwQuotaAllowed = srqi.RegistryQuotaAllowed;
}
if(pdwQuotaUsed != NULL)
{
*pdwQuotaUsed = srqi.RegistryQuotaUsed;
}
if (pdwQuotaAllowed) *pdwQuotaAllowed = QuotaInfo.RegistryQuotaAllowed;
if (pdwQuotaUsed) *pdwQuotaUsed = QuotaInfo.RegistryQuotaUsed;
return TRUE;
}
@ -222,15 +155,27 @@ GetSystemRegistryQuota(PDWORD pdwQuotaAllowed,
*/
VOID
WINAPI
GetNativeSystemInfo(
LPSYSTEM_INFO lpSystemInfo
)
GetNativeSystemInfo(IN LPSYSTEM_INFO lpSystemInfo)
{
//FIXME: GetNativeSystemInfo should return always the real Hardware Processorarchitecture
// in case a Program is running in 32bit Mode on AMD64
// GetSystemInfo should return PROCESSOR_ARCHITECTURE_INTEL and
// GetNativeSystemInfo should return PROCESSOR_ARCHITECTURE_AMD64
GetSystemInfo(lpSystemInfo);
SYSTEM_BASIC_INFORMATION BasicInfo;
SYSTEM_PROCESSOR_INFORMATION ProcInfo;
NTSTATUS Status;
/* FIXME: Should be SystemNativeBasicInformation */
Status = NtQuerySystemInformation(SystemBasicInformation,
&BasicInfo,
sizeof(BasicInfo),
0);
if (!NT_SUCCESS(Status)) return;
/* FIXME: Should be SystemNativeProcessorInformation */
Status = NtQuerySystemInformation(SystemProcessorInformation,
&ProcInfo,
sizeof(ProcInfo),
0);
if (!NT_SUCCESS(Status)) return;
GetSystemInfoInternal(&BasicInfo, &ProcInfo, lpSystemInfo);
}
/*
@ -254,15 +199,11 @@ GetLogicalProcessorInformation(OUT PSYSTEM_LOGICAL_PROCESSOR_INFORMATION Buffer,
*ReturnLength,
ReturnLength);
/* Normalize the error to what Win32 expects */
if (Status == STATUS_INFO_LENGTH_MISMATCH) Status = STATUS_BUFFER_TOO_SMALL;
if (!NT_SUCCESS(Status))
{
/*
* When NtQuerySystemInformation says STATUS_INFO_LENGTH_MISMATCH,
* return ERROR_INSUFFICIENT_BUFFER instead of ERROR_BAD_LENGTH.
*/
BaseSetLastNTError(Status == STATUS_INFO_LENGTH_MISMATCH
? STATUS_BUFFER_TOO_SMALL
: Status);
BaseSetLastNTError(Status);
return FALSE;
}
@ -274,9 +215,7 @@ GetLogicalProcessorInformation(OUT PSYSTEM_LOGICAL_PROCESSOR_INFORMATION Buffer,
*/
BOOL
WINAPI
GetNumaHighestNodeNumber(
PULONG HighestNodeNumber
)
GetNumaHighestNodeNumber(OUT PULONG HighestNodeNumber)
{
STUB;
return 0;
@ -287,10 +226,8 @@ GetNumaHighestNodeNumber(
*/
BOOL
WINAPI
GetNumaNodeProcessorMask(
UCHAR Node,
PULONGLONG ProcessorMask
)
GetNumaNodeProcessorMask(IN UCHAR Node,
OUT PULONGLONG ProcessorMask)
{
STUB;
return 0;
@ -301,15 +238,16 @@ GetNumaNodeProcessorMask(
*/
BOOL
WINAPI
GetNumaProcessorNode(
UCHAR Processor,
PUCHAR NodeNumber
)
GetNumaProcessorNode(IN UCHAR Processor,
OUT PUCHAR NodeNumber)
{
STUB;
return 0;
}
/*
* @unimplemented
*/
BOOL
WINAPI
GetNumaAvailableMemoryNode(IN UCHAR Node,
@ -324,12 +262,10 @@ GetNumaAvailableMemoryNode(IN UCHAR Node,
*/
DWORD
WINAPI
GetFirmwareEnvironmentVariableW(
LPCWSTR lpName,
LPCWSTR lpGuid,
PVOID pBuffer,
DWORD nSize
)
GetFirmwareEnvironmentVariableW(IN LPCWSTR lpName,
IN LPCWSTR lpGuid,
IN PVOID pValue,
IN DWORD nSize)
{
STUB;
return 0;
@ -340,12 +276,10 @@ GetFirmwareEnvironmentVariableW(
*/
BOOL
WINAPI
SetFirmwareEnvironmentVariableW(
LPCWSTR lpName,
LPCWSTR lpGuid,
PVOID pValue,
DWORD nSize
)
SetFirmwareEnvironmentVariableW(IN LPCWSTR lpName,
IN LPCWSTR lpGuid,
IN PVOID pValue,
IN DWORD nSize)
{
STUB;
return 0;
@ -356,12 +290,10 @@ SetFirmwareEnvironmentVariableW(
*/
DWORD
WINAPI
GetFirmwareEnvironmentVariableA(
LPCSTR lpName,
LPCSTR lpGuid,
PVOID pBuffer,
DWORD nSize
)
GetFirmwareEnvironmentVariableA(IN LPCSTR lpName,
IN LPCSTR lpGuid,
IN PVOID pValue,
IN DWORD nSize)
{
STUB;
return 0;
@ -372,17 +304,18 @@ GetFirmwareEnvironmentVariableA(
*/
BOOL
WINAPI
SetFirmwareEnvironmentVariableA(
LPCSTR lpName,
LPCSTR lpGuid,
PVOID pValue,
DWORD nSize
)
SetFirmwareEnvironmentVariableA(IN LPCSTR lpName,
IN LPCSTR lpGuid,
IN PVOID pValue,
IN DWORD nSize)
{
STUB;
return 0;
}
/*
* @unimplemented
*/
UINT
WINAPI
EnumSystemFirmwareTables(IN DWORD FirmwareTableProviderSignature,
@ -393,6 +326,9 @@ EnumSystemFirmwareTables(IN DWORD FirmwareTableProviderSignature,
return 0;
}
/*
* @unimplemented
*/
UINT
WINAPI
GetSystemFirmwareTable(IN DWORD FirmwareTableProviderSignature,
@ -404,6 +340,9 @@ GetSystemFirmwareTable(IN DWORD FirmwareTableProviderSignature,
return 0;
}
/*
* @unimplemented
*/
BOOL
WINAPI
GetSystemFileCacheSize(OUT PSIZE_T lpMinimumFileCacheSize,
@ -414,7 +353,9 @@ GetSystemFileCacheSize(OUT PSIZE_T lpMinimumFileCacheSize,
return FALSE;
}
/*
* @unimplemented
*/
BOOL
WINAPI
SetSystemFileCacheSize(IN SIZE_T MinimumFileCacheSize,
@ -424,4 +365,3 @@ SetSystemFileCacheSize(IN SIZE_T MinimumFileCacheSize,
STUB;
return FALSE;
}