]> wimlib.net Git - wimlib/blobdiff - tests/set_reparse_point.c
Add additional reparse point tests to win32-test-imagex-capture_and_apply.bat
[wimlib] / tests / set_reparse_point.c
diff --git a/tests/set_reparse_point.c b/tests/set_reparse_point.c
new file mode 100644 (file)
index 0000000..73428f0
--- /dev/null
@@ -0,0 +1,61 @@
+#include <inttypes.h>
+#include <stdio.h>
+#include <windows.h>
+
+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;
+}