Author: pschweitzer
Date: Sat Mar 29 18:50:36 2014
New Revision: 62579
URL:
http://svn.reactos.org/svn/reactos?rev=62579&view=rev
Log:
[ROSTESTS]
Add a usermode test application for tunnel cache.
It is based on MS article at:
http://support.microsoft.com/?kbid=172190
Tested successfully on Windows 7 & NTFS. Feel free to test on w2k3 NTFS or FAT/FAT32.
Added:
trunk/rostests/win32/fs/
trunk/rostests/win32/fs/CMakeLists.txt (with props)
trunk/rostests/win32/fs/tunneltest/
trunk/rostests/win32/fs/tunneltest/CMakeLists.txt (with props)
trunk/rostests/win32/fs/tunneltest/tunneltest.c (with props)
Added: trunk/rostests/win32/fs/CMakeLists.txt
URL:
http://svn.reactos.org/svn/reactos/trunk/rostests/win32/fs/CMakeLists.txt?r…
==============================================================================
--- trunk/rostests/win32/fs/CMakeLists.txt (added)
+++ trunk/rostests/win32/fs/CMakeLists.txt [iso-8859-1] Sat Mar 29 18:50:36 2014
@@ -0,0 +1 @@
+add_subdirectory(tunneltest)
Propchange: trunk/rostests/win32/fs/CMakeLists.txt
------------------------------------------------------------------------------
svn:eol-style = native
Added: trunk/rostests/win32/fs/tunneltest/CMakeLists.txt
URL:
http://svn.reactos.org/svn/reactos/trunk/rostests/win32/fs/tunneltest/CMake…
==============================================================================
--- trunk/rostests/win32/fs/tunneltest/CMakeLists.txt (added)
+++ trunk/rostests/win32/fs/tunneltest/CMakeLists.txt [iso-8859-1] Sat Mar 29 18:50:36
2014
@@ -0,0 +1,8 @@
+
+list(APPEND SOURCE
+ tunneltest.c)
+
+add_executable(tunneltest ${SOURCE})
+set_module_type(tunneltest win32cui UNICODE)
+add_importlibs(tunneltest msvcrt kernel32 ntdll)
+add_cd_file(TARGET tunneltest DESTINATION reactos/bin FOR all)
Propchange: trunk/rostests/win32/fs/tunneltest/CMakeLists.txt
------------------------------------------------------------------------------
svn:eol-style = native
Added: trunk/rostests/win32/fs/tunneltest/tunneltest.c
URL:
http://svn.reactos.org/svn/reactos/trunk/rostests/win32/fs/tunneltest/tunne…
==============================================================================
--- trunk/rostests/win32/fs/tunneltest/tunneltest.c (added)
+++ trunk/rostests/win32/fs/tunneltest/tunneltest.c [iso-8859-1] Sat Mar 29 18:50:36 2014
@@ -0,0 +1,163 @@
+/*
+ * PROJECT: ReactOS Tests
+ * LICENSE: GPL - See COPYING in the top level directory
+ * FILE: tunneltest.c
+ * PURPOSE: Usermode tunnel cache testing
+ * PROGRAMMERS: Pierre Schweitzer (pierre(a)reactos.org)
+ * NOTES: Based on indications from:
http://support.microsoft.com/?kbid=172190
+ */
+
+#include <stdio.h>
+#include <windef.h>
+#include <winternl.h>
+#include <winbase.h>
+#define RTL_CONSTANT_STRING(s) { sizeof(s)-sizeof((s)[0]), sizeof(s), s }
+
+const UNICODE_STRING FatName = RTL_CONSTANT_STRING(L"FAT");
+const UNICODE_STRING Fat32Name = RTL_CONSTANT_STRING(L"FAT32");
+const UNICODE_STRING NtfsName = RTL_CONSTANT_STRING(L"NTFS");
+
+int wmain(int argc, WCHAR * argv[])
+{
+ WCHAR TempPath[MAX_PATH + 1];
+ WCHAR CopyPath[MAX_PATH + 1];
+ WCHAR RootPath[] = {'A', ':', '\\', '\0'};
+ WCHAR FileSystemName[sizeof("FAT32")]; /* Max we should hold - fail
otherwise, we don't care */
+ UNICODE_STRING FSName;
+ WCHAR File1[] = {'\\', 'f', 'i', 'l', 'e',
'1', '\0'};
+ WCHAR File2[] = {'\\', 'f', 'i', 'l', 'e',
'2', '\0'};
+ ULONG FilePos;
+ HANDLE hFile;
+ FILETIME FileTime, File1Time;
+
+ /* Get temp path in which will work */
+ if (GetTempPathW(sizeof(TempPath) / sizeof(TempPath[0]), TempPath) == 0)
+ {
+ fprintf(stderr, "Failed to get temp path\n");
+ return GetLastError();
+ }
+
+ /* Assume it's X:\ something */
+ RootPath[0] = TempPath[0];
+
+ /* Get information about the volume */
+ if (GetVolumeInformationW(RootPath, NULL, 0, NULL, NULL, NULL, FileSystemName,
sizeof(FileSystemName) / sizeof(FileSystemName[0])) == 0)
+ {
+ fprintf(stderr, "Failed to get volume info\n");
+ return GetLastError();
+ }
+
+ /* Convert to string */
+ RtlInitUnicodeString(&FSName, FileSystemName);
+
+ /* Bail out if that's not FAT or NTFS */
+ if (RtlCompareUnicodeString(&FSName, &FatName, FALSE) != 0 &&
+ RtlCompareUnicodeString(&FSName, &Fat32Name, FALSE) != 0 &&
+ RtlCompareUnicodeString(&FSName, &NtfsName, FALSE) != 0)
+ {
+ fprintf(stderr, "!(FAT, FAT32, NTFS): \'%S\'\n",
FSName.Buffer);
+ return 0;
+ }
+
+ /* Ensure we can store complete path - no overrun */
+ FilePos = wcslen(TempPath);
+ if (FilePos > MAX_PATH - sizeof(File2) / sizeof(WCHAR))
+ {
+ fprintf(stderr, "Files won't fit\n");
+ return 0;
+ }
+
+ /* Create first file */
+ wcscat(TempPath, File1);
+ hFile = CreateFileW(TempPath, 0, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL,
NULL);
+ if (hFile == INVALID_HANDLE_VALUE)
+ {
+ fprintf(stderr, "Failed to create file1\n");
+ return GetLastError();
+ }
+ CloseHandle(hFile);
+
+ /* Wait a least 10ms (resolution of FAT) */
+ Sleep(10 * 2);
+
+ /* Create second file */
+ /* Remove old file from buffer */
+ TempPath[FilePos - 1] = 0;
+ wcscat(TempPath, File2);
+ hFile = CreateFileW(TempPath, 0, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL,
NULL);
+ if (hFile == INVALID_HANDLE_VALUE)
+ {
+ fprintf(stderr, "Failed to create file2\n");
+ return GetLastError();
+ }
+ CloseHandle(hFile);
+
+ /* Rename file1 to file */
+ TempPath[FilePos] = 0;
+ wcscat(TempPath, File1);
+ wcscpy(CopyPath, TempPath);
+ /* Remove number for dest */
+ CopyPath[wcslen(TempPath) - 1] = 0;
+ if (MoveFileW(TempPath, CopyPath) == 0)
+ {
+ fprintf(stderr, "Failed to rename file1\n");
+ return GetLastError();
+ }
+
+ /* Rename file2 to file1 */
+ wcscpy(CopyPath, TempPath);
+ /* Change 1 to 2 */
+ CopyPath[wcslen(TempPath) - 1] = L'2';
+ if (MoveFileW(CopyPath, TempPath) == 0)
+ {
+ fprintf(stderr, "Failed to rename file2\n");
+ return GetLastError();
+ }
+
+ /* Time to compare creation time of both file & file1 */
+ CopyPath[wcslen(TempPath) - 1] = 0;
+
+ /* Open file and get its creation time */
+ hFile = CreateFileW(CopyPath, GENERIC_READ, 0, NULL, OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL, NULL);
+ if (hFile == INVALID_HANDLE_VALUE)
+ {
+ fprintf(stderr, "Failed to open file\n");
+ return GetLastError();
+ }
+ if (GetFileTime(hFile, &FileTime, NULL, NULL) == FALSE)
+ {
+ fprintf(stderr, "Failed to read creation time\n");
+ CloseHandle(hFile);
+ return GetLastError();
+ }
+ CloseHandle(hFile);
+
+ /* Open file1 and get its creation time */
+ hFile = CreateFileW(TempPath, GENERIC_READ, 0, NULL, OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL, NULL);
+ if (hFile == INVALID_HANDLE_VALUE)
+ {
+ fprintf(stderr, "Failed to open file1\n");
+ return GetLastError();
+ }
+ if (GetFileTime(hFile, &File1Time, NULL, NULL) == FALSE)
+ {
+ fprintf(stderr, "Failed to read creation time\n");
+ CloseHandle(hFile);
+ return GetLastError();
+ }
+ CloseHandle(hFile);
+
+ /* Delete file */
+ DeleteFileW(TempPath);
+ DeleteFileW(CopyPath);
+
+ /* Compare both, they have to be strictly identical */
+ if (RtlCompareMemory(&FileTime, &File1Time, sizeof(FILETIME)) ==
sizeof(FILETIME))
+ {
+ fprintf(stdout, "Tunnel cache in action\n");
+ return 0;
+ }
+
+ fprintf(stdout, "Tunnel cache NOT in action\n");
+ return 0;
+}
Propchange: trunk/rostests/win32/fs/tunneltest/tunneltest.c
------------------------------------------------------------------------------
svn:eol-style = native