=?UTF-8?Q?Andr=C3=A9=20Hentschel=20?=: kernel32/tests: Add initial CreateFile2 tests based on the CreateFileW tests.

Alexandre Julliard julliard at winehq.org
Tue Sep 17 15:25:53 CDT 2013


Module: wine
Branch: master
Commit: 22cd7a10cfe80c83717b6c976edc8409315da782
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=22cd7a10cfe80c83717b6c976edc8409315da782

Author: André Hentschel <nerv at dawncrow.de>
Date:   Mon Sep 16 20:26:01 2013 +0200

kernel32/tests: Add initial CreateFile2 tests based on the CreateFileW tests.

---

 dlls/kernel32/tests/file.c |   85 ++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 85 insertions(+), 0 deletions(-)

diff --git a/dlls/kernel32/tests/file.c b/dlls/kernel32/tests/file.c
index d7a8776..288fc5e 100644
--- a/dlls/kernel32/tests/file.c
+++ b/dlls/kernel32/tests/file.c
@@ -33,6 +33,7 @@
 #include "winbase.h"
 #include "winerror.h"
 #include "winnls.h"
+#include "fileapi.h"
 
 static HANDLE (WINAPI *pFindFirstFileExA)(LPCSTR,FINDEX_INFO_LEVELS,LPVOID,FINDEX_SEARCH_OPS,LPVOID,DWORD);
 static BOOL (WINAPI *pReplaceFileA)(LPCSTR, LPCSTR, LPCSTR, DWORD, LPVOID, LPVOID);
@@ -44,6 +45,7 @@ static BOOL (WINAPI *pGetFileInformationByHandleEx)(HANDLE, FILE_INFO_BY_HANDLE_
 static HANDLE (WINAPI *pOpenFileById)(HANDLE, LPFILE_ID_DESCRIPTOR, DWORD, DWORD, LPSECURITY_ATTRIBUTES, DWORD);
 static BOOL (WINAPI *pSetFileValidData)(HANDLE, LONGLONG);
 static HRESULT (WINAPI *pCopyFile2)(PCWSTR,PCWSTR,COPYFILE2_EXTENDED_PARAMETERS*);
+static HANDLE (WINAPI *pCreateFile2)(LPCWSTR, DWORD, DWORD, DWORD, CREATEFILE2_EXTENDED_PARAMETERS*);
 
 /* keep filename and filenameW the same */
 static const char filename[] = "testfile.xxx";
@@ -82,6 +84,7 @@ static void InitFunctionPointers(void)
     pOpenFileById = (void *) GetProcAddress(hkernel32, "OpenFileById");
     pSetFileValidData = (void *) GetProcAddress(hkernel32, "SetFileValidData");
     pCopyFile2 = (void *) GetProcAddress(hkernel32, "CopyFile2");
+    pCreateFile2 = (void *) GetProcAddress(hkernel32, "CreateFile2");
 }
 
 static void test__hread( void )
@@ -1488,6 +1491,87 @@ static void test_CreateFileW(void)
     ok(ret, "DeleteFileW: error %d\n", GetLastError());
 }
 
