Removed obsolete linux header files
[reactos.git] / reactos / ntoskrnl / ex / sysinfo.c
1 /* $Id: sysinfo.c,v 1.7 2000/10/22 16:36:49 ekohl Exp $
2 *
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)
8 * UPDATE HISTORY:
9 * Created 22/05/98
10 */
11
12 /* INCLUDES *****************************************************************/
13
14 #include <ddk/ntddk.h>
15 #include <internal/ex.h>
16 #include <internal/ldr.h>
17
18 #include <internal/debug.h>
19
20 extern ULONG NtGlobalFlag; /* FIXME: it should go in a ddk/?.h */
21
22 /* FUNCTIONS *****************************************************************/
23
24 NTSTATUS
25 STDCALL
26 NtQuerySystemEnvironmentValue (
27 IN PUNICODE_STRING Name,
28 OUT PVOID Value,
29 IN ULONG Length,
30 IN OUT PULONG ReturnLength
31 )
32 {
33 UNIMPLEMENTED;
34 }
35
36
37 NTSTATUS
38 STDCALL
39 NtSetSystemEnvironmentValue (
40 IN PUNICODE_STRING VariableName,
41 IN PUNICODE_STRING Value
42 )
43 {
44 UNIMPLEMENTED;
45 }
46
47
48 /* --- Query/Set System Information --- */
49
50
51 /*
52 * NOTE: QSI_DEF(n) and SSI_DEF(n) define _cdecl function symbols
53 * so the stack is popped only in one place on x86 platform.
54 */
55 #define QSI_USE(n) QSI##n
56 #define QSI_DEF(n) \
57 static NTSTATUS QSI_USE(n) (PVOID Buffer, ULONG Size, PULONG ReqSize)
58
59 #define SSI_USE(n) SSI##n
60 #define SSI_DEF(n) \
61 static NTSTATUS SSI_USE(n) (PVOID Buffer, ULONG Size)
62
63 /* Class 0 - Basic Information */
64 QSI_DEF(SystemBasicInformation)
65 {
66 PSYSTEM_BASIC_INFORMATION Sbi
67 = (PSYSTEM_BASIC_INFORMATION) Buffer;
68
69 *ReqSize = sizeof (SYSTEM_BASIC_INFORMATION);
70 /*
71 * Check user buffer's size
72 */
73 if (Size < sizeof (SYSTEM_BASIC_INFORMATION))
74 {
75 return (STATUS_INFO_LENGTH_MISMATCH);
76 }
77
78 Sbi->AlwaysZero = 0;
79 Sbi->KeMaximumIncrement = 0; /* FIXME */
80 Sbi->MmPageSize = PAGESIZE; /* FIXME: it should be PAGE_SIZE */
81 Sbi->MmNumberOfPhysicalPages = 0; /* FIXME */
82 Sbi->MmLowestPhysicalPage = 0; /* FIXME */
83 Sbi->MmHighestPhysicalPage = 0; /* FIXME */
84 Sbi->MmLowestUserAddress = 0; /* FIXME */
85 Sbi->MmLowestUserAddress1 = 0; /* FIXME */
86 Sbi->MmHighestUserAddress = 0; /* FIXME */
87 Sbi->KeActiveProcessors = 0x00000001; /* FIXME */
88 Sbi->KeNumberProcessors = 1; /* FIXME */
89
90 return (STATUS_SUCCESS);
91 }
92
93 /* Class 1 - Processor Information */
94 QSI_DEF(SystemProcessorInformation)
95 {
96 PSYSTEM_PROCESSOR_INFORMATION Spi
97 = (PSYSTEM_PROCESSOR_INFORMATION) Buffer;
98
99 *ReqSize = sizeof (SYSTEM_PROCESSOR_INFORMATION);
100 /*
101 * Check user buffer's size
102 */
103 if (Size < sizeof (SYSTEM_PROCESSOR_INFORMATION))
104 {
105 return (STATUS_INFO_LENGTH_MISMATCH);
106 }
107
108 /* FIXME: add CPU type detection code */
109 Spi->KeProcessorArchitecture = 0; /* FIXME */
110 Spi->KeProcessorLevel = 0; /* FIXME */
111 Spi->KeProcessorRevision = 0; /* FIXME */
112 Spi->AlwaysZero = 0;
113 Spi->KeFeatureBits = 0x00000000; /* FIXME */
114
115 return (STATUS_SUCCESS);
116 }
117
118 /* Class 2 - Performance Information */
119 QSI_DEF(SystemPerformanceInfo)
120 {
121 PSYSTEM_PERFORMANCE_INFO Spi
122 = (PSYSTEM_PERFORMANCE_INFO) Buffer;
123
124 *ReqSize = sizeof (SYSTEM_PERFORMANCE_INFO);
125 /*
126 * Check user buffer's size
127 */
128 if (Size < sizeof (SYSTEM_PERFORMANCE_INFO))
129 {
130 return (STATUS_INFO_LENGTH_MISMATCH);
131 }
132
133 Spi->TotalProcessorTime.QuadPart = 0; /* FIXME */
134 Spi->IoReadTransferCount.QuadPart = 0; /* FIXME */
135 Spi->IoWriteTransferCount.QuadPart = 0; /* FIXME */
136 Spi->IoOtherTransferCount.QuadPart = 0; /* FIXME */
137 Spi->IoReadOperationCount = 0; /* FIXME */
138 Spi->IoWriteOperationCount = 0; /* FIXME */
139 Spi->IoOtherOperationCount = 0; /* FIXME */
140 Spi->MmAvailablePages = 0; /* FIXME */
141 Spi->MmTotalCommitedPages = 0; /* FIXME */
142 Spi->MmTotalCommitLimit = 0; /* FIXME */
143 Spi->MmPeakLimit = 0; /* FIXME */
144 Spi->PageFaults = 0; /* FIXME */
145 Spi->WriteCopies = 0; /* FIXME */
146 Spi->TransitionFaults = 0; /* FIXME */
147 Spi->Unknown1 = 0; /* FIXME */
148 Spi->DemandZeroFaults = 0; /* FIXME */
149 Spi->PagesInput = 0; /* FIXME */
150 Spi->PagesRead = 0; /* FIXME */
151 Spi->Unknown2 = 0; /* FIXME */
152 Spi->Unknown3 = 0; /* FIXME */
153 Spi->PagesOutput = 0; /* FIXME */
154 Spi->PageWrites = 0; /* FIXME */
155 Spi->Unknown4 = 0; /* FIXME */
156 Spi->Unknown5 = 0; /* FIXME */
157 Spi->PoolPagedBytes = 0; /* FIXME */
158 Spi->PoolNonPagedBytes = 0; /* FIXME */
159 Spi->Unknown6 = 0; /* FIXME */
160 Spi->Unknown7 = 0; /* FIXME */
161 Spi->Unknown8 = 0; /* FIXME */
162 Spi->Unknown9 = 0; /* FIXME */
163 Spi->MmTotalSystemFreePtes = 0; /* FIXME */
164 Spi->MmSystemCodepage = 0; /* FIXME */
165 Spi->MmTotalSystemDriverPages = 0; /* FIXME */
166 Spi->MmTotalSystemCodePages = 0; /* FIXME */
167 Spi->Unknown10 = 0; /* FIXME */
168 Spi->Unknown11 = 0; /* FIXME */
169 Spi->Unknown12 = 0; /* FIXME */
170 Spi->MmSystemCachePage = 0; /* FIXME */
171 Spi->MmPagedPoolPage = 0; /* FIXME */
172 Spi->MmSystemDriverPage = 0; /* FIXME */
173 Spi->CcFastReadNoWait = 0; /* FIXME */
174 Spi->CcFastReadWait = 0; /* FIXME */
175 Spi->CcFastReadResourceMiss = 0; /* FIXME */
176 Spi->CcFastReadNotPossible = 0; /* FIXME */
177 Spi->CcFastMdlReadNoWait = 0; /* FIXME */
178 Spi->CcFastMdlReadWait = 0; /* FIXME */
179 Spi->CcFastMdlReadResourceMiss = 0; /* FIXME */
180 Spi->CcFastMdlReadNotPossible = 0; /* FIXME */
181 Spi->CcMapDataNoWait = 0; /* FIXME */
182 Spi->CcMapDataWait = 0; /* FIXME */
183 Spi->CcMapDataNoWaitMiss = 0; /* FIXME */
184 Spi->CcMapDataWaitMiss = 0; /* FIXME */
185 Spi->CcPinMappedDataCount = 0; /* FIXME */
186 Spi->CcPinReadNoWait = 0; /* FIXME */
187 Spi->CcPinReadWait = 0; /* FIXME */
188 Spi->CcPinReadNoWaitMiss = 0; /* FIXME */
189 Spi->CcPinReadWaitMiss = 0; /* FIXME */
190 Spi->CcCopyReadNoWait = 0; /* FIXME */
191 Spi->CcCopyReadWait = 0; /* FIXME */
192 Spi->CcCopyReadNoWaitMiss = 0; /* FIXME */
193 Spi->CcCopyReadWaitMiss = 0; /* FIXME */
194 Spi->CcMdlReadNoWait = 0; /* FIXME */
195 Spi->CcMdlReadWait = 0; /* FIXME */
196 Spi->CcMdlReadNoWaitMiss = 0; /* FIXME */
197 Spi->CcMdlReadWaitMiss = 0; /* FIXME */
198 Spi->CcReadaheadIos = 0; /* FIXME */
199 Spi->CcLazyWriteIos = 0; /* FIXME */
200 Spi->CcLazyWritePages = 0; /* FIXME */
201 Spi->CcDataFlushes = 0; /* FIXME */
202 Spi->CcDataPages = 0; /* FIXME */
203 Spi->ContextSwitches = 0; /* FIXME */
204 Spi->Unknown13 = 0; /* FIXME */
205 Spi->Unknown14 = 0; /* FIXME */
206 Spi->SystemCalls = 0; /* FIXME */
207
208 return (STATUS_SUCCESS);
209 }
210
211 /* Class 3 - Time Information */
212 QSI_DEF(SystemTimeInformation)
213 {
214 PSYSTEM_TIME_INFORMATION Sti
215 = (PSYSTEM_TIME_INFORMATION) Buffer;
216
217 *ReqSize = sizeof (SYSTEM_TIME_INFORMATION);
218 /*
219 * Check user buffer's size
220 */
221 if (Size < sizeof (SYSTEM_TIME_INFORMATION))
222 {
223 return (STATUS_INFO_LENGTH_MISMATCH);
224 }
225
226 Sti->KeBootTime.QuadPart = 0; /* FIXME */
227 Sti->KeSystemTime.QuadPart = 0; /* FIXME */
228 Sti->ExpTimeZoneBias.QuadPart = 0; /* FIXME */
229 Sti->ExpTimeZoneId = 0; /* FIXME */
230 Sti->Unused = 0; /* FIXME */
231
232 return (STATUS_SUCCESS);
233 }
234
235 /* Class 4 - Path Information */
236 QSI_DEF(SystemPathInformation)
237 {
238 /* FIXME: QSI returns STATUS_BREAKPOINT. Why? */
239 return (STATUS_BREAKPOINT);
240 }
241
242 /* Class 5 - Process Information */
243 QSI_DEF(SystemProcessInformation)
244 {
245 /* FIXME: scan the process+thread list */
246 return (STATUS_NOT_IMPLEMENTED);
247 }
248
249 /* Class 6 - SDT Information */
250 QSI_DEF(SystemServiceDescriptorTableInfo)
251 {
252 /* FIXME */
253 return (STATUS_NOT_IMPLEMENTED);
254 }
255
256 /* Class 7 - I/O Configuration Information */
257 QSI_DEF(SystemIoConfigInfo)
258 {
259 /* FIXME */
260 return (STATUS_NOT_IMPLEMENTED);
261 }
262
263 /* Class 8 - Processor Time Information */
264 QSI_DEF(SystemProcessorTimeInfo)
265 {
266 /* FIXME */
267 return (STATUS_NOT_IMPLEMENTED);
268 }
269
270 /* Class 9 - Global Flag Information */
271 QSI_DEF(SystemNtGlobalFlagInformation)
272 {
273 if (sizeof (SYSTEM_GLOBAL_FLAG_INFO) != Size)
274 {
275 * ReqSize = sizeof (SYSTEM_GLOBAL_FLAG_INFO);
276 return (STATUS_INFO_LENGTH_MISMATCH);
277 }
278 ((PSYSTEM_GLOBAL_FLAG_INFO) Buffer)->NtGlobalFlag = NtGlobalFlag;
279 return (STATUS_SUCCESS);
280 }
281
282 SSI_DEF(SystemNtGlobalFlagInformation)
283 {
284 if (sizeof (SYSTEM_GLOBAL_FLAG_INFO) != Size)
285 {
286 return (STATUS_INFO_LENGTH_MISMATCH);
287 }
288 NtGlobalFlag = ((PSYSTEM_GLOBAL_FLAG_INFO) Buffer)->NtGlobalFlag;
289 return (STATUS_SUCCESS);
290 }
291
292 /* Class 10 - ? Information */
293 QSI_DEF(SystemInformation10)
294 {
295 /* FIXME */
296 return (STATUS_NOT_IMPLEMENTED);
297 }
298
299 /* Class 11 - Modules Information */
300 QSI_DEF(SystemModuleInfo)
301 {
302 /* FIXME */
303 return (STATUS_NOT_IMPLEMENTED);
304 }
305
306 /* Class 12 - Resource Lock Information */
307 QSI_DEF(SystemResourceLockInfo)
308 {
309 /* FIXME */
310 return (STATUS_NOT_IMPLEMENTED);
311 }
312
313 /* Class 13 - ? Information */
314 QSI_DEF(SystemInformation13)
315 {
316 /* FIXME */
317 return (STATUS_NOT_IMPLEMENTED);
318 }
319
320 /* Class 14 - ? Information */
321 QSI_DEF(SystemInformation14)
322 {
323 /* FIXME */
324 return (STATUS_NOT_IMPLEMENTED);
325 }
326
327 /* Class 15 - ? Information */
328 QSI_DEF(SystemInformation15)
329 {
330 /* FIXME */
331 return (STATUS_NOT_IMPLEMENTED);
332 }
333
334 /* Class 16 - Handle Information */
335 QSI_DEF(SystemHandleInfo)
336 {
337 /* FIXME */
338 return (STATUS_NOT_IMPLEMENTED);
339 }
340
341 /* Class 17 - Information */
342 QSI_DEF(SystemObjectInformation)
343 {
344 /* FIXME */
345 return (STATUS_NOT_IMPLEMENTED);
346 }
347
348 /* Class 18 - Information */
349 QSI_DEF(SystemPageFileInformation)
350 {
351 /* FIXME */
352 return (STATUS_NOT_IMPLEMENTED);
353 }
354
355 /* Class 19 - Information */
356 QSI_DEF(SystemInstructionEmulationInfo)
357 {
358 /* FIXME */
359 return (STATUS_NOT_IMPLEMENTED);
360 }
361
362 /* Class 20 - ? Information */
363 QSI_DEF(SystemInformation20)
364 {
365 /* FIXME */
366 return (STATUS_NOT_IMPLEMENTED);
367 }
368
369 /* Class 21 - Information */
370 QSI_DEF(SystemCacheInformation)
371 {
372 if (Size < sizeof (SYSTEM_CACHE_INFORMATION))
373 {
374 * ReqSize = sizeof (SYSTEM_CACHE_INFORMATION);
375 return (STATUS_INFO_LENGTH_MISMATCH);
376 }
377 /* FIXME */
378 return (STATUS_NOT_IMPLEMENTED);
379 }
380
381 SSI_DEF(SystemCacheInformation)
382 {
383 if (Size < sizeof (SYSTEM_CACHE_INFORMATION))
384 {
385 return (STATUS_INFO_LENGTH_MISMATCH);
386 }
387 /* FIXME */
388 return (STATUS_NOT_IMPLEMENTED);
389 }
390
391 /* Class 22 - Pool Tag Information */
392 QSI_DEF(SystemPoolTagInformation)
393 {
394 /* FIXME */
395 return (STATUS_NOT_IMPLEMENTED);
396 }
397
398 /* Class 23 - Processor Schedule Information */
399 QSI_DEF(SystemProcessorScheduleInfo)
400 {
401 /* FIXME */
402 return (STATUS_NOT_IMPLEMENTED);
403 }
404
405 /* Class 24 - DPC Information */
406 QSI_DEF(SystemDpcInformation)
407 {
408 /* FIXME */
409 return (STATUS_NOT_IMPLEMENTED);
410 }
411
412 SSI_DEF(SystemDpcInformation)
413 {
414 /* FIXME */
415 return (STATUS_NOT_IMPLEMENTED);
416 }
417
418 /* Class 25 - ? Information */
419 QSI_DEF(SystemInformation25)
420 {
421 /* FIXME */
422 return (STATUS_NOT_IMPLEMENTED);
423 }
424
425 /* Class 26 - Load Gdi Driver Information */
426 SSI_DEF(SystemLoadGdiDriverInformation)
427 {
428 PSYSTEM_GDI_DRIVER_INFORMATION Sdi
429 = (PSYSTEM_GDI_DRIVER_INFORMATION) Buffer;
430
431 if (sizeof (SYSTEM_GDI_DRIVER_INFORMATION) != Size)
432 {
433 return (STATUS_INFO_LENGTH_MISMATCH);
434 }
435
436 return LdrLoadGdiDriver (&Sdi->DriverName,
437 &Sdi->ImageAddress,
438 &Sdi->SectionPointer,
439 &Sdi->EntryPoint,
440 &Sdi->ExportSectionPointer);
441 }
442
443 /* Class 27 - Unload Gdi Driver Information */
444 SSI_DEF(SystemUnloadGdiDriverInformation)
445 {
446 /* FIXME */
447 return (STATUS_NOT_IMPLEMENTED);
448 }
449
450 /* Class 28 - Information */
451 QSI_DEF(SystemTimeAdjustmentInformation)
452 {
453 if (sizeof (SYSTEM_TIME_ADJUSTMENT_INFO) > Size)
454 {
455 * ReqSize = sizeof (SYSTEM_TIME_ADJUSTMENT_INFO);
456 return (STATUS_INFO_LENGTH_MISMATCH);
457 }
458 /* FIXME: */
459 return (STATUS_NOT_IMPLEMENTED);
460 }
461
462 SSI_DEF(SystemTimeAdjustmentInformation)
463 {
464 if (sizeof (SYSTEM_TIME_ADJUSTMENT_INFO) > Size)
465 {
466 return (STATUS_INFO_LENGTH_MISMATCH);
467 }
468 /* FIXME: */
469 return (STATUS_NOT_IMPLEMENTED);
470 }
471
472 /* Class 29 - ? Information */
473 QSI_DEF(SystemInformation29)
474 {
475 /* FIXME */
476 return (STATUS_NOT_IMPLEMENTED);
477 }
478
479 /* Class 30 - ? Information */
480 QSI_DEF(SystemInformation30)
481 {
482 /* FIXME */
483 return (STATUS_NOT_IMPLEMENTED);
484 }
485
486 /* Class 31 - ? Information */
487 QSI_DEF(SystemInformation31)
488 {
489 /* FIXME */
490 return (STATUS_NOT_IMPLEMENTED);
491 }
492
493 /* Class 32 - Crach Dump Information */
494 QSI_DEF(SystemCrashDumpSectionInfo)
495 {
496 /* FIXME */
497 return (STATUS_NOT_IMPLEMENTED);
498 }
499
500 /* Class 33 - Processor Fault Information */
501 QSI_DEF(SystemProcessorFaultCountInfo)
502 {
503 /* FIXME */
504 return (STATUS_NOT_IMPLEMENTED);
505 }
506
507 /* Class 34 - Crach Dump State Information */
508 QSI_DEF(SystemCrashDumpStateInfo)
509 {
510 /* FIXME */
511 return (STATUS_NOT_IMPLEMENTED);
512 }
513
514 /* Class 35 - Debugger Information */
515 QSI_DEF(SystemDebuggerInfo)
516 {
517 /* FIXME */
518 return (STATUS_NOT_IMPLEMENTED);
519 }
520
521 /* Class 36 - Thread Switch Counters Information */
522 QSI_DEF(SystemThreadSwitchCountersInfo)
523 {
524 /* FIXME */
525 return (STATUS_NOT_IMPLEMENTED);
526 }
527
528 /* Class 37 - Quota Information */
529 QSI_DEF(SystemQuotaInformation)
530 {
531 /* FIXME */
532 return (STATUS_NOT_IMPLEMENTED);
533 }
534
535 SSI_DEF(SystemQuotaInformation)
536 {
537 /* FIXME */
538 return (STATUS_NOT_IMPLEMENTED);
539 }
540
541 /* Class 38 - Load Driver Information */
542 SSI_DEF(SystemLoadDriverInfo)
543 {
544 /* FIXME */
545 return (STATUS_NOT_IMPLEMENTED);
546 }
547
548 /* Class 39 - Priority Separation Information */
549 SSI_DEF(SystemPrioritySeparationInfo)
550 {
551 /* FIXME */
552 return (STATUS_NOT_IMPLEMENTED);
553 }
554
555 /* Class 40 - ? Information */
556 QSI_DEF(SystemInformation40)
557 {
558 /* FIXME */
559 return (STATUS_NOT_IMPLEMENTED);
560 }
561
562 /* Class 41 - ? Information */
563 QSI_DEF(SystemInformation41)
564 {
565 /* FIXME */
566 return (STATUS_NOT_IMPLEMENTED);
567 }
568
569 /* Class 42 - ? Information */
570 QSI_DEF(SystemInformation42)
571 {
572 /* FIXME */
573 return (STATUS_NOT_IMPLEMENTED);
574 }
575
576 /* Class 43 - ? Information */
577 QSI_DEF(SystemInformation43)
578 {
579 /* FIXME */
580 return (STATUS_NOT_IMPLEMENTED);
581 }
582
583 /* Class 44 - Information */
584 QSI_DEF(SystemTimeZoneInformation)
585 {
586 * ReqSize = sizeof (TIME_ZONE_INFORMATION);
587
588 if (sizeof (TIME_ZONE_INFORMATION) != Size)
589 {
590 return (STATUS_INFO_LENGTH_MISMATCH);
591 }
592 /* Copy the time zone information struct */
593 memcpy (
594 Buffer,
595 & SystemTimeZoneInfo,
596 sizeof (TIME_ZONE_INFORMATION)
597 );
598
599 return (STATUS_SUCCESS);
600 }
601
602
603 SSI_DEF(SystemTimeZoneInformation)
604 {
605 /*
606 * Check user buffer's size
607 */
608 if (Size < sizeof (TIME_ZONE_INFORMATION))
609 {
610 return (STATUS_INFO_LENGTH_MISMATCH);
611 }
612 /* Copy the time zone information struct */
613 memcpy (
614 & SystemTimeZoneInfo,
615 (TIME_ZONE_INFORMATION *) Buffer,
616 sizeof (TIME_ZONE_INFORMATION)
617 );
618 return (STATUS_SUCCESS);
619 }
620
621
622 /* Class 45 - Information */
623 QSI_DEF(SystemLookasideInformation)
624 {
625 /* FIXME */
626 return (STATUS_NOT_IMPLEMENTED);
627 }
628
629
630 /* Query/Set Calls Table */
631 typedef
632 struct _QSSI_CALLS
633 {
634 NTSTATUS (* Query) (PVOID,ULONG,PULONG);
635 NTSTATUS (* Set) (PVOID,ULONG);
636
637 } QSSI_CALLS;
638
639 // QS Query & Set
640 // QX Query
641 // XQ Set
642 // XX unknown behaviour
643 //
644 #define SI_QS(n) {QSI_USE(n),SSI_USE(n)}
645 #define SI_QX(n) {QSI_USE(n),NULL}
646 #define SI_XS(n) {NULL,SSI_USE(n)}
647 #define SI_XX(n) {NULL,NULL}
648
649 static
650 QSSI_CALLS
651 CallQS [] =
652 {
653 SI_QX(SystemBasicInformation),
654 SI_QX(SystemProcessorInformation),
655 SI_QX(SystemPerformanceInfo),
656 SI_QX(SystemTimeInformation),
657 SI_QX(SystemPathInformation), /* should be SI_XX */
658 SI_QX(SystemProcessInformation),
659 SI_QX(SystemServiceDescriptorTableInfo),
660 SI_QX(SystemIoConfigInfo),
661 SI_QX(SystemProcessorTimeInfo),
662 SI_QS(SystemNtGlobalFlagInformation),
663 SI_QX(SystemInformation10), /* should be SI_XX */
664 SI_QX(SystemModuleInfo),
665 SI_QX(SystemResourceLockInfo),
666 SI_QX(SystemInformation13), /* should be SI_XX */
667 SI_QX(SystemInformation14), /* should be SI_XX */
668 SI_QX(SystemInformation15), /* should be SI_XX */
669 SI_QX(SystemHandleInfo),
670 SI_QX(SystemObjectInformation),
671 SI_QX(SystemPageFileInformation),
672 SI_QX(SystemInstructionEmulationInfo),
673 SI_QX(SystemInformation20), /* it should be SI_XX */
674 SI_QS(SystemCacheInformation),
675 SI_QX(SystemPoolTagInformation),
676 SI_QX(SystemProcessorScheduleInfo),
677 SI_QS(SystemDpcInformation),
678 SI_QX(SystemInformation25), /* it should be SI_XX */
679 SI_XS(SystemLoadGdiDriverInformation),
680 SI_XS(SystemUnloadGdiDriverInformation),
681 SI_QS(SystemTimeAdjustmentInformation),
682 SI_QX(SystemInformation29), /* it should be SI_XX */
683 SI_QX(SystemInformation30), /* it should be SI_XX */
684 SI_QX(SystemInformation31), /* it should be SI_XX */
685 SI_QX(SystemCrashDumpSectionInfo),
686 SI_QX(SystemProcessorFaultCountInfo),
687 SI_QX(SystemCrashDumpStateInfo),
688 SI_QX(SystemDebuggerInfo),
689 SI_QX(SystemThreadSwitchCountersInfo),
690 SI_QS(SystemQuotaInformation),
691 SI_XS(SystemLoadDriverInfo),
692 SI_XS(SystemPrioritySeparationInfo),
693 SI_QX(SystemInformation40), /* it should be SI_XX */
694 SI_QX(SystemInformation41), /* it should be SI_XX */
695 SI_QX(SystemInformation42), /* it should be SI_XX */
696 SI_QX(SystemInformation43), /* it should be SI_XX */
697 SI_QS(SystemTimeZoneInformation), /* it should be SI_QX */
698 SI_QX(SystemLookasideInformation)
699 };
700
701
702 NTSTATUS
703 STDCALL
704 NtQuerySystemInformation (
705 IN SYSTEM_INFORMATION_CLASS SystemInformationClass,
706 OUT PVOID SystemInformation,
707 IN ULONG Length,
708 OUT PULONG ResultLength
709 )
710 {
711 /*
712 * If called from user mode, check
713 * possible unsafe arguments.
714 */
715 #if 0
716 if (KernelMode != KeGetPreviousMode())
717 {
718 // Check arguments
719 //ProbeForWrite(
720 // SystemInformation,
721 // Length
722 // );
723 //ProbeForWrite(
724 // ResultLength,
725 // sizeof (ULONG)
726 // );
727 }
728 #endif
729 /*
730 * Clear the user buffer.
731 */
732 RtlZeroMemory (SystemInformation, Length);
733 /*
734 * Check the request is valid.
735 */
736 if ( (SystemInformationClass >= SystemInformationClassMin)
737 && (SystemInformationClass < SystemInformationClassMax)
738 )
739 {
740 if (NULL != CallQS [SystemInformationClass].Query)
741 {
742 /*
743 * Hand the request to a subhandler.
744 */
745 return CallQS [SystemInformationClass].Query (
746 SystemInformation,
747 Length,
748 ResultLength
749 );
750 }
751 }
752 return (STATUS_INVALID_INFO_CLASS);
753 }
754
755
756 NTSTATUS
757 STDCALL
758 NtSetSystemInformation (
759 IN SYSTEM_INFORMATION_CLASS SystemInformationClass,
760 IN PVOID SystemInformation,
761 IN ULONG SystemInformationLength
762 )
763 {
764 /*
765 * If called from user mode, check
766 * possible unsafe arguments.
767 */
768 #if 0
769 if (KernelMode != KeGetPreviousMode())
770 {
771 // Check arguments
772 //ProbeForWrite(
773 // SystemInformation,
774 // Length
775 // );
776 //ProbeForWrite(
777 // ResultLength,
778 // sizeof (ULONG)
779 // );
780 }
781 #endif
782 /*
783 * Check the request is valid.
784 */
785 if ( (SystemInformationClass >= SystemInformationClassMin)
786 && (SystemInformationClass < SystemInformationClassMax)
787 )
788 {
789 if (NULL != CallQS [SystemInformationClass].Set)
790 {
791 /*
792 * Hand the request to a subhandler.
793 */
794 return CallQS [SystemInformationClass].Set (
795 SystemInformation,
796 SystemInformationLength
797 );
798 }
799 }
800 return (STATUS_INVALID_INFO_CLASS);
801 }
802
803
804 NTSTATUS
805 STDCALL
806 NtFlushInstructionCache (
807 IN HANDLE ProcessHandle,
808 IN PVOID BaseAddress,
809 IN UINT NumberOfBytesToFlush
810 )
811 {
812 UNIMPLEMENTED;
813 }
814
815
816 /* EOF */