Fabian Maurer : kernel32: Stub FindFirstStreamW/FindNextStreamW.

Alexandre Julliard julliard at winehq.org
Mon Apr 22 16:30:39 CDT 2019


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

Author: Fabian Maurer <dark.shadow4 at web.de>
Date:   Tue Apr 16 23:12:34 2019 +0200

kernel32: Stub FindFirstStreamW/FindNextStreamW.

Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=46934
Signed-off-by: Fabian Maurer <dark.shadow4 at web.de>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 .../api-ms-win-core-file-l1-2-2.spec               |  4 ++--
 dlls/kernel32/file.c                               | 22 +++++++++++++++++++++
 dlls/kernel32/kernel32.spec                        |  4 ++--
 dlls/kernel32/tests/file.c                         | 23 ++++++++++++++++++++++
 dlls/kernelbase/kernelbase.spec                    |  4 ++--
 include/winbase.h                                  | 13 ++++++++++++
 6 files changed, 64 insertions(+), 6 deletions(-)

diff --git a/dlls/api-ms-win-core-file-l1-2-2/api-ms-win-core-file-l1-2-2.spec b/dlls/api-ms-win-core-file-l1-2-2/api-ms-win-core-file-l1-2-2.spec
index bb58af1..7237890 100644
--- a/dlls/api-ms-win-core-file-l1-2-2/api-ms-win-core-file-l1-2-2.spec
+++ b/dlls/api-ms-win-core-file-l1-2-2/api-ms-win-core-file-l1-2-2.spec
@@ -1,8 +1,8 @@
 @ stdcall AreFileApisANSI() kernel32.AreFileApisANSI
 @ stub FindFirstFileNameW
-@ stub FindFirstStreamW
+@ stdcall FindFirstStreamW(wstr long ptr long) kernel32.FindFirstStreamW
 @ stub FindNextFileNameW
-@ stub FindNextStreamW
+@ stdcall FindNextStreamW(long ptr) kernel32.FindNextStreamW
 @ stdcall GetTempFileNameA(str str long ptr) kernel32.GetTempFileNameA
 @ stdcall GetTempPathA(long ptr) kernel32.GetTempPathA
 @ stdcall GetVolumeInformationA(str ptr long ptr ptr ptr ptr long) kernel32.GetVolumeInformationA
diff --git a/dlls/kernel32/file.c b/dlls/kernel32/file.c
index 64c3e3e..6c82613 100644
--- a/dlls/kernel32/file.c
+++ b/dlls/kernel32/file.c
@@ -2363,6 +2363,28 @@ BOOL WINAPI FindNextFileA( HANDLE handle, WIN32_FIND_DATAA *data )
     return TRUE;
 }
 
