ntdll: Implement SystemTimeAdjustmentInformation class.

Signed-off-by: Alexandre Julliard <julliard@winehq.org>
feature/deterministic
Alexandre Julliard 2020-05-22 11:49:18 +02:00
parent 79e3c21c3c
commit 75e2f79b68
3 changed files with 59 additions and 0 deletions

View File

@ -2937,6 +2937,19 @@ NTSTATUS WINAPI NtQuerySystemInformation(
FIXME("info_class SYSTEM_INTERRUPT_INFORMATION\n");
}
break;
case SystemTimeAdjustmentInformation:
{
SYSTEM_TIME_ADJUSTMENT_QUERY query = { 156250, 156250, TRUE };
len = sizeof(query);
if (Length == len)
{
if (!SystemInformation) ret = STATUS_ACCESS_VIOLATION;
else memcpy( SystemInformation, &query, len );
}
else ret = STATUS_INFO_LENGTH_MISMATCH;
}
break;
case SystemKernelDebuggerInformation:
{
SYSTEM_KERNEL_DEBUGGER_INFORMATION skdi;

View File

@ -23,6 +23,7 @@
#include <stdio.h>
static NTSTATUS (WINAPI * pNtQuerySystemInformation)(SYSTEM_INFORMATION_CLASS, PVOID, ULONG, PULONG);
static NTSTATUS (WINAPI * pNtSetSystemInformation)(SYSTEM_INFORMATION_CLASS, PVOID, ULONG);
static NTSTATUS (WINAPI * pRtlGetNativeSystemInformation)(SYSTEM_INFORMATION_CLASS, PVOID, ULONG, PULONG);
static NTSTATUS (WINAPI * pNtQuerySystemInformationEx)(SYSTEM_INFORMATION_CLASS, void*, ULONG, void*, ULONG, ULONG*);
static NTSTATUS (WINAPI * pNtPowerInformation)(POWER_INFORMATION_LEVEL, PVOID, ULONG, PVOID, ULONG);
@ -76,6 +77,7 @@ static BOOL InitFunctionPtrs(void)
}
NTDLL_GET_PROC(NtQuerySystemInformation);
NTDLL_GET_PROC(NtSetSystemInformation);
NTDLL_GET_PROC(RtlGetNativeSystemInformation);
NTDLL_GET_PROC(NtPowerInformation);
NTDLL_GET_PROC(NtQueryInformationProcess);
@ -740,6 +742,40 @@ static void test_query_interrupt(void)
HeapFree( GetProcessHeap(), 0, sii);
}
static void test_time_adjustment(void)
{
SYSTEM_TIME_ADJUSTMENT_QUERY query;
SYSTEM_TIME_ADJUSTMENT adjust;
NTSTATUS status;
ULONG len;
memset( &query, 0xcc, sizeof(query) );
status = pNtQuerySystemInformation( SystemTimeAdjustmentInformation, &query, sizeof(query), &len );
ok( status == STATUS_SUCCESS, "got %08x\n", status );
ok( len == sizeof(query) || broken(!len) /* winxp */, "wrong len %u\n", len );
ok( query.TimeAdjustmentDisabled == TRUE || query.TimeAdjustmentDisabled == FALSE,
"wrong value %x\n", query.TimeAdjustmentDisabled );
status = pNtQuerySystemInformation( SystemTimeAdjustmentInformation, &query, sizeof(query)-1, &len );
ok( status == STATUS_INFO_LENGTH_MISMATCH, "got %08x\n", status );
ok( len == sizeof(query) || broken(!len) /* winxp */, "wrong len %u\n", len );
status = pNtQuerySystemInformation( SystemTimeAdjustmentInformation, &query, sizeof(query)+1, &len );
ok( status == STATUS_INFO_LENGTH_MISMATCH, "got %08x\n", status );
ok( len == sizeof(query) || broken(!len) /* winxp */, "wrong len %u\n", len );
adjust.TimeAdjustment = query.TimeAdjustment;
adjust.TimeAdjustmentDisabled = query.TimeAdjustmentDisabled;
status = pNtSetSystemInformation( SystemTimeAdjustmentInformation, &adjust, sizeof(adjust) );
ok( status == STATUS_SUCCESS || status == STATUS_PRIVILEGE_NOT_HELD, "got %08x\n", status );
status = pNtSetSystemInformation( SystemTimeAdjustmentInformation, &adjust, sizeof(adjust)-1 );
todo_wine
ok( status == STATUS_INFO_LENGTH_MISMATCH, "got %08x\n", status );
status = pNtSetSystemInformation( SystemTimeAdjustmentInformation, &adjust, sizeof(adjust)+1 );
todo_wine
ok( status == STATUS_INFO_LENGTH_MISMATCH, "got %08x\n", status );
}
static void test_query_kerndebug(void)
{
NTSTATUS status;
@ -2632,6 +2668,10 @@ START_TEST(info)
trace("Starting test_query_interrupt()\n");
test_query_interrupt();
/* 0x1c SystemTimeAdjustmentInformation */
trace("Starting test_time_adjustment()\n");
test_time_adjustment();
/* 0x23 SystemKernelDebuggerInformation */
trace("Starting test_query_kerndebug()\n");
test_query_kerndebug();

View File

@ -1624,6 +1624,12 @@ typedef struct _SYSTEM_REGISTRY_QUOTA_INFORMATION {
PVOID Reserved1;
} SYSTEM_REGISTRY_QUOTA_INFORMATION, *PSYSTEM_REGISTRY_QUOTA_INFORMATION;
typedef struct _SYSTEM_TIME_ADJUSTMENT_QUERY {
ULONG TimeAdjustment;
ULONG TimeIncrement;
BOOLEAN TimeAdjustmentDisabled;
} SYSTEM_TIME_ADJUSTMENT_QUERY, *PSYSTEM_TIME_ADJUSTMENT_QUERY;
typedef struct _SYSTEM_TIME_ADJUSTMENT {
ULONG TimeAdjustment;
BOOLEAN TimeAdjustmentDisabled;