From afda46903074c907e31408d599ae74fc0597b368 Mon Sep 17 00:00:00 2001 From: Eric Biggers Date: Sun, 22 Mar 2015 15:44:31 -0500 Subject: [PATCH] Add additional reparse point tests to win32-test-imagex-capture_and_apply.bat --- tests/set_reparse_point.c | 61 +++++++++++++++++++ tests/win32-test-imagex-capture_and_apply.bat | 45 +++++++++++++- 2 files changed, 105 insertions(+), 1 deletion(-) create mode 100644 tests/set_reparse_point.c diff --git a/tests/set_reparse_point.c b/tests/set_reparse_point.c new file mode 100644 index 00000000..73428f06 --- /dev/null +++ b/tests/set_reparse_point.c @@ -0,0 +1,61 @@ +#include +#include +#include + +static wchar_t * +win32_error_string(DWORD err_code) +{ + static wchar_t buf[1024]; + buf[0] = L'\0'; + FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, NULL, err_code, 0, + buf, 1024, NULL); + return buf; +} + +static void +fail(const char *func, DWORD code) +{ + fprintf(stderr, "%s (err 0x%08x: %ls)\n", func, + (unsigned int)code, win32_error_string(code)); + exit(1); +} + +int +wmain(int argc, wchar_t **argv) +{ + if (argc != 2) { + fprintf(stderr, "Usage: %ls FILE\n", argv[0]); + return 2; + } + + HANDLE h = CreateFile(argv[1], + GENERIC_WRITE, + FILE_SHARE_VALID_FLAGS, + NULL, + OPEN_EXISTING, + FILE_FLAG_BACKUP_SEMANTICS, + NULL); + if (h == INVALID_HANDLE_VALUE) + fail("CreateFile", GetLastError()); + + uint8_t in[128]; + uint8_t *p = in; + *(uint32_t *)p = 0x80000000; /* rptag */ + p += 4; + *(uint16_t *)p = 80; /* rpdatalen */ + p += 2; + *(uint16_t *)p = 0; /* rpreserved */ + p += 2; + memset(p, 0, 80); /* rpdata */ + p += 80; + + DWORD bytes_returned; + + if (!DeviceIoControl(h, FSCTL_SET_REPARSE_POINT, in, p - in, + NULL, 0, &bytes_returned, NULL)) + fail("DeviceIoControl", GetLastError()); + + CloseHandle(h); + + return 0; +} diff --git a/tests/win32-test-imagex-capture_and_apply.bat b/tests/win32-test-imagex-capture_and_apply.bat index 98064ade..8283ddd4 100644 --- a/tests/win32-test-imagex-capture_and_apply.bat +++ b/tests/win32-test-imagex-capture_and_apply.bat @@ -10,8 +10,9 @@ REM Administrator privileges. wimlib-imagex and win32-tree-cmp must be REM executable using the paths set below. setlocal EnableDelayedExpansion -set WIN32_TREE_CMP=win32-tree-cmp set WIMLIB_IMAGEX=wimlib-imagex +set WIN32_TREE_CMP=win32-tree-cmp +set SET_REPARSE_POINT=set_reparse_point if exist in.dir rd /S /Q in.dir if exist out.dir rd /S /Q out.dir @@ -178,6 +179,48 @@ echo "hello world!!!!" > subdir2\otherfile call :do_test if %errorlevel% neq 0 goto :fail +call :msg "reparse point that is neither a symlink nor a junction" +type nul > file +%SET_REPARSE_POINT% file +call :do_test +if %errorlevel% neq 0 goto :fail + +call :msg "reparse point with named data streams" +type nul > file +echo 11 > file:a +echo 1 > file:aa +%SET_REPARSE_POINT% file +call :do_test +if %errorlevel% neq 0 goto :fail + +call :msg "reparse point with unnamed data stream" +echo "test" > file +%SET_REPARSE_POINT% file +call :do_test +if %errorlevel% neq 0 goto :fail + +call :msg "reparse point with unnamed data stream and named data streams" +echo "test" > file +echo 11 > file:a +echo 1 > file:aa +%SET_REPARSE_POINT% file +call :do_test +if %errorlevel% neq 0 goto :fail + +call :msg "directory reparse point that is neither a symlink nor a junction" +md subdir +%SET_REPARSE_POINT% subdir +call :do_test +if %errorlevel% neq 0 goto :fail + +call :msg "directory reparse point with named data streams" +md subdir +echo 11 > subdir:a +echo 1 > subdir:aa +%SET_REPARSE_POINT% subdir +call :do_test +if %errorlevel% neq 0 goto :fail + call :msg "compressed file" echo "test" > test compact /C test > nul -- 2.43.0