diff --git a/reactos/include/ddk/zwtypes.h b/reactos/include/ddk/zwtypes.h index 68bac026df9..19acbc036f1 100644 --- a/reactos/include/ddk/zwtypes.h +++ b/reactos/include/ddk/zwtypes.h @@ -112,7 +112,7 @@ struct _LPC_MESSAGE #define ObjectNameInformation 1 #define ObjectTypeInformation 2 #define ObjectAllInformation 3 -#define ObjectDataInformation 4 +#define ObjectDataInformation 4 // semaphore information @@ -125,9 +125,12 @@ struct _LPC_MESSAGE // system information #define SystemPerformanceInformation 5 +#define SystemDriverInformation 11 #define SystemCacheInformation 21 #define SystemTimeAdjustmentInformation 28 +#define SystemTimeZoneInformation 44 + // shutdown action typedef enum SHUTDOWN_ACTION_TAG { @@ -286,9 +289,26 @@ typedef struct _OBJECT_TYPE_INFORMATION // system information +typedef struct _SYSTEM_DRIVER_INFO +{ + PVOID BaseAddress; + DWORD Unknown1; + DWORD Unknown2; + DWORD EntryIndex; + DWORD Unknown4; + CHAR DriverName[MAX_PATH+1]; +} SYSTEM_DRIVER_INFO, *PSYSTEM_DRIVER_INFO; + +typedef struct _SYSTEM_DRIVERS_INFO +{ + DWORD DriverCount; + SYSTEM_DRIVER_INFO DriverInfo[1]; +} SYSTEM_DRIVERS_INFO, *PSYSTEM_DRIVERS_INFO; + + typedef struct _SYSTEM_TIME_ADJUSTMENT { - ULONG TimeAdjustment; + ULONG TimeAdjustment; BOOL TimeAdjustmentDisabled; } SYSTEM_TIME_ADJUSTMENT, *PSYSTEM_TIME_ADJUSTMENT; @@ -321,6 +341,8 @@ typedef struct _SYSTEM_CACHE_INFORMATION { ULONG Unused[4]; } SYSTEM_CACHE_INFORMATION; +// file information + typedef struct _FILE_BASIC_INFORMATION { TIME CreationTime; diff --git a/reactos/include/internal/ex.h b/reactos/include/internal/ex.h index ce3d2c01ece..239b208e228 100644 --- a/reactos/include/internal/ex.h +++ b/reactos/include/internal/ex.h @@ -1,2 +1,31 @@ +/* + * internal executive prototypes + */ + +#ifndef _INCLUDE_INTERNAL_EXECUTIVE_H +#define _INCLUDE_INTERNAL_EXECUTIVE_H + + +#include + +/* GLOBAL VARIABLES *********************************************************/ + +TIME_ZONE_INFORMATION SystemTimeZoneInfo; + + +/* INTERNAL EXECUTIVE FUNCTIONS *********************************************/ + VOID ExUnmapPage(PVOID Addr); PVOID ExAllocatePage(VOID); + + +/* INITIALIZATION FUNCTIONS *************************************************/ + +VOID ExInit (VOID); +VOID ExInitTimeZoneInfo (VOID); + + +#endif /* _INCLUDE_INTERNAL_EXECUTIVE_H */ + +/*EOF */ + diff --git a/reactos/include/structs.h b/reactos/include/structs.h index 8648f3d1158..f82fb42c0b8 100644 --- a/reactos/include/structs.h +++ b/reactos/include/structs.h @@ -363,6 +363,27 @@ typedef struct _DISK_GEOMETRY { DWORD BytesPerSector; } DISK_GEOMETRY ; +typedef struct _SYSTEMTIME { + WORD wYear; + WORD wMonth; + WORD wDayOfWeek; + WORD wDay; + WORD wHour; + WORD wMinute; + WORD wSecond; + WORD wMilliseconds; +} SYSTEMTIME, *LPSYSTEMTIME; + +typedef struct _TIME_ZONE_INFORMATION { + LONG Bias; + WCHAR StandardName[ 32 ]; + SYSTEMTIME StandardDate; + LONG StandardBias; + WCHAR DaylightName[ 32 ]; + SYSTEMTIME DaylightDate; + LONG DaylightBias; +} TIME_ZONE_INFORMATION, *LPTIME_ZONE_INFORMATION; + #ifndef WIN32_LEAN_AND_MEAN @@ -2503,17 +2524,6 @@ typedef struct _INPUT_RECORD { } Event; } INPUT_RECORD, *PINPUT_RECORD; -typedef struct _SYSTEMTIME { - WORD wYear; - WORD wMonth; - WORD wDayOfWeek; - WORD wDay; - WORD wHour; - WORD wMinute; - WORD wSecond; - WORD wMilliseconds; -} SYSTEMTIME, *LPSYSTEMTIME; - typedef struct _JOB_INFO_1 { DWORD JobId; LPTSTR pPrinterName; @@ -4172,16 +4182,6 @@ typedef struct _textrange { LPSTR lpstrText; } TEXTRANGE; -typedef struct _TIME_ZONE_INFORMATION { - LONG Bias; - WCHAR StandardName[ 32 ]; - SYSTEMTIME StandardDate; - LONG StandardBias; - WCHAR DaylightName[ 32 ]; - SYSTEMTIME DaylightDate; - LONG DaylightBias; -} TIME_ZONE_INFORMATION, *LPTIME_ZONE_INFORMATION; - typedef struct tagTOGGLEKEYS { DWORD cbSize; DWORD dwFlags; diff --git a/reactos/ntoskrnl/ex/init.c b/reactos/ntoskrnl/ex/init.c new file mode 100644 index 00000000000..4175c5b4c48 --- /dev/null +++ b/reactos/ntoskrnl/ex/init.c @@ -0,0 +1,23 @@ +/* + * COPYRIGHT: See COPYING in the top level directory + * PROJECT: ReactOS kernel + * FILE: kernel/ex/init.c + * PURPOSE: executive initalization + * PROGRAMMER: Eric Kohl (ekohl@abo.rhein-zeitung.de) + * UPDATE HISTORY: + * Created 11/09/99 + */ + +#include +#include + +/* FUNCTIONS ****************************************************************/ + +VOID +ExInit (VOID) +{ + ExInitTimeZoneInfo (); + +} + +/* EOF */ diff --git a/reactos/ntoskrnl/ex/sysinfo.c b/reactos/ntoskrnl/ex/sysinfo.c index 9ad43894485..aed4d622764 100644 --- a/reactos/ntoskrnl/ex/sysinfo.c +++ b/reactos/ntoskrnl/ex/sysinfo.c @@ -1,8 +1,9 @@ -/* +/* $Id: sysinfo.c,v 1.3 1999/08/11 23:27:58 ekohl Exp $ + * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel - * FILE: ntoskrnl/ke/bug.c - * PURPOSE: Graceful system shutdown if a bug is detected + * FILE: ntoskrnl/ex/sysinfo.c + * PURPOSE: System information functions * PROGRAMMER: David Welch (welch@mcmail.com) * UPDATE HISTORY: * Created 22/05/98 @@ -11,6 +12,9 @@ /* INCLUDES *****************************************************************/ #include +#include +#include +#include #include @@ -21,21 +25,8 @@ STDCALL NtQuerySystemEnvironmentValue ( IN PUNICODE_STRING Name, OUT PVOID Value, - ULONG Length, - PULONG ReturnLength - ) -{ - UNIMPLEMENTED; -} - - -NTSTATUS -STDCALL -NtQuerySystemInformation ( - IN CINT SystemInformationClass, - OUT PVOID SystemInformation, - IN ULONG Length, - OUT PULONG ResultLength + IN ULONG Length, + IN OUT PULONG ReturnLength ) { UNIMPLEMENTED; @@ -53,6 +44,142 @@ NtSetSystemEnvironmentValue ( } +NTSTATUS +STDCALL +NtQuerySystemInformation ( + IN CINT SystemInformationClass, + OUT PVOID SystemInformation, + IN ULONG Length, + OUT PULONG ResultLength + ) +{ + /* + * If called from user mode, check + * possible unsafe arguments. + */ +#if 0 + if (KernelMode != KeGetPreviousMode()) + { + // Check arguments + //ProbeForWrite( + // SystemInformation, + // Length + // ); + //ProbeForWrite( + // ResultLength, + // sizeof (ULONG) + // ); + } +#endif + /* + * Clear the user buffer. + */ + memset( + SystemInformation, + 0, + Length + ); + /* + * Check the request is valid. + */ + switch (SystemInformationClass) + { +#if 0 + /*---*/ + case SystemPerformanceInformation: + /* + * Check user buffer's size + */ + if (Length < sizeof()) + { + *ResultLength = + return STATUS_INFO_LENGTH_MISMATCH; + } + /* FIXME */ + return STATUS_SUCCESS; + /*---*/ + case SystemDriverInformation: + /* Check user buffer's size */ + if (Length < sizeof (SYSTEM_DRIVER_INFO)) + { + *ResultLength = sizeof (SYSTEM_DRIVER_INFO); + return STATUS_INFO_LENGTH_MISMATCH; + } + /* FIXME: */ + return STATUS_SUCCESS; + /*---*/ + case SystemCacheInformation: + /* Check user buffer's size */ + if (Length < sizeof (SYSTEM_CACHE_INFORMATION)) + { + *ResultLength = sizeof (SYSTEM_CACHE_INFORMATION); + return STATUS_INFO_LENGTH_MISMATCH; + } + return STATUS_SUCCESS; + /*---*/ + case SystemTimeAdjustmentInformation: + /* + * Check user buffer's size + */ + if (Length < sizeof (SYSTEM_TIME_ADJUSTMENT)) + { + *ResultLength = sizeof (SYSTEM_TIME_ADJUSTMENT); + return STATUS_INFO_LENGTH_MISMATCH; + } + /* FIXME: */ + return STATUS_SUCCESS; + /*---*/ + case SystemConfigurationInformation: + { + PSYSTEM_CONFIGURATION_INFO Sci + = (PSYSTEM_CONFIGURATION_INFO) SystemInformation; + + *ResultLength = sizeof (SYSTEM_CONFIGUTATION_INFO); + /* + * Check user buffer's size + */ + if (Length < sizeof (SYSTEM_CONFIGURATION_INFO)) + { + return STATUS_INFO_LENGTH_MISMATCH; + } + /* + * Fill the object with config data. + * FIXME: some data should come from the + * registry. + */ + Sci->tag2.tag1.ProcessorAchitecture + = 80586; + Sci->tag2.tag1.Reserved + = 0x00000000; + Sci->PageSize + = 4096; + return STATUS_SUCCESS; + } +#endif + + case SystemTimeZoneInformation: /* 44 */ + *ResultLength = sizeof (TIME_ZONE_INFORMATION); + + /* + * Check user buffer's size + */ + if (Length < sizeof (TIME_ZONE_INFORMATION)) + { + return STATUS_INFO_LENGTH_MISMATCH; + } + + /* Copy the time zone information struct */ + memcpy (SystemInformation, + &SystemTimeZoneInfo, + sizeof (TIME_ZONE_INFORMATION)); + + return STATUS_SUCCESS; + + } + return STATUS_INVALID_INFO_CLASS; +} + + NTSTATUS STDCALL NtSetSystemInformation ( @@ -61,7 +188,50 @@ NtSetSystemInformation ( IN ULONG SystemInformationLength ) { - UNIMPLEMENTED; + /* + * If called from user mode, check + * possible unsafe arguments. + */ +#if 0 + if (KernelMode != KeGetPreviousMode()) + { + // Check arguments + //ProbeForWrite( + // SystemInformation, + // Length + // ); + //ProbeForWrite( + // ResultLength, + // sizeof (ULONG) + // ); + } +#endif + + /* + * Check the request is valid. + */ + switch (SystemInformationClass) + { + + + case SystemTimeZoneInformation: /* 44 */ + /* + * Check user buffer's size + */ + if (SystemInformationLength < sizeof (TIME_ZONE_INFORMATION)) + { + return STATUS_INFO_LENGTH_MISMATCH; + } + + /* Copy the time zone information struct */ + memcpy (&SystemTimeZoneInfo, + &SystemInformation, + sizeof (TIME_ZONE_INFORMATION)); + + return STATUS_SUCCESS; + } + + return STATUS_INVALID_INFO_CLASS; } diff --git a/reactos/ntoskrnl/ex/time.c b/reactos/ntoskrnl/ex/time.c index 9c50aae2050..d10f48c1c65 100644 --- a/reactos/ntoskrnl/ex/time.c +++ b/reactos/ntoskrnl/ex/time.c @@ -11,6 +11,8 @@ /* INCLUDES *****************************************************************/ #include +#include +#include #include @@ -19,10 +21,21 @@ /* GLOBALS ******************************************************************/ -static LONG lTimeZoneBias = 0; /* bias[minutes] = UTC - local time */ +/* Note: Bias[minutes] = UTC - local time */ +TIME_ZONE_INFORMATION SystemTimeZoneInfo; /* FUNCTIONS ****************************************************************/ +VOID +ExInitTimeZoneInfo (VOID) +{ + /* Initialize system time zone information */ + memset (&SystemTimeZoneInfo, 0, sizeof(TIME_ZONE_INFORMATION)); + + /* FIXME: Read time zone information from the registry */ + +} + NTSTATUS STDCALL NtSetSystemTime ( @@ -46,22 +59,26 @@ NtQuerySystemTime ( VOID +STDCALL ExLocalTimeToSystemTime ( PLARGE_INTEGER LocalTime, PLARGE_INTEGER SystemTime ) { SystemTime->QuadPart = LocalTime->QuadPart + - lTimeZoneBias * TICKSPERMINUTE; + SystemTimeZoneInfo.Bias * TICKSPERMINUTE; } VOID +STDCALL ExSystemTimeToLocalTime ( PLARGE_INTEGER SystemTime, PLARGE_INTEGER LocalTime ) { LocalTime->QuadPart = SystemTime->QuadPart - - lTimeZoneBias * TICKSPERMINUTE; + SystemTimeZoneInfo.Bias * TICKSPERMINUTE; } + +/* EOF */ diff --git a/reactos/ntoskrnl/ke/main.c b/reactos/ntoskrnl/ke/main.c index 87cfa4939fe..9b98d5885e3 100644 --- a/reactos/ntoskrnl/ke/main.c +++ b/reactos/ntoskrnl/ke/main.c @@ -20,6 +20,7 @@ #include #include #include +#include #include #include @@ -158,6 +159,7 @@ asmlinkage void _main(boot_param* _bp) HalInit(&bp); MmInitialize(&bp, last_kernel_address); KeInit(); + ExInit(); ObInit(); PsInit(); IoInit(); diff --git a/reactos/ntoskrnl/makefile_rex b/reactos/ntoskrnl/makefile_rex index 1f70270bb27..0f222698489 100644 --- a/reactos/ntoskrnl/makefile_rex +++ b/reactos/ntoskrnl/makefile_rex @@ -1,4 +1,4 @@ -# $Id: makefile_rex,v 1.29 1999/07/29 21:25:04 ekohl Exp $ +# $Id: makefile_rex,v 1.30 1999/08/11 23:23:48 ekohl Exp $ # # ReactOS Operating System # @@ -47,7 +47,7 @@ PS_OBJECTS = ps/psmgr.o ps/thread.o ps/process.o ps/idle.o ps/kill.o \ EX_OBJECTS = ex/work.o ex/fmutex.o ex/resource.o ex/time.o ex/interlck.o \ ex/callback.o ex/napi.o ex/power.o ex/sysinfo.o ex/locale.o \ - ex/stamp.o + ex/stamp.o ex/init.o SE_OBJECTS = se/semgr.o