fixed calls to NtDuplicateObject
[reactos.git] / reactos / lib / kernel32 / misc / sysinfo.c
1 /* $Id$
2 *
3 * reactos/lib/kernel32/misc/sysinfo.c
4 *
5 */
6 #include <k32.h>
7
8 #define NDEBUG
9 #include "../include/debug.h"
10
11
12 #define PV_NT351 0x00030033
13
14 /*
15 * @unimplemented
16 */
17 VOID
18 STDCALL
19 GetSystemInfo (
20 LPSYSTEM_INFO Si
21 )
22 {
23 SYSTEM_BASIC_INFORMATION Sbi;
24 SYSTEM_PROCESSOR_INFORMATION Spi;
25 DWORD ProcessVersion;
26 NTSTATUS Status;
27
28 RtlZeroMemory (Si, sizeof (SYSTEM_INFO));
29 Status = NtQuerySystemInformation (
30 SystemBasicInformation, /* 0 */
31 & Sbi,
32 sizeof Sbi, /* 44 */
33 0
34 );
35 if (STATUS_SUCCESS != Status)
36 {
37 SetLastErrorByStatus (Status);
38 return;
39 }
40 Status = NtQuerySystemInformation (
41 SystemProcessorInformation, /* 1 */
42 & Spi,
43 sizeof Spi, /* 12 */
44 0
45 );
46 if (STATUS_SUCCESS != Status)
47 {
48 SetLastErrorByStatus (Status);
49 return;
50 }
51 /*
52 * PROCESSOR_ARCHITECTURE_INTEL 0
53 * PROCESSOR_ARCHITECTURE_MIPS 1
54 * PROCESSOR_ARCHITECTURE_ALPHA 2
55 * PROCESSOR_ARCHITECTURE_PPC 3
56 * PROCESSOR_ARCHITECTURE_UNKNOWN 0xFFFF
57 */
58 Si->wProcessorArchitecture = Spi.ProcessorArchitecture;
59 /* For future use: always zero */
60 Si->wReserved = 0;
61 Si->dwPageSize = Sbi.PageSize;
62 Si->lpMinimumApplicationAddress = (PVOID)Sbi.MinimumUserModeAddress;
63 Si->lpMaximumApplicationAddress = (PVOID)Sbi.MaximumUserModeAddress;
64 Si->dwActiveProcessorMask = Sbi.ActiveProcessorsAffinityMask;
65 Si->dwNumberOfProcessors = Sbi.NumberOfProcessors;
66 /*
67 * Compatibility (no longer relevant):
68 * PROCESSOR_INTEL_386 386
69 * PROCESSOR_INTEL_486 486
70 * PROCESSOR_INTEL_PENTIUM 586
71 * PROCESSOR_MIPS_R4000 4000
72 * PROCESSOR_ALPHA_21064 21064
73 */
74 switch (Spi.ProcessorArchitecture)
75 {
76 case PROCESSOR_ARCHITECTURE_INTEL:
77 switch (Spi.ProcessorLevel)
78 {
79 case 3:
80 Si->dwProcessorType = PROCESSOR_INTEL_386;
81 break;
82 case 4:
83 Si->dwProcessorType = PROCESSOR_INTEL_486;
84 break;
85 case 5:
86 Si->dwProcessorType = PROCESSOR_INTEL_PENTIUM;
87 break;
88 default:
89 /* FIXME: P2, P3, P4...? */
90 Si->dwProcessorType = PROCESSOR_INTEL_PENTIUM;
91 }
92 break;
93
94 case PROCESSOR_ARCHITECTURE_MIPS:
95 Si->dwProcessorType = PROCESSOR_MIPS_R4000;
96 break;
97
98 case PROCESSOR_ARCHITECTURE_ALPHA:
99 Si->dwProcessorType = PROCESSOR_ALPHA_21064;
100 break;
101
102 case PROCESSOR_ARCHITECTURE_IA64:
103 Si->dwProcessorType = PROCESSOR_INTEL_IA64;
104 break;
105
106 case PROCESSOR_ARCHITECTURE_PPC:
107 switch (Spi.ProcessorLevel)
108 {
109 case 1:
110 Si->dwProcessorType = PROCESSOR_PPC_601;
111 break;
112 case 3:
113 Si->dwProcessorType = PROCESSOR_PPC_603;
114 break;
115 case 4:
116 Si->dwProcessorType = PROCESSOR_PPC_604;
117 break;
118 case 6:
119 /* PPC 603+ */
120 Si->dwProcessorType = PROCESSOR_PPC_603;
121 break;
122 case 9:
123 /* PPC 604+ */
124 Si->dwProcessorType = PROCESSOR_PPC_604;
125 break;
126 case 20:
127 Si->dwProcessorType = PROCESSOR_PPC_620;
128 break;
129 default:
130 Si->dwProcessorType = -1;
131 }
132 break;
133
134 }
135 /* Once hardcoded to 64kb */
136 Si->dwAllocationGranularity = Sbi.AllocationGranularity;
137 /* */
138 Si->wProcessorLevel = Spi.ProcessorLevel;
139 Si->wProcessorRevision = Spi.ProcessorRevision;
140 /*
141 * Get the version of Windows on which
142 * the process expects to run.
143 */
144 ProcessVersion = GetProcessVersion (0); /* current process */
145 /* In NT 3.1 and 3.5 these fields were always zero. */
146 if (PV_NT351 > ProcessVersion)
147 {
148 Si->wProcessorLevel = 0;
149 Si->wProcessorRevision = 0;
150 }
151 }
152
153
154 /*
155 * @unimplemented
156 */
157 BOOL STDCALL
158 IsProcessorFeaturePresent(DWORD ProcessorFeature)
159 {
160 if (ProcessorFeature >= PROCESSOR_FEATURE_MAX)
161 return(FALSE);
162
163 return((BOOL)SharedUserData->ProcessorFeatures[ProcessorFeature]);
164 }
165
166
167 /*
168 * @implemented
169 */
170 BOOL
171 STDCALL
172 GetSystemRegistryQuota(PDWORD pdwQuotaAllowed,
173 PDWORD pdwQuotaUsed)
174 {
175 SYSTEM_REGISTRY_QUOTA_INFORMATION srqi;
176 ULONG BytesWritten;
177 NTSTATUS Status;
178
179 Status = NtQuerySystemInformation(SystemRegistryQuotaInformation,
180 &srqi,
181 sizeof(srqi),
182 &BytesWritten);
183 if(NT_SUCCESS(Status))
184 {
185 if(pdwQuotaAllowed != NULL)
186 {
187 *pdwQuotaAllowed = srqi.RegistryQuotaAllowed;
188 }
189 if(pdwQuotaUsed != NULL)
190 {
191 *pdwQuotaUsed = srqi.RegistryQuotaUsed;
192 }
193
194 return TRUE;
195 }
196
197 SetLastErrorByStatus(Status);
198 return FALSE;
199 }
200
201 /*
202 * @implemented
203 */
204 VOID
205 STDCALL
206 GetNativeSystemInfo(
207 LPSYSTEM_INFO lpSystemInfo
208 )
209 {
210 //FIXME: GetNativeSystemInfo should return always the real Hardware Processorarchitecture
211 // in case a Program is running in 32bit Mode on AMD64
212 // GetSystemInfo should return PROCESSOR_ARCHITECTURE_INTEL and
213 // GetNativeSystemInfo should return PROCESSOR_ARCHITECTURE_AMD64
214 GetSystemInfo(lpSystemInfo);
215 }
216
217 /* EOF */