Author: pschweitzer Date: Sat Apr 18 19:46:57 2015 New Revision: 67273
URL: http://svn.reactos.org/svn/reactos?rev=67273&view=rev Log: [KERNEL32_APITEST] Add tests for PrivMoveFileIdentityW().
Tested on w2k3 by Thomas
Added: trunk/rostests/apitests/kernel32/PrivMoveFileIdentityW.c (with props) Modified: trunk/rostests/apitests/kernel32/CMakeLists.txt trunk/rostests/apitests/kernel32/testlist.c
Modified: trunk/rostests/apitests/kernel32/CMakeLists.txt URL: http://svn.reactos.org/svn/reactos/trunk/rostests/apitests/kernel32/CMakeLis... ============================================================================== --- trunk/rostests/apitests/kernel32/CMakeLists.txt [iso-8859-1] (original) +++ trunk/rostests/apitests/kernel32/CMakeLists.txt [iso-8859-1] Sat Apr 18 19:46:57 2015 @@ -8,6 +8,7 @@ interlck.c lstrcpynW.c MultiByteToWideChar.c + PrivMoveFileIdentityW.c SetCurrentDirectory.c SetUnhandledExceptionFilter.c TerminateProcess.c
Added: trunk/rostests/apitests/kernel32/PrivMoveFileIdentityW.c URL: http://svn.reactos.org/svn/reactos/trunk/rostests/apitests/kernel32/PrivMove... ============================================================================== --- trunk/rostests/apitests/kernel32/PrivMoveFileIdentityW.c (added) +++ trunk/rostests/apitests/kernel32/PrivMoveFileIdentityW.c [iso-8859-1] Sat Apr 18 19:46:57 2015 @@ -0,0 +1,111 @@ +/* + * PROJECT: ReactOS api tests + * LICENSE: GPLv2+ - See COPYING in the top level directory + * PURPOSE: Test for PrivMoveFileIdentityW + * PROGRAMMER: Pierre Schweitzer pierre@reactos.org + */ + +#include <apitest.h> + +#define WIN32_NO_STATUS +#include <stdio.h> +#include <ndk/iofuncs.h> +#include <ndk/rtltypes.h> + +static const WCHAR FileName[] = L"TestFile.xxx"; +static const WCHAR Self[] = L"kernel32_apitest.exe"; + +static BOOL (WINAPI * pPrivMoveFileIdentityW)(LPCWSTR, LPCWSTR, DWORD); + +static +BOOL +QueryFileInfo( + LPCWSTR File, + PFILE_BASIC_INFORMATION FileBasicInfo, + PFILE_STANDARD_INFORMATION FileStandardInfo) +{ + HANDLE hFile; + IO_STATUS_BLOCK IoStatusBlock; + NTSTATUS Status; + + hFile = CreateFileW(File, FILE_READ_ATTRIBUTES | SYNCHRONIZE, + FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, + OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL | FILE_SYNCHRONOUS_IO_NONALERT, + NULL); + if (hFile == INVALID_HANDLE_VALUE) + { + return FALSE; + } + + Status = NtQueryInformationFile(hFile, &IoStatusBlock, FileBasicInfo, + sizeof(FILE_BASIC_INFORMATION), FileBasicInformation); + if (!NT_SUCCESS(Status)) + { + CloseHandle(hFile); + return FALSE; + } + + Status = NtQueryInformationFile(hFile, &IoStatusBlock, FileStandardInfo, + sizeof(FILE_STANDARD_INFORMATION), FileStandardInformation); + + CloseHandle(hFile); + return NT_SUCCESS(Status); +} + +static +VOID +TestPrivMoveFileIdentityW(VOID) +{ + FILE_BASIC_INFORMATION FileBasicInfo; + FILE_STANDARD_INFORMATION FileStandardInfo; + LARGE_INTEGER CreationTime, EndOfFile; + HANDLE hDest; + NTSTATUS Status; + + DeleteFileW(FileName); + + if (!QueryFileInfo(Self, &FileBasicInfo, &FileStandardInfo)) + { + win_skip("Failed querying self\n"); + return; + } + + CreationTime = FileBasicInfo.CreationTime; + EndOfFile = FileStandardInfo.EndOfFile; + + Sleep(150); + + hDest = CreateFileW(FileName, GENERIC_WRITE | SYNCHRONIZE, + FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, + CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL | FILE_SYNCHRONOUS_IO_NONALERT, + NULL); + if (hDest == INVALID_HANDLE_VALUE) + { + win_skip("Failed creating new\n"); + return; + } + + CloseHandle(hDest); + + ok(QueryFileInfo(FileName, &FileBasicInfo, &FileStandardInfo) == TRUE, "QueryFileInfo returned FALSE\n"); + ok(FileBasicInfo.CreationTime.QuadPart != CreationTime.QuadPart, "Equal creation times\n"); + ok(FileStandardInfo.EndOfFile.QuadPart == 0LL, "File wasn't created empty: %I64d\n", FileStandardInfo.EndOfFile.QuadPart); + Status = (NTSTATUS)pPrivMoveFileIdentityW(Self, FileName, 0); + ok(Status == STATUS_SUCCESS, "PrivMoveFileIdentityW failed with %lx\n", Status); + ok(QueryFileInfo(FileName, &FileBasicInfo, &FileStandardInfo) == TRUE, "QueryFileInfo returned FALSE\n"); + ok(FileBasicInfo.CreationTime.QuadPart == CreationTime.QuadPart, "Creation time didn't change\n"); + ok(FileStandardInfo.EndOfFile.QuadPart == 0LL, "File not empty anymore: %I64d\n", FileStandardInfo.EndOfFile.QuadPart); + ok(QueryFileInfo(Self, &FileBasicInfo, &FileStandardInfo) == TRUE, "QueryFileInfo returned FALSE\n"); + ok(FileBasicInfo.CreationTime.QuadPart == CreationTime.QuadPart, "Creation time changed\n"); + ok(FileStandardInfo.EndOfFile.QuadPart == EndOfFile.QuadPart, "File size changed: %I64d\n", FileStandardInfo.EndOfFile.QuadPart); + + DeleteFileW(FileName); +} + +START_TEST(PrivMoveFileIdentityW) +{ + HMODULE hKern = GetModuleHandleA("kernel32.dll"); + pPrivMoveFileIdentityW = (void *)GetProcAddress(hKern, "PrivMoveFileIdentityW"); + + TestPrivMoveFileIdentityW(); +}
Propchange: trunk/rostests/apitests/kernel32/PrivMoveFileIdentityW.c ------------------------------------------------------------------------------ svn:eol-style = native
Modified: trunk/rostests/apitests/kernel32/testlist.c URL: http://svn.reactos.org/svn/reactos/trunk/rostests/apitests/kernel32/testlist... ============================================================================== --- trunk/rostests/apitests/kernel32/testlist.c [iso-8859-1] (original) +++ trunk/rostests/apitests/kernel32/testlist.c [iso-8859-1] Sat Apr 18 19:46:57 2015 @@ -11,6 +11,7 @@ extern void func_interlck(void); extern void func_lstrcpynW(void); extern void func_MultiByteToWideChar(void); +extern void func_PrivMoveFileIdentityW(void); extern void func_SetCurrentDirectory(void); extern void func_SetUnhandledExceptionFilter(void); extern void func_TerminateProcess(void); @@ -25,6 +26,7 @@ { "interlck", func_interlck }, { "lstrcpynW", func_lstrcpynW }, { "MultiByteToWideChar", func_MultiByteToWideChar }, + { "PrivMoveFileIdentityW", func_PrivMoveFileIdentityW }, { "SetCurrentDirectory", func_SetCurrentDirectory }, { "SetUnhandledExceptionFilter", func_SetUnhandledExceptionFilter }, { "TerminateProcess", func_TerminateProcess },