1 /* $Id: sysinfo.c,v 1.3 1999/08/11 23:27:58 ekohl Exp $
3 * COPYRIGHT: See COPYING in the top level directory
4 * PROJECT: ReactOS kernel
5 * FILE: ntoskrnl/ex/sysinfo.c
6 * PURPOSE: System information functions
7 * PROGRAMMER: David Welch (welch@mcmail.com)
12 /* INCLUDES *****************************************************************/
14 #include <ddk/ntddk.h>
15 #include <ddk/zwtypes.h>
17 #include <internal/ex.h>
19 #include <internal/debug.h>
21 /* FUNCTIONS *****************************************************************/
25 NtQuerySystemEnvironmentValue (
26 IN PUNICODE_STRING Name
,
29 IN OUT PULONG ReturnLength
38 NtSetSystemEnvironmentValue (
39 IN PUNICODE_STRING VariableName
,
40 IN PUNICODE_STRING Value
49 NtQuerySystemInformation (
50 IN CINT SystemInformationClass
,
51 OUT PVOID SystemInformation
,
53 OUT PULONG ResultLength
57 * If called from user mode, check
58 * possible unsafe arguments.
61 if (KernelMode
!= KeGetPreviousMode())
75 * Clear the user buffer.
83 * Check the request is valid.
85 switch (SystemInformationClass
)
89 case SystemPerformanceInformation
:
91 * Check user buffer's size
93 if (Length
< sizeof())
96 return STATUS_INFO_LENGTH_MISMATCH
;
99 return STATUS_SUCCESS
;
101 case SystemDriverInformation
:
102 /* Check user buffer's size */
103 if (Length
< sizeof (SYSTEM_DRIVER_INFO
))
105 *ResultLength
= sizeof (SYSTEM_DRIVER_INFO
);
106 return STATUS_INFO_LENGTH_MISMATCH
;
109 return STATUS_SUCCESS
;
111 case SystemCacheInformation
:
112 /* Check user buffer's size */
113 if (Length
< sizeof (SYSTEM_CACHE_INFORMATION
))
115 *ResultLength
= sizeof (SYSTEM_CACHE_INFORMATION
);
116 return STATUS_INFO_LENGTH_MISMATCH
;
118 return STATUS_SUCCESS
;
120 case SystemTimeAdjustmentInformation
:
122 * Check user buffer's size
124 if (Length
< sizeof (SYSTEM_TIME_ADJUSTMENT
))
126 *ResultLength
= sizeof (SYSTEM_TIME_ADJUSTMENT
);
127 return STATUS_INFO_LENGTH_MISMATCH
;
130 return STATUS_SUCCESS
;
132 case SystemConfigurationInformation
:
134 PSYSTEM_CONFIGURATION_INFO Sci
135 = (PSYSTEM_CONFIGURATION_INFO
) SystemInformation
;
137 *ResultLength
= sizeof (SYSTEM_CONFIGUTATION_INFO
);
139 * Check user buffer's size
141 if (Length
< sizeof (SYSTEM_CONFIGURATION_INFO
))
143 return STATUS_INFO_LENGTH_MISMATCH
;
146 * Fill the object with config data.
147 * FIXME: some data should come from the
150 Sci
->tag2
.tag1
.ProcessorAchitecture
152 Sci
->tag2
.tag1
.Reserved
156 return STATUS_SUCCESS
;
160 case SystemTimeZoneInformation
: /* 44 */
161 *ResultLength
= sizeof (TIME_ZONE_INFORMATION
);
164 * Check user buffer's size
166 if (Length
< sizeof (TIME_ZONE_INFORMATION
))
168 return STATUS_INFO_LENGTH_MISMATCH
;
171 /* Copy the time zone information struct */
172 memcpy (SystemInformation
,
174 sizeof (TIME_ZONE_INFORMATION
));
176 return STATUS_SUCCESS
;
179 return STATUS_INVALID_INFO_CLASS
;
185 NtSetSystemInformation (
186 IN CINT SystemInformationClass
,
187 IN PVOID SystemInformation
,
188 IN ULONG SystemInformationLength
192 * If called from user mode, check
193 * possible unsafe arguments.
196 if (KernelMode
!= KeGetPreviousMode())
200 // SystemInformation,
211 * Check the request is valid.
213 switch (SystemInformationClass
)
217 case SystemTimeZoneInformation
: /* 44 */
219 * Check user buffer's size
221 if (SystemInformationLength
< sizeof (TIME_ZONE_INFORMATION
))
223 return STATUS_INFO_LENGTH_MISMATCH
;
226 /* Copy the time zone information struct */
227 memcpy (&SystemTimeZoneInfo
,
229 sizeof (TIME_ZONE_INFORMATION
));
231 return STATUS_SUCCESS
;
234 return STATUS_INVALID_INFO_CLASS
;
240 NtFlushInstructionCache (
241 IN HANDLE ProcessHandle
,
242 IN PVOID BaseAddress
,
243 IN UINT NumberOfBytesToFlush