ReactOS  0.4.13-dev-249-gcba1a2f
PrivMoveFileIdentityW.c
Go to the documentation of this file.
1 /*
2  * PROJECT: ReactOS api tests
3  * LICENSE: GPLv2+ - See COPYING in the top level directory
4  * PURPOSE: Test for PrivMoveFileIdentityW
5  * PROGRAMMER: Pierre Schweitzer <pierre@reactos.org>
6  */
7 
8 #include "precomp.h"
9 
10 #include <ndk/iofuncs.h>
11 
12 static const WCHAR FileName[] = L"TestFile.xxx";
13 static const CHAR FileNameA[] = "TestFile.xxx";
14 static const WCHAR FileName2[] = L"TestFile2.xxx";
15 
16 static BOOL (WINAPI * pPrivMoveFileIdentityW)(LPCWSTR, LPCWSTR, DWORD);
17 
18 static
19 BOOL
21  LPCWSTR File,
22  PFILE_BASIC_INFORMATION FileBasicInfo,
23  PFILE_STANDARD_INFORMATION FileStandardInfo)
24 {
25  HANDLE hFile;
28 
32  NULL);
34  {
35  return FALSE;
36  }
37 
40  if (!NT_SUCCESS(Status))
41  {
43  return FALSE;
44  }
45 
46  Status = NtQueryInformationFile(hFile, &IoStatusBlock, FileStandardInfo,
48 
50  return NT_SUCCESS(Status);
51 }
52 
53 static
54 VOID
56 {
57  FILE_BASIC_INFORMATION FileBasicInfo;
58  FILE_STANDARD_INFORMATION FileStandardInfo;
59  LARGE_INTEGER CreationTime, EndOfFile;
60  HANDLE hDest;
61  WCHAR Self[MAX_PATH];
62  OFSTRUCT ReOpen;
63 
66 
67  if (GetModuleFileNameW(NULL, Self, MAX_PATH) == 0)
68  {
69  win_skip("Failed finding self\n");
70  return;
71  }
72 
73  if (!QueryFileInfo(Self, &FileBasicInfo, &FileStandardInfo))
74  {
75  win_skip("Failed querying self\n");
76  return;
77  }
78 
79  CreationTime = FileBasicInfo.CreationTime;
80  EndOfFile = FileStandardInfo.EndOfFile;
81 
82  Sleep(150);
83 
87  NULL);
88  if (hDest == INVALID_HANDLE_VALUE)
89  {
90  win_skip("Failed creating new\n");
91  return;
92  }
93 
94  CloseHandle(hDest);
95 
96  ok(QueryFileInfo(FileName, &FileBasicInfo, &FileStandardInfo) == TRUE, "QueryFileInfo returned FALSE\n");
97  ok(FileBasicInfo.CreationTime.QuadPart != CreationTime.QuadPart, "Equal creation times\n");
98  ok(FileStandardInfo.EndOfFile.QuadPart == 0LL, "File wasn't created empty: %I64d\n", FileStandardInfo.EndOfFile.QuadPart);
99  SetLastError(0xdeadbeef);
100  ok(pPrivMoveFileIdentityW(Self, FileName, 0) == FALSE, "PrivMoveFileIdentityW succeed\n");
101  ok(GetLastError() == ERROR_SHARING_VIOLATION, "Last error: %#lx\n", GetLastError());
102  ok(QueryFileInfo(FileName, &FileBasicInfo, &FileStandardInfo) == TRUE, "QueryFileInfo returned FALSE\n");
103  ok(FileBasicInfo.CreationTime.QuadPart != CreationTime.QuadPart, "Equal creation times\n");
104  ok(FileStandardInfo.EndOfFile.QuadPart == 0LL, "File wasn't created empty: %I64d\n", FileStandardInfo.EndOfFile.QuadPart);
105  SetLastError(0xdeadbeef);
106  ok(pPrivMoveFileIdentityW(Self, FileName, 2) == TRUE, "PrivMoveFileIdentityW failed with %#lx\n", GetLastError());
107  ok(QueryFileInfo(FileName, &FileBasicInfo, &FileStandardInfo) == TRUE, "QueryFileInfo returned FALSE\n");
108  ok(FileBasicInfo.CreationTime.QuadPart == CreationTime.QuadPart, "Creation time didn't change\n");
109  ok(FileStandardInfo.EndOfFile.QuadPart == 0LL, "File not empty anymore: %I64d\n", FileStandardInfo.EndOfFile.QuadPart);
110  ok(QueryFileInfo(Self, &FileBasicInfo, &FileStandardInfo) == TRUE, "QueryFileInfo returned FALSE\n");
111  ok(FileBasicInfo.CreationTime.QuadPart == CreationTime.QuadPart, "Creation time changed\n");
112  ok(FileStandardInfo.EndOfFile.QuadPart == EndOfFile.QuadPart, "File size changed: %I64d\n", FileStandardInfo.EndOfFile.QuadPart);
113 
117  NULL);
118  if (hDest == INVALID_HANDLE_VALUE)
119  {
120  win_skip("Failed creating new\n");
121  return;
122  }
123 
124  CloseHandle(hDest);
125 
126  ok(QueryFileInfo(FileName2, &FileBasicInfo, &FileStandardInfo) == TRUE, "QueryFileInfo returned FALSE\n");
127  ok(FileBasicInfo.CreationTime.QuadPart != CreationTime.QuadPart, "Equal creation times\n");
128  SetLastError(0xdeadbeef);
129  ok(pPrivMoveFileIdentityW(FileName, FileName2, 3) == TRUE, "PrivMoveFileIdentityW failed with %#lx\n", GetLastError());
130  ok(QueryFileInfo(FileName2, &FileBasicInfo, &FileStandardInfo) == TRUE, "QueryFileInfo returned FALSE\n");
131  ok(FileBasicInfo.CreationTime.QuadPart == CreationTime.QuadPart, "Creation time didn't change\n");
132  ok(OpenFile(FileNameA, &ReOpen, OF_EXIST) == HFILE_ERROR, "Source file still exists\n");
133 
136 }
137 
139 {
140  HMODULE hKern = GetModuleHandleA("kernel32.dll");
141  pPrivMoveFileIdentityW = (void *)GetProcAddress(hKern, "PrivMoveFileIdentityW");
142 
144 }
DWORD WINAPI GetModuleFileNameW(HINSTANCE hModule, LPWSTR lpFilename, DWORD nSize)
Definition: loader.c:607
#define TRUE
Definition: types.h:120
#define CloseHandle
Definition: compat.h:398
VOID WINAPI DECLSPEC_HOTPATCH Sleep(IN DWORD dwMilliseconds)
Definition: synch.c:736
#define LL
Definition: tui.h:72
const WCHAR * LPCWSTR
Definition: xmlstorage.h:185
char CHAR
Definition: xmlstorage.h:175
LONG NTSTATUS
Definition: precomp.h:26
static BOOL(WINAPI *pPrivMoveFileIdentityW)(LPCWSTR
#define INVALID_HANDLE_VALUE
Definition: compat.h:391
DWORD WINAPI GetLastError(VOID)
Definition: except.c:1059
#define FILE_SHARE_WRITE
Definition: nt_native.h:681
#define FILE_SHARE_READ
Definition: compat.h:125
static BOOL QueryFileInfo(LPCWSTR File, PFILE_BASIC_INFORMATION FileBasicInfo, PFILE_STANDARD_INFORMATION FileStandardInfo)
#define HFILE_ERROR
Definition: winbase.h:111
unsigned int BOOL
Definition: ntddk_ex.h:94
#define GENERIC_WRITE
Definition: nt_native.h:90
#define ok(value,...)
BOOL WINAPI DeleteFileW(IN LPCWSTR lpFileName)
Definition: delete.c:39
smooth NULL
Definition: ftsmooth.c:416
static DWORD
#define OPEN_EXISTING
Definition: compat.h:426
HFILE WINAPI OpenFile(LPCSTR lpFileName, LPOFSTRUCT lpReOpenBuff, UINT uStyle)
Definition: create.c:368
__wchar_t WCHAR
Definition: xmlstorage.h:180
#define NT_SUCCESS(StatCode)
Definition: apphelp.c:32
#define MAX_PATH
Definition: compat.h:26
#define WINAPI
Definition: msvc.h:8
#define SetLastError(x)
Definition: compat.h:409
BOOL WINAPI PrivMoveFileIdentityW(IN LPCWSTR lpSource, IN LPCWSTR lpDestination, IN DWORD dwFlags)
Definition: move.c:1321
#define FILE_READ_ATTRIBUTES
Definition: nt_native.h:647
LARGE_INTEGER CreationTime
Definition: nt_native.h:939
#define FILE_ATTRIBUTE_NORMAL
Definition: compat.h:126
static const WCHAR L[]
Definition: oid.c:1250
HMODULE WINAPI DECLSPEC_HOTPATCH GetModuleHandleA(LPCSTR lpModuleName)
Definition: loader.c:819
#define ERROR_SHARING_VIOLATION
Definition: winerror.h:135
NTSTATUS NTAPI NtQueryInformationFile(HANDLE hFile, PIO_STATUS_BLOCK io, PVOID ptr, ULONG len, FILE_INFORMATION_CLASS FileInformationClass)
#define SYNCHRONIZE
Definition: nt_native.h:61
_In_ HANDLE hFile
Definition: mswsock.h:90
Status
Definition: gdiplustypes.h:24
#define OF_EXIST
Definition: winbase.h:127
#define CREATE_ALWAYS
Definition: disk.h:72
START_TEST(PrivMoveFileIdentityW)
static OUT PIO_STATUS_BLOCK IoStatusBlock
Definition: pipe.c:75
#define FileStandardInformation
Definition: propsheet.cpp:61
#define CreateFileW
Definition: compat.h:400
#define FILE_SYNCHRONOUS_IO_NONALERT
Definition: from_kernel.h:31
static VOID TestPrivMoveFileIdentityW(VOID)
#define GetProcAddress(x, y)
Definition: compat.h:410
Definition: File.h:15
static const WCHAR FileName2[]
static const CHAR FileNameA[]
#define win_skip
Definition: test.h:141
static LPCWSTR
LONGLONG QuadPart
Definition: typedefs.h:112