Fixed size of our SYSTEM_TIMEOFDAY_INFORMATION struct.
Fixed return codes and ReturnLength/buffer for SystemTimeOfDayInformation. Added tests for SystemTimeOfDayInformation.
This commit is contained in:
parent
d27d5b0a26
commit
5e5008502e
|
@ -658,15 +658,18 @@ NTSTATUS WINAPI NtQuerySystemInformation(
|
||||||
break;
|
break;
|
||||||
case SystemTimeOfDayInformation:
|
case SystemTimeOfDayInformation:
|
||||||
{
|
{
|
||||||
SYSTEM_TIMEOFDAY_INFORMATION* sti = (SYSTEM_TIMEOFDAY_INFORMATION*)SystemInformation;
|
SYSTEM_TIMEOFDAY_INFORMATION sti;
|
||||||
if (Length >= sizeof(*sti))
|
|
||||||
|
memset(&sti, 0 , sizeof(sti));
|
||||||
|
|
||||||
|
/* liKeSystemTime, liExpTimeZoneBias, uCurrentTimeZoneId */
|
||||||
|
sti.liKeBootTime.QuadPart = boottime;
|
||||||
|
|
||||||
|
if (Length <= sizeof(sti))
|
||||||
{
|
{
|
||||||
sti->liKeBootTime.QuadPart = boottime;
|
len = Length;
|
||||||
sti->liKeSystemTime.QuadPart = 0; /* FIXME */
|
if (!SystemInformation) ret = STATUS_ACCESS_VIOLATION;
|
||||||
sti->liExpTimeZoneBias.QuadPart = 0; /* FIXME */
|
else memcpy( SystemInformation, &sti, Length);
|
||||||
sti->uCurrentTimeZoneId = 0; /* FIXME */
|
|
||||||
sti->dwReserved = 0;
|
|
||||||
len = sizeof(*sti);
|
|
||||||
}
|
}
|
||||||
else ret = STATUS_INFO_LENGTH_MISMATCH;
|
else ret = STATUS_INFO_LENGTH_MISMATCH;
|
||||||
}
|
}
|
||||||
|
|
|
@ -80,7 +80,7 @@ static void test_query_basic()
|
||||||
trace("Check with correct parameters\n");
|
trace("Check with correct parameters\n");
|
||||||
status = pNtQuerySystemInformation(SystemBasicInformation, &sbi, sizeof(sbi), &ReturnLength);
|
status = pNtQuerySystemInformation(SystemBasicInformation, &sbi, sizeof(sbi), &ReturnLength);
|
||||||
ok( status == STATUS_SUCCESS, "Expected STATUS_SUCCESS, got %08lx\n", status);
|
ok( status == STATUS_SUCCESS, "Expected STATUS_SUCCESS, got %08lx\n", status);
|
||||||
ok( sizeof(sbi) == ReturnLength, "Inconsistent length (%08x) <-> (%ld)\n", sizeof(sbi), ReturnLength);
|
ok( sizeof(sbi) == ReturnLength, "Inconsistent length (%d) <-> (%ld)\n", sizeof(sbi), ReturnLength);
|
||||||
|
|
||||||
/* Check if we have some return values */
|
/* Check if we have some return values */
|
||||||
trace("Number of Processors : %d\n", sbi.NumberOfProcessors);
|
trace("Number of Processors : %d\n", sbi.NumberOfProcessors);
|
||||||
|
@ -95,13 +95,93 @@ static void test_query_cpu()
|
||||||
|
|
||||||
status = pNtQuerySystemInformation(SystemCpuInformation, &sci, sizeof(sci), &ReturnLength);
|
status = pNtQuerySystemInformation(SystemCpuInformation, &sci, sizeof(sci), &ReturnLength);
|
||||||
ok( status == STATUS_SUCCESS, "Expected STATUS_SUCCESS, got %08lx\n", status);
|
ok( status == STATUS_SUCCESS, "Expected STATUS_SUCCESS, got %08lx\n", status);
|
||||||
ok( sizeof(sci) == ReturnLength, "Inconsistent length (%08x) <-> (%ld)\n", sizeof(sci), ReturnLength);
|
ok( sizeof(sci) == ReturnLength, "Inconsistent length (%d) <-> (%ld)\n", sizeof(sci), ReturnLength);
|
||||||
|
|
||||||
/* Check if we have some return values */
|
/* Check if we have some return values */
|
||||||
trace("Processor FeatureSet : %08lx\n", sci.FeatureSet);
|
trace("Processor FeatureSet : %08lx\n", sci.FeatureSet);
|
||||||
ok( sci.FeatureSet != 0, "Expected some features for this processor, got %08lx\n", sci.FeatureSet);
|
ok( sci.FeatureSet != 0, "Expected some features for this processor, got %08lx\n", sci.FeatureSet);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void test_query_timeofday()
|
||||||
|
{
|
||||||
|
DWORD status;
|
||||||
|
ULONG ReturnLength;
|
||||||
|
int isnt = 0;
|
||||||
|
|
||||||
|
/* Copy of our winternl.h structure turned into a private one */
|
||||||
|
typedef struct _SYSTEM_TIMEOFDAY_INFORMATION_PRIVATE {
|
||||||
|
LARGE_INTEGER liKeBootTime;
|
||||||
|
LARGE_INTEGER liKeSystemTime;
|
||||||
|
LARGE_INTEGER liExpTimeZoneBias;
|
||||||
|
ULONG uCurrentTimeZoneId;
|
||||||
|
DWORD dwUnknown1[5];
|
||||||
|
} SYSTEM_TIMEOFDAY_INFORMATION_PRIVATE, *PSYSTEM_TIMEOFDAY_INFORMATION_PRIVATE;
|
||||||
|
|
||||||
|
SYSTEM_TIMEOFDAY_INFORMATION_PRIVATE sti;
|
||||||
|
|
||||||
|
/* The structsize for NT (32 bytes) and Win2K/XP (48 bytes) differ.
|
||||||
|
*
|
||||||
|
* Windows 2000 and XP return STATUS_INFO_LENGTH_MISMATCH if the given buffer size is greater
|
||||||
|
* then 48 and 0 otherwise
|
||||||
|
* Windows NT returns STATUS_INFO_LENGTH_MISMATCH when the given buffer size is not correct
|
||||||
|
* and 0 otherwise
|
||||||
|
*
|
||||||
|
* Windows 2000 and XP copy the given buffer size into the provided buffer, if the return code is STATUS_SUCCESS
|
||||||
|
* NT only fills the buffer if the return code is STATUS_SUCCESS
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
status = pNtQuerySystemInformation(SystemTimeOfDayInformation, &sti, sizeof(sti), &ReturnLength);
|
||||||
|
isnt = ( status == STATUS_INFO_LENGTH_MISMATCH);
|
||||||
|
|
||||||
|
if (isnt)
|
||||||
|
{
|
||||||
|
trace("Windows version is NT, we have to cater for differences with W2K/WinXP\n");
|
||||||
|
|
||||||
|
status = pNtQuerySystemInformation(SystemTimeOfDayInformation, &sti, 0, &ReturnLength);
|
||||||
|
ok( status == STATUS_INFO_LENGTH_MISMATCH, "Expected STATUS_INFO_LENGTH_MISMATCH, got %08lx\n", status);
|
||||||
|
ok( 0 == ReturnLength, "ReturnLength should be 0, it is (%ld)\n", ReturnLength);
|
||||||
|
|
||||||
|
sti.uCurrentTimeZoneId = 0xdeadbeef;
|
||||||
|
status = pNtQuerySystemInformation(SystemTimeOfDayInformation, &sti, 28, &ReturnLength);
|
||||||
|
ok( 0xdeadbeef == sti.uCurrentTimeZoneId, "This part of the buffer should not have been filled\n");
|
||||||
|
|
||||||
|
status = pNtQuerySystemInformation(SystemTimeOfDayInformation, &sti, 32, &ReturnLength);
|
||||||
|
ok( status == STATUS_SUCCESS, "Expected STATUS_SUCCESS, got %08lx\n", status);
|
||||||
|
ok( 32 == ReturnLength, "ReturnLength should be 0, it is (%ld)\n", ReturnLength);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
|
||||||
|
status = pNtQuerySystemInformation(SystemTimeOfDayInformation, &sti, 0, &ReturnLength);
|
||||||
|
ok( status == STATUS_SUCCESS, "Expected STATUS_SUCCESS, got %08lx\n", status);
|
||||||
|
ok( 0 == ReturnLength, "ReturnLength should be 0, it is (%ld)\n", ReturnLength);
|
||||||
|
|
||||||
|
sti.uCurrentTimeZoneId = 0xdeadbeef;
|
||||||
|
status = pNtQuerySystemInformation(SystemTimeOfDayInformation, &sti, 24, &ReturnLength);
|
||||||
|
ok( status == STATUS_SUCCESS, "Expected STATUS_SUCCESS, got %08lx\n", status);
|
||||||
|
ok( 24 == ReturnLength, "ReturnLength should be 24, it is (%ld)\n", ReturnLength);
|
||||||
|
ok( 0xdeadbeef == sti.uCurrentTimeZoneId, "This part of the buffer should not have been filled\n");
|
||||||
|
|
||||||
|
sti.uCurrentTimeZoneId = 0xdeadbeef;
|
||||||
|
status = pNtQuerySystemInformation(SystemTimeOfDayInformation, &sti, 32, &ReturnLength);
|
||||||
|
ok( status == STATUS_SUCCESS, "Expected STATUS_SUCCESS, got %08lx\n", status);
|
||||||
|
ok( 32 == ReturnLength, "ReturnLength should be 32, it is (%ld)\n", ReturnLength);
|
||||||
|
ok( 0xdeadbeef != sti.uCurrentTimeZoneId, "Buffer should have been partially filled\n");
|
||||||
|
|
||||||
|
status = pNtQuerySystemInformation(SystemTimeOfDayInformation, &sti, 49, &ReturnLength);
|
||||||
|
ok( status == STATUS_INFO_LENGTH_MISMATCH, "Expected STATUS_INFO_LENGTH_MISMATCH, got %08lx\n", status);
|
||||||
|
ok( 0 == ReturnLength, "ReturnLength should be 0, it is (%ld)\n", ReturnLength);
|
||||||
|
|
||||||
|
status = pNtQuerySystemInformation(SystemTimeOfDayInformation, &sti, sizeof(sti), &ReturnLength);
|
||||||
|
ok( status == STATUS_SUCCESS, "Expected STATUS_SUCCESS, got %08lx\n", status);
|
||||||
|
ok( sizeof(sti) == ReturnLength, "Inconsistent length (%d) <-> (%ld)\n", sizeof(sti), ReturnLength);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Check if we have some return values */
|
||||||
|
trace("uCurrentTimeZoneId : (%ld)\n", sti.uCurrentTimeZoneId);
|
||||||
|
}
|
||||||
|
|
||||||
static void test_query_process()
|
static void test_query_process()
|
||||||
{
|
{
|
||||||
DWORD status;
|
DWORD status;
|
||||||
|
@ -250,6 +330,10 @@ START_TEST(info)
|
||||||
trace("Starting test_query_cpu()\n");
|
trace("Starting test_query_cpu()\n");
|
||||||
test_query_cpu();
|
test_query_cpu();
|
||||||
|
|
||||||
|
/* 0x3 SystemCpuInformation */
|
||||||
|
trace("Starting test_query_timeofday()\n");
|
||||||
|
test_query_timeofday();
|
||||||
|
|
||||||
/* 0x5 SystemProcessInformation */
|
/* 0x5 SystemProcessInformation */
|
||||||
trace("Starting test_query_process()\n");
|
trace("Starting test_query_process()\n");
|
||||||
test_query_process();
|
test_query_process();
|
||||||
|
|
|
@ -977,7 +977,7 @@ typedef struct _SYSTEM_TIMEOFDAY_INFORMATION {
|
||||||
LARGE_INTEGER liKeSystemTime;
|
LARGE_INTEGER liKeSystemTime;
|
||||||
LARGE_INTEGER liExpTimeZoneBias;
|
LARGE_INTEGER liExpTimeZoneBias;
|
||||||
ULONG uCurrentTimeZoneId;
|
ULONG uCurrentTimeZoneId;
|
||||||
DWORD dwReserved;
|
DWORD dwUnknown1[5];
|
||||||
#else
|
#else
|
||||||
BYTE Reserved1[48];
|
BYTE Reserved1[48];
|
||||||
#endif
|
#endif
|
||||||
|
|
Loading…
Reference in New Issue