Zebediah Figura : kernel32: Reimplement is_same_file() using FileIdInformation.

Alexandre Julliard julliard at winehq.org
Thu Apr 9 16:04:45 CDT 2020


Module: wine
Branch: master
Commit: 4b2f8c80fb50ed13c300a9268d8b1908d6171622
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=4b2f8c80fb50ed13c300a9268d8b1908d6171622

Author: Zebediah Figura <z.figura12 at gmail.com>
Date:   Wed Apr  8 16:06:06 2020 -0500

kernel32: Reimplement is_same_file() using FileIdInformation.

Signed-off-by: Zebediah Figura <zfigura at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/kernel32/path.c | 21 ++++++---------------
 1 file changed, 6 insertions(+), 15 deletions(-)

diff --git a/dlls/kernel32/path.c b/dlls/kernel32/path.c
index 31652d3164..334fc25e87 100644
--- a/dlls/kernel32/path.c
+++ b/dlls/kernel32/path.c
@@ -257,21 +257,12 @@ DWORD WINAPI GetShortPathNameA( LPCSTR longpath, LPSTR shortpath, DWORD shortlen
 
 static BOOL is_same_file(HANDLE h1, HANDLE h2)
 {
-    int fd1;
-    BOOL ret = FALSE;
-    if (wine_server_handle_to_fd(h1, 0, &fd1, NULL) == STATUS_SUCCESS)
-    {
-        int fd2;
-        if (wine_server_handle_to_fd(h2, 0, &fd2, NULL) == STATUS_SUCCESS)
-        {
-            struct stat stat1, stat2;
-            if (fstat(fd1, &stat1) == 0 && fstat(fd2, &stat2) == 0)
-                ret = (stat1.st_dev == stat2.st_dev && stat1.st_ino == stat2.st_ino);
-            wine_server_release_fd(h2, fd2);
-        }
-        wine_server_release_fd(h1, fd1);
-    }
-    return ret;
+    FILE_ID_INFORMATION id1, id2;
+    IO_STATUS_BLOCK io;
+
+    return !NtQueryInformationFile( h1, &io, &id1, sizeof(id1), FileIdInformation )
+            && !NtQueryInformationFile( h2, &io, &id2, sizeof(id2), FileIdInformation )
+            && !memcmp( &id1, &id2, sizeof(FILE_ID_INFORMATION) );
 }
 
 /**************************************************************************




More information about the wine-cvs mailing list