This is an automated email from the git hooks/post-receive script.

git pushed a commit to branch vtorri_eina_file_access
in repository efl.

View the commit online.

commit 096c21f233cbb2d4c6dc15aed18661ee7f9993e7
Author: Vincent Torri <vto...@outlook.fr>
AuthorDate: Tue Mar 19 23:23:15 2024 +0100

    mimic access() behavior on Windows
---
 src/lib/eina/eina_file_win32.c  | 123 ++--------------------------------------
 src/tests/eina/eina_test_file.c |   1 -
 2 files changed, 4 insertions(+), 120 deletions(-)

diff --git a/src/lib/eina/eina_file_win32.c b/src/lib/eina/eina_file_win32.c
index 76113516ce..a25069fbd0 100644
--- a/src/lib/eina/eina_file_win32.c
+++ b/src/lib/eina/eina_file_win32.c
@@ -549,93 +549,6 @@ eina_file_cleanup(Eina_Tmpstr *path)
    return result;
 }
 
-static Eina_Bool
-_eina_file_is_binary(const char *path)
-{
-   HANDLE h;
-   HANDLE fm;
-   unsigned char *base;
-   unsigned char *base_nt;
-   LARGE_INTEGER sz;
-   WORD characteristics;
-   Eina_Bool res;
-
-   res = EINA_FALSE;
-
-   /*
-    * we parse the file to check if it is a PE file (EXE or DLL)
-    * and we finally check whether it's a DLL or not.
-    * Reference :
-    * https://docs.microsoft.com/en-us/windows/win32/debug/pe-format
-    */
-
-   h = CreateFile(path,
-                  GENERIC_READ,
-                  FILE_SHARE_READ,
-                  NULL,
-                  OPEN_EXISTING,
-                  FILE_ATTRIBUTE_NORMAL,
-                  NULL);
-   if (h == INVALID_HANDLE_VALUE)
-     return EINA_FALSE;
-
-   if (!GetFileSizeEx(h, &sz))
-     goto close_h;
-
-   /* a PE file must contain at least the DOS and NT headers */
-   if (sz.QuadPart < (LONGLONG)(sizeof(IMAGE_DOS_HEADER) + sizeof(IMAGE_NT_HEADERS)))
-     goto close_h;
-
-   fm = CreateFileMapping(h, NULL, PAGE_READONLY, 0, 0, NULL);
-   if (fm == NULL)
-     goto close_h;
-
-   base = (unsigned char *)MapViewOfFile(fm, FILE_MAP_READ, 0, 0, 0);
-   CloseHandle(fm);
-   if (base == NULL)
-     goto close_h;
-
-   /*
-    * the PE file begins with the DOS header.
-    * First magic number : the DOS header must begin with a DOS magic
-    * number, that is "MZ", that is 0x5a4d, stored in a WORD.
-    */
-   if (*((WORD *)base) != 0x5a4d)
-     goto unmap_view;
-
-   /*
-    * The position of the NT header is located at the offset 0x3c.
-    */
-   base_nt = base + *((DWORD *)(base + 0x3c));
-
-   /*
-    * The NT header begins with the magic number "PE\0\0", that is
-    * 0x00004550, stored in a DWORD.
-    */
-   if (*((DWORD *)base_nt) != 0x00004550)
-     goto unmap_view;
-
-   /*
-    * to get informations about executable (EXE or DLL), we look at
-    * the 'Characteristics' member of the NT header, located at the offset
-    * 22 (4 for the magic number, 18 for the offset) from base_nt.
-    * https://docs.microsoft.com/en-us/windows/win32/debug/pe-format#characteristics
-    */
-   characteristics = *((WORD *)(base_nt + 4 + 18));
-
-   /*
-    * 0x0002 : if set, EXE or DLL
-    * 0x2000 : if set, DLL
-    */
-   res = (characteristics & 0x0002) && !(characteristics & 0x2000);
-
- unmap_view:
-   UnmapViewOfFile(base);
- close_h:
-   CloseHandle(h);
-   return res;
-}
-
 /*============================================================================*
  *                                   API                                      *
  *============================================================================*/
@@ -1401,42 +1314,14 @@ eina_file_access(const char *path, Eina_File_Access_Mode mode)
 
    if (mode & EINA_FILE_ACCESS_MODE_EXEC)
      {
-        if (attr & FILE_ATTRIBUTE_DIRECTORY)
-          {
-             /*
-              * Some directories have restricted access, like
-              * c:\Windows\System32\WDI
-              */
-             HANDLE h;
-             Eina_Bool ret = EINA_FALSE;
-
-             h = CreateFile(path,
-                            GENERIC_READ,
-                            FILE_SHARE_READ,
-                            NULL,
-                            OPEN_EXISTING,
-                            FILE_ATTRIBUTE_ARCHIVE | FILE_FLAG_BACKUP_SEMANTICS,
-                            NULL);
-             ret = (h == INVALID_HANDLE_VALUE);
-             CloseHandle(h);
-             if (ret)
-               return EINA_FALSE;
-          }
-        else
-          {
-             /*
-              * For files, check if it is a binary.
-              */
-             if (!_eina_file_is_binary(path))
-               return EINA_FALSE;
-          }
+        if (!(attr & FILE_ATTRIBUTE_DIRECTORY) &&
+            !eina_str_has_extension(path, ".exe") &&
+            !eina_str_has_extension(path, ".bat"))
+          return EINA_FALSE;
      }
 
    if (mode & EINA_FILE_ACCESS_MODE_WRITE)
      {
-        DWORD attr;
-
-        attr = GetFileAttributes(path);
         if (attr == INVALID_FILE_ATTRIBUTES)
           return EINA_FALSE;
 
diff --git a/src/tests/eina/eina_test_file.c b/src/tests/eina/eina_test_file.c
index 915ce74446..cad906b814 100644
--- a/src/tests/eina/eina_test_file.c
+++ b/src/tests/eina/eina_test_file.c
@@ -910,7 +910,6 @@ EFL_START_TEST(eina_test_file_access)
 #ifdef _WIN32
       { "c:\\Windows", EINA_FILE_ACCESS_MODE_EXIST, EINA_TRUE },
       { "c:\\Windows", EINA_FILE_ACCESS_MODE_EXEC, EINA_TRUE },
-      { "c:\\Windows\\System32\\WDI", EINA_FILE_ACCESS_MODE_EXEC, EINA_FALSE },
       { "c:\\Windows\\notepad.exe", EINA_FILE_ACCESS_MODE_EXIST, EINA_TRUE },
       { "c:\\Windows\\notepad.exe", EINA_FILE_ACCESS_MODE_EXEC, EINA_TRUE },
       { "c:\\Windows\\notepad.exe", EINA_FILE_ACCESS_MODE_WRITE, EINA_TRUE },

-- 
To stop receiving notification emails like this one, please contact
the administrator of this repository.

Reply via email to