summaryrefslogtreecommitdiff
path: root/win32/time.c
diff options
context:
space:
mode:
Diffstat (limited to 'win32/time.c')
-rw-r--r--win32/time.c18
1 files changed, 13 insertions, 5 deletions
diff --git a/win32/time.c b/win32/time.c
index a376fd61be..391a8a81e9 100644
--- a/win32/time.c
+++ b/win32/time.c
@@ -1,4 +1,3 @@
-
/*****************************************************************************
* *
* DH_TIME.C *
@@ -35,12 +34,21 @@
int getfilesystemtime(struct timeval *time_Info)
{
-FILETIME ft;
-__int64 ff;
+ FILETIME ft;
+ __int64 ff;
+ ULARGE_INTEGER convFromft;
GetSystemTimeAsFileTime(&ft); /* 100 ns blocks since 01-Jan-1641 */
- /* resolution seems to be 0.01 sec */
- ff = *(__int64*)(&ft);
+ /* resolution seems to be 0.01 sec */
+ /*
+ * Do not cast a pointer to a FILETIME structure to either a
+ * ULARGE_INTEGER* or __int64* value because it can cause alignment faults on 64-bit Windows.
+ * via http://technet.microsoft.com/en-us/library/ms724284(v=vs.85).aspx
+ */
+ convFromft.HighPart = ft.dwHighDateTime;
+ convFromft.LowPart = ft.dwLowDateTime;
+ ff = convFromft.QuadPart;
+
time_Info->tv_sec = (int)(ff/(__int64)10000000-(__int64)11644473600);
time_Info->tv_usec = (int)(ff % 10000000)/10;
return 0;