Added support for anonymous structs/unions on compilers that implement it.

diff --git a/dlls/advapi32/service.c b/dlls/advapi32/service.c
index b07eb89..0b6a5fc 100644
--- a/dlls/advapi32/service.c
+++ b/dlls/advapi32/service.c
@@ -158,8 +158,8 @@
 BOOL WINAPI
 AllocateLocallyUniqueId( PLUID lpluid )
 {
-	lpluid->LowPart = time(NULL);
-	lpluid->HighPart = 0;
+	lpluid->s.LowPart = time(NULL);
+	lpluid->s.HighPart = 0;
 	return TRUE;
 }
 
diff --git a/dlls/comctl32/comctl32undoc.c b/dlls/comctl32/comctl32undoc.c
index 416d35d..dc55648 100644
--- a/dlls/comctl32/comctl32undoc.c
+++ b/dlls/comctl32/comctl32undoc.c
@@ -89,8 +89,8 @@
 
     *phDpa = (HDPA)NULL;
 
-    position.LowPart = 0;
-    position.HighPart = 0;
+    position.s.LowPart = 0;
+    position.s.HighPart = 0;
 
     errCode = IStream_Seek (pStream, position, STREAM_SEEK_CUR, &newPosition);
     if (errCode != S_OK)
diff --git a/files/drive.c b/files/drive.c
index 5b53e66..dc06cfe 100644
--- a/files/drive.c
+++ b/files/drive.c
@@ -678,10 +678,10 @@
 #  error "statfs has no bfree/bavail member!"
 # endif
 #endif
-    size->LowPart = (DWORD)bigsize;
-    size->HighPart = (DWORD)(bigsize>>32);
-    available->LowPart = (DWORD)bigavail;
-    available->HighPart = (DWORD)(bigavail>>32);
+    size->s.LowPart = (DWORD)bigsize;
+    size->s.HighPart = (DWORD)(bigsize>>32);
+    available->s.LowPart = (DWORD)bigavail;
+    available->s.HighPart = (DWORD)(bigavail>>32);
     return 1;
 }
 
@@ -755,37 +755,37 @@
     if (!DRIVE_GetFreeSpace(drive, &size, &available)) return FALSE;
 
     /* Cap the size and available at 2GB as per specs.  */
-    if ((size.HighPart) ||(size.LowPart > 0x7fffffff))
+    if ((size.s.HighPart) ||(size.s.LowPart > 0x7fffffff))
 	{
-	  size.HighPart = 0;
-	  size.LowPart = 0x7fffffff;
+	  size.s.HighPart = 0;
+	  size.s.LowPart = 0x7fffffff;
 	}
-    if ((available.HighPart) ||(available.LowPart > 0x7fffffff))
+    if ((available.s.HighPart) ||(available.s.LowPart > 0x7fffffff))
       {
-	available.HighPart =0;
-	available.LowPart = 0x7fffffff;
+	available.s.HighPart =0;
+	available.s.LowPart = 0x7fffffff;
       }
     if (DRIVE_GetType(drive)==TYPE_CDROM) {
 	if (sector_bytes)
 	*sector_bytes    = 2048;
-	size.LowPart            /= 2048;
-	available.LowPart       /= 2048;
+	size.s.LowPart            /= 2048;
+	available.s.LowPart       /= 2048;
     } else {
 	if (sector_bytes)
 	*sector_bytes    = 512;
-	size.LowPart            /= 512;
-	available.LowPart       /= 512;
+	size.s.LowPart            /= 512;
+	available.s.LowPart       /= 512;
     }
     /* fixme: probably have to adjust those variables too for CDFS */
     cluster_sec = 1;
-    while (cluster_sec * 65536 < size.LowPart) cluster_sec *= 2;
+    while (cluster_sec * 65536 < size.s.LowPart) cluster_sec *= 2;
 
     if (cluster_sectors)
 	*cluster_sectors = cluster_sec;
     if (free_clusters)
-	*free_clusters   = available.LowPart / cluster_sec;
+	*free_clusters   = available.s.LowPart / cluster_sec;
     if (total_clusters)
-	*total_clusters  = size.LowPart / cluster_sec;
+	*total_clusters  = size.s.LowPart / cluster_sec;
     return TRUE;
 }
 
@@ -846,14 +846,14 @@
 
     if (total)
     {
-        total->HighPart = size.HighPart;
-        total->LowPart = size.LowPart ;
+        total->s.HighPart = size.s.HighPart;
+        total->s.LowPart = size.s.LowPart ;
     }
 
     if (totalfree)
     {
-        totalfree->HighPart = available.HighPart;
-        totalfree->LowPart = available.LowPart ;
+        totalfree->s.HighPart = available.s.HighPart;
+        totalfree->s.LowPart = available.s.LowPart ;
     }
 
     if (avail)
@@ -877,8 +877,8 @@
 
         /* Quick hack, should eventually be fixed to work 100% with
            Windows2000 (see comment above). */
-        avail->HighPart = available.HighPart;
-        avail->LowPart = available.LowPart ;
+        avail->s.HighPart = available.s.HighPart;
+        avail->s.LowPart = available.s.LowPart ;
     }
 
     return TRUE;
diff --git a/include/winnt.h b/include/winnt.h
index f597056..db0e2bd 100644
--- a/include/winnt.h
+++ b/include/winnt.h
@@ -908,16 +908,20 @@
  * LUID_AND_ATTRIBUTES
  */
 
-typedef struct _LARGE_INTEGER
-{
-    DWORD    LowPart;
-    LONG     HighPart;
+typedef union _LARGE_INTEGER {
+    struct {
+        DWORD    LowPart;
+        LONG     HighPart;
+    } DUMMYSTRUCTNAME;
+    LONGLONG QuadPart;
 } LARGE_INTEGER, *LPLARGE_INTEGER, *PLARGE_INTEGER;
 
-typedef struct _ULARGE_INTEGER
-{
-    DWORD    LowPart;
-    DWORD    HighPart;
+typedef union _ULARGE_INTEGER {
+    struct {
+        DWORD    LowPart;
+        LONG     HighPart;
+    } DUMMYSTRUCTNAME;
+    LONGLONG QuadPart;
 } ULARGE_INTEGER, *LPULARGE_INTEGER, *PULARGE_INTEGER;
 
 /*
diff --git a/include/wtypes.h b/include/wtypes.h
index b0a0ddb..d4607ca 100644
--- a/include/wtypes.h
+++ b/include/wtypes.h
@@ -147,19 +147,20 @@
 
 #ifndef _tagCY_DEFINED
 #define _tagCY_DEFINED
-typedef union tagCY
-{
+
+typedef union tagCY {
     struct {
 #ifdef BIG_ENDIAN
-        long Hi;
-        long Lo;
-#else
-        unsigned long Lo;
-        long Hi;
-#endif
-    } u;
+        LONG  Hi;
+        LONG  Lo;
+#else /* defined(BIG_ENDIAN) */
+        ULONG Lo;
+        LONG  Hi;
+#endif /* defined(BIG_ENDIAN) */
+    } DUMMYSTRUCTNAME;
     LONGLONG int64;
 } CY;
+
 #endif /* _tagCY_DEFINED */
 
 /*
diff --git a/msdos/vxd.c b/msdos/vxd.c
index d206df8..3121fd2 100644
--- a/msdos/vxd.c
+++ b/msdos/vxd.c
@@ -1044,8 +1044,8 @@
             TRACE("NtCreateSection: name=%s\n", atom? name : NULL);
 
             result = CreateFileMappingA(hFile, NULL, protect, 
-                                          size? size->HighPart : 0, 
-                                          size? size->LowPart  : 0, 
+                                          size? size->s.HighPart : 0, 
+                                          size? size->s.LowPart  : 0, 
                                           atom? name : NULL);
         }
 
@@ -1207,12 +1207,12 @@
                    InheritDisposition, AllocationType, Protect);
         TRACE("NtMapViewOfSection: "
                    "base=%lx, offset=%lx, size=%lx, access=%lx\n", 
-                   (DWORD)address, SectionOffset? SectionOffset->LowPart : 0, 
+                   (DWORD)address, SectionOffset? SectionOffset->s.LowPart : 0, 
                    ViewSize? *ViewSize : 0, access);
 
         result = (DWORD)MapViewOfFileEx(SectionHandle, access, 
-                            SectionOffset? SectionOffset->HighPart : 0, 
-                            SectionOffset? SectionOffset->LowPart  : 0,
+                            SectionOffset? SectionOffset->s.HighPart : 0, 
+                            SectionOffset? SectionOffset->s.LowPart  : 0,
                             ViewSize? *ViewSize : 0, address);
 
         TRACE("NtMapViewOfSection: result=%lx\n", result);
diff --git a/ole/antimoniker.c b/ole/antimoniker.c
index f4a526b..dcb41e6 100644
--- a/ole/antimoniker.c
+++ b/ole/antimoniker.c
@@ -261,9 +261,9 @@
     
     /* Normaly the sizemax must be the  size of DWORD ! but I tested this function it ususlly return 16 bytes */
     /* more than the number of bytes used by AntiMoniker::Save function */
-    pcbSize->LowPart =  sizeof(DWORD)+16;
+    pcbSize->s.LowPart =  sizeof(DWORD)+16;
 
-    pcbSize->HighPart=0;
+    pcbSize->s.HighPart=0;
 
     return S_OK;
 }
diff --git a/ole/compositemoniker.c b/ole/compositemoniker.c
index 72d7b37..d727e4d 100644
--- a/ole/compositemoniker.c
+++ b/ole/compositemoniker.c
@@ -409,8 +409,8 @@
     if (pcbSize!=NULL)
         return E_POINTER;
 
-    pcbSize->LowPart =0;
-    pcbSize->HighPart=0;
+    pcbSize->s.LowPart =0;
+    pcbSize->s.HighPart=0;
 
     IMoniker_Enum(iface,TRUE,&enumMk);
 
@@ -420,8 +420,8 @@
 
         IMoniker_Release(pmk);
 
-        pcbSize->LowPart +=ptmpSize.LowPart;
-        pcbSize->HighPart+=ptmpSize.HighPart;
+        pcbSize->s.LowPart +=ptmpSize.s.LowPart;
+        pcbSize->s.HighPart+=ptmpSize.s.HighPart;
     }
 
     IEnumMoniker_Release(enumMk);
diff --git a/ole/datacache.c b/ole/datacache.c
index 1a9e386..864f6d2 100644
--- a/ole/datacache.c
+++ b/ole/datacache.c
@@ -773,8 +773,8 @@
   /*
    * Skip the header
    */
