// TestOpenDirDelete_with_NovellClient.cpp : Defines the entry point for the console application. // #include #include #include #include void PrintGetLastError(_TCHAR * type, DWORD lasterr, _TCHAR * filename) { // Retrieve the system error message for the last-error code LPVOID lpMsgBuf; FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, lasterr, MAKELANGID(LANG_ENGLISH, SUBLANG_DEFAULT), (LPTSTR) &lpMsgBuf, 0, NULL ); _cwprintf(_T("%s '%s' resulted in errorcode %i, description: %s"), type, filename, lasterr, (LPTSTR) lpMsgBuf); LocalFree(lpMsgBuf); } int _tmain(int argc, _TCHAR* argv[]) { int i; HANDLE handle1, handle2; FILE_DISPOSITION_INFO fdisp = { TRUE }; DWORD lasterr; // this loop is just preparation, it has nothing to do with the problem for (i = 2; i <= argc; i++) { // make sure we start cleanly DeleteFile(argv[i - 1]); } Sleep(1000); for (i = 2; i <= argc; i++) { // Failing here probably means the directory already exists and is not empty. // Manually clean up the test environment first. if (!CreateDirectory(argv[i - 1], NULL)) { lasterr = GetLastError(); PrintGetLastError(_T("CreateDirectory"), lasterr, argv[i - 1]); return 1; } // First open the directory and keep the handle open. handle1 = CreateFile(argv[i - 1], GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, NULL, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, 0); if (handle1 == INVALID_HANDLE_VALUE) { lasterr = GetLastError(); PrintGetLastError(_T("CreateFile"), lasterr, argv[i - 1]); return 1; } // Now try to open the directory for deletion with FILE_SHARE_DELETE only, this should fail. // Successfully opening the directory could happen here when different access and sharing modes // are used for opening HANDLE1 above. handle2 = CreateFile(argv[i - 1], FILE_READ_ATTRIBUTES | DELETE, FILE_SHARE_DELETE, NULL, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, 0); if (handle2 == INVALID_HANDLE_VALUE) { lasterr = GetLastError(); if (lasterr == 32) PrintGetLastError(_T("Expected error: CreateFile(FILE_READ_ATTRIBUTES | DELETE, FILE_SHARE_DELETE)"), lasterr, argv[i - 1]); else { PrintGetLastError(_T("CreateFile(FILE_READ_ATTRIBUTES | DELETE, FILE_SHARE_DELETE)"), lasterr, argv[i - 1]); return 1; } } else { _cwprintf(_T("Expected STATUS_SHARING_VIOLATION missing\n")); // Arriving is already wrong, but try to delete the directory anyway for completeness. if (!SetFileInformationByHandle(handle2, FileDispositionInfo, &fdisp, sizeof fdisp)) { lasterr = GetLastError(); PrintGetLastError(_T("SetFileInformationByHandle(DELETE)/1"), lasterr, argv[i - 1]); } CloseHandle(handle2); } // This time open the directory for deletion with FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, this should succeed. handle2 = CreateFile(argv[i - 1], FILE_READ_ATTRIBUTES | DELETE, FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, NULL, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, 0); if (handle2 == INVALID_HANDLE_VALUE) { lasterr = GetLastError(); PrintGetLastError(_T("CreateFile(FILE_READ_ATTRIBUTES | DELETE, FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE)"), lasterr, argv[i - 1]); return 1; } // Now mark the directory for deletion, this should succeed. if (!SetFileInformationByHandle(handle2, FileDispositionInfo, &fdisp, sizeof fdisp)) { lasterr = GetLastError(); PrintGetLastError(_T("SetFileInformationByHandle(DELETE)/2"), lasterr, argv[i - 1]); _cwprintf(_T("FAIL")); return 1; } CloseHandle(handle2); CloseHandle(handle1); } _cwprintf(_T("PASS")); return 0; }