|
//------------------------------------------------------------
// Copyright (c) Microsoft Corporation. All rights reserved.
//------------------------------------------------------------
namespace System.ServiceModel.Channels
{
using System.Runtime;
using System.Runtime.InteropServices;
using System.Runtime.Versioning;
using System.Security;
using FILETIME = System.Runtime.InteropServices.ComTypes.FILETIME;
[SuppressUnmanagedCodeSecurity]
internal static class SafeNativeMethods
{
public const string KERNEL32 = "kernel32.dll";
[DllImport(KERNEL32, SetLastError = false)]
[ResourceExposure(ResourceScope.None)]
static extern uint GetSystemTimeAdjustment(
[Out] out int adjustment,
[Out] out uint increment,
[Out] out uint adjustmentDisabled
);
[DllImport(KERNEL32, SetLastError = true)]
[ResourceExposure(ResourceScope.None)]
private static extern void GetSystemTimeAsFileTime([Out] out FILETIME time);
public static void GetSystemTimeAsFileTime(out long time) {
FILETIME fileTime;
GetSystemTimeAsFileTime(out fileTime);
time = 0;
time |= (uint)fileTime.dwHighDateTime;
time <<= sizeof(uint) * 8;
time |= (uint)fileTime.dwLowDateTime;
}
[Fx.Tag.SecurityNote(Critical = "Calls critical method GetSystemTimeAdjustment.",
Safe = "Method is a SafeNativeMethod.")]
[SecuritySafeCritical]
internal static long GetSystemTimeResolution()
{
int dummyAdjustment;
uint increment;
uint dummyAdjustmentDisabled;
if (GetSystemTimeAdjustment(out dummyAdjustment, out increment, out dummyAdjustmentDisabled) != 0)
{
return (long)increment;
}
// Assume the default, which is around 15 milliseconds.
return 15 * TimeSpan.TicksPerMillisecond;
}
}
}
|