+static void test_CreateFile2(void)
+{
+    HANDLE hFile;
+    WCHAR temp_path[MAX_PATH];
+    WCHAR filename[MAX_PATH];
+    CREATEFILE2_EXTENDED_PARAMETERS exparams;
+    static const WCHAR emptyW[]={'\0'};
+    static const WCHAR prefix[] = {'p','f','x',0};
+    static const WCHAR bogus[] = { '\\', '\\', '.', '\\', 'B', 'O', 'G', 'U', 'S', 0 };
+    DWORD ret;
+
+    if (!pCreateFile2)
+    {
+        win_skip("CreateFile2 is missing\n");
+        return;
+    }
+
+    ret = GetTempPathW(MAX_PATH, temp_path);
+    ok(ret != 0, "GetTempPathW error %d\n", GetLastError());
+    ok(ret < MAX_PATH, "temp path should fit into MAX_PATH\n");
+
+    ret = GetTempFileNameW(temp_path, prefix, 0, filename);
+    ok(ret != 0, "GetTempFileNameW error %d\n", GetLastError());
+
+    SetLastError(0xdeadbeef);
+    exparams.dwSize = sizeof(exparams);
+    exparams.dwFileAttributes = FILE_FLAG_RANDOM_ACCESS;
+    exparams.dwFileFlags = 0;
+    exparams.dwSecurityQosFlags = 0;
+    exparams.lpSecurityAttributes = NULL;
+    exparams.hTemplateFile = 0;
+    hFile = pCreateFile2(filename, GENERIC_READ, 0, CREATE_NEW, &exparams);
+    ok(hFile == INVALID_HANDLE_VALUE && GetLastError() == ERROR_FILE_EXISTS,
+       "CREATE_NEW should fail if file exists and last error value should be ERROR_FILE_EXISTS\n");
+
+    SetLastError(0xdeadbeef);
+    hFile = pCreateFile2(filename, GENERIC_READ, FILE_SHARE_READ, CREATE_ALWAYS, &exparams);
+    ok(hFile != INVALID_HANDLE_VALUE && GetLastError() == ERROR_ALREADY_EXISTS,
+       "hFile %p, last error %u\n", hFile, GetLastError());
+    CloseHandle(hFile);
+
+    SetLastError(0xdeadbeef);
+    hFile = pCreateFile2(filename, GENERIC_READ, FILE_SHARE_READ, OPEN_ALWAYS, &exparams);
+    ok(hFile != INVALID_HANDLE_VALUE && GetLastError() == ERROR_ALREADY_EXISTS,
+       "hFile %p, last error %u\n", hFile, GetLastError());
+    CloseHandle(hFile);
+
+    ret = DeleteFileW(filename);
+    ok(ret, "DeleteFileW: error %d\n", GetLastError());
+
+    SetLastError(0xdeadbeef);
+    hFile = pCreateFile2(filename, GENERIC_READ, FILE_SHARE_READ, OPEN_ALWAYS, &exparams);
+    ok(hFile != INVALID_HANDLE_VALUE && GetLastError() == 0,
+       "hFile %p, last error %u\n", hFile, GetLastError());
+    CloseHandle(hFile);
+
+    ret = DeleteFileW(filename);
+    ok(ret, "DeleteFileW: error %d\n", GetLastError());
+
+    hFile = pCreateFile2(emptyW, GENERIC_READ, 0, CREATE_NEW, &exparams);
+    ok(hFile == INVALID_HANDLE_VALUE && GetLastError() == ERROR_PATH_NOT_FOUND,
+       "CreateFile2(\"\") returned ret=%p error=%d\n",hFile,GetLastError());
+
+    /* test the result of opening a nonexistent driver name */
+    exparams.dwFileAttributes = FILE_ATTRIBUTE_NORMAL;
+    hFile = pCreateFile2(bogus, 0, FILE_SHARE_READ | FILE_SHARE_WRITE, OPEN_EXISTING, &exparams);
+    ok(hFile == INVALID_HANDLE_VALUE && GetLastError() == ERROR_FILE_NOT_FOUND,
+       "CreateFile2 on invalid VxD name returned ret=%p error=%d\n",hFile,GetLastError());
+
+    ret = CreateDirectoryW(filename, NULL);
+    ok(ret == TRUE, "couldn't create temporary directory\n");
+    exparams.dwFileAttributes = FILE_ATTRIBUTE_NORMAL | FILE_FLAG_BACKUP_SEMANTICS;
+    hFile = pCreateFile2(filename, GENERIC_READ | GENERIC_WRITE, 0, OPEN_ALWAYS, &exparams);
+    todo_wine
+    ok(hFile == INVALID_HANDLE_VALUE,
+       "expected CreateFile2 to fail on existing directory, error: %d\n", GetLastError());
+    CloseHandle(hFile);
+    ret = RemoveDirectoryW(filename);
+    ok(ret, "DeleteFileW: error %d\n", GetLastError());
+}
+
 static void test_GetTempFileNameA(void)
 {
     UINT result;
@@ -3906,6 +3990,7 @@ START_TEST(file)
     test_CreateFile();
     test_CreateFileA();
     test_CreateFileW();
+    test_CreateFile2();
     test_DeleteFileA();
     test_DeleteFileW();
     test_MoveFileA();




More information about the wine-cvs mailing list