X-Git-Url: https://wimlib.net/git/?a=blobdiff_plain;f=tests%2Fwlfuzz.c;h=a32218f29a7dfdabc4b1c27a41784f15d9074210;hb=5a50cccf768a6bf6e9ccfd2337bcedc0cbf1ba6c;hp=080852fe37185384b257fa63a4f89d9f000f01e9;hpb=dface45804a58a5843c8ee90da4921f720a90878;p=wimlib diff --git a/tests/wlfuzz.c b/tests/wlfuzz.c index 080852fe..a32218f2 100644 --- a/tests/wlfuzz.c +++ b/tests/wlfuzz.c @@ -3,7 +3,7 @@ */ /* - * Copyright (C) 2015-2016 Eric Biggers + * Copyright (C) 2015-2021 Eric Biggers * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -66,7 +66,7 @@ #endif #include -#ifdef __WIN32__ +#ifdef _WIN32 # include # include # include @@ -119,7 +119,7 @@ assertion_failed(int line, const char *format, ...) static void change_to_temporary_directory(void) { -#ifdef __WIN32__ +#ifdef _WIN32 ASSERT(SetCurrentDirectory(L"E:\\"), "failed to change directory to E:\\"); #else @@ -186,19 +186,19 @@ create_ntfs_volume(const char *name) } #endif /* WITH_NTFS_3G */ -#ifdef __WIN32__ +#ifdef _WIN32 -extern WINAPI NTSTATUS NtQueryDirectoryFile (HANDLE FileHandle, - HANDLE Event, - PIO_APC_ROUTINE ApcRoutine, - PVOID ApcContext, - PIO_STATUS_BLOCK IoStatusBlock, - PVOID FileInformation, - ULONG Length, - FILE_INFORMATION_CLASS FileInformationClass, - BOOLEAN ReturnSingleEntry, - PUNICODE_STRING FileName, - BOOLEAN RestartScan); +WINAPI NTSTATUS NtQueryDirectoryFile(HANDLE FileHandle, + HANDLE Event, + PIO_APC_ROUTINE ApcRoutine, + PVOID ApcContext, + PIO_STATUS_BLOCK IoStatusBlock, + PVOID FileInformation, + ULONG Length, + FILE_INFORMATION_CLASS FileInformationClass, + BOOLEAN ReturnSingleEntry, + PUNICODE_STRING FileName, + BOOLEAN RestartScan); static void delete_directory_tree_recursive(HANDLE cur_dir, UNICODE_STRING *name) @@ -300,7 +300,7 @@ delete_directory_tree(const wchar_t *name) ASSERT(GetFileAttributes(name) == 0xFFFFFFFF, "Deletion didn't work!"); } -#else /* __WIN32__ */ +#else /* _WIN32 */ static void delete_directory_tree_recursive(int dirfd, const char *name) @@ -332,7 +332,7 @@ delete_directory_tree(const tchar *name) delete_directory_tree_recursive(AT_FDCWD, name); } -#endif /* !__WIN32__ */ +#endif /* !_WIN32 */ static uint32_t rand32(void) @@ -411,7 +411,7 @@ get_image_count(WIMStruct *wim) return info.image_count; } -#ifdef __WIN32__ +#ifdef _WIN32 static bool is_wimboot_capable(WIMStruct *wim) { @@ -426,7 +426,7 @@ is_wimboot_capable(WIMStruct *wim) (info.compression_type == WIMLIB_COMPRESSION_TYPE_LZX && info.chunk_size == 32768)); } -#endif /* __WIN32__ */ +#endif /* _WIN32 */ static void overwrite_wim(WIMStruct *wim) @@ -498,48 +498,67 @@ get_random_write_flags(void) return write_flags; } +static uint32_t +get_random_chunk_size(int min_order, int max_order) +{ + return 1 << (min_order + (rand32() % (max_order - min_order + 1))); +} + static void op__create_new_wim(void) { printf(":::op__create_new_wim\n"); const tchar *wimfile; - WIMStruct *wim; + enum wimlib_compression_type ctype = WIMLIB_COMPRESSION_TYPE_NONE; + uint32_t chunk_size = 0; + uint32_t solid_chunk_size = 0; int write_flags; + WIMStruct *wim; if (num_wimfiles_in_use == MAX_NUM_WIMS) return; wimfile = select_new_wimfile(); - CHECK_RET(wimlib_create_new_wim(WIMLIB_COMPRESSION_TYPE_NONE, &wim)); - /* Select a random compression type and chunk size. */ - switch (rand32() % 8) { - default: - CHECK_RET(wimlib_set_output_compression_type(wim, WIMLIB_COMPRESSION_TYPE_NONE)); + switch (rand32() % 4) { + case 0: break; - case 3 ... 4: - CHECK_RET(wimlib_set_output_compression_type(wim, WIMLIB_COMPRESSION_TYPE_XPRESS)); - CHECK_RET(wimlib_set_output_chunk_size(wim, 1 << (12 + rand32() % 5))); + case 1: + ctype = WIMLIB_COMPRESSION_TYPE_XPRESS; + chunk_size = get_random_chunk_size(12, 16); break; - case 5 ... 6: - CHECK_RET(wimlib_set_output_compression_type(wim, WIMLIB_COMPRESSION_TYPE_LZX)); + case 2: + ctype = WIMLIB_COMPRESSION_TYPE_LZX; if (randbool()) - CHECK_RET(wimlib_set_output_chunk_size(wim, 1 << 15)); + chunk_size = 1 << 15; else - CHECK_RET(wimlib_set_output_chunk_size(wim, 1 << (15 + rand32() % 7))); + chunk_size = get_random_chunk_size(15, 21); break; - case 7: - CHECK_RET(wimlib_set_output_compression_type(wim, WIMLIB_COMPRESSION_TYPE_LZMS)); - CHECK_RET(wimlib_set_output_chunk_size(wim, 1 << (15 + rand32() % 12))); + case 3: + ctype = WIMLIB_COMPRESSION_TYPE_LZMS; + chunk_size = get_random_chunk_size(15, 28); + if (randbool()) + solid_chunk_size = get_random_chunk_size(15, 26); + else + solid_chunk_size = get_random_chunk_size(26, 28); break; } /* Select random write flags. */ write_flags = get_random_write_flags(); - printf("Creating %"TS" with write flags 0x%08x\n", wimfile, write_flags); + printf("Creating %"TS" with write flags 0x%08x, compression_type=%"TS", chunk_size=%u, solid_chunk_size=%u\n", + wimfile, write_flags, + wimlib_get_compression_type_string(ctype), + chunk_size, solid_chunk_size); + + CHECK_RET(wimlib_create_new_wim(ctype, &wim)); + if (chunk_size != 0) + CHECK_RET(wimlib_set_output_chunk_size(wim, chunk_size)); + if (solid_chunk_size != 0) + CHECK_RET(wimlib_set_output_pack_chunk_size(wim, solid_chunk_size)); CHECK_RET(wimlib_write(wim, wimfile, WIMLIB_ALL_IMAGES, write_flags, 0)); @@ -759,15 +778,15 @@ op__apply_and_capture_test(void) } else #endif { -#ifdef __WIN32__ +#ifdef _WIN32 printf("applying in Windows mode\n"); cmp_flags |= WIMLIB_CMP_FLAG_WINDOWS_MODE; -#else /* __WIN32__ */ +#else /* _WIN32 */ printf("applying in UNIX mode\n"); extract_flags |= WIMLIB_EXTRACT_FLAG_UNIX_DATA; add_flags |= WIMLIB_ADD_FLAG_UNIX_DATA; cmp_flags |= WIMLIB_CMP_FLAG_UNIX_MODE; -#endif /* !__WIN32__ */ +#endif /* !_WIN32 */ } add_flags |= WIMLIB_ADD_FLAG_NORPFIX; CHECK_RET(wimlib_extract_image(wim, image, TMP_TARGET_NAME, @@ -791,7 +810,7 @@ op__apply_and_capture_test(void) wimlib_free(wim); } -#ifdef __WIN32__ +#ifdef _WIN32 /* Enumerate and unregister all backing WIMs from the specified volume */ static void @@ -801,10 +820,10 @@ unregister_all_backing_wims(const tchar drive_letter) HANDLE h; void *overlay_list; DWORD bytes_returned; - const struct wim_provider_overlay_entry *entry; + const WIM_PROVIDER_OVERLAY_ENTRY *entry; struct { - struct wof_external_info wof_info; - struct wim_provider_remove_overlay_input wim; + WOF_EXTERNAL_INFO wof_info; + WIM_PROVIDER_REMOVE_OVERLAY_INPUT wim; } in; wsprintf(volume, L"\\\\.\\%lc:", drive_letter); @@ -818,14 +837,15 @@ unregister_all_backing_wims(const tchar drive_letter) overlay_list = malloc(32768); ASSERT(overlay_list != NULL, "out of memory"); - in.wof_info.version = WOF_CURRENT_VERSION; - in.wof_info.provider = WOF_PROVIDER_WIM; + in.wof_info.Version = WOF_CURRENT_VERSION; + in.wof_info.Provider = WOF_PROVIDER_WIM; if (!DeviceIoControl(h, FSCTL_ENUM_OVERLAY, - &in, sizeof(struct wof_external_info), + &in, sizeof(WOF_EXTERNAL_INFO), overlay_list, 32768, &bytes_returned, NULL)) { ASSERT(GetLastError() == ERROR_INVALID_FUNCTION || + GetLastError() == ERROR_INVALID_PARAMETER || GetLastError() == ERROR_FILE_NOT_FOUND, "FSCTL_ENUM_OVERLAY failed; error=%u", GetLastError()); return; @@ -834,16 +854,16 @@ unregister_all_backing_wims(const tchar drive_letter) entry = overlay_list; for (;;) { printf("Unregistering data source ID %"PRIu64"\n", - entry->data_source_id); - in.wim.data_source_id = entry->data_source_id; + entry->DataSourceId.QuadPart); + in.wim.DataSourceId = entry->DataSourceId; ASSERT(DeviceIoControl(h, FSCTL_REMOVE_OVERLAY, &in, sizeof(in), NULL, 0, &bytes_returned, NULL), "FSCTL_REMOVE_OVERLAY failed; error=%u", (unsigned )GetLastError()); - if (entry->next_entry_offset == 0) + if (entry->NextEntryOffset == 0) break; - entry = (const struct wim_provider_overlay_entry *) - ((const uint8_t *)entry + entry->next_entry_offset); + entry = (const WIM_PROVIDER_OVERLAY_ENTRY *) + ((const uint8_t *)entry + entry->NextEntryOffset); } free(overlay_list); CloseHandle(h); @@ -911,7 +931,7 @@ op__wimboot_test(void) wimlib_free(wim); wimlib_free(wim2); } -#endif /* __WIN32__ */ +#endif /* _WIN32 */ static int is_solid_resource(const struct wimlib_resource_entry *resource, void *_ctx) @@ -1019,13 +1039,13 @@ static const operation_func operation_table[] = { op__apply_and_capture_test, op__split_test, op__set_compression_level, -#ifdef __WIN32__ +#ifdef _WIN32 op__wimboot_test, #endif }; -#ifdef __WIN32__ -extern int wmain(int argc, wchar_t **argv); +#ifdef _WIN32 +int wmain(int argc, wchar_t **argv); #define main wmain #endif