+/**************************************************************************
+ *           FindFirstStreamW   (KERNEL32.@)
+ */
+HANDLE WINAPI FindFirstStreamW(LPCWSTR filename, STREAM_INFO_LEVELS infolevel, void *data, DWORD flags)
+{
+    FIXME("(%s, %d, %p, %x): stub!\n", debugstr_w(filename), infolevel, data, flags);
+
+    SetLastError(ERROR_HANDLE_EOF);
+    return INVALID_HANDLE_VALUE;
+}
+
+/**************************************************************************
+ *           FindNextStreamW   (KERNEL32.@)
+ */
+BOOL WINAPI FindNextStreamW(HANDLE handle, void *data)
+{
+    FIXME("(%p, %p): stub!\n", handle, data);
+
+    SetLastError(ERROR_HANDLE_EOF);
+    return FALSE;
+}
+
 
 /**************************************************************************
  *           GetFileAttributesW   (KERNEL32.@)
diff --git a/dlls/kernel32/kernel32.spec b/dlls/kernel32/kernel32.spec
index 3edfe21..75e7cc5 100644
--- a/dlls/kernel32/kernel32.spec
+++ b/dlls/kernel32/kernel32.spec
@@ -488,7 +488,7 @@
 # @ stub FindFirstFileTransactedW
 @ stdcall FindFirstFileW(wstr ptr)
 # @ stub FindFirstStreamTransactedW
-# @ stub FindFirstStreamW
+@ stdcall FindFirstStreamW(wstr long ptr long)
 @ stdcall FindFirstVolumeA(ptr long)
 @ stdcall FindFirstVolumeMountPointA(str ptr long)
 @ stdcall FindFirstVolumeMountPointW(wstr ptr long)
@@ -497,7 +497,7 @@
 @ stdcall FindNextFileA(long ptr)
 # @ stub FindNextFileNameW
 @ stdcall FindNextFileW(long ptr)
-# @ stub FindNextStreamW
+@ stdcall FindNextStreamW(long ptr)
 @ stdcall FindNextVolumeA(long ptr long)
 @ stub FindNextVolumeMountPointA
 @ stub FindNextVolumeMountPointW
diff --git a/dlls/kernel32/tests/file.c b/dlls/kernel32/tests/file.c
index 4df31c1..9bf80f6 100644
--- a/dlls/kernel32/tests/file.c
+++ b/dlls/kernel32/tests/file.c
@@ -62,6 +62,7 @@ static BOOL (WINAPI *pGetQueuedCompletionStatusEx)(HANDLE, OVERLAPPED_ENTRY*, UL
 static void (WINAPI *pRtlInitAnsiString)(PANSI_STRING,PCSZ);
 static void (WINAPI *pRtlFreeUnicodeString)(PUNICODE_STRING);
 static BOOL (WINAPI *pSetFileCompletionNotificationModes)(HANDLE, UCHAR);
+static HANDLE (WINAPI *pFindFirstStreamW)(LPCWSTR filename, STREAM_INFO_LEVELS infolevel, void *data, DWORD flags);
 
 static char filename[MAX_PATH];
 static const char sillytext[] =
@@ -111,6 +112,7 @@ static void InitFunctionPointers(void)
     pSetFileInformationByHandle = (void *) GetProcAddress(hkernel32, "SetFileInformationByHandle");
     pGetQueuedCompletionStatusEx = (void *) GetProcAddress(hkernel32, "GetQueuedCompletionStatusEx");
     pSetFileCompletionNotificationModes = (void *)GetProcAddress(hkernel32, "SetFileCompletionNotificationModes");
+    pFindFirstStreamW = (void *)GetProcAddress(hkernel32, "FindFirstStreamW");
 }
 
 static void test__hread( void )
@@ -5314,6 +5316,26 @@ static void test_file_readonly_access(void)
     ok(ret, "DeleteFileA: error %d\n", GetLastError());
 }
 
+static void test_find_file_stream(void)
+{
+    WCHAR path[] = {'C',':','\\','w','i','n','d','o','w','s',0};
+    HANDLE handle;
+    int error;
+    WIN32_FIND_STREAM_DATA data;
+
+    if (!pFindFirstStreamW)
+    {
+        win_skip("FindFirstStreamW is missing\n");
+        return;
+    }
+
+    SetLastError(0xdeadbeef);
+    handle = pFindFirstStreamW(path, FindStreamInfoStandard, &data, 0);
+    error = GetLastError();
+    ok(handle == INVALID_HANDLE_VALUE, "Expected INVALID_HANDLE_VALUE, got %p\n", handle);
+    ok(error == ERROR_HANDLE_EOF, "Expected ERROR_HANDLE_EOF, got %d\n", error);
+}
+
 START_TEST(file)
 {
     char temp_path[MAX_PATH];
@@ -5385,4 +5407,5 @@ START_TEST(file)
     test_post_completion();
     test_overlapped_read();
     test_file_readonly_access();
+    test_find_file_stream();
 }
diff --git a/dlls/kernelbase/kernelbase.spec b/dlls/kernelbase/kernelbase.spec
index 71ca260..ac6fc12 100644
--- a/dlls/kernelbase/kernelbase.spec
+++ b/dlls/kernelbase/kernelbase.spec
@@ -360,7 +360,7 @@
 # @ stub FindFirstFileNameW
 @ stdcall FindFirstFileW(wstr ptr) kernel32.FindFirstFileW
 @ stdcall FindFirstFreeAce(ptr ptr) advapi32.FindFirstFreeAce
-# @ stub FindFirstStreamW
+@ stdcall FindFirstStreamW(wstr long ptr long) kernel32.FindFirstStreamW
 @ stdcall FindFirstVolumeW(ptr long) kernel32.FindFirstVolumeW
 @ stub FindNLSString
 @ stdcall FindNLSStringEx(wstr long wstr long wstr long ptr ptr ptr long) kernel32.FindNLSStringEx
@@ -368,7 +368,7 @@
 @ stdcall FindNextFileA(long ptr) kernel32.FindNextFileA
 # @ stub FindNextFileNameW
 @ stdcall FindNextFileW(long ptr) kernel32.FindNextFileW
-# @ stub FindNextStreamW
+@ stdcall FindNextStreamW(long ptr) kernel32.FindNextStreamW
 @ stdcall FindNextVolumeW(long ptr long) kernel32.FindNextVolumeW
 # @ stub FindPackagesByPackageFamily
 @ stdcall FindResourceExW(long wstr wstr long) kernel32.FindResourceExW
diff --git a/include/winbase.h b/include/winbase.h
index 49d0e7e..c2e216c 100644
--- a/include/winbase.h
+++ b/include/winbase.h
@@ -1717,6 +1717,17 @@ typedef struct _UMS_SCHEDULER_STARTUP_INFO
 typedef enum _RTL_UMS_SCHEDULER_REASON UMS_SCHEDULER_REASON;
 typedef enum _RTL_UMS_THREAD_INFO_CLASS UMS_THREAD_INFO_CLASS, *PUMS_THREAD_INFO_CLASS;
 
+typedef enum _STREAM_INFO_LEVELS
+{
+    FindStreamInfoStandard,
+    FindStreamInfoMaxInfoLevel
+} STREAM_INFO_LEVELS;
+
+typedef struct _WIN32_FIND_STREAM_DATA {
+    LARGE_INTEGER StreamSize;
+    WCHAR cStreamName[MAX_PATH + 36];
+} WIN32_FIND_STREAM_DATA,*PWIN32_FIND_STREAM_DATA;
+
 WINBASEAPI BOOL        WINAPI ActivateActCtx(HANDLE,ULONG_PTR *);
 WINADVAPI  BOOL        WINAPI AddAccessAllowedAce(PACL,DWORD,DWORD,PSID);
 WINADVAPI  BOOL        WINAPI AddAccessAllowedAceEx(PACL,DWORD,DWORD,DWORD,PSID);
@@ -2002,10 +2013,12 @@ WINBASEAPI HANDLE      WINAPI FindFirstFileExA(LPCSTR,FINDEX_INFO_LEVELS,LPVOID,
 WINBASEAPI HANDLE      WINAPI FindFirstFileExW(LPCWSTR,FINDEX_INFO_LEVELS,LPVOID,FINDEX_SEARCH_OPS,LPVOID,DWORD);
 #define                       FindFirstFileEx WINELIB_NAME_AW(FindFirstFileEx)
 WINADVAPI  BOOL        WINAPI FindFirstFreeAce(PACL,LPVOID*);
+WINBASEAPI HANDLE      WINAPI FindFirstStreamW(LPCWSTR,STREAM_INFO_LEVELS,void*,DWORD);
 WINBASEAPI BOOL        WINAPI FindNextChangeNotification(HANDLE);
 WINBASEAPI BOOL        WINAPI FindNextFileA(HANDLE,LPWIN32_FIND_DATAA);
 WINBASEAPI BOOL        WINAPI FindNextFileW(HANDLE,LPWIN32_FIND_DATAW);
 #define                       FindNextFile WINELIB_NAME_AW(FindNextFile)
+WINBASEAPI BOOL        WINAPI FindNextStreamW(HANDLE,void*);
 WINBASEAPI BOOL        WINAPI FindCloseChangeNotification(HANDLE);
 WINBASEAPI HRSRC       WINAPI FindResourceA(HMODULE,LPCSTR,LPCSTR);
 WINBASEAPI HRSRC       WINAPI FindResourceW(HMODULE,LPCWSTR,LPCWSTR);




More information about the wine-cvs mailing list