=?UTF-8?Q?Vincas=20Mili=C5=ABnas=20?=: kernel32/tests: Added tests of FileIdBothDirectoryInfo for GetFileInformationByHandleEx.
Alexandre Julliard
julliard at winehq.org
Fri Oct 12 11:37:44 CDT 2012
Module: wine
Branch: master
Commit: 9cec60bb1e6d81706dd81180f4284e18183ea603
URL: http://source.winehq.org/git/wine.git/?a=commit;h=9cec60bb1e6d81706dd81180f4284e18183ea603
Author: Vincas Miliūnas <vincas.miliunas at gmail.com>
Date: Fri Oct 12 13:34:54 2012 +0300
kernel32/tests: Added tests of FileIdBothDirectoryInfo for GetFileInformationByHandleEx.
---
dlls/kernel32/tests/file.c | 80 ++++++++++++++++++++++++++++++++++++++++++++
include/winbase.h | 43 +++++++++++++++++++++++
2 files changed, 123 insertions(+), 0 deletions(-)
diff --git a/dlls/kernel32/tests/file.c b/dlls/kernel32/tests/file.c
index c046371..71ad774 100644
--- a/dlls/kernel32/tests/file.c
+++ b/dlls/kernel32/tests/file.c
@@ -39,6 +39,7 @@ static BOOL (WINAPI *pReplaceFileW)(LPCWSTR, LPCWSTR, LPCWSTR, DWORD, LPVOID, LP
static UINT (WINAPI *pGetSystemWindowsDirectoryA)(LPSTR, UINT);
static BOOL (WINAPI *pGetVolumeNameForVolumeMountPointA)(LPCSTR, LPSTR, DWORD);
static DWORD (WINAPI *pQueueUserAPC)(PAPCFUNC pfnAPC, HANDLE hThread, ULONG_PTR dwData);
+static BOOL (WINAPI *pGetFileInformationByHandleEx)(HANDLE, FILE_INFO_BY_HANDLE_CLASS, LPVOID, DWORD);
/* keep filename and filenameW the same */
static const char filename[] = "testfile.xxx";
@@ -73,6 +74,7 @@ static void InitFunctionPointers(void)
pGetSystemWindowsDirectoryA=(void*)GetProcAddress(hkernel32, "GetSystemWindowsDirectoryA");
pGetVolumeNameForVolumeMountPointA = (void *) GetProcAddress(hkernel32, "GetVolumeNameForVolumeMountPointA");
pQueueUserAPC = (void *) GetProcAddress(hkernel32, "QueueUserAPC");
+ pGetFileInformationByHandleEx = (void *) GetProcAddress(hkernel32, "GetFileInformationByHandleEx");
}
static void test__hread( void )
@@ -3258,6 +3260,83 @@ static void test_CreatFile(void)
DeleteFile(file_name);
}
+static void test_GetFileInformationByHandleEx(void)
+{
+ int i;
+ char tempPath[MAX_PATH], tempFileName[MAX_PATH], buffer[1024];
+ BOOL ret;
+ DWORD ret2;
+ HANDLE directory;
+ FILE_ID_BOTH_DIR_INFO *bothDirInfo;
+ struct {
+ FILE_INFO_BY_HANDLE_CLASS handleClass;
+ void *ptr;
+ DWORD size;
+ DWORD errorCode;
+ } checks[] = {
+ {0xdeadbeef, NULL, 0, ERROR_INVALID_PARAMETER},
+ {FileIdBothDirectoryInfo, NULL, 0, ERROR_BAD_LENGTH},
+ {FileIdBothDirectoryInfo, NULL, sizeof(buffer), ERROR_NOACCESS},
+ {FileIdBothDirectoryInfo, buffer, 0, ERROR_BAD_LENGTH}};
+
+ if (!pGetFileInformationByHandleEx)
+ {
+ win_skip("GetFileInformationByHandleEx is missing.\n");
+ return;
+ }
+
+ ret2 = GetTempPathA(sizeof(tempPath), tempPath);
+ ok(ret2, "GetFileInformationByHandleEx: GetTempPathA failed, got error %u.\n", GetLastError());
+
+ /* ensure the existence of a file in the temp folder */
+ ret2 = GetTempFileNameA(tempPath, "abc", 0, tempFileName);
+ ok(ret2, "GetFileInformationByHandleEx: GetTempFileNameA failed, got error %u.\n", GetLastError());
+ ok(GetFileAttributesA(tempFileName) != INVALID_FILE_ATTRIBUTES, "GetFileInformationByHandleEx: "
+ "GetFileAttributesA failed to find the temp file, got error %u.\n", GetLastError());
+
+ directory = CreateFileA(tempPath, GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE,
+ NULL, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, NULL);
+ ok(directory != INVALID_HANDLE_VALUE, "GetFileInformationByHandleEx: failed to open the temp folder, "
+ "got error %u.\n", GetLastError());
+
+ for (i = 0; i < sizeof(checks) / sizeof(checks[0]); i += 1)
+ {
+ SetLastError(0xdeadbeef);
+ ret = pGetFileInformationByHandleEx(directory, checks[i].handleClass, checks[i].ptr, checks[i].size);
+ todo_wine
+ ok(!ret && GetLastError() == checks[i].errorCode, "GetFileInformationByHandleEx: expected error %u, "
+ "got %u.\n", checks[i].errorCode, GetLastError());
+ }
+
+ while (TRUE)
+ {
+ memset(buffer, 0xff, sizeof(buffer));
+ ret = pGetFileInformationByHandleEx(directory, FileIdBothDirectoryInfo, buffer, sizeof(buffer));
+ if (!ret && GetLastError() == ERROR_NO_MORE_FILES)
+ break;
+ todo_wine
+ ok(ret, "GetFileInformationByHandleEx: failed to query for FileIdBothDirectoryInfo, got error %u.\n", GetLastError());
+ if (!ret)
+ break;
+ bothDirInfo = (FILE_ID_BOTH_DIR_INFO *)buffer;
+ while (TRUE)
+ {
+ todo_wine
+ ok(bothDirInfo->FileAttributes != 0xffffffff, "GetFileInformationByHandleEx: returned invalid file attributes.\n");
+ todo_wine
+ ok(bothDirInfo->FileId.u.LowPart != 0xffffffff, "GetFileInformationByHandleEx: returned invalid file id.\n");
+ todo_wine
+ ok(bothDirInfo->FileNameLength != 0xffffffff, "GetFileInformationByHandleEx: returned invalid file name length.\n");
+ if (!bothDirInfo->NextEntryOffset)
+ break;
+ bothDirInfo = (FILE_ID_BOTH_DIR_INFO *)(((char *)bothDirInfo) + bothDirInfo->NextEntryOffset);
+ }
+ }
+
+ CloseHandle(directory);
+ DeleteFile(tempFileName);
+}
+
START_TEST(file)
{
InitFunctionPointers();
@@ -3297,4 +3376,5 @@ START_TEST(file)
test_RemoveDirectory();
test_ReplaceFileA();
test_ReplaceFileW();
+ test_GetFileInformationByHandleEx();
}
diff --git a/include/winbase.h b/include/winbase.h
index c1e62a3..2e97048 100644
--- a/include/winbase.h
+++ b/include/winbase.h
@@ -740,6 +740,49 @@ typedef struct _BY_HANDLE_FILE_INFORMATION
DWORD nFileIndexLow;
} BY_HANDLE_FILE_INFORMATION, *PBY_HANDLE_FILE_INFORMATION, *LPBY_HANDLE_FILE_INFORMATION ;
+typedef enum _FILE_INFO_BY_HANDLE_CLASS {
+ FileBasicInfo,
+ FileStandardInfo,
+ FileNameInfo,
+ FileRenameInfo,
+ FileDispositionInfo,
+ FileAllocationInfo,
+ FileEndOfFileInfo,
+ FileStreamInfo,
+ FileCompressionInfo,
+ FileAttributeTagInfo,
+ FileIdBothDirectoryInfo,
+ FileIdBothDirectoryRestartInfo,
+ FileIoPriorityHintInfo,
+ FileRemoteProtocolInfo,
+ FileFullDirectoryInfo,
+ FileFullDirectoryRestartInfo,
+ FileStorageInfo,
+ FileAlignmentInfo,
+ FileIdInfo,
+ FileIdExtdDirectoryInfo,
+ FileIdExtdDirectoryRestartInfo,
+ MaximumFileInfoByHandlesClass
+} FILE_INFO_BY_HANDLE_CLASS, *PFILE_INFO_BY_HANDLE_CLASS;
+
+typedef struct _FILE_ID_BOTH_DIR_INFO {
+ DWORD NextEntryOffset;
+ DWORD FileIndex;
+ LARGE_INTEGER CreationTime;
+ LARGE_INTEGER LastAccessTime;
+ LARGE_INTEGER LastWriteTime;
+ LARGE_INTEGER ChangeTime;
+ LARGE_INTEGER EndOfFile;
+ LARGE_INTEGER AllocationSize;
+ DWORD FileAttributes;
+ DWORD FileNameLength;
+ DWORD EaSize;
+ CCHAR ShortNameLength;
+ WCHAR ShortName[12];
+ LARGE_INTEGER FileId;
+ WCHAR FileName[1];
+} FILE_ID_BOTH_DIR_INFO, *PFILE_ID_BOTH_DIR_INFO;
+
#define PIPE_ACCESS_INBOUND 1
#define PIPE_ACCESS_OUTBOUND 2
#define PIPE_ACCESS_DUPLEX 3
More information about the wine-cvs
mailing list