diff --git a/dlls/kernel/comm.c b/dlls/kernel/comm.c index 2f1a3fcfd98..dd8770880a5 100644 --- a/dlls/kernel/comm.c +++ b/dlls/kernel/comm.c @@ -1975,8 +1975,8 @@ static BOOL COMM_WaitCommEvent( commio->fd = fd; /* FIXME */ lpOverlapped->InternalHigh = 0; - lpOverlapped->Offset = 0; - lpOverlapped->OffsetHigh = 0; + lpOverlapped->u.s.Offset = 0; + lpOverlapped->u.s.OffsetHigh = 0; SERVER_START_REQ( register_async ) { diff --git a/dlls/kernel/file.c b/dlls/kernel/file.c index b1817ac8cf3..8ebdd22adbf 100644 --- a/dlls/kernel/file.c +++ b/dlls/kernel/file.c @@ -323,8 +323,8 @@ BOOL WINAPI ReadFileEx(HANDLE hFile, LPVOID buffer, DWORD bytesToRead, return FALSE; } - offset.u.LowPart = overlapped->Offset; - offset.u.HighPart = overlapped->OffsetHigh; + offset.u.LowPart = overlapped->u.s.Offset; + offset.u.HighPart = overlapped->u.s.OffsetHigh; io_status = (PIO_STATUS_BLOCK)overlapped; io_status->u.Status = STATUS_PENDING; @@ -364,8 +364,8 @@ BOOL WINAPI ReadFile( HANDLE hFile, LPVOID buffer, DWORD bytesToRead, if (overlapped != NULL) { - offset.u.LowPart = overlapped->Offset; - offset.u.HighPart = overlapped->OffsetHigh; + offset.u.LowPart = overlapped->u.s.Offset; + offset.u.HighPart = overlapped->u.s.OffsetHigh; poffset = &offset; hEvent = overlapped->hEvent; io_status = (PIO_STATUS_BLOCK)overlapped; @@ -405,8 +405,8 @@ BOOL WINAPI WriteFileEx(HANDLE hFile, LPCVOID buffer, DWORD bytesToWrite, SetLastError(ERROR_INVALID_PARAMETER); return FALSE; } - offset.u.LowPart = overlapped->Offset; - offset.u.HighPart = overlapped->OffsetHigh; + offset.u.LowPart = overlapped->u.s.Offset; + offset.u.HighPart = overlapped->u.s.OffsetHigh; io_status = (PIO_STATUS_BLOCK)overlapped; io_status->u.Status = STATUS_PENDING; @@ -439,8 +439,8 @@ BOOL WINAPI WriteFile( HANDLE hFile, LPCVOID buffer, DWORD bytesToWrite, if (overlapped) { - offset.u.LowPart = overlapped->Offset; - offset.u.HighPart = overlapped->OffsetHigh; + offset.u.LowPart = overlapped->u.s.Offset; + offset.u.HighPart = overlapped->u.s.OffsetHigh; poffset = &offset; hEvent = overlapped->hEvent; piosb = (PIO_STATUS_BLOCK)overlapped; @@ -999,13 +999,13 @@ BOOL WINAPI LockFileEx( HANDLE hFile, DWORD flags, DWORD reserved, } TRACE( "%p %lx%08lx %lx%08lx flags %lx\n", - hFile, overlapped->OffsetHigh, overlapped->Offset, + hFile, overlapped->u.s.OffsetHigh, overlapped->u.s.Offset, count_high, count_low, flags ); count.u.LowPart = count_low; count.u.HighPart = count_high; - offset.u.LowPart = overlapped->Offset; - offset.u.HighPart = overlapped->OffsetHigh; + offset.u.LowPart = overlapped->u.s.Offset; + offset.u.HighPart = overlapped->u.s.OffsetHigh; status = NtLockFile( hFile, overlapped->hEvent, NULL, NULL, NULL, &offset, &count, NULL, @@ -1050,7 +1050,7 @@ BOOL WINAPI UnlockFileEx( HANDLE hFile, DWORD reserved, DWORD count_low, DWORD c } if (overlapped->hEvent) FIXME("Unimplemented overlapped operation\n"); - return UnlockFile( hFile, overlapped->Offset, overlapped->OffsetHigh, count_low, count_high ); + return UnlockFile( hFile, overlapped->u.s.Offset, overlapped->u.s.OffsetHigh, count_low, count_high ); } diff --git a/dlls/kernel/tests/file.c b/dlls/kernel/tests/file.c index e54f32a28d4..f7ec05c8e97 100644 --- a/dlls/kernel/tests/file.c +++ b/dlls/kernel/tests/file.c @@ -28,6 +28,17 @@ #include "winbase.h" #include "winerror.h" +#ifdef NONAMELESSUNION +# define U(x) (x).u +#else +# define U(x) (x) +#endif +#ifdef NONAMELESSSTRUCT +# define S(x) (x).s +#else +# define S(x) (x) +#endif + static int dll_capable(const char *dll, const char *function) { HMODULE module = GetModuleHandleA(dll); @@ -912,8 +923,8 @@ static void test_offset_in_overlapped_structure(void) ok(done == sizeof(buf), "expected number of bytes written %lu\n", done); memset(&ov, 0, sizeof(ov)); - ov.Offset = PATTERN_OFFSET; - ov.OffsetHigh = 0; + S(U(ov)).Offset = PATTERN_OFFSET; + S(U(ov)).OffsetHigh = 0; rc=WriteFile(hFile, pattern, sizeof(pattern), &done, &ov); /* Win 9x does not support the overlapped I/O on files */ if (rc || GetLastError()!=ERROR_INVALID_PARAMETER) { @@ -923,8 +934,8 @@ static void test_offset_in_overlapped_structure(void) ok(SetFilePointer(hFile, 0, NULL, FILE_CURRENT) == (PATTERN_OFFSET + sizeof(pattern)), "expected file offset %d\n", PATTERN_OFFSET + sizeof(pattern)); - ov.Offset = sizeof(buf) * 2; - ov.OffsetHigh = 0; + S(U(ov)).Offset = sizeof(buf) * 2; + S(U(ov)).OffsetHigh = 0; ret = WriteFile(hFile, pattern, sizeof(pattern), &done, &ov); ok( ret, "WriteFile error %ld\n", GetLastError()); ok(done == sizeof(pattern), "expected number of bytes written %lu\n", done); @@ -942,8 +953,8 @@ static void test_offset_in_overlapped_structure(void) memset(buf, 0, sizeof(buf)); memset(&ov, 0, sizeof(ov)); - ov.Offset = PATTERN_OFFSET; - ov.OffsetHigh = 0; + S(U(ov)).Offset = PATTERN_OFFSET; + S(U(ov)).OffsetHigh = 0; rc=ReadFile(hFile, buf, sizeof(pattern), &done, &ov); /* Win 9x does not support the overlapped I/O on files */ if (rc || GetLastError()!=ERROR_INVALID_PARAMETER) { @@ -1001,8 +1012,8 @@ static void test_LockFile(void) ok( !UnlockFile( handle, 10, 0, 20, 0 ), "UnlockFile 10,20 again succeeded\n" ); ok( UnlockFile( handle, 5, 0, 5, 0 ), "UnlockFile 5,5 failed\n" ); - overlapped.Offset = 100; - overlapped.OffsetHigh = 0; + S(U(overlapped)).Offset = 100; + S(U(overlapped)).OffsetHigh = 0; overlapped.hEvent = 0; lockfileex_capable = dll_capable("kernel32", "LockFileEx"); @@ -1018,7 +1029,7 @@ static void test_LockFile(void) } /* overlapping shared locks are OK */ - overlapped.Offset = 150; + S(U(overlapped)).Offset = 150; limited_UnLockFile || ok( LockFileEx( handle, 0, 0, 100, 0, &overlapped ), "LockFileEx 150,100 failed\n" ); /* but exclusive is not */ @@ -1031,7 +1042,7 @@ static void test_LockFile(void) { if (!UnlockFileEx( handle, 0, 100, 0, &overlapped )) { /* UnLockFile is capable. */ - overlapped.Offset = 100; + S(U(overlapped)).Offset = 100; ok( !UnlockFileEx( handle, 0, 100, 0, &overlapped ), "UnlockFileEx 150,100 again succeeded\n" ); } @@ -1299,8 +1310,8 @@ static void test_async_file_errors(void) HANDLE hFile; LPVOID lpBuffer = HeapAlloc(GetProcessHeap(), 0, 4096); OVERLAPPED ovl; - ovl.Offset = 0; - ovl.OffsetHigh = 0; + S(U(ovl)).Offset = 0; + S(U(ovl)).OffsetHigh = 0; ovl.hEvent = hSem; completion_count = 0; szFile[0] = '\0'; @@ -1317,7 +1328,7 @@ static void test_async_file_errors(void) /*printf("Offset = %ld, result = %s\n", ovl.Offset, res ? "TRUE" : "FALSE");*/ if (!res) break; - ovl.Offset += 4096; + S(U(ovl)).Offset += 4096; /* i/o completion routine only called if ReadFileEx returned success. * we only care about violations of this rule so undo what should have * been done */ diff --git a/dlls/kernel/tests/generated.c b/dlls/kernel/tests/generated.c index 1d117f6d5bf..55845b6ba89 100644 --- a/dlls/kernel/tests/generated.c +++ b/dlls/kernel/tests/generated.c @@ -835,10 +835,10 @@ static void test_pack_OVERLAPPED(void) { /* OVERLAPPED (pack 4) */ TEST_TYPE(OVERLAPPED, 20, 4); - TEST_FIELD(OVERLAPPED, DWORD, Internal, 0, 4, 4); - TEST_FIELD(OVERLAPPED, DWORD, InternalHigh, 4, 4, 4); - TEST_FIELD(OVERLAPPED, DWORD, Offset, 8, 4, 4); - TEST_FIELD(OVERLAPPED, DWORD, OffsetHigh, 12, 4, 4); + TEST_FIELD(OVERLAPPED, ULONG_PTR, Internal, 0, 4, 4); + TEST_FIELD(OVERLAPPED, ULONG_PTR, InternalHigh, 4, 4, 4); + /*TEST_FIELD(OVERLAPPED, DWORD, Offset, 8, 4, 4);*/ + /*TEST_FIELD(OVERLAPPED, DWORD, OffsetHigh, 12, 4, 4);*/ TEST_FIELD(OVERLAPPED, HANDLE, hEvent, 16, 4, 4); } diff --git a/dlls/ntdll/loader.c b/dlls/ntdll/loader.c index de84592ffa1..07f0a972c7c 100644 --- a/dlls/ntdll/loader.c +++ b/dlls/ntdll/loader.c @@ -25,6 +25,9 @@ #include #include +#define NONAMELESSUNION +#define NONAMELESSSTRUCT + #include "windef.h" #include "winbase.h" #include "winnt.h" diff --git a/dlls/quartz/filesource.c b/dlls/quartz/filesource.c index 820b57ae8bd..8133d98a8c5 100644 --- a/dlls/quartz/filesource.c +++ b/dlls/quartz/filesource.c @@ -18,6 +18,9 @@ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ +#define NONAMELESSUNION +#define NONAMELESSSTRUCT + #include "quartz_private.h" #include "wine/debug.h" @@ -966,8 +969,8 @@ static HRESULT WINAPI FileAsyncReader_Request(IAsyncReader * iface, IMediaSample { DWORD dwLength = (DWORD) BYTES_FROM_MEDIATIME(Stop - Start); - pDataRq->ovl.Offset = (DWORD) BYTES_FROM_MEDIATIME(Start); - pDataRq->ovl.OffsetHigh = (DWORD)(BYTES_FROM_MEDIATIME(Start) >> (sizeof(DWORD) * 8)); + pDataRq->ovl.u.s.Offset = (DWORD) BYTES_FROM_MEDIATIME(Start); + pDataRq->ovl.u.s.OffsetHigh = (DWORD)(BYTES_FROM_MEDIATIME(Start) >> (sizeof(DWORD) * 8)); pDataRq->ovl.hEvent = This->hEvent; pDataRq->dwUserData = dwUser; pDataRq->pNext = NULL; @@ -1120,8 +1123,8 @@ static HRESULT WINAPI FileAsyncReader_SyncRead(IAsyncReader * iface, LONGLONG ll ovl.hEvent = CreateEventW(NULL, 0, 0, NULL); /* NOTE: llPosition is the actual byte position to start reading from */ - ovl.Offset = (DWORD) llPosition; - ovl.OffsetHigh = (DWORD) (llPosition >> (sizeof(DWORD) * 8)); + ovl.u.s.Offset = (DWORD) llPosition; + ovl.u.s.OffsetHigh = (DWORD) (llPosition >> (sizeof(DWORD) * 8)); if (!ReadFile(This->hFile, pBuffer, lLength, NULL, &ovl)) hr = HRESULT_FROM_WIN32(GetLastError()); diff --git a/dlls/wininet/urlcache.c b/dlls/wininet/urlcache.c index 337dbe5d4cd..d5c8819ceb7 100644 --- a/dlls/wininet/urlcache.c +++ b/dlls/wininet/urlcache.c @@ -32,6 +32,9 @@ #include #include +#define NONAMELESSUNION +#define NONAMELESSSTRUCT + #include "windef.h" #include "winbase.h" #include "winuser.h" diff --git a/dlls/winsock/socket.c b/dlls/winsock/socket.c index 2edb58fe77c..a44cbeca07c 100644 --- a/dlls/winsock/socket.c +++ b/dlls/winsock/socket.c @@ -2993,7 +2993,7 @@ BOOL WINAPI WSAGetOverlappedResult( SOCKET s, LPWSAOVERLAPPED lpOverlapped, *lpcbTransfer = lpOverlapped->InternalHigh; if ( lpdwFlags ) - *lpdwFlags = lpOverlapped->Offset; + *lpdwFlags = lpOverlapped->u.s.Offset; switch ( lpOverlapped->Internal ) { diff --git a/include/winbase.h b/include/winbase.h index 3077f66f328..e25409a25da 100644 --- a/include/winbase.h +++ b/include/winbase.h @@ -485,10 +485,25 @@ typedef struct _SYSTEMTIME{ /* The 'overlapped' data structure used by async I/O functions. */ typedef struct _OVERLAPPED { - DWORD Internal; - DWORD InternalHigh; - DWORD Offset; - DWORD OffsetHigh; +#ifdef WORDS_BIGENDIAN + ULONG_PTR InternalHigh; + ULONG_PTR Internal; +#else + ULONG_PTR Internal; + ULONG_PTR InternalHigh; +#endif + union { + struct { +#ifdef WORDS_BIGENDIAN + DWORD OffsetHigh; + DWORD Offset; +#else + DWORD Offset; + DWORD OffsetHigh; +#endif + } DUMMYSTRUCTNAME; + PVOID Pointer; + } DUMMYUNIONNAME; HANDLE hEvent; } OVERLAPPED, *LPOVERLAPPED; diff --git a/include/wininet.h b/include/wininet.h index 8127d4032b6..31b156299a2 100644 --- a/include/wininet.h +++ b/include/wininet.h @@ -1366,7 +1366,7 @@ typedef struct _INTERNET_CACHE_ENTRY_INFOA { union { DWORD dwReserved; DWORD dwExemptDelta; - } u; + } DUMMYUNIONNAME; } INTERNET_CACHE_ENTRY_INFOA,* LPINTERNET_CACHE_ENTRY_INFOA; typedef struct _INTERNET_CACHE_ENTRY_INFOW { @@ -1389,7 +1389,7 @@ typedef struct _INTERNET_CACHE_ENTRY_INFOW { union { DWORD dwReserved; DWORD dwExemptDelta; - } u; + } DUMMYUNIONNAME; } INTERNET_CACHE_ENTRY_INFOW,* LPINTERNET_CACHE_ENTRY_INFOW; DECL_WINELIB_TYPE_AW(INTERNET_CACHE_ENTRY_INFO) diff --git a/include/winnt.h b/include/winnt.h index 1121fea3fe1..245b1999d53 100644 --- a/include/winnt.h +++ b/include/winnt.h @@ -2189,7 +2189,7 @@ typedef struct _IMAGE_IMPORT_DESCRIPTOR { union { DWORD Characteristics; /* 0 for terminating null import descriptor */ PIMAGE_THUNK_DATA OriginalFirstThunk; /* RVA to original unbound IAT */ - } u; + } DUMMYUNIONNAME; DWORD TimeDateStamp; /* 0 if not bound, * -1 if bound, and real date\time stamp * in IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT