2 * PROJECT: ReactOS Win32 Base API
3 * LICENSE: See COPYING in the top level directory
4 * FILE: dll/win32/kernel32/client/sysinfo.c
5 * PURPOSE: System Information Functions
6 * PROGRAMMERS: Emanuele Aliberti
7 * Christoph von Wittich
12 /* INCLUDES *******************************************************************/
19 #define PV_NT351 0x00030033
21 /* PRIVATE FUNCTIONS **********************************************************/
25 GetSystemInfoInternal(IN PSYSTEM_BASIC_INFORMATION BasicInfo
,
26 IN PSYSTEM_PROCESSOR_INFORMATION ProcInfo
,
27 OUT LPSYSTEM_INFO SystemInfo
)
29 RtlZeroMemory(SystemInfo
, sizeof (SYSTEM_INFO
));
30 SystemInfo
->wProcessorArchitecture
= ProcInfo
->ProcessorArchitecture
;
31 SystemInfo
->wReserved
= 0;
32 SystemInfo
->dwPageSize
= BasicInfo
->PageSize
;
33 SystemInfo
->lpMinimumApplicationAddress
= (PVOID
)BasicInfo
->MinimumUserModeAddress
;
34 SystemInfo
->lpMaximumApplicationAddress
= (PVOID
)BasicInfo
->MaximumUserModeAddress
;
35 SystemInfo
->dwActiveProcessorMask
= BasicInfo
->ActiveProcessorsAffinityMask
;
36 SystemInfo
->dwNumberOfProcessors
= BasicInfo
->NumberOfProcessors
;
37 SystemInfo
->wProcessorLevel
= ProcInfo
->ProcessorLevel
;
38 SystemInfo
->wProcessorRevision
= ProcInfo
->ProcessorRevision
;
39 SystemInfo
->dwAllocationGranularity
= BasicInfo
->AllocationGranularity
;
41 switch (ProcInfo
->ProcessorArchitecture
)
43 case PROCESSOR_ARCHITECTURE_INTEL
:
44 switch (ProcInfo
->ProcessorLevel
)
47 SystemInfo
->dwProcessorType
= PROCESSOR_INTEL_386
;
50 SystemInfo
->dwProcessorType
= PROCESSOR_INTEL_486
;
53 SystemInfo
->dwProcessorType
= PROCESSOR_INTEL_PENTIUM
;
57 case PROCESSOR_ARCHITECTURE_AMD64
:
58 SystemInfo
->dwProcessorType
= PROCESSOR_AMD_X8664
;
61 case PROCESSOR_ARCHITECTURE_IA64
:
62 SystemInfo
->dwProcessorType
= PROCESSOR_INTEL_IA64
;
66 SystemInfo
->dwProcessorType
= 0;
70 if (PV_NT351
> GetProcessVersion(0))
72 SystemInfo
->wProcessorLevel
= 0;
73 SystemInfo
->wProcessorRevision
= 0;
77 /* PUBLIC FUNCTIONS ***********************************************************/
84 GetLargePageMinimum(VOID
)
86 return SharedUserData
->LargePageMinimum
;
94 GetSystemInfo(IN LPSYSTEM_INFO lpSystemInfo
)
96 SYSTEM_BASIC_INFORMATION BasicInfo
;
97 SYSTEM_PROCESSOR_INFORMATION ProcInfo
;
100 Status
= NtQuerySystemInformation(SystemBasicInformation
,
104 if (!NT_SUCCESS(Status
)) return;
106 Status
= NtQuerySystemInformation(SystemProcessorInformation
,
110 if (!NT_SUCCESS(Status
)) return;
112 GetSystemInfoInternal(&BasicInfo
, &ProcInfo
, lpSystemInfo
);
120 IsProcessorFeaturePresent(IN DWORD ProcessorFeature
)
122 if (ProcessorFeature
>= PROCESSOR_FEATURE_MAX
) return FALSE
;
123 return ((BOOL
)SharedUserData
->ProcessorFeatures
[ProcessorFeature
]);
131 GetSystemRegistryQuota(OUT PDWORD pdwQuotaAllowed
,
132 OUT PDWORD pdwQuotaUsed
)
134 SYSTEM_REGISTRY_QUOTA_INFORMATION QuotaInfo
;
138 Status
= NtQuerySystemInformation(SystemRegistryQuotaInformation
,
142 if (NT_SUCCESS(Status
))
144 if (pdwQuotaAllowed
) *pdwQuotaAllowed
= QuotaInfo
.RegistryQuotaAllowed
;
145 if (pdwQuotaUsed
) *pdwQuotaUsed
= QuotaInfo
.RegistryQuotaUsed
;
149 BaseSetLastNTError(Status
);
158 GetNativeSystemInfo(IN LPSYSTEM_INFO lpSystemInfo
)
160 SYSTEM_BASIC_INFORMATION BasicInfo
;
161 SYSTEM_PROCESSOR_INFORMATION ProcInfo
;
164 /* FIXME: Should be SystemNativeBasicInformation */
165 Status
= NtQuerySystemInformation(SystemBasicInformation
,
169 if (!NT_SUCCESS(Status
)) return;
171 /* FIXME: Should be SystemNativeProcessorInformation */
172 Status
= NtQuerySystemInformation(SystemProcessorInformation
,
176 if (!NT_SUCCESS(Status
)) return;
178 GetSystemInfoInternal(&BasicInfo
, &ProcInfo
, lpSystemInfo
);
186 GetLogicalProcessorInformation(OUT PSYSTEM_LOGICAL_PROCESSOR_INFORMATION Buffer
,
187 IN OUT PDWORD ReturnLength
)
193 SetLastError(ERROR_INVALID_PARAMETER
);
197 Status
= NtQuerySystemInformation(SystemLogicalProcessorInformation
,
202 /* Normalize the error to what Win32 expects */
203 if (Status
== STATUS_INFO_LENGTH_MISMATCH
) Status
= STATUS_BUFFER_TOO_SMALL
;
204 if (!NT_SUCCESS(Status
))
206 BaseSetLastNTError(Status
);
218 GetNumaHighestNodeNumber(OUT PULONG HighestNodeNumber
)
229 GetNumaNodeProcessorMask(IN UCHAR Node
,
230 OUT PULONGLONG ProcessorMask
)
241 GetNumaProcessorNode(IN UCHAR Processor
,
242 OUT PUCHAR NodeNumber
)
253 GetNumaAvailableMemoryNode(IN UCHAR Node
,
254 OUT PULONGLONG AvailableBytes
)
265 GetFirmwareEnvironmentVariableW(IN LPCWSTR lpName
,
279 SetFirmwareEnvironmentVariableW(IN LPCWSTR lpName
,
293 GetFirmwareEnvironmentVariableA(IN LPCSTR lpName
,
307 SetFirmwareEnvironmentVariableA(IN LPCSTR lpName
,
321 EnumSystemFirmwareTables(IN DWORD FirmwareTableProviderSignature
,
322 OUT PVOID pFirmwareTableBuffer
,
334 GetSystemFirmwareTable(IN DWORD FirmwareTableProviderSignature
,
335 IN DWORD FirmwareTableID
,
336 OUT PVOID pFirmwareTableBuffer
,
348 GetSystemFileCacheSize(OUT PSIZE_T lpMinimumFileCacheSize
,
349 OUT PSIZE_T lpMaximumFileCacheSize
,
361 SetSystemFileCacheSize(IN SIZE_T MinimumFileCacheSize
,
362 IN SIZE_T MaximumFileCacheSize
,