]> git.unchartedbackwaters.co.uk Git - francis/winuae.git/commitdiff
More nicer looking 64-bit SetFilePointer() usage.
authorToni Wilen <twilen@winuae.net>
Mon, 1 Sep 2014 14:34:05 +0000 (17:34 +0300)
committerToni Wilen <twilen@winuae.net>
Mon, 1 Sep 2014 14:34:05 +0000 (17:34 +0300)
od-win32/hardfile_win32.cpp

index 7fa9f89b74e54d7bd7149de3b4c04854fbd1f835..b440c992068cc6a1db5634fc80157ac22f3c8ceb 100644 (file)
@@ -132,9 +132,9 @@ static void rdbdump (HANDLE h, uae_u64 offset, uae_u8 *buf, int blocksize)
        }
        for (i = 0; i <= blocks; i++) {
                DWORD outlen;
-               LONG high;
-               high = (DWORD)(offset >> 32);
-               if (SetFilePointer (h, (DWORD)offset, &high, FILE_BEGIN) == INVALID_FILE_SIZE)
+               LARGE_INTEGER fppos;
+               fppos.QuadPart = offset;
+               if (SetFilePointer (h, fppos.LowPart, &fppos.HighPart, FILE_BEGIN) == INVALID_SET_FILE_POINTER && GetLastError() != NO_ERROR)
                        break;
                ReadFile (h, buf, blocksize, &outlen, NULL);
                fwrite (buf, 1, blocksize, f);
@@ -259,11 +259,11 @@ static int safetycheck (HANDLE h, const TCHAR *name, uae_u64 offset, uae_u8 *buf
        uae_u64 origoffset = offset;
        int i, j, blocks = 63, empty = 1;
        DWORD outlen;
-       LONG high;
 
        for (j = 0; j < blocks; j++) {
-               high = (LONG)(offset >> 32);
-               if (SetFilePointer (h, (DWORD)offset, &high, FILE_BEGIN) == INVALID_FILE_SIZE) {
+               LARGE_INTEGER fppos;
+               fppos.QuadPart = offset;
+               if (SetFilePointer (h, fppos.LowPart, &fppos.HighPart, FILE_BEGIN) == INVALID_SET_FILE_POINTER && GetLastError() != NO_ERROR) {
                        write_log (_T("hd ignored, SetFilePointer failed, error %d\n"), GetLastError ());
                        return 1;
                }
@@ -736,10 +736,10 @@ emptyreal:
                        LONG high = 0;
                        DWORD high2;
                        ret = SetFilePointer (h, 0, &high, FILE_END);
-                       if (ret == INVALID_FILE_SIZE && GetLastError () != NO_ERROR)
+                       if (ret == INVALID_SET_FILE_POINTER && GetLastError () != NO_ERROR)
                                goto end;
                        low = GetFileSize (h, &high2);
-                       if (low == INVALID_FILE_SIZE && GetLastError () != NO_ERROR)
+                       if (low == INVALID_SET_FILE_POINTER && GetLastError () != NO_ERROR)
                                goto end;
                        low &= ~(hfd->ci.blocksize - 1);
                        hfd->physsize = hfd->virtsize = ((uae_u64)high2 << 32) | low;
@@ -856,9 +856,10 @@ static int hdf_seek (struct hardfiledata *hfd, uae_u64 offset)
                abort ();
        }
        if (hfd->handle_valid == HDF_HANDLE_WIN32) {
-               LONG high = (LONG)(offset >> 32);
-               ret = SetFilePointer (hfd->handle->h, (DWORD)offset, &high, FILE_BEGIN);
-               if (ret == INVALID_FILE_SIZE && GetLastError() != NO_ERROR)
+               LARGE_INTEGER fppos;
+               fppos.QuadPart = offset;
+               ret = SetFilePointer (hfd->handle->h, fppos.LowPart, &fppos.HighPart, FILE_BEGIN);
+               if (ret == INVALID_SET_FILE_POINTER && GetLastError() != NO_ERROR)
                        return -1;
        } else if (hfd->handle_valid == HDF_HANDLE_ZFILE) {
                zfile_fseek (hfd->handle->zf, (long)offset, SEEK_SET);
@@ -868,18 +869,21 @@ static int hdf_seek (struct hardfiledata *hfd, uae_u64 offset)
 
 static void poscheck (struct hardfiledata *hfd, int len)
 {
-       DWORD ret, err;
-       uae_u64 pos;
+       DWORD err;
+       uae_s64 pos;
 
        if (hfd->handle_valid == HDF_HANDLE_WIN32) {
-               LONG high = 0;
-               ret = SetFilePointer (hfd->handle->h, 0, &high, FILE_CURRENT);
-               err = GetLastError ();
-               if (ret == INVALID_FILE_SIZE && err != NO_ERROR) {
-                       gui_message (_T("hd: poscheck failed. seek failure, error %d"), err);
-                       abort ();
+               LARGE_INTEGER fppos;
+               fppos.QuadPart = 0;
+               fppos.LowPart = SetFilePointer (hfd->handle->h, 0, &fppos.HighPart, FILE_CURRENT);
+               if (fppos.LowPart == INVALID_SET_FILE_POINTER) {
+                       err = GetLastError ();
+                       if (err != NO_ERROR) {
+                               gui_message (_T("hd: poscheck failed. seek failure, error %d"), err);
+                               abort ();
+                       }
                }
-               pos = ((uae_u64)high) << 32 | ret;
+               pos = fppos.QuadPart;
        } else if (hfd->handle_valid == HDF_HANDLE_ZFILE) {
                pos = zfile_ftell (hfd->handle->zf);
        }
@@ -2016,7 +2020,7 @@ int harddrive_to_hdf (HWND hDlg, struct uae_prefs *p, int idx)
                goto err;
        li.QuadPart = size;
        ret = SetFilePointer (hdst, li.LowPart, &li.HighPart, FILE_BEGIN);
-       if (ret == INVALID_FILE_SIZE && GetLastError () != NO_ERROR)
+       if (ret == INVALID_SET_FILE_POINTER && GetLastError () != NO_ERROR)
                goto err;
        if (!SetEndOfFile (hdst))
                goto err;