-  offset.HighPart = 0;
-  offset.LowPart  = sizeof(PresentationDataHeader);
+  offset.s.HighPart = 0;
+  offset.s.LowPart  = sizeof(PresentationDataHeader);
 
   hres = IStream_Seek(
            presStream,
@@ -787,7 +787,7 @@
    */
   metafileBits = HeapAlloc(GetProcessHeap(), 
 			   0, 
-			   streamInfo.cbSize.LowPart);
+			   streamInfo.cbSize.s.LowPart);
 
   /*
    * Read the metafile bits.
@@ -795,7 +795,7 @@
   hres = IStream_Read(
 	   presStream,
 	   metafileBits,
-	   streamInfo.cbSize.LowPart,
+	   streamInfo.cbSize.s.LowPart,
 	   NULL);
 
   /*
@@ -803,7 +803,7 @@
    */
   if (SUCCEEDED(hres))
   {
-    newMetafile = SetMetaFileBitsEx(streamInfo.cbSize.LowPart, metafileBits);
+    newMetafile = SetMetaFileBitsEx(streamInfo.cbSize.s.LowPart, metafileBits);
   }
 
   /*
diff --git a/ole/filemoniker.c b/ole/filemoniker.c
index b56544b..4a399a4 100644
--- a/ole/filemoniker.c
+++ b/ole/filemoniker.c
@@ -423,8 +423,8 @@
                sizeof(WORD)+            /* constant : 0x3 */
                len*sizeof(WCHAR);       /* unicde filePath string */
     
-    pcbSize->LowPart=sizeMAx;
-    pcbSize->HighPart=0;
+    pcbSize->s.LowPart=sizeMAx;
+    pcbSize->s.HighPart=0;
 
     return S_OK;
 }
diff --git a/ole/hglobalstream.c b/ole/hglobalstream.c
index bcd6386..7361425 100644
--- a/ole/hglobalstream.c
+++ b/ole/hglobalstream.c
@@ -257,14 +257,14 @@
     /*
      * Start the stream at the begining.
      */
-    newStream->currentPosition.HighPart = 0;
-    newStream->currentPosition.LowPart = 0;
+    newStream->currentPosition.s.HighPart = 0;
+    newStream->currentPosition.s.LowPart = 0;
     
     /*
      * Initialize the size of the stream to the size of the handle.
      */
-    newStream->streamSize.HighPart = 0;
-    newStream->streamSize.LowPart  = GlobalSize(newStream->supportHandle);
+    newStream->streamSize.s.HighPart = 0;
+    newStream->streamSize.s.LowPart  = GlobalSize(newStream->supportHandle);
   }
   
   return newStream;
@@ -420,19 +420,19 @@
    * Using the known size of the stream, calculate the number of bytes
    * to read from the block chain
    */
-  bytesToReadFromBuffer = MIN( This->streamSize.LowPart - This->currentPosition.LowPart, cb);
+  bytesToReadFromBuffer = MIN( This->streamSize.s.LowPart - This->currentPosition.s.LowPart, cb);
 
   /*
    * Lock the buffer in position and copy the data.
    */
   supportBuffer = GlobalLock(This->supportHandle);
 
-  memcpy(pv, (char *) supportBuffer+This->currentPosition.LowPart, bytesToReadFromBuffer);
+  memcpy(pv, (char *) supportBuffer+This->currentPosition.s.LowPart, bytesToReadFromBuffer);
 
   /*
    * Move the current position to the new position
    */
-  This->currentPosition.LowPart+=bytesToReadFromBuffer;
+  This->currentPosition.s.LowPart+=bytesToReadFromBuffer;
 
   /*
    * Return the number of bytes read.
@@ -493,14 +493,14 @@
   }
   else
   {
-    newSize.HighPart = 0;
-    newSize.LowPart = This->currentPosition.LowPart + cb;
+    newSize.s.HighPart = 0;
+    newSize.s.LowPart = This->currentPosition.s.LowPart + cb;
   }
   
   /*
    * Verify if we need to grow the stream
    */
-  if (newSize.LowPart > This->streamSize.LowPart)
+  if (newSize.s.LowPart > This->streamSize.s.LowPart)
   {
     /* grow stream */
    IStream_SetSize(iface, newSize);
@@ -511,12 +511,12 @@
    */
   supportBuffer = GlobalLock(This->supportHandle);
 
-  memcpy((char *) supportBuffer+This->currentPosition.LowPart, pv, cb);  
+  memcpy((char *) supportBuffer+This->currentPosition.s.LowPart, pv, cb);  
 
   /*
    * Move the current position to the new position
    */
-  This->currentPosition.LowPart+=cb;
+  This->currentPosition.s.LowPart+=cb;
 
   /*
    * Return the number of bytes read.
@@ -550,7 +550,7 @@
   ULARGE_INTEGER newPosition;
 
   TRACE("(%p, %ld, %ld, %p)\n", iface,
-	dlibMove.LowPart, dwOrigin, plibNewPosition);
+	dlibMove.s.LowPart, dwOrigin, plibNewPosition);
 
   /* 
    * The caller is allowed to pass in NULL as the new position return value.
@@ -569,8 +569,8 @@
   switch (dwOrigin)
   {
     case STREAM_SEEK_SET:
-      plibNewPosition->HighPart = 0;
-      plibNewPosition->LowPart  = 0;
+      plibNewPosition->s.HighPart = 0;
+      plibNewPosition->s.LowPart  = 0;
       break;
     case STREAM_SEEK_CUR:
       *plibNewPosition = This->currentPosition;
@@ -585,13 +585,13 @@
   /*
    * We don't support files with offsets of 64 bits.
    */
-  assert(dlibMove.HighPart == 0);
+  assert(dlibMove.s.HighPart == 0);
 
   /*
    * Check if we end-up before the beginning of the file. That should trigger an
    * error.
    */
-  if ( (dlibMove.LowPart<0) && (plibNewPosition->LowPart < (ULONG)(-dlibMove.LowPart)) )
+  if ( (dlibMove.s.LowPart<0) && (plibNewPosition->s.LowPart < (ULONG)(-dlibMove.s.LowPart)) )
   {
     /*
      * I don't know what error to send there.
@@ -604,7 +604,7 @@
    * If the file pointer ends-up after the end of the stream, the next Write operation will
    * make the file larger. This is how it is documented.
    */
-  plibNewPosition->LowPart += dlibMove.LowPart;
+  plibNewPosition->s.LowPart += dlibMove.s.LowPart;
   This->currentPosition = *plibNewPosition;
  
   return S_OK;
@@ -625,25 +625,25 @@
 {
   HGLOBALStreamImpl* const This=(HGLOBALStreamImpl*)iface;
 
-  TRACE("(%p, %ld)\n", iface, libNewSize.LowPart);
+  TRACE("(%p, %ld)\n", iface, libNewSize.s.LowPart);
 
   /*
    * As documented.
    */
-  if (libNewSize.HighPart != 0)
+  if (libNewSize.s.HighPart != 0)
     return STG_E_INVALIDFUNCTION;
   
-  if (This->streamSize.LowPart == libNewSize.LowPart)
+  if (This->streamSize.s.LowPart == libNewSize.s.LowPart)
     return S_OK;
 
   /*
    * Re allocate the HGlobal to fit the new size of the stream.
    */
   This->supportHandle = GlobalReAlloc(This->supportHandle, 
-				      libNewSize.LowPart,
+				      libNewSize.s.LowPart,
 				      0);
 
-  This->streamSize.LowPart = libNewSize.LowPart;
+  This->streamSize.s.LowPart = libNewSize.s.LowPart;
   
   return S_OK;
 }
@@ -669,7 +669,7 @@
   ULARGE_INTEGER totalBytesWritten;
 
   TRACE("(%p, %p, %ld, %p, %p)\n", iface, pstm, 
-	cb.LowPart, pcbRead, pcbWritten);
+	cb.s.LowPart, pcbRead, pcbWritten);
 
   /*
    * Sanity check
@@ -677,28 +677,28 @@
   if ( pstm == 0 )
     return STG_E_INVALIDPOINTER;
 
-  totalBytesRead.LowPart = totalBytesRead.HighPart = 0;
-  totalBytesWritten.LowPart = totalBytesWritten.HighPart = 0;
+  totalBytesRead.s.LowPart = totalBytesRead.s.HighPart = 0;
+  totalBytesWritten.s.LowPart = totalBytesWritten.s.HighPart = 0;
 
   /*
    * use stack to store data temporarly
    * there is surely more performant way of doing it, for now this basic
    * implementation will do the job
    */
-  while ( cb.LowPart > 0 )
+  while ( cb.s.LowPart > 0 )
   {
-    if ( cb.LowPart >= 128 )
+    if ( cb.s.LowPart >= 128 )
       copySize = 128;
     else
-      copySize = cb.LowPart;
+      copySize = cb.s.LowPart;
     
     IStream_Read(iface, tmpBuffer, copySize, &bytesRead);
 
-    totalBytesRead.LowPart += bytesRead;
+    totalBytesRead.s.LowPart += bytesRead;
     
     IStream_Write(pstm, tmpBuffer, bytesRead, &bytesWritten);
 
-    totalBytesWritten.LowPart += bytesWritten;
+    totalBytesWritten.s.LowPart += bytesWritten;
 
     /*
      * Check that read & write operations were succesfull
@@ -710,9 +710,9 @@
     }
     
     if (bytesRead!=copySize)
-      cb.LowPart = 0;
+      cb.s.LowPart = 0;
     else
-      cb.LowPart -= bytesRead;
+      cb.s.LowPart -= bytesRead;
   }
 
   /*
@@ -720,14 +720,14 @@
    */
   if (pcbRead)
   {
-    pcbRead->LowPart = totalBytesRead.LowPart;
-    pcbRead->HighPart = totalBytesRead.HighPart;
+    pcbRead->s.LowPart = totalBytesRead.s.LowPart;
+    pcbRead->s.HighPart = totalBytesRead.s.HighPart;
   }
 
   if (pcbWritten)
   {
-    pcbWritten->LowPart = totalBytesWritten.LowPart;
-    pcbWritten->HighPart = totalBytesWritten.HighPart;
+    pcbWritten->s.LowPart = totalBytesWritten.s.LowPart;
+    pcbWritten->s.HighPart = totalBytesWritten.s.HighPart;
   }
   return hr;
 }
diff --git a/ole/itemmoniker.c b/ole/itemmoniker.c
index d7d0648..d21a37d 100644
--- a/ole/itemmoniker.c
+++ b/ole/itemmoniker.c
@@ -322,13 +322,13 @@
 
     /* for more details see ItemMonikerImpl_Save coments */
     
-    pcbSize->LowPart =  sizeof(DWORD) + /* DWORD witch contains delimiter length */
+    pcbSize->s.LowPart =  sizeof(DWORD) + /* DWORD witch contains delimiter length */
                         delimiterLength + /* item delimiter string */
                         sizeof(DWORD) + /* DWORD witch contains item name length */
                         nameLength + /* item name string */
                         34; /* this constant was added ! because when I tested this function it usually */
                             /*  returns 34 bytes more than the number of bytes used by IMoniker::Save function */
-    pcbSize->HighPart=0;
+    pcbSize->s.HighPart=0;
 
     return S_OK;
 }
