From: Eric Biggers Date: Sat, 27 Jun 2015 22:55:33 +0000 (-0500) Subject: Add Windows tests for empty and max length reparse points X-Git-Tag: v1.8.2~50 X-Git-Url: https://wimlib.net/git/?p=wimlib;a=commitdiff_plain;h=a8343baff22193be4651a3a63b07cb1520ced4e8;ds=sidebyside Add Windows tests for empty and max length reparse points --- diff --git a/tests/set_reparse_point.c b/tests/set_reparse_point.c index 73428f06..d22cd08a 100644 --- a/tests/set_reparse_point.c +++ b/tests/set_reparse_point.c @@ -1,59 +1,65 @@ #include #include +#include #include -static wchar_t * -win32_error_string(DWORD err_code) +static const wchar_t * +win32_error_string(DWORD err) { static wchar_t buf[1024]; buf[0] = L'\0'; - FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, NULL, err_code, 0, - buf, 1024, NULL); + FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, NULL, err, 0, buf, 1024, NULL); return buf; } static void -fail(const char *func, DWORD code) +fail(const char *func) { + DWORD err = GetLastError(); fprintf(stderr, "%s (err 0x%08x: %ls)\n", func, - (unsigned int)code, win32_error_string(code)); + (uint32_t)err, win32_error_string(err)); exit(1); } int wmain(int argc, wchar_t **argv) { - if (argc != 2) { - fprintf(stderr, "Usage: %ls FILE\n", argv[0]); - return 2; + uint16_t rpdatalen = 80; + + if (argc < 2 || argc > 3) { + fprintf(stderr, "Usage: %ls FILE [rpdatalen]\n", argv[0]); + return 1; } + if (argc == 3) + rpdatalen = wcstol(argv[2], NULL, 10); + HANDLE h = CreateFile(argv[1], GENERIC_WRITE, FILE_SHARE_VALID_FLAGS, NULL, OPEN_EXISTING, - FILE_FLAG_BACKUP_SEMANTICS, + FILE_FLAG_BACKUP_SEMANTICS | FILE_FLAG_OPEN_REPARSE_POINT, NULL); if (h == INVALID_HANDLE_VALUE) - fail("CreateFile", GetLastError()); + fail("CreateFile"); - uint8_t in[128]; + uint8_t in[8 + rpdatalen]; uint8_t *p = in; *(uint32_t *)p = 0x80000000; /* rptag */ p += 4; - *(uint16_t *)p = 80; /* rpdatalen */ + *(uint16_t *)p = rpdatalen; /* rpdatalen */ p += 2; - *(uint16_t *)p = 0; /* rpreserved */ + *(uint16_t *)p = 0x1234; /* rpreserved */ p += 2; - memset(p, 0, 80); /* rpdata */ - p += 80; + memset(p, 0, rpdatalen); /* rpdata */ + p += rpdatalen; DWORD bytes_returned; if (!DeviceIoControl(h, FSCTL_SET_REPARSE_POINT, in, p - in, NULL, 0, &bytes_returned, NULL)) - fail("DeviceIoControl", GetLastError()); + fail("DeviceIoControl"); CloseHandle(h); diff --git a/tests/win32-test-imagex-capture_and_apply.bat b/tests/win32-test-imagex-capture_and_apply.bat index 8283ddd4..8f573ece 100644 --- a/tests/win32-test-imagex-capture_and_apply.bat +++ b/tests/win32-test-imagex-capture_and_apply.bat @@ -207,6 +207,32 @@ echo 1 > file:aa call :do_test if %errorlevel% neq 0 goto :fail +call :msg "empty reparse point" +type nul > file +%SET_REPARSE_POINT% file 0 +call :do_test +if %errorlevel% neq 0 goto :fail + +call :msg "empty reparse point with unnamed data stream" +echo hello > file +%SET_REPARSE_POINT% file 0 +call :do_test +if %errorlevel% neq 0 goto :fail + +call :msg "empty reparse point with unnamed data stream and named data streams" +echo hello > file +echo hello > file:ads1 +type nul > file:ads2 +%SET_REPARSE_POINT% file 0 +call :do_test +if %errorlevel% neq 0 goto :fail + +call :msg "maximum length reparse point" +type nul > file +%SET_REPARSE_POINT% file 16376 +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