diff --git a/src/.msvc/rufus.vcxproj b/src/.msvc/rufus.vcxproj index 6d337200..abf8e173 100644 --- a/src/.msvc/rufus.vcxproj +++ b/src/.msvc/rufus.vcxproj @@ -222,6 +222,7 @@ + diff --git a/src/.msvc/rufus.vcxproj.filters b/src/.msvc/rufus.vcxproj.filters index 2ccf6621..45f75f62 100644 --- a/src/.msvc/rufus.vcxproj.filters +++ b/src/.msvc/rufus.vcxproj.filters @@ -140,6 +140,9 @@ Header Files + + Header Files + diff --git a/src/checksum.c b/src/checksum.c index e831cc54..714c8c1a 100644 --- a/src/checksum.c +++ b/src/checksum.c @@ -51,6 +51,7 @@ #include #include +#include "db.h" #include "rufus.h" #include "missing.h" #include "resource.h" @@ -714,19 +715,18 @@ sum_write_t *sum_write[CHECKSUM_MAX] = { md5_write, sha1_write , sha256_write }; sum_final_t *sum_final[CHECKSUM_MAX] = { md5_final, sha1_final , sha256_final }; // Compute an individual checksum without threading or buffering, for a single file -BOOL Checksum(const unsigned type, const char* path, uint8_t* sum) +BOOL HashFile(const unsigned type, const char* path, uint8_t* sum) { BOOL r = FALSE; SUM_CONTEXT sum_ctx = { 0 }; HANDLE h = INVALID_HANDLE_VALUE; - DWORD read_size = 0; + DWORD rs = 0; uint64_t rb; - char buffer[4096]; + unsigned char buf[4096]; if ((type >= CHECKSUM_MAX) || (path == NULL) || (sum == NULL)) goto out; - uprintf("\r\nComputing checksum for '%s'...", path); h = CreateFileU(path, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_FLAG_SEQUENTIAL_SCAN, NULL); if (h == INVALID_HANDLE_VALUE) { uprintf("Could not open file: %s", WindowsErrorString()); @@ -735,16 +735,16 @@ BOOL Checksum(const unsigned type, const char* path, uint8_t* sum) } sum_init[type](&sum_ctx); - for (rb = 0; ; rb += read_size) { + for (rb = 0; ; rb += rs) { CHECK_FOR_USER_CANCEL; - if (!ReadFile(h, buffer, sizeof(buffer), &read_size, NULL)) { + if (!ReadFile(h, buf, sizeof(buf), &rs, NULL)) { FormatStatus = ERROR_SEVERITY_ERROR | FAC(FACILITY_STORAGE) | ERROR_READ_FAULT; uprintf(" Read error: %s", WindowsErrorString()); goto out; } - if (read_size == 0) + if (rs == 0) break; - sum_write[type](&sum_ctx, buffer, (size_t)read_size); + sum_write[type](&sum_ctx, buf, (size_t)rs); } sum_final[type](&sum_ctx); @@ -756,6 +756,25 @@ out: return r; } +BOOL HashBuffer(const unsigned type, const unsigned char* buf, const size_t len, uint8_t* sum) +{ + BOOL r = FALSE; + SUM_CONTEXT sum_ctx = { 0 }; + + if ((type >= CHECKSUM_MAX) || (sum == NULL)) + goto out; + + sum_init[type](&sum_ctx); + sum_write[type](&sum_ctx, buf, len); + sum_final[type](&sum_ctx); + + memcpy(sum, sum_ctx.buf, sum_count[type]); + r = TRUE; + +out: + return r; +} + /* * Checksum dialog callback */ @@ -975,3 +994,30 @@ out: MyDialogBox(hMainInstance, IDD_CHECKSUM, hMainDialog, ChecksumCallback); ExitThread(r); } + +/* + * The following 2 calls are used to check whether a buffer/file is in our hash DB + */ +BOOL IsBufferInDB(const unsigned char* buf, const size_t len) +{ + int i; + uint8_t sum[32]; + if (!HashBuffer(CHECKSUM_SHA256, buf, len, sum)) + return FALSE; + for (i = 0; i < ARRAYSIZE(sha256db); i += 32) + if (memcmp(sum, &sha256db[i], 32) == 0) + return TRUE; + return FALSE; +} + +BOOL IsFileInDB(const char* path) +{ + int i; + uint8_t sum[32]; + if (!HashFile(CHECKSUM_SHA256, path, sum)) + return FALSE; + for (i = 0; i < ARRAYSIZE(sha256db); i += 32) + if (memcmp(sum, &sha256db[i], 32) == 0) + return TRUE; + return FALSE; +} diff --git a/src/db.h b/src/db.h new file mode 100644 index 00000000..c6c9af39 --- /dev/null +++ b/src/db.h @@ -0,0 +1,108 @@ +/* + * Rufus: The Reliable USB Formatting Utility + * DB of the hash values we know for downloadable content (GRUB, Syslinux, etc.) + * Copyright © 2016 Pete Batard + * + * 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 + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#include +#pragma once + +/* + * NB: Table data was generated from the files/ directory the server with: + * find . -not -name "*.txt" -not -name "*.sh" -not -name "*pre*" -type f -print0 | xargs -0 sha256sum | awk '{print $1}' | sort | uniq | xxd -r -p | hexdump -v -e '31/1 "0x%02x, " 1/1 " 0x%02x,\n"' + */ + +static uint8_t sha256db[] = { + 0x12, 0xbd, 0x22, 0xd2, 0xb3, 0x69, 0x56, 0x0f, 0x89, 0xb8, 0x50, 0x7e, 0x7e, 0x74, 0xeb, 0xc5, 0xea, 0x44, 0x91, 0x48, 0x75, 0xf0, 0xa4, 0xcb, 0x1e, 0xa6, 0xfb, 0x4e, 0xc9, 0x89, 0x58, 0x17, + 0x15, 0x5f, 0x36, 0x7b, 0xb1, 0x30, 0xfe, 0x05, 0x5c, 0x79, 0x9f, 0x88, 0xb3, 0xc0, 0xc1, 0xa0, 0x0a, 0x18, 0x05, 0x78, 0x22, 0x69, 0xcf, 0x7e, 0x54, 0xaa, 0x61, 0xbd, 0xe3, 0x8e, 0x05, 0x92, + 0x1c, 0xb7, 0x8b, 0x98, 0xbc, 0xd6, 0x76, 0x7b, 0x01, 0x44, 0xf5, 0x00, 0xaf, 0x81, 0xef, 0x4f, 0x3c, 0x54, 0xea, 0xaf, 0xe3, 0xc9, 0x4e, 0x1f, 0xd6, 0x24, 0x68, 0x41, 0x4e, 0x98, 0x92, 0x25, + 0x1c, 0xc6, 0x32, 0x21, 0xfd, 0xf4, 0x46, 0xfc, 0xda, 0xc6, 0xc0, 0x56, 0x35, 0x79, 0x54, 0xc1, 0x5b, 0x61, 0x75, 0xca, 0x1b, 0xc2, 0xa4, 0x9f, 0x85, 0x52, 0xec, 0xca, 0x28, 0xac, 0x3e, 0x51, + 0x22, 0x96, 0x82, 0xac, 0x61, 0xb8, 0x8b, 0x11, 0x25, 0xfc, 0xd7, 0xe6, 0x9f, 0x4e, 0x7f, 0x46, 0x7f, 0x68, 0xc5, 0x14, 0x9e, 0xb9, 0x37, 0x1a, 0x98, 0xd8, 0xf2, 0x78, 0x41, 0x40, 0xad, 0x88, + 0x25, 0xd1, 0x38, 0xf3, 0x8b, 0x17, 0x35, 0x79, 0x3e, 0xee, 0x89, 0x19, 0xa3, 0xa0, 0xe5, 0xc9, 0x97, 0x9d, 0x2f, 0xac, 0xc0, 0xb5, 0x70, 0x74, 0x24, 0xe8, 0x04, 0x98, 0x1d, 0x25, 0xf9, 0xc9, + 0x2b, 0x31, 0x7b, 0x12, 0xab, 0xff, 0x49, 0x66, 0x48, 0x78, 0xdf, 0xe0, 0xb5, 0x00, 0xb8, 0x50, 0x0f, 0x93, 0xf1, 0xd5, 0xe4, 0xd5, 0x28, 0x45, 0x95, 0xcc, 0x2c, 0x15, 0x6c, 0x74, 0x4f, 0x79, + 0x2d, 0x99, 0x55, 0x09, 0xd0, 0xd6, 0xcd, 0xf7, 0x6e, 0xd5, 0x9f, 0x46, 0x53, 0xf1, 0xcb, 0xe1, 0xc9, 0xe6, 0x24, 0xe1, 0xaf, 0xa8, 0xf7, 0x8e, 0xc2, 0x45, 0x5b, 0x24, 0x53, 0x4b, 0x87, 0x76, + 0x2e, 0x3e, 0xf6, 0x65, 0x1e, 0x59, 0x85, 0x20, 0x26, 0xc5, 0x74, 0xde, 0x52, 0x65, 0xf6, 0x8e, 0x24, 0xf8, 0xe6, 0x27, 0xc5, 0x53, 0xce, 0x8d, 0x32, 0x7c, 0xa7, 0xe0, 0xb4, 0x96, 0x70, 0xa1, + 0x31, 0x17, 0x97, 0x0e, 0x89, 0xe2, 0xab, 0xd6, 0x7e, 0x29, 0x26, 0x63, 0xf3, 0xe2, 0xcf, 0xa7, 0xc3, 0xfe, 0xe8, 0x7a, 0x87, 0x0a, 0xb9, 0x20, 0xc8, 0xa1, 0x74, 0xff, 0x5d, 0xfb, 0xfe, 0x8e, + 0x33, 0x02, 0x03, 0xb6, 0x29, 0x5e, 0x7c, 0x60, 0x72, 0x5f, 0x07, 0xc0, 0x92, 0x15, 0xd1, 0x75, 0xaa, 0x09, 0x23, 0xee, 0xd5, 0x5a, 0xec, 0xb5, 0x72, 0x77, 0x76, 0x4d, 0x6b, 0xdc, 0xf1, 0x31, + 0x34, 0x08, 0x54, 0xee, 0x4f, 0x7f, 0x10, 0xaa, 0x63, 0x38, 0xba, 0xeb, 0xa4, 0xdd, 0xd1, 0xca, 0x9c, 0xbd, 0x15, 0x6f, 0x04, 0x86, 0x69, 0x66, 0x6c, 0x92, 0xe4, 0x85, 0x47, 0x6e, 0xe9, 0x41, + 0x34, 0x1b, 0x76, 0x83, 0x3c, 0xc6, 0x1c, 0x1c, 0xd0, 0xde, 0x84, 0x2c, 0xcb, 0xfe, 0x38, 0x4f, 0x0b, 0x21, 0xb1, 0x10, 0x0e, 0xaa, 0x74, 0xf9, 0x5f, 0x07, 0x21, 0x72, 0x4f, 0x00, 0x6f, 0x74, + 0x37, 0x9f, 0x06, 0xfe, 0xee, 0x22, 0xf0, 0xd5, 0x8f, 0xf9, 0x9b, 0xb3, 0x47, 0xf9, 0x9e, 0x0a, 0x1a, 0x23, 0xaf, 0x03, 0x1e, 0x35, 0x13, 0x02, 0xd2, 0xf7, 0x63, 0x55, 0xc9, 0xc7, 0x90, 0xb2, + 0x38, 0x48, 0x38, 0xcf, 0x85, 0x08, 0x18, 0x04, 0x0a, 0xf2, 0xb3, 0xd8, 0x71, 0x38, 0xb4, 0x49, 0x12, 0xb0, 0x0d, 0x4f, 0x17, 0xb1, 0xba, 0x41, 0xbd, 0x06, 0x1a, 0xf4, 0x6d, 0x56, 0x61, 0x62, + 0x39, 0xde, 0x1f, 0x87, 0x08, 0xef, 0xd8, 0x88, 0x56, 0x91, 0x68, 0x5e, 0xfc, 0x59, 0x45, 0x48, 0xdf, 0x29, 0xfb, 0x20, 0x0b, 0xc1, 0x56, 0x7f, 0x1b, 0xd7, 0xcf, 0xce, 0x6f, 0x95, 0x55, 0xe0, + 0x3c, 0x39, 0x1b, 0x51, 0x04, 0xec, 0xdb, 0x65, 0x33, 0x01, 0xd2, 0xe2, 0x20, 0x0a, 0x6d, 0xab, 0xc0, 0xdb, 0x59, 0xd8, 0x80, 0x7b, 0xe9, 0x47, 0x99, 0x51, 0xbe, 0x18, 0x61, 0x53, 0x20, 0xad, + 0x3d, 0x3c, 0xba, 0x34, 0x12, 0xe1, 0xba, 0xf6, 0x01, 0xaf, 0xbb, 0x6d, 0xf0, 0x09, 0x75, 0xa0, 0x8c, 0xc0, 0xad, 0x7c, 0x62, 0xfd, 0x50, 0x15, 0x87, 0x08, 0xeb, 0x4c, 0x8c, 0x3d, 0x95, 0x55, + 0x3f, 0x12, 0x06, 0xe0, 0xcc, 0x45, 0xdb, 0xe1, 0x80, 0xe7, 0x3a, 0xda, 0xeb, 0x22, 0x1b, 0xfc, 0x7d, 0x5a, 0x80, 0x00, 0x95, 0x73, 0x85, 0x49, 0x39, 0x03, 0x79, 0xd7, 0xd0, 0x28, 0x2a, 0xc3, + 0x40, 0xe7, 0x8e, 0x0b, 0x92, 0xb9, 0x80, 0x60, 0xbf, 0x28, 0x9b, 0xa6, 0xab, 0x68, 0x22, 0x5b, 0x61, 0xe2, 0x5e, 0x08, 0x9e, 0xd5, 0xa6, 0x16, 0x94, 0xc5, 0x19, 0x17, 0x92, 0x5f, 0x3e, 0x8d, + 0x40, 0xe7, 0x99, 0x43, 0xac, 0x71, 0xde, 0xf1, 0xc0, 0x35, 0x5a, 0xec, 0x71, 0xb4, 0xf7, 0x8d, 0xcf, 0x19, 0x20, 0x4a, 0x97, 0xe9, 0x7e, 0x0f, 0x34, 0x17, 0x50, 0x65, 0x32, 0xc9, 0x02, 0x76, + 0x42, 0x23, 0x03, 0x86, 0x6d, 0xa1, 0xf2, 0xaf, 0x28, 0x25, 0x92, 0x29, 0x17, 0x21, 0xc7, 0x61, 0x23, 0xcf, 0xe9, 0x84, 0x05, 0xb7, 0x60, 0x2a, 0xc7, 0xe3, 0xe9, 0x5b, 0xf3, 0xcb, 0xd4, 0xba, + 0x44, 0xb2, 0xed, 0x6b, 0x5a, 0xc4, 0x92, 0x4b, 0xde, 0x88, 0x92, 0x89, 0x58, 0x18, 0xe0, 0x5c, 0x15, 0x26, 0x2c, 0xe5, 0x7e, 0x52, 0xca, 0x59, 0x52, 0x5a, 0x92, 0xda, 0xb4, 0xe3, 0xf6, 0x22, + 0x46, 0x48, 0xe8, 0x13, 0xd7, 0x54, 0x20, 0x39, 0x4e, 0xe6, 0x35, 0xd2, 0xa4, 0x78, 0x44, 0xeb, 0xdc, 0xc9, 0x98, 0xd3, 0x45, 0x8f, 0x95, 0xf9, 0x50, 0x80, 0x50, 0x9b, 0x88, 0x80, 0x44, 0x4a, + 0x47, 0x0c, 0x04, 0x6d, 0xe8, 0x53, 0x5d, 0x46, 0x0e, 0x05, 0x63, 0x99, 0xa8, 0x89, 0x28, 0x0b, 0x25, 0x55, 0xf2, 0xb7, 0xbf, 0x89, 0x84, 0x9a, 0x7f, 0x27, 0xa4, 0x32, 0x72, 0xb5, 0x3f, 0x12, + 0x4d, 0xee, 0xc3, 0x47, 0xb0, 0xa3, 0x18, 0x46, 0x09, 0x42, 0xb2, 0xeb, 0x3e, 0xd1, 0x75, 0xcf, 0x3f, 0x8c, 0x3e, 0x8c, 0xe4, 0x3b, 0x14, 0xfc, 0x8e, 0x8f, 0x8c, 0x51, 0xcb, 0xa5, 0x5a, 0xdb, + 0x4e, 0xfb, 0x8f, 0xde, 0xb9, 0xe1, 0xe2, 0xa2, 0xc3, 0xf0, 0x11, 0xca, 0x77, 0x3b, 0x95, 0xf4, 0xb9, 0x7f, 0xbc, 0x7f, 0x3d, 0x40, 0x4d, 0x7c, 0x60, 0xf3, 0x4a, 0x61, 0x43, 0x44, 0x7e, 0x7f, + 0x50, 0xca, 0xe9, 0x94, 0x79, 0x68, 0xdf, 0xa6, 0xd7, 0x11, 0xcd, 0xb0, 0x7d, 0x84, 0xf2, 0x56, 0x78, 0xd6, 0x69, 0xbf, 0xb0, 0x29, 0xaa, 0x56, 0xa1, 0x04, 0x55, 0xb0, 0xcd, 0x06, 0xca, 0xd2, + 0x52, 0x0b, 0x46, 0x87, 0x46, 0x22, 0xb5, 0xa6, 0x57, 0x83, 0xdb, 0x7c, 0x12, 0x42, 0x53, 0x2d, 0x13, 0x7f, 0x95, 0xfe, 0xbf, 0x4d, 0xf9, 0xc2, 0x7e, 0x67, 0x94, 0x3a, 0x21, 0x27, 0xf6, 0x08, + 0x54, 0x4b, 0x3e, 0x86, 0xfc, 0xa2, 0x7a, 0x12, 0xf4, 0x81, 0xfd, 0x32, 0x53, 0x57, 0x1c, 0xc5, 0xe6, 0x1a, 0x19, 0xed, 0x9a, 0x43, 0xbc, 0x12, 0xa8, 0x07, 0x6d, 0x90, 0x8f, 0x98, 0x39, 0x6f, + 0x55, 0xb9, 0x27, 0xd2, 0x17, 0xe8, 0x83, 0xd9, 0xe1, 0x58, 0xc9, 0x51, 0x80, 0xb1, 0xba, 0x79, 0x97, 0x3a, 0xd3, 0xd9, 0x44, 0xc2, 0xc6, 0xa1, 0xed, 0x49, 0x5c, 0xd3, 0xef, 0xc3, 0x54, 0x1c, + 0x56, 0x7a, 0x32, 0x6a, 0x20, 0x9a, 0xe8, 0x69, 0x9a, 0x7d, 0xb5, 0xc0, 0xa4, 0x34, 0x52, 0x71, 0x05, 0x1e, 0x0a, 0x84, 0x03, 0xae, 0x21, 0x13, 0xd9, 0xd0, 0x12, 0xc4, 0x8d, 0x99, 0xa4, 0x13, + 0x57, 0x45, 0x0a, 0xf8, 0xa4, 0xe0, 0x06, 0x71, 0x11, 0x46, 0xaa, 0x53, 0x1f, 0xe5, 0x59, 0x8f, 0x9e, 0x92, 0xe7, 0x3d, 0x6c, 0xea, 0x93, 0x06, 0x02, 0x13, 0xa3, 0x08, 0xce, 0x76, 0x11, 0x29, + 0x5b, 0xf5, 0xb8, 0x10, 0xa4, 0x4a, 0x27, 0xd8, 0x72, 0xae, 0x50, 0x68, 0xa4, 0xc0, 0x06, 0x93, 0xcb, 0xa2, 0x41, 0xd7, 0x96, 0x51, 0x07, 0xfb, 0x20, 0xd0, 0x18, 0x17, 0x92, 0x36, 0x16, 0x81, + 0x5c, 0xef, 0x9a, 0xd0, 0xd0, 0xca, 0x04, 0x09, 0x72, 0x62, 0x24, 0x16, 0x86, 0xc6, 0xc3, 0xa7, 0x30, 0x6a, 0xb9, 0xb9, 0xcd, 0xf2, 0x4b, 0x9d, 0x4e, 0xe3, 0xb1, 0x6a, 0xf0, 0x1a, 0x5a, 0xf2, + 0x5e, 0xd2, 0x81, 0xa6, 0x95, 0xbe, 0x85, 0x95, 0x64, 0x02, 0xb2, 0x30, 0x51, 0x2c, 0x49, 0x96, 0x4a, 0x46, 0x24, 0xc9, 0xd7, 0x55, 0xcd, 0x1c, 0xda, 0xa7, 0x37, 0x6c, 0x2f, 0x7f, 0x41, 0xb9, + 0x67, 0x64, 0x0d, 0x11, 0xfe, 0x80, 0x78, 0x17, 0x57, 0x0e, 0xf1, 0x6d, 0xeb, 0xe8, 0x21, 0xb5, 0xd3, 0x93, 0x51, 0x78, 0x3a, 0x5f, 0xa7, 0x61, 0x7b, 0xa2, 0x55, 0x30, 0xec, 0x4d, 0xd8, 0x77, + 0x68, 0x40, 0xb3, 0xda, 0xf8, 0x6d, 0xba, 0x9f, 0x8e, 0x64, 0x22, 0xdb, 0x59, 0x54, 0x67, 0x64, 0xe3, 0xb1, 0x44, 0x61, 0x9a, 0x70, 0xb5, 0xac, 0x27, 0x88, 0x50, 0x5e, 0xdb, 0xc6, 0x17, 0x6c, + 0x6a, 0x8e, 0xf8, 0x3a, 0xd5, 0x52, 0xfe, 0x72, 0x37, 0xdf, 0xea, 0x8a, 0x13, 0x4e, 0x14, 0xa4, 0x03, 0x6a, 0x78, 0x74, 0x97, 0x63, 0x03, 0x92, 0x5e, 0xd3, 0x84, 0xf7, 0xc6, 0x92, 0xa6, 0x0d, + 0x6a, 0xbc, 0xdc, 0x80, 0x3a, 0x30, 0x85, 0xea, 0x5f, 0x9d, 0xa1, 0xb4, 0x3e, 0xdb, 0x2e, 0xad, 0xa2, 0x75, 0x36, 0x0d, 0xb8, 0x11, 0xc9, 0xac, 0xf5, 0x9a, 0x55, 0x5f, 0x67, 0x7b, 0x2d, 0x8b, + 0x75, 0x6f, 0x89, 0x25, 0x23, 0xc6, 0x8d, 0x27, 0x32, 0x28, 0x8b, 0x5a, 0xd4, 0x2d, 0x7d, 0xc7, 0x4e, 0xa7, 0xa7, 0x08, 0x9b, 0x04, 0x2b, 0x12, 0x5f, 0x5d, 0x74, 0x7f, 0xf3, 0x20, 0xa0, 0x77, + 0x77, 0x9a, 0x5e, 0xbd, 0x69, 0xd3, 0x28, 0x5e, 0xb9, 0xed, 0x4a, 0xc7, 0xc0, 0x4d, 0x2d, 0x15, 0xcb, 0xa1, 0x8a, 0x1f, 0x97, 0xc7, 0xc4, 0xbe, 0x62, 0x48, 0x93, 0xa9, 0xe1, 0xb0, 0x89, 0x2e, + 0x78, 0x64, 0x8e, 0xf0, 0xc5, 0x00, 0x41, 0x75, 0xb9, 0xa8, 0xea, 0x33, 0x30, 0x14, 0xea, 0x02, 0xc9, 0x17, 0xf8, 0x23, 0xe7, 0x7a, 0x3e, 0xc9, 0xac, 0xd9, 0xd2, 0x2b, 0x46, 0x02, 0xf3, 0x6d, + 0x7d, 0xa9, 0xc5, 0x21, 0x76, 0xb8, 0xaf, 0x01, 0x64, 0xea, 0x39, 0x21, 0x22, 0x44, 0xb1, 0x0a, 0xa0, 0xc7, 0x97, 0xe7, 0x65, 0xbb, 0x6b, 0x92, 0x69, 0xb5, 0x8b, 0xc9, 0xe5, 0x0a, 0x9f, 0x18, + 0x82, 0x11, 0xfa, 0xe8, 0xaf, 0xf0, 0x23, 0x3f, 0x05, 0xa8, 0xb7, 0x8c, 0x58, 0x15, 0x25, 0xe2, 0x81, 0xac, 0x98, 0x23, 0x54, 0xa8, 0xc4, 0x3b, 0xb4, 0x96, 0x5e, 0x61, 0xdc, 0x98, 0xb4, 0x62, + 0x83, 0x9b, 0xd0, 0x8a, 0xcb, 0x68, 0x47, 0xd6, 0x55, 0x07, 0xf1, 0x4e, 0x7a, 0x55, 0x6e, 0x91, 0xe6, 0x12, 0x9c, 0x47, 0x86, 0x3f, 0x7d, 0x61, 0xe2, 0xce, 0x6d, 0xb7, 0x8d, 0xf3, 0xd2, 0x3f, + 0x83, 0xb9, 0xb1, 0x58, 0xcc, 0xc5, 0x73, 0xc2, 0x17, 0xff, 0x46, 0x0b, 0x9d, 0xfb, 0x18, 0x67, 0xf4, 0xe7, 0x50, 0xf2, 0x61, 0xa9, 0x6e, 0x46, 0x05, 0x6e, 0xc1, 0x1f, 0x47, 0xb1, 0x23, 0x82, + 0x87, 0xaa, 0x91, 0xf8, 0x7f, 0xba, 0x5f, 0x31, 0x79, 0x43, 0x08, 0xda, 0xa4, 0xa4, 0x8d, 0xad, 0x6c, 0xf6, 0xfa, 0x34, 0x26, 0x4d, 0x66, 0xb8, 0x84, 0xb8, 0xb9, 0xdc, 0x96, 0x42, 0xed, 0x86, + 0x88, 0x14, 0xe5, 0x76, 0xab, 0xc1, 0xaa, 0x44, 0xdd, 0xe9, 0x43, 0xb0, 0xca, 0xae, 0xe8, 0x33, 0xa5, 0x81, 0x01, 0x42, 0x61, 0x4a, 0xde, 0xeb, 0x4c, 0xc7, 0x25, 0xe7, 0x8a, 0x50, 0x45, 0xb7, + 0x8b, 0x93, 0x7e, 0x5e, 0x8b, 0xae, 0x5a, 0xf8, 0xc8, 0x95, 0x63, 0xc0, 0x0e, 0x9c, 0xaf, 0xc6, 0xcd, 0x7c, 0x2c, 0x80, 0x8a, 0xda, 0x7b, 0xf4, 0xad, 0x51, 0x08, 0xda, 0x3e, 0x51, 0xcd, 0x70, + 0x8e, 0xc8, 0x42, 0x06, 0x94, 0x4c, 0xd4, 0x3d, 0xf6, 0xba, 0x83, 0x63, 0xc0, 0x81, 0xe4, 0xa0, 0x82, 0x9e, 0x71, 0x9a, 0xbf, 0x5a, 0x46, 0x6d, 0x7c, 0x81, 0x0c, 0x2f, 0x5b, 0x6d, 0x13, 0x75, + 0x95, 0x8d, 0x10, 0xbb, 0x87, 0x28, 0xcc, 0x1f, 0xf1, 0x6a, 0x12, 0xee, 0x6a, 0x60, 0x62, 0x40, 0xa6, 0xb7, 0x4d, 0xab, 0xa0, 0x2b, 0x8c, 0xb8, 0xed, 0x2a, 0xe8, 0x1c, 0x2f, 0xb2, 0x5b, 0x97, + 0x9a, 0x0b, 0xc4, 0x1b, 0xd7, 0x95, 0xed, 0xb0, 0x83, 0x0f, 0x1c, 0xc4, 0x82, 0x4b, 0xfa, 0x9d, 0xe0, 0x9d, 0x68, 0x63, 0x92, 0x09, 0x4f, 0x5a, 0xe7, 0xfb, 0xac, 0xfb, 0xb0, 0x17, 0x9d, 0xa6, + 0x9b, 0xcc, 0x65, 0x92, 0xa7, 0xba, 0x7e, 0x73, 0x38, 0xf4, 0xbb, 0xba, 0x27, 0xc6, 0x30, 0x16, 0xb9, 0x5e, 0xcb, 0x1e, 0xc6, 0x8c, 0x0b, 0xe9, 0xb6, 0x99, 0xb2, 0xea, 0x69, 0xcb, 0xab, 0xb2, + 0x9c, 0x63, 0xbe, 0xef, 0xc7, 0x59, 0x86, 0xe5, 0x79, 0x5d, 0x02, 0x8a, 0xe4, 0x48, 0xc1, 0x09, 0x38, 0x62, 0x1d, 0xd7, 0x6a, 0x89, 0x7e, 0x4f, 0x08, 0x2a, 0x42, 0x12, 0x93, 0x0b, 0x1c, 0x2e, + 0xa6, 0x82, 0x43, 0xa0, 0xf2, 0xe5, 0x90, 0xb8, 0x14, 0x02, 0xd6, 0xfa, 0x62, 0xd4, 0xfd, 0x30, 0x94, 0x8c, 0x00, 0x3d, 0xa1, 0x2b, 0xfe, 0xeb, 0x69, 0xba, 0x20, 0x34, 0x17, 0x27, 0x09, 0x4c, + 0xa9, 0x4a, 0x99, 0xe6, 0xde, 0x68, 0x81, 0x44, 0x49, 0x2b, 0x38, 0xdb, 0xee, 0x09, 0xde, 0x07, 0x30, 0xe3, 0x2e, 0x1c, 0xfd, 0x0a, 0xb2, 0x54, 0x99, 0x22, 0xff, 0xa8, 0x04, 0x01, 0xad, 0x49, + 0xa9, 0x95, 0x68, 0x57, 0x9c, 0xd2, 0x51, 0xaf, 0xf1, 0x34, 0xfc, 0xaa, 0xa8, 0x09, 0x91, 0x60, 0x5e, 0x8f, 0xb1, 0x19, 0x74, 0x51, 0xf7, 0x51, 0xaa, 0x4d, 0x6c, 0x84, 0xbf, 0x65, 0xf4, 0xe3, + 0xb2, 0xf0, 0xde, 0x2e, 0x01, 0xa7, 0xe3, 0x4d, 0x96, 0xa9, 0x76, 0x36, 0x43, 0x05, 0xd3, 0x9f, 0xf8, 0x49, 0xd5, 0x0a, 0xd1, 0x3a, 0xd1, 0xf8, 0xa8, 0xb4, 0x41, 0x1d, 0x1d, 0x53, 0x4e, 0x88, + 0xb3, 0xa8, 0xf2, 0x12, 0x89, 0x1c, 0xd2, 0x6e, 0x1a, 0xb4, 0x4a, 0xa8, 0x59, 0x8f, 0x6e, 0x64, 0xc6, 0x83, 0x19, 0x8d, 0x43, 0x00, 0x27, 0x54, 0xec, 0xbd, 0x8a, 0x78, 0xf2, 0xd0, 0xc0, 0x0b, + 0xb3, 0xdc, 0x31, 0x79, 0xf6, 0x2b, 0x20, 0x51, 0xc9, 0x43, 0xe5, 0x2e, 0xeb, 0xf2, 0x29, 0x8a, 0xa4, 0x7e, 0x7c, 0x0a, 0x97, 0x78, 0xe8, 0x62, 0x77, 0xa7, 0x48, 0x2a, 0x27, 0x0a, 0x7a, 0x8e, + 0xb4, 0x6a, 0xf2, 0x09, 0x19, 0xe9, 0xf2, 0x1f, 0xa1, 0x52, 0x37, 0x5d, 0xda, 0xc4, 0x58, 0x87, 0x08, 0xc1, 0x22, 0xb3, 0x65, 0x7f, 0x09, 0x01, 0x31, 0x4e, 0x83, 0x45, 0x49, 0xa9, 0x6c, 0xe7, + 0xbf, 0xf9, 0xc5, 0x89, 0x59, 0x70, 0x4d, 0x1e, 0xbe, 0x25, 0xb4, 0x43, 0xc8, 0x92, 0x3a, 0x42, 0xed, 0x89, 0xaf, 0x8b, 0xd2, 0x92, 0xe7, 0xd7, 0xcb, 0xeb, 0xca, 0xcc, 0xc0, 0x7c, 0xc7, 0x19, + 0xc3, 0x3b, 0x31, 0x5f, 0xec, 0xe4, 0xad, 0xc4, 0xc3, 0xb2, 0x75, 0x13, 0x22, 0x84, 0x66, 0xe4, 0x44, 0x99, 0xcd, 0xa7, 0xfd, 0x63, 0x97, 0xc5, 0xab, 0xe0, 0xf8, 0xce, 0x4f, 0xe3, 0x45, 0x39, + 0xcd, 0x08, 0xf4, 0x81, 0xfb, 0x0c, 0xda, 0x19, 0xe1, 0x78, 0x6d, 0x43, 0x8d, 0x5c, 0x13, 0x93, 0xf7, 0xbf, 0xf3, 0x81, 0x31, 0x44, 0x4a, 0x0a, 0x5e, 0x54, 0xc1, 0x04, 0xed, 0x1d, 0x4d, 0xad, + 0xd0, 0x15, 0x48, 0xaf, 0x46, 0xf6, 0x4f, 0xed, 0x16, 0x69, 0xa5, 0x6e, 0x69, 0x31, 0x56, 0xb5, 0xde, 0x39, 0xd6, 0xbf, 0xa8, 0x6e, 0x9e, 0x07, 0x13, 0x1d, 0x70, 0x06, 0x3c, 0x56, 0x3d, 0xd0, + 0xd1, 0x19, 0x76, 0xaf, 0xd6, 0x28, 0x03, 0xff, 0xa7, 0x60, 0x9a, 0x59, 0x18, 0xa8, 0x7a, 0xf2, 0xd1, 0x7b, 0x5d, 0x15, 0x8f, 0x14, 0x0d, 0x11, 0xdf, 0x5c, 0x17, 0x44, 0x9e, 0xb4, 0xe4, 0xaf, + 0xd2, 0xc6, 0x93, 0x8d, 0xae, 0x5a, 0xd7, 0x16, 0x0e, 0x9e, 0x6c, 0x61, 0xef, 0x46, 0xb7, 0xfd, 0x14, 0x6e, 0x30, 0xc0, 0x3f, 0xdc, 0x8f, 0x5c, 0x6d, 0xbd, 0xeb, 0x86, 0x22, 0xc8, 0xa7, 0xbd, + 0xd5, 0x50, 0x39, 0xef, 0xb6, 0x8d, 0x6e, 0xec, 0xde, 0x68, 0x61, 0xc9, 0x0b, 0xa9, 0xb7, 0x99, 0x44, 0xd1, 0xaa, 0x8b, 0xc3, 0xd6, 0x01, 0xfb, 0x80, 0xfd, 0x08, 0x7b, 0xc6, 0x13, 0x63, 0xf8, + 0xd9, 0x1c, 0xbd, 0xf9, 0x01, 0x79, 0x5e, 0x98, 0x19, 0x84, 0x9c, 0x75, 0x3e, 0xa5, 0x3a, 0xd8, 0x59, 0xc6, 0xf2, 0x5d, 0x59, 0x17, 0xa6, 0x75, 0x92, 0x58, 0x3f, 0xd6, 0x5e, 0x6d, 0x00, 0xf0, + 0xe7, 0x87, 0x08, 0xc7, 0x2c, 0x49, 0x8e, 0xcc, 0x14, 0x9e, 0x30, 0xf0, 0xa9, 0x85, 0xd3, 0x73, 0xa3, 0x00, 0xad, 0x5c, 0xf7, 0xd2, 0x88, 0xc7, 0x7d, 0xe8, 0x05, 0x5e, 0x25, 0x66, 0x28, 0x1f, + 0xe9, 0x00, 0x3a, 0x56, 0x28, 0x43, 0xa3, 0x7b, 0xec, 0x4b, 0xef, 0xd4, 0xbb, 0x71, 0xfe, 0x3c, 0x5e, 0x6a, 0x50, 0x4d, 0x0b, 0x99, 0x36, 0xaf, 0xb6, 0x9e, 0xdc, 0x37, 0x2f, 0x7c, 0x41, 0xef, + 0xec, 0x31, 0xc2, 0xb7, 0xba, 0x09, 0xee, 0x69, 0xee, 0xf8, 0x55, 0x31, 0xe2, 0xc2, 0x4f, 0x22, 0x4a, 0xf7, 0xd9, 0x4a, 0x72, 0x25, 0xb2, 0x6f, 0x4f, 0x57, 0xf7, 0x70, 0x5e, 0x7d, 0xda, 0x1a, + 0xec, 0x94, 0x7e, 0x1c, 0x1e, 0x3f, 0xbe, 0xca, 0x4f, 0x55, 0x6d, 0x7a, 0x1a, 0x41, 0x15, 0x60, 0x89, 0x41, 0xf5, 0x48, 0x35, 0xe0, 0x7e, 0x8e, 0x89, 0xf7, 0x02, 0x85, 0x3d, 0xb7, 0xae, 0x2a, + 0xec, 0xfd, 0xbc, 0x3f, 0x4f, 0x2e, 0x4d, 0x99, 0x16, 0x9c, 0xdd, 0xfb, 0x15, 0x2d, 0x92, 0x4d, 0x7d, 0xe6, 0x8a, 0xb6, 0x7f, 0x4d, 0x12, 0x54, 0x40, 0xfa, 0xbc, 0x9f, 0x00, 0x46, 0xd5, 0xbc, + 0xee, 0xed, 0xc0, 0x4c, 0x13, 0x73, 0xb5, 0xc4, 0x04, 0x4d, 0x1f, 0xde, 0x0d, 0x2f, 0xb8, 0xe2, 0x8c, 0x74, 0xb1, 0x02, 0x9c, 0x99, 0xed, 0x67, 0x0a, 0x15, 0x98, 0x3f, 0x18, 0xa0, 0x4d, 0x36, + 0xf5, 0x40, 0x26, 0x1c, 0x09, 0x7d, 0xbd, 0x8a, 0x8a, 0x12, 0x9b, 0x68, 0x99, 0x5f, 0x33, 0xab, 0xe7, 0x1c, 0x29, 0x40, 0xf8, 0x87, 0xc6, 0x68, 0x9b, 0xf8, 0xdc, 0x3f, 0x1a, 0xcf, 0x0b, 0x44, + 0xfb, 0x0a, 0x23, 0xca, 0x4d, 0x22, 0xfd, 0xd2, 0xad, 0x4e, 0xfa, 0x1b, 0x21, 0x08, 0xb6, 0x60, 0xd2, 0xff, 0xa3, 0xf2, 0xfb, 0xdd, 0x25, 0x32, 0xdc, 0xf1, 0x3f, 0x49, 0x33, 0x28, 0x46, 0x7b, + 0xfb, 0x49, 0xfd, 0x45, 0x8c, 0xaf, 0x47, 0x5a, 0x16, 0x05, 0x5e, 0x4a, 0x75, 0x5a, 0xc3, 0xe3, 0x95, 0x52, 0xf4, 0xe9, 0x6c, 0xa2, 0x0d, 0xea, 0x53, 0xf5, 0xc4, 0x09, 0x2b, 0x68, 0xfd, 0x4f, +}; diff --git a/src/format.c b/src/format.c index 52145b13..6567c12e 100644 --- a/src/format.c +++ b/src/format.c @@ -1002,7 +1002,7 @@ static BOOL WriteSBR(HANDLE hPhysicalDrive) switch (bt) { case BT_GRUB4DOS: - uprintf("Writing Grub4Dos SBR..."); + uprintf("Writing Grub4Dos SBR"); buf = GetResource(hMainInstance, MAKEINTRESOURCEA(IDR_GR_GRUB_GRLDR_MBR), _RT_RCDATA, "grldr.mbr", &size, FALSE); if ((buf == NULL) || (size <= mbr_size)) { uprintf("grldr.mbr is either not present or too small"); @@ -1013,11 +1013,12 @@ static BOOL WriteSBR(HANDLE hPhysicalDrive) break; case BT_GRUB2: if (grub2_buf != NULL) { - uprintf("Writing Grub 2.0 SBR (from download)..."); + uprintf("Writing Grub 2.0 SBR (from download) %s", + IsBufferInDB(grub2_buf, grub2_len)?"✓":"✗"); buf = grub2_buf; size = (DWORD)grub2_len; } else { - uprintf("Writing Grub 2.0 SBR (from embedded)..."); + uprintf("Writing Grub 2.0 SBR (from embedded)"); buf = GetResource(hMainInstance, MAKEINTRESOURCEA(IDR_GR_GRUB2_CORE_IMG), _RT_RCDATA, "core.img", &size, FALSE); if (buf == NULL) { uprintf("Could not access core.img"); @@ -1898,8 +1899,9 @@ DWORD WINAPI FormatThread(void* param) } } else if (bt == BT_GRUB4DOS) { grub4dos_dst[0] = drive_name[0]; - uprintf("Installing: %s (Grub4DOS loader)\n", grub4dos_dst); IGNORE_RETVAL(_chdirU(app_dir)); + uprintf("Installing: %s (Grub4DOS loader) %s\n", grub4dos_dst, + IsFileInDB(FILES_DIR "\\grub4dos-" GRUB4DOS_VERSION "\\grldr")?"✓":"✗"); if (!CopyFileU(FILES_DIR "\\grub4dos-" GRUB4DOS_VERSION "\\grldr", grub4dos_dst, FALSE)) uprintf("Failed to copy file: %s", WindowsErrorString()); } else if ((bt == BT_ISO) && (image_path != NULL)) { diff --git a/src/iso.c b/src/iso.c index 6bd3ad92..a50ff1a4 100644 --- a/src/iso.c +++ b/src/iso.c @@ -366,7 +366,7 @@ static int udf_extract_files(udf_t *p_udf, udf_dirent_t *p_udf_dirent, const cha i_length = (int)(3 + strlen(psz_path) + strlen(psz_basename) + strlen(psz_extract_dir) + 24); psz_fullpath = (char*)calloc(sizeof(char), i_length); if (psz_fullpath == NULL) { - uprintf("Error allocating file name\n"); + uprintf("Error allocating file name"); goto out; } i_length = _snprintf(psz_fullpath, i_length, "%s%s/%s", psz_extract_dir, psz_path, psz_basename); @@ -398,23 +398,23 @@ static int udf_extract_files(udf_t *p_udf, udf_dirent_t *p_udf_dirent, const cha for (i=0; irr.psz_symlink); + uprintf(" Ignoring Rock Ridge symbolic link to '%s'", p_statbuf->rr.psz_symlink); safe_free(p_statbuf->rr.psz_symlink); } file_handle = CreateFileU(psz_sanpath, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ|FILE_SHARE_WRITE, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); if (file_handle == INVALID_HANDLE_VALUE) { err = GetLastError(); - uprintf(" Unable to create file: %s\n", WindowsErrorString()); + uprintf(" Unable to create file: %s", WindowsErrorString()); if ((err == ERROR_ACCESS_DENIED) && (safe_strcmp(&psz_sanpath[3], autorun_name) == 0)) uprintf(stupid_antivirus); else @@ -570,7 +570,7 @@ static int iso_extract_files(iso9660_t* p_iso, const char *psz_path) memset(buf, 0, ISO_BLOCKSIZE); lsn = p_statbuf->lsn + (lsn_t)i; if (iso9660_iso_seek_read(p_iso, buf, lsn, 1) != ISO_BLOCKSIZE) { - uprintf(" Error reading ISO9660 file %s at LSN %lu\n", + uprintf(" Error reading ISO9660 file %s at LSN %lu", psz_iso_name, (long unsigned int)lsn); goto out; } diff --git a/src/rufus.c b/src/rufus.c index e6fbf847..e4e12f44 100644 --- a/src/rufus.c +++ b/src/rufus.c @@ -2271,13 +2271,6 @@ static INT_PTR CALLBACK MainCallback(HWND hDlg, UINT message, WPARAM wParam, LPA #ifdef RUFUS_TEST case IDC_TEST: { - int j; - char str[65]; - uint8_t sum[32]; - Checksum(CHECKSUM_SHA256, "C:\\rufus\\src\\.msvc\\rufus_files\\syslinux-6.03\\ldlinux.sys", sum); - for (j = 0; j < sizeof(sum); j++) - safe_sprintf(&str[2 * j], ARRAYSIZE(str) - 2 * j, "%02x", sum[j]); - uprintf(" Checksum: %s", str); break; } #endif diff --git a/src/rufus.h b/src/rufus.h index 182abd20..a18dc063 100644 --- a/src/rufus.h +++ b/src/rufus.h @@ -456,7 +456,10 @@ extern BOOL IsFontAvailable(const char* font_name); extern BOOL WriteFileWithRetry(HANDLE hFile, LPCVOID lpBuffer, DWORD nNumberOfBytesToWrite, LPDWORD lpNumberOfBytesWritten, DWORD nNumRetries); extern BOOL SetThreadAffinity(DWORD_PTR* thread_affinity, size_t num_threads); -extern BOOL Checksum(const unsigned type, const char* path, uint8_t* sum); +extern BOOL HashFile(const unsigned type, const char* path, uint8_t* sum); +extern BOOL HashBuffer(const unsigned type, const unsigned char* buf, const size_t len, uint8_t* sum); +extern BOOL IsFileInDB(const char* path); +extern BOOL IsBufferInDB(const unsigned char* buf, const size_t len); #define printbits(x) _printbits(sizeof(x), &x, 0) #define printbitslz(x) _printbits(sizeof(x), &x, 1) extern char* _printbits(size_t const size, void const * const ptr, int leading_zeroes); diff --git a/src/rufus.rc b/src/rufus.rc index fa55f8a8..bd18006f 100644 --- a/src/rufus.rc +++ b/src/rufus.rc @@ -33,7 +33,7 @@ LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL IDD_DIALOG DIALOGEX 12, 12, 242, 376 STYLE DS_SETFONT | DS_MODALFRAME | DS_CENTER | WS_MINIMIZEBOX | WS_POPUP | WS_CAPTION | WS_SYSMENU EXSTYLE WS_EX_ACCEPTFILES -CAPTION "Rufus 2.10.939" +CAPTION "Rufus 2.10.940" FONT 8, "Segoe UI Symbol", 400, 0, 0x0 BEGIN LTEXT "Device",IDS_DEVICE_TXT,9,6,200,8 @@ -320,8 +320,8 @@ END // VS_VERSION_INFO VERSIONINFO - FILEVERSION 2,10,939,0 - PRODUCTVERSION 2,10,939,0 + FILEVERSION 2,10,940,0 + PRODUCTVERSION 2,10,940,0 FILEFLAGSMASK 0x3fL #ifdef _DEBUG FILEFLAGS 0x1L @@ -338,13 +338,13 @@ BEGIN BEGIN VALUE "CompanyName", "Akeo Consulting (http://akeo.ie)" VALUE "FileDescription", "Rufus" - VALUE "FileVersion", "2.10.939" + VALUE "FileVersion", "2.10.940" VALUE "InternalName", "Rufus" VALUE "LegalCopyright", "© 2011-2016 Pete Batard (GPL v3)" VALUE "LegalTrademarks", "http://www.gnu.org/copyleft/gpl.html" VALUE "OriginalFilename", "rufus.exe" VALUE "ProductName", "Rufus" - VALUE "ProductVersion", "2.10.939" + VALUE "ProductVersion", "2.10.940" END END BLOCK "VarFileInfo" diff --git a/src/syslinux.c b/src/syslinux.c index 2ca2874f..0f3dd82f 100644 --- a/src/syslinux.c +++ b/src/syslinux.c @@ -148,7 +148,8 @@ BOOL InstallSyslinux(DWORD drive_index, char drive_letter, int fs_type) uprintf("Could not read %s", path); goto out; } - uprintf("Using existing './%s'", path); + uprintf("Using existing './%s' %s", path, + IsBufferInDB(syslinux_ldlinux[i], (size_t)syslinux_ldlinux_len[i])?"✓":"✗"); } } else { for (i=0; i<2; i++) { @@ -313,8 +314,9 @@ BOOL InstallSyslinux(DWORD drive_index, char drive_letter, int fs_type) uprintf("Caution: No '%s' was provided. The target will be missing a required Syslinux file!", &path[3]); } else { fclose(fd); - if (CopyFileA(&path[3], path, TRUE)) { - uprintf("Created '%s' (from '%s/%s-%s/%s')", path, FILES_DIR, syslinux, embedded_sl_version_str[1], &path[3]); + if (CopyFileU(&path[3], path, TRUE)) { + uprintf("Created '%s' (from '%s/%s-%s/%s') %s", path, FILES_DIR, syslinux, + embedded_sl_version_str[1], &path[3], IsFileInDB(&path[3])?"✓":"✗"); } else { uprintf("Failed to create '%s': %s", path, WindowsErrorString()); }