From: Paul Gofman pgofman@codeweavers.com
--- dlls/kernelbase/kernelbase.spec | 2 ++ dlls/kernelbase/sync.c | 32 ++++++++++++++++++++++++++++++++ dlls/ntdll/tests/time.c | 18 ++++++++++++++++++ 3 files changed, 52 insertions(+)
diff --git a/dlls/kernelbase/kernelbase.spec b/dlls/kernelbase/kernelbase.spec index 27f45edcedf..50c765c792a 100644 --- a/dlls/kernelbase/kernelbase.spec +++ b/dlls/kernelbase/kernelbase.spec @@ -162,8 +162,10 @@ @ stdcall CompareStringW(long long wstr long wstr long) @ stdcall ConnectNamedPipe(long ptr) @ stdcall ContinueDebugEvent(long long long) +@ stdcall ConvertAuxiliaryCounterToPerformanceCounter(int64 ptr ptr) @ stdcall ConvertDefaultLocale(long) @ stdcall ConvertFiberToThread() +@ stdcall ConvertPerformanceCounterToAuxiliaryCounter(int64 ptr ptr) @ stdcall ConvertThreadToFiber(ptr) @ stdcall ConvertThreadToFiberEx(ptr long) @ stdcall ConvertToAutoInheritPrivateObjectSecurity(ptr ptr ptr ptr long ptr) diff --git a/dlls/kernelbase/sync.c b/dlls/kernelbase/sync.c index f03a6c3150a..cff93c17598 100644 --- a/dlls/kernelbase/sync.c +++ b/dlls/kernelbase/sync.c @@ -271,6 +271,38 @@ BOOL WINAPI QueryIdleProcessorCycleTimeEx( USHORT group_id, ULONG *size, ULONG64 }
+/*********************************************************************** + * ConvertAuxiliaryCounterToPerformanceCounter (kernelbase.@) + */ +HRESULT WINAPI ConvertAuxiliaryCounterToPerformanceCounter( ULONGLONG from, ULONGLONG *to, ULONGLONG *error ) +{ + NTSTATUS status; + + TRACE( "%#I64x, %p, %p.\n", from, to, error ); + + if ((status = NtConvertBetweenAuxiliaryCounterAndPerformanceCounter( 0, &from, to, error )) == STATUS_NOT_SUPPORTED) + return E_NOTIMPL; + + return HRESULT_FROM_NT(status); +} + + +/*********************************************************************** + * ConvertAuxiliaryCounterToPerformanceCounter (kernelbase.@) + */ +HRESULT WINAPI ConvertPerformanceCounterToAuxiliaryCounter( ULONGLONG from, ULONGLONG *to, ULONGLONG *error ) +{ + NTSTATUS status; + + TRACE( "%#I64x, %p, %p.\n", from, to, error ); + + if ((status = NtConvertBetweenAuxiliaryCounterAndPerformanceCounter( 1, &from, to, error )) == STATUS_NOT_SUPPORTED) + return E_NOTIMPL; + + return HRESULT_FROM_NT(status); +} + + /*********************************************************************** * Waits ***********************************************************************/ diff --git a/dlls/ntdll/tests/time.c b/dlls/ntdll/tests/time.c index c843f764282..bb0079b0823 100644 --- a/dlls/ntdll/tests/time.c +++ b/dlls/ntdll/tests/time.c @@ -46,6 +46,8 @@ static BOOL (WINAPI *pRtlQueryPerformanceCounter)(LARGE_INTEGER*); static BOOL (WINAPI *pRtlQueryPerformanceFrequency)(LARGE_INTEGER*);
static NTSTATUS (WINAPI *pNtConvertBetweenAuxiliaryCounterAndPerformanceCounter)(ULONG, ULONGLONG *, ULONGLONG *, ULONGLONG *); +static HRESULT (WINAPI *pConvertAuxiliaryCounterToPerformanceCounter)(ULONGLONG, ULONGLONG *, ULONGLONG *); +static HRESULT (WINAPI *pConvertPerformanceCounterToAuxiliaryCounter)(ULONGLONG, ULONGLONG *, ULONGLONG *);
static const int MonthLengths[2][12] = { @@ -485,6 +487,7 @@ static void test_NtConvertBetweenAuxiliaryCounterAndPerformanceCounter(void) { ULONGLONG qpc, error, value; NTSTATUS status; + HRESULT hr;
if (!pNtConvertBetweenAuxiliaryCounterAndPerformanceCounter) { @@ -510,11 +513,23 @@ static void test_NtConvertBetweenAuxiliaryCounterAndPerformanceCounter(void) ok(value == 0xdeadbeef, "got %#I64x.\n", value); ok(qpc == 0xdeadbeef, "got %#I64x.\n", qpc); ok(error == 0xdeadbeef, "got %#I64x.\n", error); + + hr = pConvertAuxiliaryCounterToPerformanceCounter(1, &qpc, &error); + ok(hr == E_NOTIMPL, "got %#lx.\n", hr); + ok(value == 0xdeadbeef, "got %#I64x.\n", value); + ok(qpc == 0xdeadbeef, "got %#I64x.\n", qpc); + ok(error == 0xdeadbeef, "got %#I64x.\n", error); + QueryPerformanceCounter((LARGE_INTEGER *)&qpc); + hr = pConvertPerformanceCounterToAuxiliaryCounter(qpc, &value, &error); + ok(hr == E_NOTIMPL, "got %#lx.\n", hr); + ok(value == 0xdeadbeef, "got %#I64x.\n", value); + ok(error == 0xdeadbeef, "got %#I64x.\n", error); }
START_TEST(time) { HMODULE mod = GetModuleHandleA("ntdll.dll"); + HMODULE hkernelbase = GetModuleHandleA("kernelbase.dll"); pRtlTimeToTimeFields = (void *)GetProcAddress(mod,"RtlTimeToTimeFields"); pRtlTimeFieldsToTime = (void *)GetProcAddress(mod,"RtlTimeFieldsToTime"); pNtQueryPerformanceCounter = (void *)GetProcAddress(mod, "NtQueryPerformanceCounter"); @@ -529,6 +544,9 @@ START_TEST(time) pNtConvertBetweenAuxiliaryCounterAndPerformanceCounter = (void *)GetProcAddress(mod, "NtConvertBetweenAuxiliaryCounterAndPerformanceCounter");
+ pConvertAuxiliaryCounterToPerformanceCounter = (void *)GetProcAddress(hkernelbase, "ConvertAuxiliaryCounterToPerformanceCounter"); + pConvertPerformanceCounterToAuxiliaryCounter = (void *)GetProcAddress(hkernelbase, "ConvertPerformanceCounterToAuxiliaryCounter"); + if (pRtlTimeToTimeFields && pRtlTimeFieldsToTime) test_pRtlTimeToTimeFields(); else