diff --git a/ole/memlockbytes.c b/ole/memlockbytes.c
index 5c1db00..e408035 100644
--- a/ole/memlockbytes.c
+++ b/ole/memlockbytes.c
@@ -215,8 +215,8 @@
     /*
      * Initialize the size of the array to the size of the handle.
      */
-    newLockBytes->byteArraySize.HighPart = 0;
-    newLockBytes->byteArraySize.LowPart  = GlobalSize(
+    newLockBytes->byteArraySize.s.HighPart = 0;
+    newLockBytes->byteArraySize.s.LowPart  = GlobalSize(
                                               newLockBytes->supportHandle);
   }
 
@@ -365,15 +365,15 @@
   /*
    * Make sure the offset is valid.
    */
-  if (ulOffset.LowPart > This->byteArraySize.LowPart)
+  if (ulOffset.s.LowPart > This->byteArraySize.s.LowPart)
     return E_FAIL;
 
   /*
    * Using the known size of the array, calculate the number of bytes
    * to read.
    */
-  bytesToReadFromBuffer = MIN(This->byteArraySize.LowPart -
-                              ulOffset.LowPart, cb);
+  bytesToReadFromBuffer = MIN(This->byteArraySize.s.LowPart -
+                              ulOffset.s.LowPart, cb);
 
   /*
    * Lock the buffer in position and copy the data.
@@ -381,7 +381,7 @@
   supportBuffer = GlobalLock(This->supportHandle);
 
   memcpy(pv,
-         (char *) supportBuffer + ulOffset.LowPart,
+         (char *) supportBuffer + ulOffset.s.LowPart,
          bytesToReadFromBuffer);
 
   /*
@@ -440,14 +440,14 @@
   }
   else
   {
-    newSize.HighPart = 0;
-    newSize.LowPart = ulOffset.LowPart + cb;
+    newSize.s.HighPart = 0;
+    newSize.s.LowPart = ulOffset.s.LowPart + cb;
   }
 
   /*
    * Verify if we need to grow the stream
    */
-  if (newSize.LowPart > This->byteArraySize.LowPart)
+  if (newSize.s.LowPart > This->byteArraySize.s.LowPart)
   {
     /* grow stream */
     if (HGLOBALLockBytesImpl_SetSize(iface, newSize) == STG_E_MEDIUMFULL)
@@ -459,7 +459,7 @@
    */
   supportBuffer = GlobalLock(This->supportHandle);
 
-  memcpy((char *) supportBuffer + ulOffset.LowPart, pv, cb);
+  memcpy((char *) supportBuffer + ulOffset.s.LowPart, pv, cb);
 
   /*
    * Return the number of bytes written.
@@ -500,23 +500,23 @@
   /*
    * As documented.
    */
-  if (libNewSize.HighPart != 0)
+  if (libNewSize.s.HighPart != 0)
     return STG_E_INVALIDFUNCTION;
  
-  if (This->byteArraySize.LowPart == libNewSize.LowPart)
+  if (This->byteArraySize.s.LowPart == libNewSize.s.LowPart)
     return S_OK;
 
   /*
    * Re allocate the HGlobal to fit the new size of the stream.
    */
   This->supportHandle = GlobalReAlloc(This->supportHandle,
-                                      libNewSize.LowPart,
+                                      libNewSize.s.LowPart,
                                       0);
 
   if (This->supportHandle == 0)
     return STG_E_MEDIUMFULL;
 
-  This->byteArraySize.LowPart = libNewSize.LowPart;
+  This->byteArraySize.s.LowPart = libNewSize.s.LowPart;
  
   return S_OK;
 }
diff --git a/ole/olefont.c b/ole/olefont.c
index 52464da..6a1c082 100644
--- a/ole/olefont.c
+++ b/ole/olefont.c
@@ -540,8 +540,8 @@
   if (psize==0)
     return E_POINTER;
 
-  psize->u.Hi = 0;
-  psize->u.Lo = this->description.cySize.u.Lo;
+  psize->s.Hi = 0;
+  psize->s.Lo = this->description.cySize.s.Lo;
 
   return S_OK;
 }
@@ -557,8 +557,8 @@
 {
   _ICOM_THIS(OLEFontImpl, iface);
 
-  this->description.cySize.u.Hi = 0;
-  this->description.cySize.u.Lo = this->description.cySize.u.Lo;
+  this->description.cySize.s.Hi = 0;
+  this->description.cySize.s.Lo = this->description.cySize.s.Lo;
 
   return S_OK;
 }
@@ -810,7 +810,7 @@
      */
     IFont_get_Size(iface, &cySize);
 
-    fontHeight = MulDiv(cySize.u.Lo, 2540L, 72L);
+    fontHeight = MulDiv(cySize.s.Lo, 2540L, 72L);
     fontHeight = MulDiv(fontHeight, this->cyLogical,this->cyHimetric);
 
     memset(&logFont, 0, sizeof(LOGFONTW));
@@ -1232,12 +1232,12 @@
   /*
    * Size
    */
-  IStream_Read(pLoadStream, &this->description.cySize.u.Lo, 4, &cbRead);
+  IStream_Read(pLoadStream, &this->description.cySize.s.Lo, 4, &cbRead);
 
   if (cbRead!=4)
     return E_FAIL;
 
-  this->description.cySize.u.Hi = 0;
+  this->description.cySize.s.Hi = 0;
 
   /*
    * FontName
@@ -1327,7 +1327,7 @@
   /*
    * Size
    */
-  IStream_Write(pOutStream, &this->description.cySize.u.Lo, 4, &cbWritten);
+  IStream_Write(pOutStream, &this->description.cySize.s.Lo, 4, &cbWritten);
 
   if (cbWritten!=4)
     return E_FAIL;
@@ -1379,18 +1379,18 @@
   if (pcbSize==NULL)
     return E_POINTER;
 
-  pcbSize->HighPart = 0;
-  pcbSize->LowPart = 0;
+  pcbSize->s.HighPart = 0;
+  pcbSize->s.LowPart = 0;
 
-  pcbSize->LowPart += sizeof(BYTE);  /* Version */
-  pcbSize->LowPart += sizeof(WORD);  /* Lang code */
-  pcbSize->LowPart += sizeof(BYTE);  /* Flags */
-  pcbSize->LowPart += sizeof(WORD);  /* Weight */
-  pcbSize->LowPart += sizeof(DWORD); /* Size */
-  pcbSize->LowPart += sizeof(BYTE);  /* StrLength */
+  pcbSize->s.LowPart += sizeof(BYTE);  /* Version */
+  pcbSize->s.LowPart += sizeof(WORD);  /* Lang code */
+  pcbSize->s.LowPart += sizeof(BYTE);  /* Flags */
+  pcbSize->s.LowPart += sizeof(WORD);  /* Weight */
+  pcbSize->s.LowPart += sizeof(DWORD); /* Size */
+  pcbSize->s.LowPart += sizeof(BYTE);  /* StrLength */
 
   if (this->description.lpstrName!=0)
-    pcbSize->LowPart += lstrlenW(this->description.lpstrName);
+    pcbSize->s.LowPart += lstrlenW(this->description.lpstrName);
 
   return S_OK;
 }
diff --git a/ole/stg_bigblockfile.c b/ole/stg_bigblockfile.c
index 04e7279..d251738 100644
--- a/ole/stg_bigblockfile.c
+++ b/ole/stg_bigblockfile.c
@@ -175,7 +175,7 @@
     return FALSE;
   }
 
-  This->filesize.LowPart = GetFileSize(This->hfile, NULL);
+  This->filesize.s.LowPart = GetFileSize(This->hfile, NULL);
 
   /* create the mapped pages list
    */
@@ -221,8 +221,8 @@
    */
   ILockBytes_AddRef(This->pLkbyt);
 
-  This->filesize.LowPart = GlobalSize(This->hbytearray);
-  This->filesize.HighPart = 0;
+  This->filesize.s.LowPart = GlobalSize(This->hbytearray);
+  This->filesize.s.HighPart = 0;
 
   This->pbytearray = GlobalLock(This->hbytearray);
 
@@ -289,8 +289,8 @@
    * 
    */
   if ((This->blocksize * (index + 1)) >
-      (This->filesize.LowPart +
-       (This->blocksize - (This->filesize.LowPart % This->blocksize))))
+      (This->filesize.s.LowPart +
+       (This->blocksize - (This->filesize.s.LowPart % This->blocksize))))
     return 0;
 
   return BIGBLOCKFILE_GetBigBlockPointer(This, index, FILE_MAP_READ);
@@ -316,12 +316,12 @@
   /*
    * make sure that the block physically exists
    */
-  if ((This->blocksize * (index + 1)) > This->filesize.LowPart)
+  if ((This->blocksize * (index + 1)) > This->filesize.s.LowPart)
   {
     ULARGE_INTEGER newSize;
 
-    newSize.HighPart = 0;
-    newSize.LowPart = This->blocksize * (index + 1);
+    newSize.s.HighPart = 0;
+    newSize.s.LowPart = This->blocksize * (index + 1);
 
     BIGBLOCKFILE_SetSize(This, newSize);
   }
@@ -377,7 +377,7 @@
  */
 void BIGBLOCKFILE_SetSize(LPBIGBLOCKFILE This, ULARGE_INTEGER newSize)
 {
-  if (This->filesize.LowPart == newSize.LowPart)
+  if (This->filesize.s.LowPart == newSize.s.LowPart)
     return;
 
   if (This->fileBased)
@@ -396,7 +396,7 @@
     /*
      * set the new end of file
      */
-    SetFilePointer(This->hfile, newSize.LowPart, NULL, FILE_BEGIN);
+    SetFilePointer(This->hfile, newSize.s.LowPart, NULL, FILE_BEGIN);
     SetEndOfFile(This->hfile);
   
     /*
@@ -429,8 +429,8 @@
    */
   BIGBLOCKFILE_RemoveAllBlocks(This);
 
-  This->filesize.LowPart = newSize.LowPart;
-  This->filesize.HighPart = newSize.HighPart;
+  This->filesize.s.LowPart = newSize.s.LowPart;
+  This->filesize.s.HighPart = newSize.s.HighPart;
 }
 
 /******************************************************************************
@@ -811,8 +811,8 @@
     newMappedPage->next = This->maplisthead->next;
     This->maplisthead->next = newMappedPage;
 
-    if (((pagenum + 1) * PAGE_SIZE) > This->filesize.LowPart)
-      numBytesToMap = This->filesize.LowPart - (pagenum * PAGE_SIZE);
+    if (((pagenum + 1) * PAGE_SIZE) > This->filesize.s.LowPart)
+      numBytesToMap = This->filesize.s.LowPart - (pagenum * PAGE_SIZE);
     else
       numBytesToMap = PAGE_SIZE;
 
diff --git a/ole/stg_stream.c b/ole/stg_stream.c
index 65167a2..101cce2 100644
--- a/ole/stg_stream.c
+++ b/ole/stg_stream.c
@@ -84,14 +84,14 @@
     /*
      * Start the stream at the begining.
      */
-    newStream->currentPosition.HighPart = 0;
-    newStream->currentPosition.LowPart = 0;
+    newStream->currentPosition.s.HighPart = 0;
+    newStream->currentPosition.s.LowPart = 0;
     
     /*
      * Initialize the rest of the data.
      */
-    newStream->streamSize.HighPart = 0;
-    newStream->streamSize.LowPart  = 0;
+    newStream->streamSize.s.HighPart = 0;
+    newStream->streamSize.s.LowPart  = 0;
     newStream->bigBlockChain       = 0;
     newStream->smallBlockChain     = 0;
     
@@ -272,16 +272,16 @@
     /*
      * This code supports only streams that are <32 bits in size.
      */
