diff --git a/tst/winfsp-tests/stream-tests.c b/tst/winfsp-tests/stream-tests.c index 64f568c8..bb164eb2 100644 --- a/tst/winfsp-tests/stream-tests.c +++ b/tst/winfsp-tests/stream-tests.c @@ -1260,7 +1260,7 @@ static void stream_delete_pending_dotest(ULONG Flags, PWSTR Prefix, ULONG FileIn BOOL Success; WCHAR Dir1Path[MAX_PATH], Dir1StreamPath[MAX_PATH]; WCHAR FilePath[MAX_PATH], FileStreamPath[MAX_PATH]; - FILE_DISPOSITION_INFO DispositionInfo; + MY_FILE_DISPOSITION_INFO DispositionInfo; StringCbPrintfW(Dir1Path, sizeof Dir1Path, L"%s%s\\dir1", Prefix ? L"" : L"\\\\?\\GLOBALROOT", Prefix ? Prefix : memfs_volumename(memfs)); @@ -1304,7 +1304,7 @@ static void stream_delete_pending_dotest(ULONG Flags, PWSTR Prefix, ULONG FileIn DELETE, FILE_SHARE_DELETE, 0, OPEN_EXISTING, 0, 0); ASSERT(INVALID_HANDLE_VALUE != Handle); - DispositionInfo.DeleteFile = TRUE; + DispositionInfo.Disposition = TRUE; Success = SetFileInformationByHandle(Handle, FileDispositionInfo, &DispositionInfo, sizeof DispositionInfo); ASSERT(Success); @@ -1327,7 +1327,7 @@ static void stream_delete_pending_dotest(ULONG Flags, PWSTR Prefix, ULONG FileIn DELETE, FILE_SHARE_DELETE, 0, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, 0); ASSERT(INVALID_HANDLE_VALUE != Handle); - DispositionInfo.DeleteFile = TRUE; + DispositionInfo.Disposition = TRUE; Success = SetFileInformationByHandle(Handle, FileDispositionInfo, &DispositionInfo, sizeof DispositionInfo); ASSERT(Success); diff --git a/tst/winfsp-tests/winfsp-tests.c b/tst/winfsp-tests/winfsp-tests.c index 9a849854..2c976c92 100644 --- a/tst/winfsp-tests/winfsp-tests.c +++ b/tst/winfsp-tests/winfsp-tests.c @@ -17,6 +17,7 @@ int NtfsTests = 0; int WinFspDiskTests = 1; int WinFspNetTests = 1; +BOOLEAN OptResilient = FALSE; BOOLEAN OptCaseInsensitive = FALSE; BOOLEAN OptCaseRandomize = FALSE; WCHAR OptMountPointBuf[MAX_PATH], *OptMountPoint; @@ -201,6 +202,37 @@ HANDLE HookCreateFileW( return h; } +#undef DeleteFileW +BOOL HookDeleteFileW( + LPCWSTR lpFileName) +{ + BOOL Success; + DWORD LastError; + + Success = DeleteFileW(lpFileName); + LastError = GetLastError(); + if (OptResilient && !Success) + { + ULONG MaxTries = 10; + while (!Success && ERROR_SHARING_VIOLATION == LastError && 0 != MaxTries--) + { + Sleep(300); + Success = DeleteFileW(lpFileName); + } + } + else + { + ULONG MaxTries = 3; + while (INVALID_FILE_ATTRIBUTES != GetFileAttributes(lpFileName) && 0 != MaxTries--) + { + Sleep(300); + } + } + + SetLastError(LastError); + return Success; +} + static VOID DisableBackupRestorePrivileges(VOID) { union @@ -227,7 +259,7 @@ static VOID DisableBackupRestorePrivileges(VOID) CloseHandle(Token); } -VOID AddNetShareIfNeeded(VOID) +static VOID AddNetShareIfNeeded(VOID) { if (!OptShareName) return; @@ -247,7 +279,7 @@ VOID AddNetShareIfNeeded(VOID) ABORT("cannot add network share"); } -VOID RemoveNetShareIfNeeded(VOID) +static VOID RemoveNetShareIfNeeded(VOID) { if (!OptShareName) return; @@ -308,6 +340,11 @@ int main(int argc, char *argv[]) WinFspNetTests = 0; rmarg(argv, argc, argi); } + else if (0 == strcmp("--resilient", a)) + { + OptResilient = TRUE; + rmarg(argv, argc, argi); + } else if (0 == strcmp("--case-insensitive", a)) { OptCaseInsensitive = TRUE; diff --git a/tst/winfsp-tests/winfsp-tests.h b/tst/winfsp-tests/winfsp-tests.h index 6ad1ff24..b6b29694 100644 --- a/tst/winfsp-tests/winfsp-tests.h +++ b/tst/winfsp-tests/winfsp-tests.h @@ -17,13 +17,20 @@ HANDLE HookCreateFileW( DWORD dwFlagsAndAttributes, HANDLE hTemplateFile); -VOID AddNetShareIfNeeded(VOID); -VOID RemoveNetShareIfNeeded(VOID); +#define DeleteFileW HookDeleteFileW +BOOL HookDeleteFileW( + LPCWSTR lpFileName); + +typedef struct +{ + BOOLEAN Disposition; +} MY_FILE_DISPOSITION_INFO; extern int NtfsTests; extern int WinFspDiskTests; extern int WinFspNetTests; +extern BOOLEAN OptResilient; extern BOOLEAN OptCaseInsensitive; extern BOOLEAN OptCaseRandomize; extern WCHAR OptMountPointBuf[], *OptMountPoint;