-    assert(This->streamSize.HighPart == 0);
+    assert(This->streamSize.s.HighPart == 0);
     
     if(curProperty.startingBlock == BLOCK_END_OF_CHAIN)
     {
-      assert( (This->streamSize.HighPart == 0) && (This->streamSize.LowPart == 0) );
+      assert( (This->streamSize.s.HighPart == 0) && (This->streamSize.s.LowPart == 0) );
     }
     else
     {
-      if ( (This->streamSize.HighPart == 0) &&
-	   (This->streamSize.LowPart < LIMIT_TO_USE_SMALL_BLOCK) )
+      if ( (This->streamSize.s.HighPart == 0) &&
+	   (This->streamSize.s.LowPart < LIMIT_TO_USE_SMALL_BLOCK) )
       {
 	This->smallBlockChain = SmallBlockChainStream_Construct(
 								This->parentStorage->ancestorStorage,	
@@ -332,7 +332,7 @@
    * Using the known size of the stream, calculate the number of bytes
    * to read from the block chain
    */
-  bytesToReadFromBuffer = MIN( This->streamSize.LowPart - This->currentPosition.LowPart, cb);
+  bytesToReadFromBuffer = MIN( This->streamSize.s.LowPart - This->currentPosition.s.LowPart, cb);
   
   /*
    * Depending on the type of chain that was opened when the stream was constructed,
@@ -375,7 +375,7 @@
   /*
    * Advance the pointer for the number of positions read.
    */
-  This->currentPosition.LowPart += *pcbRead;
+  This->currentPosition.s.LowPart += *pcbRead;
   
   /*
    * The function returns S_OK if the buffer was filled completely
@@ -430,14 +430,14 @@
   }
   else
   {
-    newSize.HighPart = 0;
-    newSize.LowPart = This->currentPosition.LowPart + cb;
+    newSize.s.HighPart = 0;
+    newSize.s.LowPart = This->currentPosition.s.LowPart + cb;
   }
   
   /*
    * Verify if we need to grow the stream
    */
-  if (newSize.LowPart > This->streamSize.LowPart)
+  if (newSize.s.LowPart > This->streamSize.s.LowPart)
   {
     /* grow stream */
     IStream_SetSize(iface, newSize);
@@ -470,7 +470,7 @@
   /*
    * Advance the position pointer for the number of positions written.
    */
-  This->currentPosition.LowPart += *pcbWritten;
+  This->currentPosition.s.LowPart += *pcbWritten;
   
   return S_OK;
 }
@@ -494,7 +494,7 @@
   ULARGE_INTEGER newPosition;
 
   TRACE("(%p, %ld, %ld, %p)\n",
-	iface, dlibMove.LowPart, dwOrigin, plibNewPosition);
+	iface, dlibMove.s.LowPart, dwOrigin, plibNewPosition);
 
   /* 
    * The caller is allowed to pass in NULL as the new position return value.
@@ -513,8 +513,8 @@
   switch (dwOrigin)
   {
     case STREAM_SEEK_SET:
-      plibNewPosition->HighPart = 0;
-      plibNewPosition->LowPart  = 0;
+      plibNewPosition->s.HighPart = 0;
+      plibNewPosition->s.LowPart  = 0;
       break;
     case STREAM_SEEK_CUR:
       *plibNewPosition = This->currentPosition;
@@ -529,13 +529,13 @@
   /*
    * We don't support files with offsets of 64 bits.
    */
-  assert(dlibMove.HighPart == 0);
+  assert(dlibMove.s.HighPart == 0);
 
   /*
    * Check if we end-up before the beginning of the file. That should trigger an
    * error.
    */
-  if ( (dlibMove.LowPart<0) && (plibNewPosition->LowPart < (ULONG)(-dlibMove.LowPart)) )
+  if ( (dlibMove.s.LowPart<0) && (plibNewPosition->s.LowPart < (ULONG)(-dlibMove.s.LowPart)) )
   {
     /*
      * I don't know what error to send there.
@@ -548,7 +548,7 @@
    * If the file pointer ends-up after the end of the stream, the next Write operation will
    * make the file larger. This is how it is documented.
    */
-  plibNewPosition->LowPart += dlibMove.LowPart;
+  plibNewPosition->s.LowPart += dlibMove.s.LowPart;
   This->currentPosition = *plibNewPosition;
  
   return S_OK;
@@ -572,15 +572,15 @@
   StgProperty    curProperty;
   BOOL         Success;
 
-  TRACE("(%p, %ld)\n", iface, libNewSize.LowPart);
+  TRACE("(%p, %ld)\n", iface, libNewSize.s.LowPart);
 
   /*
    * As documented.
    */
-  if (libNewSize.HighPart != 0)
+  if (libNewSize.s.HighPart != 0)
     return STG_E_INVALIDFUNCTION;
   
-  if (This->streamSize.LowPart == libNewSize.LowPart)
+  if (This->streamSize.s.LowPart == libNewSize.s.LowPart)
     return S_OK;
 
   /*
@@ -588,7 +588,7 @@
    */
   if ((This->smallBlockChain == 0) && (This->bigBlockChain == 0))
   {
-    if (libNewSize.LowPart < LIMIT_TO_USE_SMALL_BLOCK)
+    if (libNewSize.s.LowPart < LIMIT_TO_USE_SMALL_BLOCK)
     {
       This->smallBlockChain = SmallBlockChainStream_Construct(
                                     This->parentStorage->ancestorStorage,
@@ -613,9 +613,9 @@
    * Determine if we have to switch from small to big blocks or vice versa
    */  
   if ( (This->smallBlockChain!=0) && 
-       (curProperty.size.LowPart < LIMIT_TO_USE_SMALL_BLOCK) )
+       (curProperty.size.s.LowPart < LIMIT_TO_USE_SMALL_BLOCK) )
   {
-    if (libNewSize.LowPart >= LIMIT_TO_USE_SMALL_BLOCK)
+    if (libNewSize.s.LowPart >= LIMIT_TO_USE_SMALL_BLOCK)
     {
       /*
        * Transform the small block chain into a big block chain
@@ -642,8 +642,8 @@
                                        This->ownerProperty,
                                        &curProperty);
 
-  curProperty.size.HighPart = libNewSize.HighPart;
-  curProperty.size.LowPart = libNewSize.LowPart;
+  curProperty.size.s.HighPart = libNewSize.s.HighPart;
+  curProperty.size.s.LowPart = libNewSize.s.LowPart;
   
   if (Success)
   {
@@ -678,7 +678,7 @@
   ULARGE_INTEGER totalBytesWritten;
 
   TRACE("(%p, %p, %ld, %p, %p)\n", 
-	iface, pstm, cb.LowPart, pcbRead, pcbWritten);
+	iface, pstm, cb.s.LowPart, pcbRead, pcbWritten);
 
   /*
    * Sanity check
@@ -686,28 +686,28 @@
   if ( pstm == 0 )
     return STG_E_INVALIDPOINTER;
 
-  totalBytesRead.LowPart = totalBytesRead.HighPart = 0;
-  totalBytesWritten.LowPart = totalBytesWritten.HighPart = 0;
+  totalBytesRead.s.LowPart = totalBytesRead.s.HighPart = 0;
+  totalBytesWritten.s.LowPart = totalBytesWritten.s.HighPart = 0;
 
   /*
    * use stack to store data temporarly
    * there is surely more performant way of doing it, for now this basic
    * implementation will do the job
    */
-  while ( cb.LowPart > 0 )
+  while ( cb.s.LowPart > 0 )
   {
-    if ( cb.LowPart >= 128 )
+    if ( cb.s.LowPart >= 128 )
       copySize = 128;
     else
-      copySize = cb.LowPart;
+      copySize = cb.s.LowPart;
     
     IStream_Read(iface, tmpBuffer, copySize, &bytesRead);
 
-    totalBytesRead.LowPart += bytesRead;
+    totalBytesRead.s.LowPart += bytesRead;
     
     IStream_Write(pstm, tmpBuffer, bytesRead, &bytesWritten);
 
-    totalBytesWritten.LowPart += bytesWritten;
+    totalBytesWritten.s.LowPart += bytesWritten;
 
     /*
      * Check that read & write operations were succesfull
@@ -719,9 +719,9 @@
     }
     
     if (bytesRead!=copySize)
-      cb.LowPart = 0;
+      cb.s.LowPart = 0;
     else
-      cb.LowPart -= bytesRead;
+      cb.s.LowPart -= bytesRead;
   }
 
   /*
@@ -729,14 +729,14 @@
    */
   if (pcbRead)
   {
-    pcbRead->LowPart = totalBytesRead.LowPart;
-    pcbRead->HighPart = totalBytesRead.HighPart;
+    pcbRead->s.LowPart = totalBytesRead.s.LowPart;
+    pcbRead->s.HighPart = totalBytesRead.s.HighPart;
   }
 
   if (pcbWritten)
   {
-    pcbWritten->LowPart = totalBytesWritten.LowPart;
-    pcbWritten->HighPart = totalBytesWritten.HighPart;
+    pcbWritten->s.LowPart = totalBytesWritten.s.LowPart;
+    pcbWritten->s.HighPart = totalBytesWritten.s.HighPart;
   }
   return hr;
 }
diff --git a/ole/storage.c b/ole/storage.c
index d1dcc4a..5962f12 100644
--- a/ole/storage.c
+++ b/ole/storage.c
@@ -732,7 +732,7 @@
 	IStream16* iface,LARGE_INTEGER offset,DWORD whence,ULARGE_INTEGER *newpos
 ) {
 	ICOM_THIS(IStream16Impl,iface);
-	TRACE_(relay)("(%p)->([%ld.%ld],%ld,%p)\n",This,offset.HighPart,offset.LowPart,whence,newpos);
+	TRACE_(relay)("(%p)->([%ld.%ld],%ld,%p)\n",This,offset.s.HighPart,offset.s.LowPart,whence,newpos);
 
 	switch (whence) {
 	/* unix SEEK_xx should be the same as win95 ones */
@@ -740,31 +740,31 @@
 		/* offset must be ==0 (<0 is invalid, and >0 cannot be handled
 		 * right now.
 		 */
-		assert(offset.HighPart==0);
-		This->offset.HighPart = offset.HighPart;
-		This->offset.LowPart = offset.LowPart;
+		assert(offset.s.HighPart==0);
+		This->offset.s.HighPart = offset.s.HighPart;
+		This->offset.s.LowPart = offset.s.LowPart;
 		break;
 	case SEEK_CUR:
-		if (offset.HighPart < 0) {
+		if (offset.s.HighPart < 0) {
 			/* FIXME: is this negation correct ? */
-			offset.HighPart = -offset.HighPart;
-			offset.LowPart = (0xffffffff ^ offset.LowPart)+1;
+			offset.s.HighPart = -offset.s.HighPart;
+			offset.s.LowPart = (0xffffffff ^ offset.s.LowPart)+1;
 
-			assert(offset.HighPart==0);
-			assert(This->offset.LowPart >= offset.LowPart);
-			This->offset.LowPart -= offset.LowPart;
+			assert(offset.s.HighPart==0);
+			assert(This->offset.s.LowPart >= offset.s.LowPart);
+			This->offset.s.LowPart -= offset.s.LowPart;
 		} else {
-			assert(offset.HighPart==0);
-			This->offset.LowPart+= offset.LowPart;
+			assert(offset.s.HighPart==0);
+			This->offset.s.LowPart+= offset.s.LowPart;
 		}
 		break;
 	case SEEK_END:
-		assert(offset.HighPart==0);
-		This->offset.LowPart = This->stde.pps_size-offset.LowPart;
+		assert(offset.s.HighPart==0);
+		This->offset.s.LowPart = This->stde.pps_size-offset.s.LowPart;
 		break;
 	}
-	if (This->offset.LowPart>This->stde.pps_size)
-		This->offset.LowPart=This->stde.pps_size;
+	if (This->offset.s.LowPart>This->stde.pps_size)
+		This->offset.s.LowPart=This->stde.pps_size;
 	if (newpos) *newpos = This->offset;
 	return S_OK;
 }
@@ -784,11 +784,11 @@
 	if (!pcbRead) bytesread=&xxread;
 	*bytesread = 0;
 
-	if (cb>This->stde.pps_size-This->offset.LowPart)
-		cb=This->stde.pps_size-This->offset.LowPart;
+	if (cb>This->stde.pps_size-This->offset.s.LowPart)
+		cb=This->stde.pps_size-This->offset.s.LowPart;
 	if (This->stde.pps_size < 0x1000) {
 		/* use small block reader */
-		blocknr = STORAGE_get_nth_next_small_blocknr(This->hf,This->stde.pps_sb,This->offset.LowPart/SMALLSIZE);
+		blocknr = STORAGE_get_nth_next_small_blocknr(This->hf,This->stde.pps_sb,This->offset.s.LowPart/SMALLSIZE);
 		while (cb) {
 			int	cc;
 
@@ -797,10 +797,10 @@
 				return E_FAIL;
 			}
 			cc = cb; 
-			if (cc>SMALLSIZE-(This->offset.LowPart&(SMALLSIZE-1)))
-				cc=SMALLSIZE-(This->offset.LowPart&(SMALLSIZE-1));
-			memcpy((LPBYTE)pv,block+(This->offset.LowPart&(SMALLSIZE-1)),cc);
-			This->offset.LowPart+=cc;
+			if (cc>SMALLSIZE-(This->offset.s.LowPart&(SMALLSIZE-1)))
+				cc=SMALLSIZE-(This->offset.s.LowPart&(SMALLSIZE-1));
+			memcpy((LPBYTE)pv,block+(This->offset.s.LowPart&(SMALLSIZE-1)),cc);
+			This->offset.s.LowPart+=cc;
 			(LPBYTE)pv+=cc;
 			*bytesread+=cc;
 			cb-=cc;
@@ -808,7 +808,7 @@
 		}
 	} else {
 		/* use big block reader */
-		blocknr = STORAGE_get_nth_next_big_blocknr(This->hf,This->stde.pps_sb,This->offset.LowPart/BIGSIZE);
+		blocknr = STORAGE_get_nth_next_big_blocknr(This->hf,This->stde.pps_sb,This->offset.s.LowPart/BIGSIZE);
 		while (cb) {
 			int	cc;
 
@@ -817,10 +817,10 @@
 				return E_FAIL;
 			}
 			cc = cb; 
-			if (cc>BIGSIZE-(This->offset.LowPart&(BIGSIZE-1)))
-				cc=BIGSIZE-(This->offset.LowPart&(BIGSIZE-1));
-			memcpy((LPBYTE)pv,block+(This->offset.LowPart&(BIGSIZE-1)),cc);
-			This->offset.LowPart+=cc;
+			if (cc>BIGSIZE-(This->offset.s.LowPart&(BIGSIZE-1)))
+				cc=BIGSIZE-(This->offset.s.LowPart&(BIGSIZE-1));
+			memcpy((LPBYTE)pv,block+(This->offset.s.LowPart&(BIGSIZE-1)),cc);
+			This->offset.s.LowPart+=cc;
 			(LPBYTE)pv+=cc;
 			*bytesread+=cc;
 			cb-=cc;
@@ -847,7 +847,7 @@
 
 	TRACE_(relay)("(%p)->(%p,%ld,%p)\n",This,pv,cb,pcbWrite);
 	/* do we need to junk some blocks? */
-	newsize	= This->offset.LowPart+cb;
+	newsize	= This->offset.s.LowPart+cb;
 	oldsize	= This->stde.pps_size;
 	if (newsize < oldsize) {
 		if (oldsize < 0x1000) {
@@ -1033,7 +1033,7 @@
 
 	/* finally the write pass */
 	if (This->stde.pps_size < 0x1000) {
-		blocknr = STORAGE_get_nth_next_small_blocknr(hf,This->stde.pps_sb,This->offset.LowPart/SMALLSIZE);
+		blocknr = STORAGE_get_nth_next_small_blocknr(hf,This->stde.pps_sb,This->offset.s.LowPart/SMALLSIZE);
 		assert(blocknr>=0);
 		while (cb>0) {
 			/* we ensured that it is allocated above */
@@ -1044,10 +1044,10 @@
 			if (!STORAGE_get_small_block(hf,blocknr,block))
 				return E_FAIL;
 
-			cc = SMALLSIZE-(This->offset.LowPart&(SMALLSIZE-1));
+			cc = SMALLSIZE-(This->offset.s.LowPart&(SMALLSIZE-1));
 			if (cc>cb)
 				cc=cb;
-			memcpy(	((LPBYTE)block)+(This->offset.LowPart&(SMALLSIZE-1)),
+			memcpy(	((LPBYTE)block)+(This->offset.s.LowPart&(SMALLSIZE-1)),
 				(LPBYTE)((char *) pv+curoffset),
 				cc
 			);
@@ -1056,12 +1056,12 @@
 			cb			-= cc;
 			curoffset		+= cc;
 			(LPBYTE)pv		+= cc;
-			This->offset.LowPart	+= cc;
+			This->offset.s.LowPart	+= cc;
 			*byteswritten		+= cc;
 			blocknr = STORAGE_get_next_small_blocknr(hf,blocknr);
 		}
 	} else {
-		blocknr = STORAGE_get_nth_next_big_blocknr(hf,This->stde.pps_sb,This->offset.LowPart/BIGSIZE);
+		blocknr = STORAGE_get_nth_next_big_blocknr(hf,This->stde.pps_sb,This->offset.s.LowPart/BIGSIZE);
 		assert(blocknr>=0);
 		while (cb>0) {
 			/* we ensured that it is allocated above, so it better is */
@@ -1072,10 +1072,10 @@
 			if (!STORAGE_get_big_block(hf,blocknr,block))
 				return E_FAIL;
 
-			cc = BIGSIZE-(This->offset.LowPart&(BIGSIZE-1));
+			cc = BIGSIZE-(This->offset.s.LowPart&(BIGSIZE-1));
 			if (cc>cb)
 				cc=cb;
-			memcpy(	((LPBYTE)block)+(This->offset.LowPart&(BIGSIZE-1)),
+			memcpy(	((LPBYTE)block)+(This->offset.s.LowPart&(BIGSIZE-1)),
 				(LPBYTE)((char *) pv+curoffset),
 				cc
 			);
@@ -1084,7 +1084,7 @@
 			cb			-= cc;
 			curoffset		+= cc;
 			(LPBYTE)pv		+= cc;
-			This->offset.LowPart	+= cc;
+			This->offset.s.LowPart	+= cc;
 			*byteswritten		+= cc;
 			blocknr = STORAGE_get_next_big_blocknr(hf,blocknr);
 		}
@@ -1272,7 +1272,7 @@
 	);
 	pstatstg->pwcsName=(LPOLESTR16)SEGPTR_GET(SEGPTR_STRDUP_WtoA(This->stde.pps_rawname));
 	pstatstg->type = This->stde.pps_type;
-	pstatstg->cbSize.LowPart = This->stde.pps_size;
+	pstatstg->cbSize.s.LowPart = This->stde.pps_size;
 	pstatstg->mtime = This->stde.pps_ft1; /* FIXME */ /* why? */
 	pstatstg->atime = This->stde.pps_ft2; /* FIXME */
 	pstatstg->ctime = This->stde.pps_ft2; /* FIXME */
@@ -1395,8 +1395,8 @@
 	lpstr = (IStream16Impl*)PTR_SEG_TO_LIN(*ppstm);
         DuplicateHandle( GetCurrentProcess(), This->hf, GetCurrentProcess(),
                          &lpstr->hf, 0, TRUE, DUPLICATE_SAME_ACCESS );
-	lpstr->offset.LowPart	= 0;
-	lpstr->offset.HighPart	= 0;
+	lpstr->offset.s.LowPart	= 0;
+	lpstr->offset.s.HighPart	= 0;
 
 	ppsent=STORAGE_get_free_pps_entry(lpstr->hf);
 	if (ppsent<0)
@@ -1494,8 +1494,8 @@
 		IStream16_fnRelease((IStream16*)lpstr);
 		return E_FAIL;
 	}
-	lpstr->offset.LowPart	= 0;
-	lpstr->offset.HighPart	= 0;
+	lpstr->offset.s.LowPart	= 0;
+	lpstr->offset.s.HighPart	= 0;
 	lpstr->ppsent		= newpps;
 	return S_OK;
 }
diff --git a/ole/storage32.c b/ole/storage32.c
index ca2bbb7..18996a2 100644
--- a/ole/storage32.c
+++ b/ole/storage32.c
@@ -630,8 +630,8 @@
  
     renamedProperty.propertyType  = currentProperty.propertyType;
     renamedProperty.startingBlock = currentProperty.startingBlock;
-    renamedProperty.size.LowPart  = currentProperty.size.LowPart;
-    renamedProperty.size.HighPart = currentProperty.size.HighPart;
+    renamedProperty.size.s.LowPart  = currentProperty.size.s.LowPart;
+    renamedProperty.size.s.HighPart = currentProperty.size.s.HighPart;
   
     renamedProperty.previousProperty = PROPERTY_NULL;
     renamedProperty.nextProperty     = PROPERTY_NULL;
@@ -800,8 +800,8 @@
 
   newStreamProperty.propertyType  = PROPTYPE_STREAM;
   newStreamProperty.startingBlock = BLOCK_END_OF_CHAIN;
-  newStreamProperty.size.LowPart  = 0;
-  newStreamProperty.size.HighPart = 0;
+  newStreamProperty.size.s.LowPart  = 0;
+  newStreamProperty.size.s.HighPart = 0;
 
   newStreamProperty.previousProperty = PROPERTY_NULL;
   newStreamProperty.nextProperty     = PROPERTY_NULL;
@@ -985,8 +985,8 @@
 
   newProperty.propertyType  = PROPTYPE_STORAGE;
   newProperty.startingBlock = BLOCK_END_OF_CHAIN;
-  newProperty.size.LowPart  = 0;
-  newProperty.size.HighPart = 0;
+  newProperty.size.s.LowPart  = 0;
+  newProperty.size.s.HighPart = 0;
 
   newProperty.previousProperty = PROPERTY_NULL;
   newProperty.nextProperty     = PROPERTY_NULL;
@@ -1107,8 +1107,8 @@
     /* 
      * initialize the size used by the property stream 
      */
-    newSize.HighPart = 0;
-    newSize.LowPart  = storage->bigBlockSize * blockCount;
+    newSize.s.HighPart = 0;
+    newSize.s.LowPart  = storage->bigBlockSize * blockCount;
 
     /* 
      * add a property block to the property chain 
@@ -1699,8 +1699,8 @@
   HRESULT        hr;
   ULARGE_INTEGER size;
 
-  size.HighPart = 0;
-  size.LowPart = 0;
+  size.s.HighPart = 0;
+  size.s.LowPart = 0;
 
   hr = StorageBaseImpl_OpenStream(
          (IStorage*)parentStorage,
@@ -2094,8 +2094,8 @@
     /*
      * Add one block for the big block depot and one block for the properties
      */
-    size.HighPart = 0;
-    size.LowPart  = This->bigBlockSize * 3;
+    size.s.HighPart = 0;
+    size.s.LowPart  = This->bigBlockSize * 3;
     BIGBLOCKFILE_SetSize(This->bigBlockFile, size);
 
     /*
@@ -2161,8 +2161,8 @@
     rootProp.nextProperty     = PROPERTY_NULL;
     rootProp.dirProperty      = PROPERTY_NULL;
     rootProp.startingBlock    = BLOCK_END_OF_CHAIN;
-    rootProp.size.HighPart    = 0;
-    rootProp.size.LowPart     = 0;
+    rootProp.size.s.HighPart    = 0;
+    rootProp.size.s.LowPart     = 0;
 
     StorageImpl_WriteProperty(This, 0, &rootProp);
   }
@@ -2924,8 +2924,8 @@
   BOOL         readSucessful;
   ULONG          bytesRead;
 
-  offsetInPropSet.HighPart = 0;
-  offsetInPropSet.LowPart  = index * PROPSET_BLOCK_SIZE;
+  offsetInPropSet.s.HighPart = 0;
+  offsetInPropSet.s.LowPart  = index * PROPSET_BLOCK_SIZE;
   
   readSucessful = BlockChainStream_ReadAt(
                     This->rootBlockChain,
@@ -2997,9 +2997,9 @@
     StorageUtl_ReadDWord(
       currentProperty, 
       OFFSET_PS_SIZE,         
-      &buffer->size.LowPart);
+      &buffer->size.s.LowPart);
 
-    buffer->size.HighPart = 0;
+    buffer->size.s.HighPart = 0;
   }
 
   return readSucessful;
@@ -3018,8 +3018,8 @@
   BOOL         writeSucessful;
   ULONG          bytesWritten;
 
-  offsetInPropSet.HighPart = 0;
-  offsetInPropSet.LowPart  = index * PROPSET_BLOCK_SIZE;
+  offsetInPropSet.s.HighPart = 0;
+  offsetInPropSet.s.LowPart  = index * PROPSET_BLOCK_SIZE;
 
   memset(currentProperty, 0, PROPSET_BLOCK_SIZE);
 
@@ -3088,7 +3088,7 @@
   StorageUtl_WriteDWord(
     currentProperty, 
       OFFSET_PS_SIZE,         
-      buffer->size.LowPart);
+      buffer->size.s.LowPart);
 
   writeSucessful = BlockChainStream_WriteAt(This->rootBlockChain,
                                             offsetInPropSet,
@@ -3200,8 +3200,8 @@
    * Copy the contents of the small block chain to the big block chain
    * by small block size increments.
    */
-  offset.LowPart = 0;
-  offset.HighPart = 0;
+  offset.s.LowPart = 0;
+  offset.s.HighPart = 0;
   cbTotalRead = 0;
   cbTotalWritten = 0;
 
@@ -3222,7 +3222,7 @@
                                             &cbWritten);
     cbTotalWritten += cbWritten;
 
-    offset.LowPart += This->smallBlockSize;
+    offset.s.LowPart += This->smallBlockSize;
 
   } while (successRead && successWrite);
   free(buffer);
@@ -3233,8 +3233,8 @@
    * Destroy the small block chain.
    */
   propertyIndex = (*ppsbChain)->ownerPropertyIndex;
-  size.HighPart = 0;
-  size.LowPart  = 0;
+  size.s.HighPart = 0;
+  size.s.LowPart  = 0;
   SmallBlockChainStream_SetSize(*ppsbChain, size);
   SmallBlockChainStream_Destroy(*ppsbChain);
   *ppsbChain = 0;
@@ -4054,8 +4054,8 @@
   void*          buffer,
   ULONG*         bytesRead)
 {
-  ULONG blockNoInSequence = offset.LowPart / This->parentStorage->bigBlockSize;
-  ULONG offsetInBlock     = offset.LowPart % This->parentStorage->bigBlockSize;
+  ULONG blockNoInSequence = offset.s.LowPart / This->parentStorage->bigBlockSize;
+  ULONG offsetInBlock     = offset.s.LowPart % This->parentStorage->bigBlockSize;
   ULONG bytesToReadInBuffer;
   ULONG blockIndex;
   BYTE* bufferWalker;
@@ -4143,8 +4143,8 @@
   const void*       buffer,
   ULONG*            bytesWritten)
 {
-  ULONG blockNoInSequence = offset.LowPart / This->parentStorage->bigBlockSize;
-  ULONG offsetInBlock     = offset.LowPart % This->parentStorage->bigBlockSize;
+  ULONG blockNoInSequence = offset.s.LowPart / This->parentStorage->bigBlockSize;
+  ULONG offsetInBlock     = offset.s.LowPart % This->parentStorage->bigBlockSize;
   ULONG bytesToWrite;
   ULONG blockIndex;
   BYTE* bufferWalker;
@@ -4239,9 +4239,9 @@
   /*
    * Figure out how many blocks are needed to contain the new size
    */
-  numBlocks = newSize.LowPart / This->parentStorage->bigBlockSize;
+  numBlocks = newSize.s.LowPart / This->parentStorage->bigBlockSize;
 
-  if ((newSize.LowPart % This->parentStorage->bigBlockSize) != 0)
+  if ((newSize.s.LowPart % This->parentStorage->bigBlockSize) != 0)
     numBlocks++;
 
   blockIndex = BlockChainStream_GetHeadOfChain(This);
@@ -4338,9 +4338,9 @@
   /*
    * Figure out how many blocks are needed to contain this stream
    */
-  newNumBlocks = newSize.LowPart / This->parentStorage->bigBlockSize;
+  newNumBlocks = newSize.s.LowPart / This->parentStorage->bigBlockSize;
 
-  if ((newSize.LowPart % This->parentStorage->bigBlockSize) != 0)
+  if ((newSize.s.LowPart % This->parentStorage->bigBlockSize) != 0)
     newNumBlocks++;
 
   /*
@@ -4411,10 +4411,10 @@
 {
   ULARGE_INTEGER size = BlockChainStream_GetSize(This);
 
-  if (newSize.LowPart == size.LowPart)
+  if (newSize.s.LowPart == size.s.LowPart)
     return TRUE;
 
-  if (newSize.LowPart < size.LowPart)
+  if (newSize.s.LowPart < size.s.LowPart)
   {
     BlockChainStream_Shrink(This, newSize);
   }
@@ -4423,7 +4423,7 @@
     ULARGE_INTEGER fileSize = 
       BIGBLOCKFILE_GetSize(This->parentStorage->bigBlockFile);
 
-    ULONG diff = newSize.LowPart - size.LowPart;
+    ULONG diff = newSize.s.LowPart - size.s.LowPart;
 
     /*
      * Make sure the file stays a multiple of blocksize
@@ -4432,7 +4432,7 @@
       diff += (This->parentStorage->bigBlockSize - 
                 (diff % This->parentStorage->bigBlockSize) );
 
-    fileSize.LowPart += diff;
+    fileSize.s.LowPart += diff;
     BIGBLOCKFILE_SetSize(This->parentStorage->bigBlockFile, fileSize);
 
     BlockChainStream_Enlarge(This, newSize);
@@ -4472,9 +4472,9 @@
      * size of them
      */
     ULARGE_INTEGER result;
-    result.HighPart = 0;
+    result.s.HighPart = 0;
 
-    result.LowPart  = 
+    result.s.LowPart  = 
       BlockChainStream_GetCount(This) * 
       This->parentStorage->bigBlockSize;
 
@@ -4553,8 +4553,8 @@
   ULONG  bytesRead;
   BOOL success;
 
-  offsetOfBlockInDepot.HighPart = 0;
-  offsetOfBlockInDepot.LowPart  = blockIndex * sizeof(ULONG);
+  offsetOfBlockInDepot.s.HighPart = 0;
+  offsetOfBlockInDepot.s.LowPart  = blockIndex * sizeof(ULONG);
 
   /*
    * Read those bytes in the buffer from the small block file.
@@ -4591,8 +4591,8 @@
   DWORD  buffer;
   ULONG  bytesWritten;
 
-  offsetOfBlockInDepot.HighPart = 0;
-  offsetOfBlockInDepot.LowPart  = blockIndex * sizeof(ULONG);
+  offsetOfBlockInDepot.s.HighPart = 0;
+  offsetOfBlockInDepot.s.LowPart  = blockIndex * sizeof(ULONG);
 
   StorageUtl_WriteDWord(&buffer, 0, nextBlock);
 
@@ -4637,14 +4637,14 @@
   BOOL success = TRUE;
   ULONG smallBlocksPerBigBlock;
 
-  offsetOfBlockInDepot.HighPart = 0;
+  offsetOfBlockInDepot.s.HighPart = 0;
 
   /*
    * Scan the small block depot for a free block
    */
   while (nextBlockIndex != BLOCK_UNUSED)
   {
-    offsetOfBlockInDepot.LowPart = blockIndex * sizeof(ULONG);
+    offsetOfBlockInDepot.s.LowPart = blockIndex * sizeof(ULONG);
 
     success = BlockChainStream_ReadAt(
                 This->parentStorage->smallBlockDepotChain,
@@ -4732,8 +4732,8 @@
           &rootProp);
 
         rootProp.startingBlock = sbStartIndex;
-        rootProp.size.HighPart = 0;
-        rootProp.size.LowPart  = This->parentStorage->bigBlockSize;
+        rootProp.size.s.HighPart = 0;
+        rootProp.size.s.LowPart  = This->parentStorage->bigBlockSize;
 
         StorageImpl_WriteProperty(
           This->parentStorage, 
@@ -4759,10 +4759,10 @@
       This->parentStorage->rootPropertySetIndex, 
       &rootProp);
 
-    if (rootProp.size.LowPart < 
+    if (rootProp.size.s.LowPart < 
        (blocksRequired * This->parentStorage->bigBlockSize))
     {
-      rootProp.size.LowPart += This->parentStorage->bigBlockSize;
+      rootProp.size.s.LowPart += This->parentStorage->bigBlockSize;
 
       BlockChainStream_SetSize(
         This->parentStorage->smallBlockRootChain, 
@@ -4794,9 +4794,9 @@
 {
   ULARGE_INTEGER offsetInBigBlockFile;
   ULONG blockNoInSequence = 
-    offset.LowPart / This->parentStorage->smallBlockSize;
+    offset.s.LowPart / This->parentStorage->smallBlockSize;
 
-  ULONG offsetInBlock = offset.LowPart % This->parentStorage->smallBlockSize;
+  ULONG offsetInBlock = offset.s.LowPart % This->parentStorage->smallBlockSize;
   ULONG bytesToReadInBuffer;
   ULONG blockIndex;
   ULONG bytesReadFromBigBlockFile;
@@ -4805,7 +4805,7 @@
   /*
    * This should never happen on a small block file.
    */
-  assert(offset.HighPart==0);
+  assert(offset.s.HighPart==0);
 
   /*
    * Find the first block in the stream that contains part of the buffer.
@@ -4836,11 +4836,11 @@
     /*
      * Calculate the offset of the small block in the small block file.
      */
-    offsetInBigBlockFile.HighPart  = 0;
-    offsetInBigBlockFile.LowPart   = 
+    offsetInBigBlockFile.s.HighPart  = 0;
+    offsetInBigBlockFile.s.LowPart   = 
       blockIndex * This->parentStorage->smallBlockSize;
 
-    offsetInBigBlockFile.LowPart  += offsetInBlock;
+    offsetInBigBlockFile.s.LowPart  += offsetInBlock;
 
     /*
      * Read those bytes in the buffer from the small block file.
@@ -4882,9 +4882,9 @@
 {
   ULARGE_INTEGER offsetInBigBlockFile;
   ULONG blockNoInSequence = 
-    offset.LowPart / This->parentStorage->smallBlockSize;
+    offset.s.LowPart / This->parentStorage->smallBlockSize;
 
-  ULONG offsetInBlock = offset.LowPart % This->parentStorage->smallBlockSize;
+  ULONG offsetInBlock = offset.s.LowPart % This->parentStorage->smallBlockSize;
   ULONG bytesToWriteInBuffer;
   ULONG blockIndex;
   ULONG bytesWrittenFromBigBlockFile;
@@ -4893,7 +4893,7 @@
   /*
    * This should never happen on a small block file.
    */
-  assert(offset.HighPart==0);
+  assert(offset.s.HighPart==0);
   
   /*
    * Find the first block in the stream that contains part of the buffer.
@@ -4926,11 +4926,11 @@
     /*
      * Calculate the offset of the small block in the small block file.
      */
-    offsetInBigBlockFile.HighPart  = 0;
-    offsetInBigBlockFile.LowPart   = 
+    offsetInBigBlockFile.s.HighPart  = 0;
+    offsetInBigBlockFile.s.LowPart   = 
       blockIndex * This->parentStorage->smallBlockSize;
 
-    offsetInBigBlockFile.LowPart  += offsetInBlock;
+    offsetInBigBlockFile.s.LowPart  += offsetInBlock;
     
     /*
      * Write those bytes in the buffer to the small block file.
@@ -4969,9 +4969,9 @@
   ULONG numBlocks;
   ULONG count = 0;
 
-  numBlocks = newSize.LowPart / This->parentStorage->smallBlockSize;
+  numBlocks = newSize.s.LowPart / This->parentStorage->smallBlockSize;
 
-  if ((newSize.LowPart % This->parentStorage->smallBlockSize) != 0)
+  if ((newSize.s.LowPart % This->parentStorage->smallBlockSize) != 0)
     numBlocks++;
 
   blockIndex = SmallBlockChainStream_GetHeadOfChain(This);
@@ -5076,9 +5076,9 @@
   /*
    * Figure out how many blocks are needed to contain this stream
    */
-  newNumBlocks = newSize.LowPart / This->parentStorage->smallBlockSize;
+  newNumBlocks = newSize.s.LowPart / This->parentStorage->smallBlockSize;
 
-  if ((newSize.LowPart % This->parentStorage->smallBlockSize) != 0)
+  if ((newSize.s.LowPart % This->parentStorage->smallBlockSize) != 0)
     newNumBlocks++;
 
   /*
@@ -5150,10 +5150,10 @@
 {
   ULARGE_INTEGER size = SmallBlockChainStream_GetSize(This);
 
-  if (newSize.LowPart == size.LowPart)
+  if (newSize.s.LowPart == size.s.LowPart)
     return TRUE;
 
-  if (newSize.LowPart < size.LowPart)
+  if (newSize.s.LowPart < size.s.LowPart)
   {
     SmallBlockChainStream_Shrink(This, newSize);
   }
@@ -5514,8 +5514,8 @@
   BYTE sig[8];
   ULARGE_INTEGER offset;
 
-  offset.HighPart = 0;
-  offset.LowPart  = 0;
+  offset.s.HighPart = 0;
+  offset.s.LowPart  = 0;
 
   ILockBytes_ReadAt(plkbyt, offset, sig, sizeof(sig), NULL);
 
diff --git a/ole/variant.c b/ole/variant.c
index b9233a9..b3a81d89 100644
--- a/ole/variant.c
+++ b/ole/variant.c
@@ -2206,7 +2206,7 @@
  * Convert currency to unsigned char
  */
 HRESULT WINAPI VarUI1FromCy(CY cyIn, BYTE* pbOut) {
-   double t = round((((double)cyIn.u.Hi * 4294967296.0) + (double)cyIn.u.Lo) / 10000);
+   double t = round((((double)cyIn.s.Hi * 4294967296.0) + (double)cyIn.s.Lo) / 10000);
    
    if (t > UI1_MAX || t < UI1_MIN) return DISP_E_OVERFLOW;
    
@@ -2412,7 +2412,7 @@
  * Convert currency to signed short
  */
 HRESULT WINAPI VarI2FromCy(CY cyIn, short* psOut) {
-   double t = round((((double)cyIn.u.Hi * 4294967296.0) + (double)cyIn.u.Lo) / 10000);
+   double t = round((((double)cyIn.s.Hi * 4294967296.0) + (double)cyIn.s.Lo) / 10000);
    
    if (t > I2_MAX || t < I2_MIN) return DISP_E_OVERFLOW;
    
@@ -2605,7 +2605,7 @@
  * Convert currency to signed long
  */
 HRESULT WINAPI VarI4FromCy(CY cyIn, LONG* plOut) {
-   double t = round((((double)cyIn.u.Hi * 4294967296.0) + (double)cyIn.u.Lo) / 10000);
+   double t = round((((double)cyIn.s.Hi * 4294967296.0) + (double)cyIn.s.Lo) / 10000);
    
    if (t > I4_MAX || t < I4_MIN) return DISP_E_OVERFLOW;
    
@@ -2779,7 +2779,7 @@
  * Convert currency to float
  */
 HRESULT WINAPI VarR4FromCy(CY cyIn, FLOAT* pfltOut) {
-   *pfltOut = (FLOAT)((((double)cyIn.u.Hi * 4294967296.0) + (double)cyIn.u.Lo) / 10000);
+   *pfltOut = (FLOAT)((((double)cyIn.s.Hi * 4294967296.0) + (double)cyIn.s.Lo) / 10000);
    
    return S_OK;
 }
@@ -2929,7 +2929,7 @@
  * Convert currency to double
  */
 HRESULT WINAPI VarR8FromCy(CY cyIn, double* pdblOut) {
-   *pdblOut = (double)((((double)cyIn.u.Hi * 4294967296.0) + (double)cyIn.u.Lo) / 10000);
+   *pdblOut = (double)((((double)cyIn.s.Hi * 4294967296.0) + (double)cyIn.s.Lo) / 10000);
    
    return S_OK;
 }
@@ -3120,7 +3120,7 @@
  * Convert currency to date
  */
 HRESULT WINAPI VarDateFromCy(CY cyIn, DATE* pdateOut) {
-   *pdateOut = (DATE)((((double)cyIn.u.Hi * 4294967296.0) + (double)cyIn.u.Lo) / 10000);
+   *pdateOut = (DATE)((((double)cyIn.s.Hi * 4294967296.0) + (double)cyIn.s.Lo) / 10000);
 
    if (*pdateOut > DATE_MAX || *pdateOut < DATE_MIN) return DISP_E_TYPEMISMATCH;
    return S_OK;
@@ -3537,7 +3537,7 @@
  * Convert currency to boolean
  */
 HRESULT WINAPI VarBoolFromCy(CY cyIn, VARIANT_BOOL* pboolOut) {
-      if (cyIn.u.Hi || cyIn.u.Lo) *pboolOut = -1;
+      if (cyIn.s.Hi || cyIn.s.Lo) *pboolOut = -1;
       else *pboolOut = 0;
       
       return S_OK;
@@ -3741,7 +3741,7 @@
  * Convert currency to signed char
  */
 HRESULT WINAPI VarI1FromCy(CY cyIn, CHAR* pcOut) {
-   double t = round((((double)cyIn.u.Hi * 4294967296.0) + (double)cyIn.u.Lo) / 10000);
+   double t = round((((double)cyIn.s.Hi * 4294967296.0) + (double)cyIn.s.Lo) / 10000);
    
    if (t > CHAR_MAX || t < CHAR_MIN) return DISP_E_OVERFLOW;
    
@@ -3975,7 +3975,7 @@
  * Convert currency to unsigned short
  */
 HRESULT WINAPI VarUI2FromCy(CY cyIn, USHORT* pusOut) {
-   double t = round((((double)cyIn.u.Hi * 4294967296.0) + (double)cyIn.u.Lo) / 10000);
+   double t = round((((double)cyIn.s.Hi * 4294967296.0) + (double)cyIn.s.Lo) / 10000);
    
    if (t > UI2_MAX || t < UI2_MIN) return DISP_E_OVERFLOW;
       
@@ -4123,7 +4123,7 @@
  * Convert currency to unsigned long
  */
 HRESULT WINAPI VarUI4FromCy(CY cyIn, ULONG* pulOut) {
-   double t = round((((double)cyIn.u.Hi * 4294967296.0) + (double)cyIn.u.Lo) / 10000);
+   double t = round((((double)cyIn.s.Hi * 4294967296.0) + (double)cyIn.s.Lo) / 10000);
    
    if (t > UI4_MAX || t < UI4_MIN) return DISP_E_OVERFLOW;
 
@@ -4137,8 +4137,8 @@
  * Convert unsigned char to currency
  */
 HRESULT WINAPI VarCyFromUI1(BYTE bIn, CY* pcyOut) {
-   pcyOut->u.Hi = 0;
-   pcyOut->u.Lo = ((ULONG)bIn) * 10000;
+   pcyOut->s.Hi = 0;
+   pcyOut->s.Lo = ((ULONG)bIn) * 10000;
    
    return S_OK;
 }
@@ -4148,9 +4148,9 @@
  * Convert signed short to currency
  */
 HRESULT WINAPI VarCyFromI2(short sIn, CY* pcyOut) {
-   if (sIn < 0) pcyOut->u.Hi = -1;
-   else pcyOut->u.Hi = 0;
-   pcyOut->u.Lo = ((ULONG)sIn) * 10000;
+   if (sIn < 0) pcyOut->s.Hi = -1;
+   else pcyOut->s.Hi = 0;
+   pcyOut->s.Lo = ((ULONG)sIn) * 10000;
    
    return S_OK;
 }
@@ -4161,9 +4161,9 @@
  */
 HRESULT WINAPI VarCyFromI4(LONG lIn, CY* pcyOut) {
       double t = (double)lIn * (double)10000;
-      pcyOut->u.Hi = (LONG)(t / (double)4294967296.0);
-      pcyOut->u.Lo = (ULONG)fmod(t, (double)4294967296.0);
-      if (lIn < 0) pcyOut->u.Hi--;
+      pcyOut->s.Hi = (LONG)(t / (double)4294967296.0);
+      pcyOut->s.Lo = (ULONG)fmod(t, (double)4294967296.0);
+      if (lIn < 0) pcyOut->s.Hi--;
    
       return S_OK;
 }
@@ -4174,9 +4174,9 @@
  */
 HRESULT WINAPI VarCyFromR4(FLOAT fltIn, CY* pcyOut) {
    double t = round((double)fltIn * (double)10000);
-   pcyOut->u.Hi = (LONG)(t / (double)4294967296.0);
-   pcyOut->u.Lo = (ULONG)fmod(t, (double)4294967296.0);
-   if (fltIn < 0) pcyOut->u.Hi--;
+   pcyOut->s.Hi = (LONG)(t / (double)4294967296.0);
+   pcyOut->s.Lo = (ULONG)fmod(t, (double)4294967296.0);
+   if (fltIn < 0) pcyOut->s.Hi--;
    
    return S_OK;
 }
@@ -4187,9 +4187,9 @@
  */
 HRESULT WINAPI VarCyFromR8(double dblIn, CY* pcyOut) {
    double t = round(dblIn * (double)10000);
-   pcyOut->u.Hi = (LONG)(t / (double)4294967296.0);
-   pcyOut->u.Lo = (ULONG)fmod(t, (double)4294967296.0);
-   if (dblIn < 0) pcyOut->u.Hi--;
+   pcyOut->s.Hi = (LONG)(t / (double)4294967296.0);
+   pcyOut->s.Lo = (ULONG)fmod(t, (double)4294967296.0);
+   if (dblIn < 0) pcyOut->s.Hi--;
 
    return S_OK;
 }
@@ -4200,9 +4200,9 @@
  */
 HRESULT WINAPI VarCyFromDate(DATE dateIn, CY* pcyOut) {
    double t = round((double)dateIn * (double)10000);
-   pcyOut->u.Hi = (LONG)(t / (double)4294967296.0);
-   pcyOut->u.Lo = (ULONG)fmod(t, (double)4294967296.0);
-   if (dateIn < 0) pcyOut->u.Hi--;
+   pcyOut->s.Hi = (LONG)(t / (double)4294967296.0);
+   pcyOut->s.Lo = (ULONG)fmod(t, (double)4294967296.0);
+   if (dateIn < 0) pcyOut->s.Hi--;
 
    return S_OK;
 }
@@ -4221,9 +4221,9 @@
  * Convert boolean to currency
  */
 HRESULT WINAPI VarCyFromBool(VARIANT_BOOL boolIn, CY* pcyOut) {
-   if (boolIn < 0) pcyOut->u.Hi = -1;
-   else pcyOut->u.Hi = 0;
-   pcyOut->u.Lo = (ULONG)boolIn * (ULONG)10000;
+   if (boolIn < 0) pcyOut->s.Hi = -1;
+   else pcyOut->s.Hi = 0;
+   pcyOut->s.Lo = (ULONG)boolIn * (ULONG)10000;
    
    return S_OK;
 }
@@ -4233,9 +4233,9 @@
  * Convert signed char to currency
  */
 HRESULT WINAPI VarCyFromI1(CHAR cIn, CY* pcyOut) {
-   if (cIn < 0) pcyOut->u.Hi = -1;
-   else pcyOut->u.Hi = 0;
-   pcyOut->u.Lo = (ULONG)cIn * (ULONG)10000;
+   if (cIn < 0) pcyOut->s.Hi = -1;
+   else pcyOut->s.Hi = 0;
+   pcyOut->s.Lo = (ULONG)cIn * (ULONG)10000;
    
    return S_OK;
 }
@@ -4245,8 +4245,8 @@
  * Convert unsigned short to currency
  */
 HRESULT WINAPI VarCyFromUI2(USHORT usIn, CY* pcyOut) {
-   pcyOut->u.Hi = 0;
-   pcyOut->u.Lo = (ULONG)usIn * (ULONG)10000;
+   pcyOut->s.Hi = 0;
+   pcyOut->s.Lo = (ULONG)usIn * (ULONG)10000;
    
    return S_OK;
 }
@@ -4257,8 +4257,8 @@
  */
 HRESULT WINAPI VarCyFromUI4(ULONG ulIn, CY* pcyOut) {
    double t = (double)ulIn * (double)10000;
-   pcyOut->u.Hi = (LONG)(t / (double)4294967296.0);
-   pcyOut->u.Lo = (ULONG)fmod(t, (double)4294967296.0);
+   pcyOut->s.Hi = (LONG)(t / (double)4294967296.0);
+   pcyOut->s.Lo = (ULONG)fmod(t, (double)4294967296.0);
       
    return S_OK;
 }
diff --git a/win32/newfns.c b/win32/newfns.c
index 63da291..1c37205 100644
--- a/win32/newfns.c
+++ b/win32/newfns.c
@@ -28,8 +28,8 @@
     struct timeval tv;
 
     gettimeofday(&tv,NULL);
-    counter->LowPart = tv.tv_usec+tv.tv_sec*1000000;
-    counter->HighPart = 0;
+    counter->s.LowPart = tv.tv_usec+tv.tv_sec*1000000;
+    counter->s.HighPart = 0;
     return TRUE;
 }
 
@@ -38,8 +38,8 @@
  */
 BOOL WINAPI QueryPerformanceFrequency(PLARGE_INTEGER frequency)
 {
-	frequency->LowPart	= 1000000;
-	frequency->HighPart	= 0;
+	frequency->s.LowPart	= 1000000;
+	frequency->s.HighPart	= 0;
 	return TRUE;
 }