Compare commits

...

72 Commits
v4.4 ... master

Author SHA1 Message Date
Костянтин Сергійович 1d4eea4926
[loc] update Ukrainian translation to latest 2024-05-16 11:11:23 +01:00
Pete Batard e596e1a550
[loc] update Pollock to prevent an issue with Outlook and whitespaces 2024-05-14 16:49:04 +01:00
Riku Brander 49be8c34b5
[loc] update Finnish translation to latest 2024-05-14 16:36:18 +01:00
Aldis Tutins 3fdf6e121f
[loc] update Latvian translation to latest 2024-05-14 16:25:46 +01:00
a1346054 97d69d84c6
[misc] correct author's name
* Closes #2477.
2024-05-13 17:07:59 +01:00
Pete Batard 45423becd5
[vhd] fix VHDX being inadvertently saved as VHD
* Addresses the error reported in #2468.
* Also use memmove instead of memcpy where overlapping data is involved.
2024-05-12 13:06:23 +01:00
Martin Kubánik fb43dc8957
[loc] update Slovak translation to latest 2024-05-12 12:26:17 +01:00
Roberto Boriotti d12e845b9a
[loc] update Italian translation to latest 2024-05-12 12:14:48 +01:00
Miloš Ljubičić 236b4e60eb
[loc] update Serbian translation to latest 2024-05-11 11:40:56 +01:00
Jakub Zieciak b2f06d746b
[loc] update Norwegian and Polish translations 2024-05-10 11:21:38 +01:00
Ben Gamer 8727d3b3f6
[loc] update Croatian translation to latest 2024-05-10 11:13:29 +01:00
Marco A. Ramirez Madrid ef2cac008d
[loc] update Spanish translation to latest 2024-05-10 11:08:51 +01:00
Csizmadia Gábor 9476bb41ad
[loc] update Hungarian translation to latest 2024-05-10 10:47:34 +01:00
五月雨 412f1c63da
[loc] update Japanese translation to latest 2024-05-10 10:42:13 +01:00
Christos Alvanos 0c38268665
[loc] update Greek translation to latest 2024-05-10 10:39:25 +01:00
Pete Batard 03d46b3d87
[misc] silence a benign log warning
* Also update ChangeLog for 4.5 BETA.
2024-05-08 15:44:32 +01:00
Pete Batard d0bc05077a
[misc] improve size based constants
* Make them more explicit by ensuring that they use a size suffix.
* Also improve whitespace consistency.
* Also make sure that we display the search for conflicting process message
  in the status on a search operation that may timeout.
2024-05-07 12:53:40 +01:00
Pete Batard 180a61736c
[misc] move the revoked UEFI bootloader prompt before the ISO → ESP one
* Also fix a potential buffer overflow when displaying the detailed HDD vs UFD score due to the
  safe_sprintf() macro re-evaluating the expression passed as parameter.
* Also refactor and clean up the the safe_###() macros to avoid similar issues.
* Also use FOF_NO_UI as flag for SHDeleteDirectoryExU(), which may alleviate some Alt-D errors.
2024-05-06 19:47:36 +01:00
Pete Batard 2106be0c3b
[iso] fix an assertion with mt86plus_7.00_64.grub.iso
* Also fix a couple typos in Brazilian Portuguese translation.
2024-05-06 19:39:26 +01:00
Marcos Mello ddc7f1b89d
[loc] update Portuguese (Brazilian) translation to latest 2024-05-03 20:12:35 +01:00
Pete Batard 39a5ae6d36
[core] fix "drive cannot find the sector requested" when writing VHDs
* As opposed to the ERROR_HANDLE_EOF we get when reading sectors from the VHD file directly, now that we mount
  VHD/VHDX for reading, and access them as regular disks, we also need to process ERROR_SECTOR_NOT_FOUND as an
  indicator for the end of the drive.
* Also switch to using GetOverlappedResultEx() with a timeout since we no longer have to cater for Windows 7.
* Closes #2468.
2024-05-01 12:48:42 +01:00
Pete Batard cba95f7710
[grub] update GRUB to 2.12 release 2024-04-30 11:59:40 +01:00
Erfan Al 4df3fd8d16
[loc] update Persian translation to latest 2024-04-30 11:57:20 +01:00
VenusGirl d38664dde8
[loc] update Korean translation to latest 2024-04-29 10:44:27 +01:00
Mehmetali Kuran 7d63b78571
[loc] update Turkish translation to latest 2024-04-29 10:39:27 +01:00
Wang JiaWei 2767fdbfd3
[loc] update Chinese Simplified translation to latest 2024-04-29 10:36:34 +01:00
Ahmed Rasnaama 569b1e2971
[loc] update Arabic translation to latest 2024-04-29 10:31:15 +01:00
Pete Batard 2a6df95cad
[iso] fix persistence option not being added for Ubuntu 24.04
* Ubuntu changed their GRUB config format yet again, so our search for the kernel
  config no longer works, and the 'persistent' option doesn't get added.
* Switch to a more generic '/casper/vmlinuz' search, though it might have unintended
  consequences...
* Also fix a possible double free in FormatExtFs().
2024-04-28 13:56:18 +01:00
Pete Batard 83e0bdad7a
[md5sum] fix unwanted partial matches in is_in_md5sum()
* is_in_md5sum() could partially match a string against another one, which, aside from matching
  unwanted files, could also lead to files not being identified as being in the md5sum.txt if
  the previous partial match happened to be with the current search target.
* Fix this by making sure that we always match a whole path followed by '/n', '/r' or '/0'.
2024-04-28 13:26:38 +01:00
Pete Batard df9e333f3a
[md5sum] fix bootloaders not being extracted unless referenced in md5sum.txt
* Not all md5sum.txt (e.g. Ubuntu 24.04) will reference the UEFI bootloader,
  so we can't rely on using that data for the bootloader extraction.
* Instead, formally test for the presence of the bootloader on disk.
2024-04-27 18:21:57 +01:00
Pete Batard 4ec57dc5d7
[iso] fix improper size being returned by ExtractISOFile()
* The call returned the size occupied in blocks rather than the actual file size,
  leading to issues such as Rufus not being able to identify the GRUB version used
  by Ubuntu 24.04.
2024-04-26 21:54:43 +01:00
Pete Batard 6ac2dfb0df
[misc] fix temp_dir not being properly initialized
* The static_/safe_ string macros were not properly designed to handle the case where
  an expression such as strlen() rather than a static value was passed for the count,
  leading to unexpected results, such as excessive truncation of strings. Fix that.
* Also fix a buffer overflow in GetDevices() due to using a wrong string length.
2024-04-26 19:15:48 +01:00
Suttirak Mattayawerakiat 00dc0473b5
[loc] update Thai translation to latest 2024-04-26 12:57:20 +01:00
Pete Batard 4286871f50
[loc] fix versioning for Russian and French
* Also update README for upcoming feature.
2024-04-26 11:06:37 +01:00
Thilo Langbein 2c3e560ba3
[loc] update German translation to latest 2024-04-26 10:54:32 +01:00
Thomas De Rocker 2ecb8b54b2
[loc] upate Dutch translation to latest 2024-04-26 10:52:09 +01:00
Sopor 4019bc135f
[loc] update Swedish translation to latest 2024-04-26 10:46:05 +01:00
Дмитрий Ерохин 0a956f38b0
[loc] update Russian translation to latest 2024-04-26 10:19:13 +01:00
Itiel 37ccc8d1e1
[loc] update Hebrew translation to latest 2024-04-26 10:12:20 +01:00
Mike Handberg Hovedskov 13ae9b3339
[loc] update Danish translation to latest 2024-04-26 10:09:45 +01:00
Richard Kahl 11f74cde01
[loc] update Czech translation to latest 2024-04-26 10:05:09 +01:00
Fedorovici Constantin-Robert b28eb88e3b
[loc] update Romanian translation to latest 2024-04-26 10:01:50 +01:00
Minh Nguyễn Quang 8b0531e4dc
[loc] update Vietnamese translation to latest 2024-04-26 09:56:56 +01:00
Pete Batard 855a06d3a0
[loc] update French translation to latest
* Also change the time of cron execution for the lock issues workflow.
2024-04-25 12:51:28 +01:00
Pete Batard eb45c97667
[bled] fix memory allocation issue for 32-bit in unpack_lzma_stream()
* Vulnerability discovered and reported by Mansour Gashasbi (@gashasbi).
* Also update the lock thread workflow to try to avoid recent failures.
2024-04-22 12:56:28 +01:00
Pete Batard 513c5f44a5
[misc] fix possible buffer overflows in _snprintf()
* _snprintf() is not always guaranteed to NUL terminate a string which could
  lead to  buffer overflows in iso_extract_files() and iso_extract_files().
* Fix this by switching to using the more secure _snprintf_s().
* Vulnerability discovered and reported by Mansour Gashasbi (@gashasbi).
* For good measure, we also switch to the strncat_s() where possible and also
  use memmove() instead of memcpy()/strcpy() as the behaviour of the latter on
  overlapping memory regions is undefined.
* Also fix some additional MinGW warnings regarding casts and nb_blocks.
2024-04-17 17:19:03 +01:00
Pete Batard 92ac1c770c
[wue] don't display WUE when '/sources/$OEM$/$$/Panther/unattend.xml' exists
* Closes #2451.
* Also update Coverity workflow to use latest actions/upload-artifact.
2024-04-15 16:35:52 +01:00
Pete Batard f813eb05d8
[iso] fix a buffer overflow in syslinux.c
* p[safe_strlen(p)] = 0; was pointless and could lead to a buffer overflow if
  the string was not already NUL terminated, so remove it and make sure we
  process a buffer that either contains legitimate Syslinux version strings
  (that are NUL terminated always) or that has been read through read_file()
  (that always adds a NUL terminator to the buffer).
* Also fix some whitespaces in related code sections and switch to using
  read_file() for GRUB version lookup.
* Vulnerability discovered and reported by Mansour Gashasbi (@gashasbi).
2024-04-10 10:26:31 +02:00
Pete Batard 34e6e43a97
[efi] update UEFI:NTFS to latest
* This updates UEFI:NTFS to the v2.5 release:
  https://github.com/pbatard/uefi-ntfs/releases/tag/v2.5
2024-04-09 22:49:31 +02:00
Pete Batard 8a8e418751
[iso] fix a buffer overflow in iso9660/iso9660_fs.c
* Whereas the length of the buffer allocated for the UTF-8 filename string is
  the same length as the UCS-2 (which means it can store twice as many UTF-8
  bytes as there are characters in the filename), it is still possible for the
  converted UTF-8 string to overflow this buffer if the name contains glyphs
  that use 3 or 4-byte sequences.
* As a result, use strncpy with the actual size of the UTF-8 filename buffer
  (the following bytes are calloc'd to zero so the truncated string will be
  NUL terminated) and produce a warning if the filename is truncated.
* Vulnerability discovered and reported by Mansour Gashasbi (@gashasbi).
2024-04-09 00:09:21 +02:00
Pete Batard 4eda8d9d5c
[process] add extra exception handling on NtClose()
* Also fix a typo in Norwegian translation (Closes #2453).
2024-04-04 17:40:20 +01:00
Pete Batard 5061af2b7c
[md5sum] compute and add md5sum_totalbytes to pre-existing md5sum.txt 2024-04-04 17:28:00 +01:00
Pete Batard dd8314b2f0
[ui] add runtime UEFI media validation as a selectable advanced option
* Also add Ctrl-A as a new cheat-mode to toggle the use of Rufus MBR (which is enabled by default)
  which replaces the previous UI checkbox. The Disk ID field is now completely removed as we now
  use the default values for XP and non XP installs, and will expect people with multiple disks to
  disconnect all except the one where they plan to install Windows.
2024-04-02 17:18:06 +01:00
Pete Batard 6dac531552
[misc] don't pass an output size in DeviceIoControl() when not needed
* Also improve partition creation and address 2 Coverity warnings.
2024-04-01 14:56:06 +01:00
Pete Batard 8a5a5a318a
[misc] improve readability of error code handling
* Also don't pass a read size value in WriteFileWithRetry() if we don't use it.
2024-04-01 02:16:41 +01:00
Pete Batard 52ca79816f
[md5sum] Add md5sum.txt creation and runtime UEFI validation
* This allows *runtime* validation of UEFI bootable media, such as Windows
  or Linux installers, which, considering the unreliability of USB flash
  drives, we assert is a a much better proposal than write-time validation
  that utilities like balenaEcther (and to a lesser extent MCT) provide.
* Based on uefi-md5sum (https://github.com/pbatard/uefi-md5sum).
* Unconditionally activated on ISO extraction for GPT targets for now.
  This will be changed to a user selectable option later.
2024-03-29 00:48:05 +00:00
Pete Batard b7568ab30a
[uefi] add the uefi-md5sum resources
* See https://github.com/pbatard/uefi-md5sum.
* The ia32, x64 and aa64 have been Secure Boot signed by Microsoft.
2024-03-28 23:50:41 +00:00
Pete Batard a59389e1e1
[misc] move hash definitions to rufus.h
* Also always add an extra NUL to read_file(), some additional macros in missing.h
  and fix some warnings in process.c.
2024-03-27 19:02:24 +00:00
Pete Batard d3f78c4e01
[efi] update UEFI:NTFS to latest
* Also fix missing original translator for Korean and remove an unwanted warning message.
2024-03-25 18:56:23 +00:00
Pete Batard 5eae8a6441
[cmp] Enable extraction of zip archives outside of ISO copy mode
* This enables the use of Ctrl-SELECT to also extract files from a .zip
  when using non-bootable, DOS, UEFI-NTFS, etc.
* Also clean up some uprintf line terminations and some additional code.
* Also fix some Coverity and MinGW warnings.
2024-03-12 17:41:27 +00:00
Pete Batard abc33122a0
[iso] increase write buffer size to work around a bug in the AMI UEFI NTFS driver
* The AMI UEFI NTFS driver (version 0x10000), which is used in many modern systems from
  ASUS, Gigabyte, intel and so on, has a major bug whereas depending on the size of the
  buffers that are used to write the data onto the NTFS volume from Windows, as well as
  read the data from the NTFS volume from UEFI, the data being read may be incorrect
  (for details on this, see https://github.com/pbatard/AmiNtfsBug).
* Especially, it appears that if the size of the buffer used to write data on Windows is
  smaller than the NTFS cluster size, the bug may be triggered.
* Because of this, we increase the size of ISO write buffer to 64 KB since, per
  https://support.microsoft.com/en-gb/topic/default-cluster-size-for-ntfs-fat-and-exfat-9772e6f1-e31a-00d7-e18f-73169155af95
  this is the maximum cluster size that can be used for NTFS volumes.
* This increase in size should also help with performance somewhat.
* Also add support for C11's _Static_assert() which may come handy.
2024-03-12 12:53:30 +00:00
Pete Batard 8738e7a7de
[vhd] fix truncated write operation when using a VHDX image as source
* The legacy code we used for writing disk images used the size of the source image as
  the maximum number of bytes we should copy, which is fine for uncompressed DD or VHD
  images, but not so much for compressed VHDX ones. So we now make sure to use the
  actual size of the virtual disk, which we obtain when mounting the VHD/VHDX.
* Also fix log progress update as well as a MinGW warning.
2024-03-04 00:49:57 +00:00
Bella Zhang 026afa7e3d
[iso] add Circle Linux to the list of Red-Hat derivatives
* Closes #2414.
2024-02-09 17:04:40 +00:00
Pete Batard 172888ac32
[dos] fix a CodeQL warning and harmonize code 2024-02-09 17:00:42 +00:00
Pete Batard 15e3886499
[iso] enable persistence support for Linux Mint
* Mint users sure are lucky that one of them *lied their way through* pretending that
  persistence actually used to work with previous version of Mint, when it never did,
  because they got us going through a whole refactor of the partition creation process
  just so we could make Mint persistence work.
* Closes #2428.
* Also fix a Coverity warning.
2024-02-09 16:59:28 +00:00
Pete Batard 0f23c47184
[misc] refactor partition creation 2024-02-08 14:17:03 +00:00
Pete Batard 164d4b0ab0
[misc] update workflows to use upload-artifact@v4
* See actions/upload-artifact#483, actions/upload-artifact#472#issuecomment-1861571655
  and ultimately https://github.com/actions/upload-artifact/blob/main/merge/README.md.
2024-02-07 20:11:09 +00:00
Pete Batard 1be7eaf306
[net] fix Fido script not being able to be launched again on user cancel
* Also update workflows to latest setup-msbuild
* Closes #2419
2024-02-07 19:24:17 +00:00
Pete Batard ac9a3f42d8
[misc] fix revoked bootloaders message does not display when using MBR
* Also update version to rufus-next
2024-02-06 20:02:36 +00:00
Pete Batard c2b2624b62
[vhd] improve handing of user selected filename on save to VHD/FFU
* Use of '*.*' as pattern in file save dialog could lead to assert and crash, so
  we now try to derive the type of image to be saved from the file extension. We
  also did not properly handle user cancellation in the file save dialog.
* Also update iso9660/iso9660_fs.c to latest proposal of El Torito image handling.
* Also add a couple asserts in the hash table functions so that, if these ever get
  triggered we will pick them from Windows Store reports, and clean up code.
2024-02-03 18:39:44 +00:00
Pete Batard 018ed3414b
[iso] improve El Torito image handling
* Update to latest libcdio proposal and fix incorrect image size.
* Also remove unnecessary calls in packme.cmd.
2024-01-24 17:51:40 +00:00
Pete Batard f6fd520d2a
[appstore] prevent packaging of ALPHA or BETA versions
* Also add package version override
2024-01-18 14:24:53 +00:00
97 changed files with 6414 additions and 3235 deletions

View File

@ -48,7 +48,7 @@ jobs:
languages: cpp
- name: Add MSBuild to PATH
uses: microsoft/setup-msbuild@v1.1
uses: microsoft/setup-msbuild@v2
with:
msbuild-architecture: x64

View File

@ -44,7 +44,7 @@ jobs:
run: echo "${{github.workspace}}/cov-analysis-win64/bin" >> $GITHUB_PATH
- name: Add MSBuild to PATH
uses: microsoft/setup-msbuild@v1.1
uses: microsoft/setup-msbuild@v2
- name: Build with Coverity
run: |
@ -52,7 +52,7 @@ jobs:
cov-build.exe --dir cov-int msbuild ${{ env.SOLUTION_FILE_PATH }} /m /p:Configuration=${{ env.BUILD_CONFIGURATION }},Platform=${{ env.TARGET_PLATFORM }}
- name: Publish Coverity artifacts
uses: actions/upload-artifact@v3
uses: actions/upload-artifact@v4
with:
name: cov-int
path: cov-int/

View File

@ -3,7 +3,7 @@ name: '[cron] Lock stale issues'
on:
schedule:
- cron: '0 0 * * *'
- cron: '33 22 * * *'
jobs:
lock:
@ -11,7 +11,7 @@ jobs:
steps:
- uses: dessant/lock-threads@v5
with:
github-token: ${{ github.token }}
github-token: ${{ secrets.GITHUB_TOKEN }}
issue-inactive-days: '90'
issue-comment: >
This thread has been automatically locked since there has not been

View File

@ -63,14 +63,18 @@ jobs:
shell: bash
if: ${{ !startsWith(github.ref, 'refs/tags/') }}
# This ONLY works if the shell is bash or if using $env:GITHUB_OUTPUT
run: echo "option=--enable-alpha" >> $GITHUB_OUTPUT
run: |
echo "option=--enable-alpha" >> $GITHUB_OUTPUT
sed -b -i 's/VALUE "InternalName", "Rufus"/VALUE "InternalName", "Rufus (ALPHA)"/' ./src/rufus.rc
- name: Set BETA
id: set_beta
shell: bash
if: ${{ startsWith(github.ref, 'refs/tags/') && contains(github.ref, 'BETA') }}
# This ONLY works if the shell is bash or if using $env:GITHUB_OUTPUT
run: echo "option=--enable-beta" >> $GITHUB_OUTPUT
run: |
echo "option=--enable-beta" >> $GITHUB_OUTPUT
sed -b -i 's/VALUE "InternalName", "Rufus"/VALUE "InternalName", "Rufus (BETA)"/' ./src/rufus.rc
- name: Build
run: |
@ -92,7 +96,18 @@ jobs:
- name: Upload artifacts
if: ${{ github.event_name == 'push' }}
uses: actions/upload-artifact@v3
uses: actions/upload-artifact@v4
with:
name: MinGW
name: ${{ matrix.sys }}
path: ./*.exe
Extra-Step-To-Merge-Artifacts-Thanks-To-Upload-Artifact-v4-Breaking-Backwards-Compatibility:
runs-on: windows-latest
needs: MinGW-Build
steps:
- name: Merge Artifacts
uses: actions/upload-artifact/merge@v4
if: ${{ github.event_name == 'push' }}
with:
name: MinGW
delete-merged: true

View File

@ -45,7 +45,7 @@ jobs:
submodules: recursive
- name: Add MSBuild to PATH
uses: microsoft/setup-msbuild@v1
uses: microsoft/setup-msbuild@v2
with:
msbuild-architecture: x64
@ -54,14 +54,18 @@ jobs:
shell: bash
if: ${{ !startsWith(github.ref, 'refs/tags/') }}
# This ONLY works if the shell is bash or if using $env:GITHUB_OUTPUT
run: echo "option=/DALPHA" >> $GITHUB_OUTPUT
run: |
echo "option=/DALPHA" >> $GITHUB_OUTPUT
sed -b -i 's/VALUE "InternalName", "Rufus"/VALUE "InternalName", "Rufus (ALPHA)"/' ./src/rufus.rc
- name: Set BETA
id: set_beta
shell: bash
if: ${{ startsWith(github.ref, 'refs/tags/') && contains(github.ref, 'BETA') }}
# This ONLY works if the shell is bash or if using $env:GITHUB_OUTPUT
run: echo "option=/DBETA" >> $GITHUB_OUTPUT
run: |
echo "option=/DBETA" >> $GITHUB_OUTPUT
sed -b -i 's/VALUE "InternalName", "Rufus"/VALUE "InternalName", "Rufus (BETA)"/' ./src/rufus.rc
- name: Build
shell: cmd
@ -82,10 +86,21 @@ jobs:
curl --request POST --url https://www.virustotal.com/api/v3/monitor/items --header 'x-apikey: ${{ secrets.VIRUSTOTAL_API_KEY }}' --form path='/rufus_${{ matrix.TARGET_PLATFORM }}.exe' --form file=@./rufus_${{ matrix.TARGET_PLATFORM }}.exe
- name: Upload artifacts
uses: actions/upload-artifact@v3
uses: actions/upload-artifact@v4
if: ${{ github.event_name == 'push' }}
with:
name: VS2022
name: ${{ matrix.TARGET_PLATFORM }}
path: |
./*.exe
./*.pdb
Extra-Step-To-Merge-Artifacts-Thanks-To-Upload-Artifact-v4-Breaking-Backwards-Compatibility:
runs-on: windows-latest
needs: VS2022-Build
steps:
- name: Merge Artifacts
uses: actions/upload-artifact/merge@v4
if: ${{ github.event_name == 'push' }}
with:
name: VS2022
delete-merged: true

13
.gitignore vendored
View File

@ -1,27 +1,40 @@
*.a
*.aps
*.appx
*.appxupload
*.bak
*.db
*.db-shm
*.db-wal
*.dep
*.diff
*.dll
*.efi
*.exe
*.htm
*.idb
*.ipch
*.la
*.lib
*.lo
*.lock
*.log
*.mac
*.mo
*.mp4
*.ncb
*.nope
*.o
*.obj
*.old
*.opendb
*.opt
*.org
*.p7x
*.patch
*.pc
*.pdb
*.pdf
*.plg
*.res
*.sig

View File

@ -1,3 +1,15 @@
o Version 4.5 (2024.05.??)
Add a new advanced option, that adds runtime UEFI media validation to suitable images (Windows, most Linux)
Move the 'Use Rufus MBR' advanced option to a cheat mode (Alt-A)
Fix truncation of VHDX images, as well as a benign error message when writing VHD/VHDX
Fix support for Linux persistence in some configurations (Mint, Ubuntu 24.04)
Fix multiple potential vulnerabilities (with thanks to Mansour Gashasbi)
Update internal GRUB to version 2.12
Update UEFI:NTFS to latest (now always uses the ntfs-3g driver, rather than the buggy AMI NTFS one)
Increase buffer size when copying ISO files, in an attempt to minimize the AMI NTFS UEFI driver bug
Improve partition creation handling
Don't display the WUE dialog when a conflicting 'unattend.xml' already exists
o Version 4.4 (2024.01.17)
Add workaround for distros that use broken symbolic links as their UEFI bootloaders (such as Mint 21.3)
Add support for GRUB 2.12

View File

@ -26,6 +26,7 @@ Features
* Create VHD/DD, VHDX and FFU images of an existing drive
* Create persistent Linux partitions
* Compute MD5, SHA-1, SHA-256 and SHA-512 checksums of the selected image
* Perform runtime validation of UEFI bootable media
* Improve Windows installation experience by automatically setting up OOBE parameters (local account, privacy options, etc.)
* Perform bad blocks checks, including detection of "fake" flash drives
* Download official Microsoft Windows 8, Windows 10 or Windows 11 retail ISOs

20
configure vendored
View File

@ -1,6 +1,6 @@
#! /bin/sh
# Guess values for system-dependent variables and create Makefiles.
# Generated by GNU Autoconf 2.71 for rufus 4.4.
# Generated by GNU Autoconf 2.71 for rufus 4.5.
#
# Report bugs to <https://github.com/pbatard/rufus/issues>.
#
@ -611,8 +611,8 @@ MAKEFLAGS=
# Identity of this package.
PACKAGE_NAME='rufus'
PACKAGE_TARNAME='rufus'
PACKAGE_VERSION='4.4'
PACKAGE_STRING='rufus 4.4'
PACKAGE_VERSION='4.5'
PACKAGE_STRING='rufus 4.5'
PACKAGE_BUGREPORT='https://github.com/pbatard/rufus/issues'
PACKAGE_URL='https://rufus.ie'
@ -1269,7 +1269,7 @@ if test "$ac_init_help" = "long"; then
# Omit some internal or obsolete options to make the list less imposing.
# This message is too long to be a string in the A/UX 3.1 sh.
cat <<_ACEOF
\`configure' configures rufus 4.4 to adapt to many kinds of systems.
\`configure' configures rufus 4.5 to adapt to many kinds of systems.
Usage: $0 [OPTION]... [VAR=VALUE]...
@ -1336,7 +1336,7 @@ fi
if test -n "$ac_init_help"; then
case $ac_init_help in
short | recursive ) echo "Configuration of rufus 4.4:";;
short | recursive ) echo "Configuration of rufus 4.5:";;
esac
cat <<\_ACEOF
@ -1428,7 +1428,7 @@ fi
test -n "$ac_init_help" && exit $ac_status
if $ac_init_version; then
cat <<\_ACEOF
rufus configure 4.4
rufus configure 4.5
generated by GNU Autoconf 2.71
Copyright (C) 2021 Free Software Foundation, Inc.
@ -1504,7 +1504,7 @@ cat >config.log <<_ACEOF
This file contains any messages produced by compilers while
running configure, to aid debugging if configure makes a mistake.
It was created by rufus $as_me 4.4, which was
It was created by rufus $as_me 4.5, which was
generated by GNU Autoconf 2.71. Invocation command line was
$ $0$ac_configure_args_raw
@ -2767,7 +2767,7 @@ fi
# Define the identity of the package.
PACKAGE='rufus'
VERSION='4.4'
VERSION='4.5'
printf "%s\n" "#define PACKAGE \"$PACKAGE\"" >>confdefs.h
@ -5309,7 +5309,7 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
# report actual input values of CONFIG_FILES etc. instead of their
# values after options handling.
ac_log="
This file was extended by rufus $as_me 4.4, which was
This file was extended by rufus $as_me 4.5, which was
generated by GNU Autoconf 2.71. Invocation command line was
CONFIG_FILES = $CONFIG_FILES
@ -5365,7 +5365,7 @@ ac_cs_config_escaped=`printf "%s\n" "$ac_cs_config" | sed "s/^ //; s/'/'\\\\\\\\
cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
ac_cs_config='$ac_cs_config_escaped'
ac_cs_version="\\
rufus config.status 4.4
rufus config.status 4.5
configured by $0, generated by GNU Autoconf 2.71,
with options \\"\$ac_cs_config\\"

View File

@ -1,4 +1,4 @@
AC_INIT([rufus], [4.4], [https://github.com/pbatard/rufus/issues], [rufus], [https://rufus.ie])
AC_INIT([rufus], [4.5], [https://github.com/pbatard/rufus/issues], [rufus], [https://rufus.ie])
AM_INIT_AUTOMAKE([-Wno-portability foreign no-dist no-dependencies])
AC_CONFIG_SRCDIR([src/rufus.c])
AC_CONFIG_MACRO_DIR([m4])

View File

@ -3,6 +3,9 @@
@echo off
setlocal EnableExtensions DisableDelayedExpansion
rem if set, this will override the version for the package
rem set VERSION_OVERRIDE=4.4.2104.0
goto main
:ReplaceTokenInFile
@ -66,13 +69,31 @@ for %%a in (%ARCHS%) do (
)
)
rem exiftool.exe can't be installed in the Windows system directories...
if not exist exiftool.exe (
echo exiftool.exe must exist in this directory
goto out
)
rem Make sure we're not trying to create a package from an ALPHA or BETA version!
exiftool -s3 -*InternalName* rufus_x64.exe | findstr /C:"ALPHA" 1>nul && (
echo Alpha version detected - ABORTED
goto out
)
exiftool -s3 -*InternalName* rufus_x64.exe | findstr /C:"BETA" 1>nul && (
echo Beta version detected - ABORTED
goto out
)
rem Populate the version from the executable
set target=%~dp0rufus_x64.exe
set target=%target:\=\\%
wmic datafile where "name='%target%'" get version | find /v "Version" > version.txt
set /p VERSION=<version.txt
set VERSION=%VERSION: =%
del version.txt
if "%VERSION_OVERRIDE%"=="" (
exiftool -s3 -*FileVersionNumber* rufus_x64.exe > version.txt
set /p VERSION=<version.txt
del version.txt
) else (
echo WARNING: Forcing version to %VERSION_OVERRIDE%
set VERSION=%VERSION_OVERRIDE%
)
echo Will create %VERSION% AppStore Bundle
pause

Binary file not shown.

View File

@ -4,4 +4,4 @@
*/
#pragma once
#define GRUB2_PACKAGE_VERSION "2.06"
#define GRUB2_PACKAGE_VERSION "2.12"

View File

@ -1,8 +1,8 @@
This directory contains the Grub 2.0 boot records that are used by Rufus
* boot.img and core.img were created from:
https://ftp.gnu.org/gnu/grub/grub-2.06.tar.xz
on a Debian 10.9 x64 system using the commands:
* boot.img and core.img were created from a patched (since the offcial GRUB 2.12 release is *BROKEN*):
https://ftp.gnu.org/gnu/grub/grub-2.12.tar.xz
on a Debian 12.5 x64 system using the commands:
./autogen.sh
# --enable-boot-time for Manjaro Linux
./configure --disable-nls --enable-boot-time

View File

@ -5,7 +5,9 @@ To edit a translation, please make sure to follow:
https://github.com/pbatard/rufus/wiki/Localization#Editing_an_existing_translation
Or simply download https://files.akeo.ie/pollock/pollock-1.5.exe and follow its directions.
o v4.?? (202?.??.??)
o v4.5 (2024.05.??)
- *UPDATED* IDC_RUFUS_MBR -> IDC_UEFI_MEDIA_VALIDATION "Enable runtime UEFI media validation"
- *UPDATED* MSG_167 "Install a UEFI bootloader, that will perform MD5Sum file validation of the media"
- *NEW* MSG_337 "An additional file ('diskcopy.dll') must be downloaded from Microsoft to install MS-DOS (...)"
- *NEW* MSG_338 "Revoked UEFI bootloader detected"
- *NEW* MSG_339 "Rufus detected that the ISO you have selected contains a UEFI bootloader that has been revoked (...)"
@ -15,8 +17,12 @@ o v4.?? (202?.??.??)
- *NEW* MSG_343 "Uncompressed VHD Image"
- *NEW* MSG_344 "Full Flash Update Image"
- *NEW* MSG_345 "Some additional data must be downloaded from Microsoft to use this functionality (...)"
- *NEW* MSG_346 "Restrict Windows to S-Mode (INCOMPATIBLE with online account bypass)"
- *NEW* MSG_347 "Expert Mode"
- *NEW* MSG_348 "Extracting archive files: %s"
- *NEW* MSG_349 "Use Rufus MBR"
o v3.22 (2023.??.??)
o v3.22 (2023.03.25)
// MSG_144 is aimed the the ISO download feature
- *UPDATED* MSG_144 "Temporarily banned by Microsoft for requesting too many downloads (...)" -> "Download of Windows ISOs is unavailable due to Microsoft having altered their website to prevent it."
// MSG_199 will appear for the ISO download feature if running on Windows 7

View File

@ -1,9 +1,9 @@
msgid ""
msgstr ""
"Project-Id-Version: 3.22\n"
"Project-Id-Version: 4.5\n"
"Report-Msgid-Bugs-To: pete@akeo.ie\n"
"POT-Creation-Date: 2023-04-24 12:17+0300\n"
"PO-Revision-Date: 2023-04-25 13:09+0100\n"
"POT-Creation-Date: 2024-04-26 10:29+0100\n"
"PO-Revision-Date: 2024-04-29 10:22+0100\n"
"Last-Translator: \n"
"Language-Team: \n"
"Language: ar_SA\n"
@ -13,7 +13,7 @@ msgstr ""
"X-Poedit-SourceCharset: UTF-8\n"
"X-Rufus-LanguageName: Arabic (العربية)\n"
"X-Rufus-LCID: 0x0401, 0x0801, 0x0c01, 0x1001, 0x1401, 0x1801, 0x1c01, 0x2001, 0x2401, 0x2801, 0x2c01, 0x3001, 0x3401, 0x3801, 0x3c01, 0x4001\n"
"X-Generator: Poedit 3.2.2\n"
"X-Generator: Poedit 3.4.2\n"
#. • IDD_DIALOG → IDS_DRIVE_PROPERTIES_TXT
msgid "Drive Properties"
@ -54,13 +54,11 @@ msgstr "قائمة محركات الأقراص الثابتة USB"
msgid "Add fixes for old BIOSes (extra partition, align, etc.)"
msgstr "إضافة إصلاحات لنظام الإدخال والإخراج الأساسي (BIOS) القديم"
#. • IDD_DIALOG → IDC_RUFUS_MBR
#. • IDD_DIALOG → IDC_UEFI_MEDIA_VALIDATION
#.
#. 'MBR': See http://en.wikipedia.org/wiki/Master_boot_record
#. Rufus can install it's own custom MBR (the Rufus MBR), which also allows users to
#. specify a custom disk ID for the BIOS. The tooltip for this control is MSG_167.
msgid "Use Rufus MBR with BIOS ID"
msgstr "استخدام Rufus MBR مع معرف BIOS"
#. It is acceptable to drop the "runtime" if you are running out of space
msgid "Enable runtime UEFI media validation"
msgstr "تمكين التحقق من صحة وسائط UEFI في وقت التشغيل"
# fixed translation since فورمات is the pronounce of format in arabic, correct translation is تهّيئة
#. • IDD_DIALOG → IDS_FORMAT_OPTIONS_TXT
@ -73,7 +71,7 @@ msgstr "نظام الملفات"
#. • IDD_DIALOG → IDS_CLUSTER_SIZE_TXT
msgid "Cluster size"
msgstr "حجم الكتلة"
msgstr "حجم المجموعة"
#. • IDD_DIALOG → IDS_LABEL_TXT
msgid "Volume label"
@ -145,7 +143,7 @@ msgstr "السجل"
#. • IDD_LOG → IDC_LOG_CLEAR
msgid "Clear"
msgstr "مسح"
msgstr "مسح الكل"
#. • IDD_LOG → IDC_LOG_SAVE
msgid "Save"
@ -215,11 +213,11 @@ msgstr ""
#. • MSG_004
msgid "Rufus update policy"
msgstr "سياسة تحديث Rufus"
msgstr "تحديث سياسة Rufus"
#. • MSG_005
msgid "Do you want to allow Rufus to check for application updates online?"
msgstr "هل تريد السماح لـ Rufus بالتحقق من تحديثات التطبيق عبر الإنترنت؟"
msgstr "هل تريد السماح لـ Rufus بالتحقق من وجود تحديثات التطبيق عبر الإنترنت؟"
#. • MSG_007
msgid "Cancel"
@ -250,7 +248,7 @@ msgid ""
"%s"
msgstr ""
"%s\n"
"يمكن الإطلاع على تقرير مفصّل خلال:\n"
"يمكن الإطلاع على تقرير مفصّل من خلال:\n"
"%s"
#. • MSG_013
@ -373,7 +371,7 @@ msgstr "إيقاف"
#. • MSG_039
msgid "Launch"
msgstr "إطلاق"
msgstr "بدأ"
#. • MSG_041
msgid "Operation cancelled by the user"
@ -407,11 +405,11 @@ msgstr "أقسام متعددة"
#. • MSG_048
msgid "Rufus - Flushing buffers"
msgstr "روفوس - تفريغ الذاكرة"
msgstr "Rufus - تفريغ الذاكرة"
#. • MSG_049
msgid "Rufus - Cancellation"
msgstr "روفوس - إلغاء"
msgstr "Rufus - إلغاء"
#. • MSG_050
msgid "Success."
@ -451,7 +449,7 @@ msgstr "معالج الجهاز غير صالح."
#. • MSG_059
msgid "The selected cluster size is not valid for this device."
msgstr "حجم الكتلة المحدد غير صالح لهذا الجهاز."
msgstr "حجم المجموعة المحدد غير صالح لهذا الجهاز."
#. • MSG_060
msgid "The volume size is invalid."
@ -509,7 +507,7 @@ msgstr "لم يكتمل فحص الأجزاء السيئة."
#. • MSG_073
msgid "ISO image scan failure."
msgstr "فشل مسح صورة قرص ISO."
msgstr "فشل فحص صورة قرص ISO."
#. • MSG_074
msgid "ISO image extraction failure."
@ -525,7 +523,7 @@ msgstr "تعذر تصحيح/إعداد ملفات الاقلاع."
#. • MSG_077
msgid "Unable to assign a drive letter."
msgstr "تعذر تعيين حرف محرك أقراص."
msgstr "تعذر تعيين حرف لمحرك أقراص."
#. • MSG_078
msgid "Can't mount GUID volume."
@ -574,14 +572,14 @@ msgid ""
"Note: The new file will be downloaded in the current directory and once a '%s' exists there, it will be reused automatically."
msgstr ""
"صورة الـISO يبدو استخدامها لإصدار قديم من '%s'. \n"
"قوائم التمهيد قد لا يتم عرضها بشكل صحيح بهذا السبب.\n"
"قوائم الإقلاع قد لا يتم عرضها بشكل صحيح بهذا السبب.\n"
"\n"
"لإصلاح الخلل يمكنك تحميل إصدار جديد من قبل روفوس:\n"
"لإصلاح الخلل يمكنك تحميل إصدار جديد من قبل Rufus:\n"
"- إختر ‘نعم’ للإتصال بالإنترنت وتحميل الملف\n"
"- إختر ‘لا’ لترك ملف الISO دون تعديل\n"
"إذا كنت لا تعرف ما عليك فعله, عليك اختيار ‘نعم’.\n"
"\n"
"ملاحظة: سيتم تحميل ملف جديد في الدليل الحالي وبعد العثور على %s هناك, سوف يتم إعادة إستخدامه تلقائياً."
"ملاحظة: سيتم تحميل ملف جديد في المجلد الحالي للتطبيق وبعد العثور على %s هناك, سوف يتم إعادة إستخدامه تلقائياً."
#. • MSG_085
msgid "Downloading %s"
@ -630,7 +628,7 @@ msgid ""
msgstr ""
"هام: هذا المحرك يحتوي على أجزاء متعددة !!\n"
"\n"
"قد يشمل ذلك أقسامًا / وحدات تخزين غير مدرجة أو حتى مرئية من Windows. إذا كنت ترغب في المتابعة، فأنت مسؤول عن أي فقد للبيانات في هذه الأقسام."
"قد يشمل ذلك أقسامًا أو وحدات تخزين غير مدرجة أو حتى مرئية من Windows. إذا كنت ترغب في المتابعة، فأنت مسؤول عن أي فقدان للبيانات في هذه الأقسام."
#. • MSG_094
msgid "Multiple partitions detected"
@ -656,11 +654,11 @@ msgid ""
"\n"
"Note: The 'FIXED/REMOVABLE' attribute is a hardware property that can only be changed using custom tools from the drive manufacturer. However those tools are ALMOST NEVER provided to the public..."
msgstr ""
"هام: أنت تحاول تثبيت 'Windows To Go'، لكن القرص المستهدف ليس لديه السمة 'FIXED'. على الأرجح سيتسبب هذا في تجمد ويندوز أثناء الإقلاع، لأن ميكروسوفت لم تصممه ليعمل مع الأقراص ذات السمة البديلة 'REMOVABLE'.\n"
"هام: أنت تحاول تثبيت 'Windows To Go'، لكن القرص المستهدف ليس لديه السمة 'FIXED'. على الأرجح سيتسبب هذا في تجمد ويندوز أثناء الإقلاع، لأن ميكروسوفت لم تصممه ليعمل مع الأقراص ذات السمة 'REMOVABLE'.\n"
"\n"
"هل لا زلت تريد الإستمرار؟\n"
"\n"
"ملاحظة: السمات 'FIXED/REMOVABLE' هي خصائص للعتاد ينكم تغييرها فقط باستعمال أدوات خاصة من مُصنع الأقراص. لكن هذه الأدوات لا تُّوفر للعامة غالبا..."
"ملاحظة: السمات 'FIXED/REMOVABLE' هي خصائص للعتاد يمكن تغييرها فقط باستعمال أدوات خاصة من مُصنع الأقراص. لكن هذه الأدوات لا تُّوفر للعامة غالبا..."
#. • MSG_099
msgid "Filesystem limitation"
@ -679,7 +677,7 @@ msgid ""
"Your platform cannot extract files from WIM archives. WIM extraction is required to create EFI bootable Windows 7 and Windows Vista USB drives. You can fix that by installing a recent version of 7-Zip.\n"
"Do you want to visit the 7-zip download page?"
msgstr ""
"لا يمكن للنظام الأساسي الخاص بك استخراج الملفات من أرشيفات WIM. يلزم استخراج WIM لإنشاء محركات أقراص USB قابلة للتمهيد من EFI لنظامي التشغيل Windows 7 و Windows Vista. يمكنك إصلاح ذلك عن طريق تثبيت إصدار حديث من 7-Zip.\n"
"لا يمكن لنظامك الأساسي استخراج الملفات من أرشيفات WIM. يلزم استخراج WIM لإنشاء محركات أقراص USB قابلة للإقلاع من EFI لنظامي التشغيل Windows 7 و Windows Vista. يمكنك إصلاح ذلك عن طريق تثبيت إصدار حديث من 7-Zip.\n"
"هل تريد زيارة صفحة التنزيل 7-zip؟"
#. • MSG_103
@ -701,13 +699,13 @@ msgid ""
"Note: The file will be downloaded in the current directory and once a '%s' exists there, it will be reused automatically."
msgstr ""
"%s أو أحدث تتطلّب ملف '%s' ليتم التثبيت.\n"
"لأن هذا الملف هو أكثر من 100KB في الحجم، ومتوفّر دائماً في ملفات ISO %s, ليس متوفّر في روفوس. \n"
"لأن هذا الملف هو أكثر من 100KB في الحجم، ومتوفّر دائماً في ملفات ISO %s, ليس متوفّرا في Rufus. \n"
"\n"
"روفوس يمكنه تحميل الملف المفقود لك: \n"
"Rufus يمكنه تحميل الملف المفقود لك: \n"
"- إختر ‘نعم’ للإتصال بالإنترنت وتحميل الملف\n"
"- إختر ‘لا’ إذا كنت تريد نسخ هذا الملف على محرك الأقراص يدوياً في وقت لاحق\n"
"\n"
"ملاحظة: سيتم تحميل ملف جديد في الدليل الحالي وبعد العثور على %s هناك, سوف يتم إعادة إستخدامه تلقائياً."
"ملاحظة: سيتم تحميل ملف جديد في المجلد الحالي للتطبيق وبعد العثور على %s هناك, سوف يتم إعادة إستخدامه تلقائياً."
#. • MSG_105
msgid ""
@ -715,11 +713,11 @@ msgid ""
"If you are sure you want to cancel, click YES. Otherwise, click NO."
msgstr ""
"الإلغاء قد يترك الجهاز في حالة غير صالحة للاستعمال.\n"
"إذا كنت متأكداً من أنك تريد الإلغاء، إضغط نعم، وإلا، إضغط لا."
"إذا كنت متأكداً من أنك تريد الإلغاء، إضغط \"نعم\"، وإلا، إضغط \"لا\"."
#. • MSG_106
msgid "Please select folder"
msgstr "الرجاء إختيار المجلد"
msgstr "الرجاء إختيار مجلد"
#. • MSG_107
msgid "All files"
@ -727,7 +725,7 @@ msgstr "جميع الملفات"
#. • MSG_108
msgid "Rufus log"
msgstr "سجلّ روفوس"
msgstr "سجلّ Rufus"
#. • MSG_109
msgid "0x%02X (Disk %d)"
@ -741,7 +739,7 @@ msgid ""
"MS-DOS cannot boot from a drive using a 64 kilobytes Cluster size.\n"
"Please change the Cluster size or use FreeDOS."
msgstr ""
"لا يمكن لـ MS-DOS التمهيد من محرك أقراص يستخدم حجم الكتلة 64 كيلو بايت.\n"
"لا يمكن لـ MS-DOS الإقلاع من محرك أقراص يستخدم حجم الكتلة 64 كيلو بايت.\n"
"الرجاء تغيير حجم الكتلة أو استخدام FreeDOS."
#. • MSG_111
@ -752,7 +750,7 @@ msgstr "حجم الكتلة غير متوافق"
#.
#. "%d:%02d" is a duration (mins:secs)
msgid "Formatting a large UDF volumes can take a lot of time. At USB 2.0 speeds, the estimated formatting duration is %d:%02d, during which the progress bar will appear frozen. Please be patient!"
msgstr "يمكن أن تستغرق تهيئة وحدات التخزين UDF الكبيرة الكثير من الوقت. عند سرعات USB 2.0، تكون مدة التهيئة المقدرة %d:%02d, حيث سيظهر شريط التقدم مجمداً. يرجى التحلي بالصبر!"
msgstr "يمكن أن تستغرق تهيئة وحدات التخزين UDF الكبيرة الكثير من الوقت. عند سرعات USB 2.0، تكون مدة التهيئة المقدرة بـ %d:%02d, حيث سيظهر شريط التقدم مجمداً. يرجى التحلي بالصبر!"
#. • MSG_113
msgid "Large UDF volume"
@ -774,11 +772,11 @@ msgstr ""
"- قم بتحديد 'نعم' للاتصال بالإنترنت وتنزيل هذه الملفات\n"
"- قم بتحديد 'لا' لإلغاء العملية\n"
"\n"
"ملاحظة: سيتم تنزيل الملفات في دليل التطبيق الحالي وستتم إعادة استخدامها تلقائيًا إذا كانت موجودة."
"ملاحظة: سيتم تنزيل الملفات في مجلد التطبيق الحالي وستتم إعادة استخدامها تلقائيًا إذا كانت موجودة."
#. • MSG_115
msgid "Download required"
msgstr "التنزيل مطلوب"
msgstr "التنزيل من الانترنت مطلوب"
#. • MSG_116
#.
@ -794,11 +792,11 @@ msgid ""
"\n"
"Note: The file will be downloaded in the current application directory and will be reused automatically if present. If no match can be found online, then the default version will be used."
msgstr ""
"هذه الصورة (الإيميج) تستعمل Grub %s لكن التطبيق يحتوي فقط على ملفات تثبيت Grub %s.\n"
"هذه الصورة (image) تستعمل Grub %s لكن التطبيق يحتوي فقط على ملفات تثبيت Grub %s.\n"
"\n"
"بما أن إصدارات Grub المختلفة قد لا تتوافق مع بعضهاالبعض، وبما أنه لا يمكن ضمها كلها، فسيحاول روفوس تحديد مكان إصدار من ملف تثبيت Grub ('core.img') يتوافق مع الموجود في صورتك:\n"
"بما أن إصدارات Grub المختلفة قد لا تتوافق مع بعضهاالبعض، وبما أنه لا يمكن ضمها كلها، فسيحاول Rufus تحديد مكان إصدار من ملف تثبيت Grub ('core.img') يتوافق مع الموجود في صورتك:\n"
"- إختر 'نعم' للاتصال بلالأنترنت ومحاولة تنزيله\n"
"- إختر 'لا' لاستعمال الإصدار الافتراضي من روفوس\n"
"- إختر 'لا' لاستعمال الإصدار الافتراضي من Rufus\n"
"- إختر 'إلغاء' لوقف العملية\n"
"\n"
"ملاحظة: سيتم تنزيل الملف في المجلد الحالي للتطبيق و سيستعمل تلقائيا إذا كان موجداً. إذا لم يتم العثور على إصدار موافق، فسيُستعمل الإصدار الافتراضي كبديل."
@ -813,7 +811,7 @@ msgstr "التثبيت القياسي لنظام التشغيل Windows"
#. http://en.wikipedia.org/wiki/Windows_To_Go in your language.
#. Otherwise, you may add a parenthesis eg. "Windows To Go (<hint at what it does>)"
msgid "Windows To Go"
msgstr ""
msgstr "Windows To Go"
#. • MSG_119
msgid "advanced drive properties"
@ -846,7 +844,7 @@ msgstr "حجم التقسيم المستمر"
#. It is okay to use "No partition" or "None" or "Deactivated" to indicate that a persistent partition will not be
#. created if the width of the control is too small (since the 'Size' edit control is *not* adjusted for width).
msgid "No persistence"
msgstr "لا استمرار"
msgstr "لا استمرارية"
#. • MSG_125
#.
@ -856,7 +854,7 @@ msgstr "حدد حجم التقسيم المستمر لجهاز ال USB الحي
#. • MSG_126
msgid "Set the partition size units."
msgstr "حدد وحدات حجم التقسيم."
msgstr "حدد حجم وحدات التقسيم."
#. • MSG_127
msgid "Do not show this message again"
@ -871,7 +869,7 @@ msgid ""
"You have just created a media that uses the UEFI:NTFS bootloader. Please remember that, to boot this media, YOU MUST DISABLE SECURE BOOT.\n"
"For details on why this is necessary, see the 'More Information' button below."
msgstr ""
"لقد قمت بإنشاء وسائط تستخدم محمل الإقلاع UEFI:NTFS. يرجى التذكر أنه يجب تعطيل Secure Boot للتمكن من إقلاع الوسائط.\n"
"لقد قمت لتوك بإنشاء وسائط تستخدم محمل الإقلاع UEFI:NTFS. يرجى التذكر أنه يجب تعطيل Secure Boot للتمكن من إقلاع الوسائط.\n"
"للمزيد من التفاصيل عن ضرورة الإجراء المذكور, إضغط على زر 'مزيد من المعلومات' أدناه."
#. • MSG_130
@ -888,7 +886,7 @@ msgstr ""
#. • MSG_132
msgid "Another program or process is accessing this drive. Do you want to format it anyway?"
msgstr "هذا القرص يستخدم من قبل برنامج / إجراء آخر. هل تود التهيئة على أية حال ؟"
msgstr "هذا القرص يستخدم من قبل برنامج آخر. هل تود التهيئة على أية حال ؟"
#. • MSG_133
msgid ""
@ -898,11 +896,11 @@ msgid ""
"\n"
"Also note that the reason Rufus cannot automatically fix this for you is that 'WppRecorder.sys' is a Microsoft copyrighted file, so we cannot legally embed a copy of the file in the application..."
msgstr ""
"لقد قام روفوس بإكتشاف أنك تحاول إنشاء وسائط Windows To Go بناءً على ISO 1809\n"
"لقد قام Rufus بإكتشاف أنك تحاول إنشاء وسائط Windows To Go بناءً على ISO 1809\n"
"\n"
"بسبب عيب في Microsoft, سوف تتوقف الوسائط خلال إقلاع Windows (شاشة الموت الزرقاء) ما لم تقم يدوياً بإستبدال ملف 'WppRecorder.sys' بإصدار 1803.\n"
"\n"
"يرجى العلم أن سبب عدم إمكانية روفوس من إصلاح المشكلة تلقائيا هو أن ملف 'WppRecorder.sys' محفوظ الحقوق ل Microsoft, لذلك لا يمكننا تضمين نسخة من الملف في التطبيق..."
"يرجى العلم أن سبب عدم إمكانية Rufus من إصلاح المشكلة تلقائيا هو أن ملف 'WppRecorder.sys' محفوظ الحقوق ل Microsoft, لذلك لا يمكننا تضمين نسخة من الملف في التطبيق..."
#. • MSG_134
msgid ""
@ -910,7 +908,7 @@ msgid ""
"\n"
"Are you sure you want to continue?"
msgstr ""
"بسبب إختيار نظام التجزئة MBR, روفوس قادر فقط على إنشاء تجزئة لغاية 2 TB على هذه الوسائط, الذي سوف يؤدي إلى عدم توفر %s من مساحة القرص.\n"
"بسبب إختيار نظام التجزئة MBR, Rufus(Rufus) قادر فقط على إنشاء تجزئة لغاية 2 TB على هذه الوسائط, الذي سوف يؤدي إلى عدم توفر %s من مساحة القرص.\n"
"\n"
"هل تريد المتابعة ؟"
@ -1035,7 +1033,7 @@ msgstr "الطريقة اللتي سيتم إستخدامها لإنشاء ال
#. • MSG_164
msgid "Method that will be used to make the drive bootable"
msgstr "الطريقة التي سيتّم إستخدامها لخلق محرك أقراص تمهيدي"
msgstr "الطريقة التي سيتّم إستخدامها لخلق محرك أقراص إقلاعي"
#. • MSG_165
msgid "Click to select or download an image..."
@ -1046,16 +1044,8 @@ msgid "Check this box to allow the display of international labels and set a dev
msgstr "حدّد هذا المربّع للسماح بعرض التسميات الدولية وتعيين أيقونة الجهاز (إنشاء autorun.inf)"
#. • MSG_167
msgid "Install an MBR that allows boot selection and can masquerade the BIOS USB drive ID"
msgstr "تثبيت MBR للسماح باختيار التمهيد ويمكن تنكّر الـ BIOS ID لقرص USB"
#. • MSG_168
msgid ""
"Try to masquerade first bootable USB drive (usually 0x80) as a different disk.\n"
"This should only be necessary if you install Windows XP and have more than one disk."
msgstr ""
"محاولة تنكّر محرّك قرص USB (عادة 0x80) كقرص مختلف.\n"
"Tهذا ضروري فقط إذا أردت تثبيت ويندوز إكس بي ولديك أكثر من قرص واحد."
msgid "Install a UEFI bootloader, that will perform MD5Sum file validation of the media"
msgstr "قم بتثبيت أداة تحميل تشغيل UEFI، و التي ستقوم بالتحقق من صحة الملف بإستخدام MD5"
#. • MSG_169
msgid ""
@ -1063,7 +1053,7 @@ msgid ""
"This can improve boot detection for older BIOSes."
msgstr ""
"إنشاء قسم إضافي خفي ومحاذاة حدود الأقسام.\n"
"هذا يمكنه تحسين إكتشاف التمهيد لـ BIOSes قديمة."
"هذا يمكنه تحسين إكتشاف الإقلاع لـ BIOSes قديمة."
#. • MSG_170
msgid "Enable the listing of USB Hard Drive enclosures. USE AT YOUR OWN RISKS!!!"
@ -1098,7 +1088,7 @@ msgstr "إصدار %d.%d (بناء %d)"
#. • MSG_176
msgid "English translation: Pete Batard <mailto:pete@akeo.ie>"
msgstr "الترجمة إلى العربية: أ. راس النعامة / عمر الصمد / فراس السيخ / عبدالمجيد"
msgstr "الترجمة إلى العربية:\\line• أ. راس النعامة \\line• عمر الصمد \\line• فراس السيخ \\line• عبدالمجيد"
#. • MSG_177
msgid "Report bugs or request enhancements at:"
@ -1130,7 +1120,7 @@ msgstr "عنوان IP الخاص بك"
#. • MSG_184
msgid "For the purpose of generating private usage statistics, we may keep the information collected, \\b for at most a year\\b0 . However, we will not willingly disclose any of this individual data to third parties."
msgstr "لغرض إنشاء إحصاءات الاستخدام الخاصة، قد نحتفظ بالمعلومات التي تم جمعها, \\b لمدة عام على الأكثر\\b0 . ومع ذلك،، فإننا لن نكشف عن أي من هذه البيانات الفردية عن طيب خاطر لأطراف ثالثة."
msgstr "لغرض إنشاء إحصاءات الاستخدام الخاصة، قد نحتفظ بالمعلومات التي تم جمعها, \\b لمدة عام على الأكثر\\b0 . ومع ذلك،، فإننا لن نكشف عن أي من هذه البيانات الفردية طوعًا لأطراف ثالثة."
#. • MSG_185
msgid "Update Process:"
@ -1141,20 +1131,20 @@ msgid ""
"Rufus does not install or run background services, therefore update checks are performed only when the main application is running.\\line\n"
"Internet access is of course required when checking for updates."
msgstr ""
"روفوس لا يقوم بتثبيت أو تشغيل خدمات خلفية, وبالتالي يتم التحقّق من تحديثات فقط عند تشغيل التطبيق الرئيسي. \\line\n"
"Rufus لا يقوم بتثبيت أو تشغيل خدمات خلفية, وبالتالي يتم التحقّق من تحديثات فقط عند تشغيل التطبيق الرئيسي. \\line\n"
"الإتصال بالإنترنت بالطبع مطلوب عند التحقّق من وجود تحديثات."
#. • MSG_187
msgid "Invalid image for selected boot option"
msgstr "صورة (إيميج) غير صالحة للخيار التمهيدي المحدّد"
msgstr "صورة (image) غير صالحة للخيار الإقلاعي المحدّد"
#. • MSG_188
msgid "The current image doesn't match the boot option selected. Please use a different image or choose a different boot option."
msgstr "الصورة (الإيميج) الحالية لا تتطابق مع الخيار التمهيدي المحدّد. يُرجى إستخدام صورة مختلفة أو تحديد خيار تمهيدي آخر."
msgstr "الصورة (image) الحالية لا تتطابق مع الخيار الإقلاعي المحدّد. يُرجى إستخدام صورة مختلفة أو تحديد خيار إقلاعي آخر."
#. • MSG_189
msgid "This ISO image is not compatible with the selected filesystem"
msgstr "صورة (إيميج) ISO هذه غير متوافقة مع نظام الملفات المحدّد"
msgstr "صورة ISO هذه غير متوافقة مع نظام الملفات المحدّد"
#. • MSG_190
msgid "Incompatible drive detected"
@ -1196,7 +1186,7 @@ msgstr ""
"هام: هذا القرص يستخدم حجم قطاع غير قياسي!\n"
"\n"
"الأقراص التقليدية تستعمل 512-بايت كحجن قطاع لكن هذا القراص يستعمل %d-بايت. في العديد من الحالات، هذا يعني أنك لن تستطيع الإقلاع من هذا القرص.\n"
"يستطيع روفوس محاولة إنشاء قرص إقلاع، لكن من دون ضمان أنه سيعمل."
"يستطيع Rufus محاولة إنشاء قرص إقلاع، لكن من دون ضمان أنه سيعمل."
#. • MSG_197
msgid "Nonstandard sector size detected"
@ -1204,7 +1194,7 @@ msgstr "إكتشاف حجم قطاع غير قياسي"
#. • MSG_198
msgid "'Windows To Go' can only be installed on a GPT partitioned drive if it has the FIXED attribute set. The current drive was not detected as FIXED."
msgstr "يمكن تثبيت 'Windows To Go' على قرص بتقسيمات GPT فقط إذا كان عندهالسمة FIXED مُحددة. لم يتم إكتشاف FIXED في القرص الحالي."
msgstr "يمكن تثبيت 'Windows To Go' فقط على قرص بتقسيمات GPT إذا كان عنده السمة FIXED مُحددة. لم يتم إكتشاف FIXED في القرص الحالي."
#. • MSG_199
msgid "This feature is not available on this platform."
@ -1216,17 +1206,17 @@ msgstr "جاري الإلغاء الرجاء الإنتظار..."
#. • MSG_202
msgid "Scanning image..."
msgstr "مسح الصورة..."
msgstr "فحص الصورة (image)..."
#. • MSG_203
msgid "Failed to scan image"
msgstr "فشل لمسح الصورة"
msgstr "فشل فحص الصورة"
#. • MSG_204
#.
#. %s is the name of an obsolete Syslinux .c32 module. Example: "Obsolete vesamenu.c32 detected"
msgid "Obsolete %s detected"
msgstr "إكتشاف %s قديمة مهملة"
msgstr "إكتشاف %s قديمة"
#. • MSG_205
#.
@ -1285,13 +1275,13 @@ msgstr "فشل إطلاق تطبيق جديد"
#.
#. Example: "Opened some_file.txt"
msgid "Opened %s"
msgstr "فتح %s"
msgstr "تم فتح %s"
#. • MSG_216
#.
#. Example: "Saved rufus.log"
msgid "Saved %s"
msgstr "حفظ %s"
msgstr "تم حفظ %s"
#. • MSG_217
#.
@ -1301,11 +1291,11 @@ msgstr "التهيئة: %s"
#. • MSG_218
msgid "Creating file system: Task %d/%d completed"
msgstr "إنشاء نظام الملفات: تمت %d/%d عملية"
msgstr "إنشاء نظام الملفات: عملية %d/%d تمت"
#. • MSG_219
msgid "NTFS Fixup: %d%% completed"
msgstr "إصلاح NTFS: تم %d%%"
msgstr "إصلاح NTFS: تم إصلاح %d%%"
#. • MSG_220
#.
@ -1313,7 +1303,7 @@ msgstr "إصلاح NTFS: تم %d%%"
#. Example: "Formatting (UDF) - Estimated duration 3:21..."
#. If "estimated duration" is too long, just use "estimated" or an abbreviation
msgid "Formatting (%s) - estimated duration %d:%02d..."
msgstr "فرمتة (%s) تقديرياً %d:%02d..."
msgstr "فرمتة (%s) المدة التقديرية %d:%02d..."
#. • MSG_221
msgid "Setting label (%s)..."
@ -1339,7 +1329,7 @@ msgstr "طلب الوصول إلى القرص..."
#. • MSG_226
msgid "Analyzing existing boot records..."
msgstr "تحليل سجلّات التمهيد الموجودة..."
msgstr "تحليل سجلّات الإقلاع الموجودة..."
#. • MSG_227
msgid "Closing existing volume..."
@ -1347,11 +1337,11 @@ msgstr "غلق وحدة التخزين الموجودة..."
#. • MSG_228
msgid "Writing Master Boot Record..."
msgstr "كتابة سجلّ التمهيد الرئيسي (MBR) ..."
msgstr "كتابة سجلّ الإقلاع الرئيسي (MBR) ..."
#. • MSG_229
msgid "Writing Partition Boot Record..."
msgstr "كتابة سجل تمهيد القسم ..."
msgstr "كتابة سجل إقلاع القسم ..."
#. • MSG_230
msgid "Copying DOS files..."
@ -1363,7 +1353,7 @@ msgstr "نسخ ملفات الـISO: %s"
#. • MSG_232
msgid "Win7 EFI boot setup (%s)..."
msgstr "إعداد تمهيد EFI ل ويندوز7 (%s)..."
msgstr "إعداد إقلاع EFI ل ويندوز7 (%s)..."
#. • MSG_233
msgid "Finalizing, please wait..."
@ -1423,7 +1413,7 @@ msgstr "فشل في تحميل الملف."
#. • MSG_243
msgid "Checking for Rufus updates..."
msgstr "التحقّق من تحديثات روفوس..."
msgstr "التحقّق من تحديثات Rufus..."
#. • MSG_244
msgid "Updates: Unable to connect to the internet"
@ -1435,11 +1425,11 @@ msgstr "التحديثات: عدم القدرة على الوصول إلى بي
#. • MSG_246
msgid "A new version of Rufus is available!"
msgstr "إصدار جديد متاح من روفوس!"
msgstr "إصدار جديد متاح من Rufus!"
#. • MSG_247
msgid "No new version of Rufus was found"
msgstr "لم يتم العثور على إصدار جديد من روفوس"
msgstr "لم يتم العثور على إصدار جديد من Rufus"
#. • MSG_248
msgid "Application registry keys successfully deleted"
@ -1493,7 +1483,7 @@ msgstr "فرض التحديث"
#. • MSG_260
msgid "NTFS compression"
msgstr "إنضغاط NTFS"
msgstr "ضغط NTFS"
#. • MSG_261
msgid "Writing image: %s"
@ -1509,11 +1499,11 @@ msgstr "دعم ISO"
#.
#. Cheat mode to force legacy size units, where 1 KB is 1024 bytes and NOT that fake 1000 bytes abomination!
msgid "Use PROPER size units"
msgstr "استعمل وحدات حجم مناسبة"
msgstr "استعمل وحدات حجم مناسبة (PROPER)"
#. • MSG_264
msgid "Deleting directory '%s'"
msgstr "حذف الدليل '%s'"
msgstr "حذف المجلد '%s'"
#. • MSG_265
msgid "VMWare disk detection"
@ -1529,7 +1519,7 @@ msgstr "تطبيق صورة (نسخة) ويندوز: %s"
#. • MSG_268
msgid "Applying Windows image..."
msgstr "تطبيق صورة (إيميج) ويندوز..."
msgstr "تطبيق صورة (نسخة) ويندوز..."
#. • MSG_269
msgid "Preserve timestamps"
@ -1541,7 +1531,7 @@ msgstr "تنقيح الأخطاء عن طريق USB"
#. • MSG_271
msgid "Computing image checksums: %s"
msgstr "حساب مجاميع اختبار (Checksums) الصورة: %s"
msgstr "حساب مجاميع الإختبار (Checksums) للصورة (Image): %s"
#. • MSG_272
msgid "Compute the MD5, SHA1 and SHA256 checksums for the selected image"
@ -1565,8 +1555,8 @@ msgid ""
"\n"
"Please select the mode that you want to use to write this image:"
msgstr ""
"الصورة التي اخترتها هي صورة 'ISOHybrid'. هذا يعني أنه يمكن كتابتها في نمط %s (نسخة ملف) أو نمط %s.\n"
" (صورة قرص)روفوس يوصي باستعمال نمط %s، كي تتمكن دوما من الوصول الكامل إلى القرص بعد كتابته.\n"
"الصورة التي اخترتها هي صورة 'ISOHybrid'. هذا يعني أنه يمكن كتابتها إما في نمط نسخة ملف %s وإما في نمط نسخة قرص %s.\n"
" Rufus يوصي باستعمال نمط %s، كي تتمكن دوما من الوصول الكامل إلى القرص بعد كتابته.\n"
"لكن، إذا واجهت مشاكلا خلال الإقلاع يمكنك محاولة كتابة هاته الصورة مرة أخرى في نمط %s.\n"
"\n"
"فضلا اختر النمط الذي تريده لكتابة هاته الصورة:"
@ -1609,7 +1599,7 @@ msgstr "التوفيع الرقمي غير صالح"
#. • MSG_284
msgid "The downloaded executable is missing a digital signature."
msgstr "الملف التنفيذي المحمل ينقصه توقيع رقمي معين."
msgstr "الملف التنفيذي المحمل ينقصه توقيع رقمي."
#. • MSG_285
msgid ""
@ -1627,11 +1617,11 @@ msgstr "تصفير القرص: %s"
#. • MSG_287
msgid "Detection of non-USB removable drives"
msgstr "الكشف عن أقراص الUSB القابلة للإزالة"
msgstr "الكشف عن الأقراص غير USB القابلة للإزالة"
#. • MSG_288
msgid "Missing elevated privileges"
msgstr "صلاحيات رفيعة مفقوده"
msgstr "عدم التوفر على صلاحيات رفيعة"
#. • MSG_289
msgid "This application can only run with elevated privileges"
@ -1671,7 +1661,7 @@ msgid ""
"\n"
"Are you sure you want to run it?"
msgstr ""
"هذا الإصدار من روفوس لم يتم إنتاجه من قبل المطورين الرسميين.\n"
"هذا الإصدار من Rufus لم يتم إنتاجه من قبل المطورين الرسميين.\n"
"\n"
"؟هل أنت متأكد من الأستمرار?"
@ -1691,7 +1681,7 @@ msgstr ""
"\n"
"إذا قمت بالحصول على هذا الملف من الإنترنت, يجب عليك تحميل نسخة جديدة و التحقق من أن المجموع الإختباري لMD5 و SHA مطابق للنسخ(ة) الأصلية.\n"
"\n"
"علماُ بانه يمكنك مقارنة الMD5 و SHA في روفوس عن طريق الضغط على زر (✓)"
"علماُ بانه يمكنك مقارنة الMD5 و SHA في Rufus عن طريق الضغط على زر (✓)"
#. • MSG_299
msgid "Timestamp validation error"
@ -1705,7 +1695,7 @@ msgid ""
msgstr ""
"Rufus لم يتمكن من التحقق أن الطابع الزمني للتحديث الذي تم تنزيله أحدث من ذلك الذي في البرنامج التنفيذي الحالي. \n"
"\n"
" من أجل منع سيناريوهات الهجوم المحتملة, تم إحباط عملية الاتحديث و سيتم حذف التحديث, الرجاء التحقق من السجل لمزيد من التفاصيل."
" من أجل منع سيناريوهات الهجوم المحتملة, تم إحباط عملية التحديث و سيتم حذف التحديث, الرجاء التحقق من السجل لمزيد من التفاصيل."
#. • MSG_301
msgid "Show application settings"
@ -1752,7 +1742,7 @@ msgid ""
"\n"
"Please select the mode that you want to use to write this image:"
msgstr ""
"يستخدم ISO الذي حددته UEFI وهو صغير بما يكفي ليتم كتابته كقسم نظام EFI (ESP). يمكن أن تكون الكتابة إلى ESP ، بدلاً من الكتابة إلى قسم بيانات عام يشغل القرص بأكمله ، هي الأفضل لبعض أنواع التثبيتات.\n"
"يستخدم ISO الذي حددته UEFI وهو صغير بما يكفي ليتم كتابته كقسم نظام EFI (ESP). يمكن أن تكون الكتابة إلى ESP ، بدلاً من الكتابة إلى قسم بيانات عام تشغل القرص بأكمله ، هي الأفضل لبعض أنواع التثبيتات.\n"
"\n"
"الرجاء تحديد الوضع الذي تريد استخدامه لكتابة هذه الصورة(Image):"
@ -1786,11 +1776,11 @@ msgstr "رقم تعريف القرص"
#. • MSG_318
msgid "Default thread priority: %d"
msgstr "الأفضلية الافتراضية لمؤشر الترابط: %d"
msgstr "الأفضلية الافتراضية لـ thread : %d"
#. • MSG_319
msgid "Ignore Boot Marker"
msgstr "تجاهل علامة التمهيد"
msgstr "تجاهل علامة الإقلاع"
#. • MSG_320
msgid "Refreshing partition layout (%s)..."
@ -1801,8 +1791,8 @@ msgid ""
"The image you have selected is an ISOHybrid, but its creators have not made it compatible with ISO/File copy mode.\n"
"As a result, DD image writing mode will be enforced."
msgstr ""
"الصورة التي حددتها هي ISO-Hybrid (هجينة) ، لكن منشئوها لم يجعلوها متوافقة مع وضع نسخ ملف ISO. \n"
"نتيجة لذلك ، سيتم فرض وضع كتابة صورة DD."
"الصورة التي حددتها هي ISO-Hybrid (هجينة) ، لكن منشئوها لم يجعلوها متوافقة مع وضع نسخ ملف ISO. \n"
"نتيجة لذلك ، سيتم فرض وضع DD لكتابة الصورة."
#. • MSG_322
msgid "Unable to open or read '%s'"
@ -1810,7 +1800,7 @@ msgstr "غير قادر على فتح أو قراءة '%s'"
#. • MSG_325
msgid "Applying Windows customization: %s"
msgstr "تطبيق تخصيص ويندوز: %s"
msgstr "جاري تطبيق تخصيصات ويندوز: %s"
#. • MSG_326
msgid "Applying user options..."
@ -1830,7 +1820,7 @@ msgstr "قم بإزالة متطلبات 4GB + RAM ، Secure Boot و TPM 2.0"
#. • MSG_330
msgid "Remove requirement for an online Microsoft account"
msgstr "إزالة متطلبات حساب مايكروسوفت عبر الإنترنت"
msgstr "قم بإزالة متطلبات حساب مايكروسوفت عبر الإنترنت"
#. • MSG_331
msgid "Disable data collection (Skip privacy questions)"
@ -1856,11 +1846,87 @@ msgstr "تعطيل التشفير التلقائي BitLocker للجهاز"
msgid "Persistent log"
msgstr "سجل متواصل"
#. • MSG_337
msgid ""
"An additional file ('diskcopy.dll') must be downloaded from Microsoft to install MS-DOS:\n"
"- Select 'Yes' to connect to the Internet and download it\n"
"- Select 'No' to cancel the operation\n"
"\n"
"Note: The file will be downloaded in the application's directory and will be reused automatically if present."
msgstr ""
"يجب تنزيل ملف إضافي ('diskcopy.dll') من Microsoft لتثبيت MS-DOS:\n"
"- حدد \"نعم\" للاتصال بالإنترنت وتنزيله\n"
"- اختر \"لا\" لإلغاء العملية\n"
"\n"
"ملاحظة: سيتم تنزيل الملف في مجلد التطبيق وسيتم إعادة استخدامه تلقائيًا إذا كان موجودًا."
#. • MSG_338
msgid "Revoked UEFI bootloader detected"
msgstr "تم اكتشاف أداة تحميل التشغيل UEFI التي تم إبطالها سابقا"
#. • MSG_339
msgid ""
"Rufus detected that the ISO you have selected contains a UEFI bootloader that has been revoked and that will produce %s, when Secure Boot is enabled on a fully up to date UEFI system.\n"
"\n"
"- If you obtained this ISO image from a non reputable source, you should consider the possibility that it might contain UEFI malware and avoid booting from it.\n"
"- If you obtained it from a trusted source, you should try to locate a more up to date version, that will not produce this warning."
msgstr ""
"اكتشف Rufus أن ملف ISO الذي حددته يحتوي على أداة تحميل التشغيل UEFI التي تم إبطالها سابقا والتي ستنتج %s، عند تمكين Secure Boot محدث بالكامل على نظام UEFI .\n"
"\n"
"- إذا حصلت على صورة ISO هذه من مصدر غير حسن السمعة، فيجب أن تفكر في احتمالية احتوائها على برامج UEFI ضارة وتجنب التشغيل منها.\n"
"- إذا حصلت على صورة ISO هذه من مصدر موثوق به، فعليك محاولة العثور على إصدار أكثر حداثة، والذي لن ينتج عنه هذا التحذير."
#. • MSG_340
msgid "a \"Security Violation\" screen"
msgstr "شاشة \"الانتهاكات الأمنية\""
#. • MSG_341
msgid "a Windows Recovery Screen (BSOD) with '%s'"
msgstr "شاشة استرداد ويندوز (BSOD) مع '%s'"
#. • MSG_342
msgid "Compressed VHDX Image"
msgstr "صورة VHDX مضغوطة"
#. • MSG_343
msgid "Uncompressed VHD Image"
msgstr "صورة VHD غير مضغوطة"
#. • MSG_344
msgid "Full Flash Update Image"
msgstr "صورة (image) لتحديث فلاشة كاملة (FFU)"
#. • MSG_345
msgid ""
"Some additional data must be downloaded from Microsoft to use this functionality:\n"
"- Select 'Yes' to connect to the Internet and download it\n"
"- Select 'No' to cancel the operation"
msgstr ""
"يجب تنزيل بعض البيانات الإضافية من Microsoft لاستخدام هذه الوظيفة:\n"
"- اختر \"نعم\" للاتصال بالإنترنت وتنزيلها\n"
"- اختر \"لا\" لإلغاء العملية"
#. • MSG_346
msgid "Restrict Windows to S-Mode (INCOMPATIBLE with online account bypass)"
msgstr "تقييد Windows على الوضع \"S\" (S-Mode، غير متوافق مع تجاوز الحساب عبر الإنترنت)"
#. • MSG_347
msgid "Expert Mode"
msgstr "وضع الخبير"
#. • MSG_348
msgid "Extracting archive files: %s"
msgstr "استخراج ملفات الأرشيف: %s"
#. • MSG_349
msgid "Use Rufus MBR"
msgstr "استخدم Refus MBR"
#. • MSG_900
#.
#. The following messages are for the Windows Store listing only and are not used by the application
msgid "Rufus is a utility that helps format and create bootable USB flash drives, such as USB keys/pendrives, memory sticks, etc."
msgstr "برنامج Rufus هو أداة تساعد في تنسيق وإنشاء أقراص الإقلاع عن طريق USB، مثل مفاتيح USB، بطاقات الذاكرة، وغيرها."
msgstr "برنامج Rufus هو أداة تساعد في تنسيق وإنشاء أقراص الإقلاع USB، مثل مفاتيح USB، بطاقات الذاكرة، وغيرها."
#. • MSG_901
msgid "Official site: %s"
@ -1889,7 +1955,7 @@ msgstr ""
#.
#. Keyword for "boot" will be used for search in the Windows Store
msgid "Boot"
msgstr "التمهيد (Boot)"
msgstr "الإقلاع (Boot)"
#. • MSG_910
#.
@ -1899,19 +1965,19 @@ msgstr "تهيئة USB وبطاقة الفلاش ومحركات الأقراص
#. • MSG_911
msgid "Create FreeDOS bootable USB drives"
msgstr "إنشاء محركات أقراص USB قابلة للتشغيل من FreeDOS"
msgstr "إنشاء محركات أقراص USB قابلة للإقلاع من FreeDOS"
#. • MSG_912
msgid "Create bootable drives from bootable ISOs (Windows, Linux, etc.)"
msgstr "إنشاء محركات أقراص قابلة للتمهيد من ملفات ISO القابلة للتمهيد (Windows و Linux وما إلى ذلك)"
msgstr "إنشاء محركات أقراص قابلة للإقلاع من ملفات ISO القابلة للإقلاع (Windows و Linux وما إلى ذلك)"
#. • MSG_913
msgid "Create bootable drives from bootable disk images, including compressed ones"
msgstr "إنشاء محركات أقراص قابلة للتمهيد من صور الأقراص القابلة للتمهيد ، بما في ذلك الأقراص المضغوطة"
msgstr "إنشاء محركات أقراص قابلة للإقلاع من صور الأقراص القابلة للإقلاع ، بما في ذلك الأقراص المضغوطة"
#. • MSG_914
msgid "Create BIOS or UEFI bootable drives, including UEFI bootable NTFS"
msgstr "إنشاء BIOS أو محركات أقراص UEFI قابلة للتمهيد ، بما في ذلك NTFS القابل للتشغيل من UEFI"
msgstr "إنشاء BIOS أو محركات أقراص UEFI قابلة للإقلاع ، بما في ذلك UEFI NTFS القابل للتشغيل"
#. • MSG_915
msgid "Create 'Windows To Go' drives"
@ -1919,7 +1985,7 @@ msgstr "إنشاء محركات أقراص \"Windows To Go\""
#. • MSG_916
msgid "Create Windows 11 installation drives for PCs that don't have TPM or Secure Boot"
msgstr "قم بإنشاء محركات تثبيت ويندوز 11 لأجهزة الكمبيوتر التي لا تحتوي على TPM أو التمهيد الآمن"
msgstr "قم بإنشاء محركات تثبيت ويندوز 11 لأجهزة الكمبيوتر التي لا تحتوي على TPM أو الإقلاع الآمن (Secure Boot)"
#. • MSG_917
msgid "Create persistent Linux partitions"
@ -1931,7 +1997,7 @@ msgstr "إنشاء صور VHD / DD لمحرك الأقراص المحدد"
#. • MSG_919
msgid "Compute MD5, SHA-1, SHA-256 and SHA-512 checksums of the selected image"
msgstr "حساب المجموع الاختباري MD5 و SHA-1 و SHA-256 و SHA-512 للصورة المحددة"
msgstr "حساب المجاميع الإختبارية MD5 و SHA-1 و SHA-256 و SHA-512 للصورة المحددة"
#. • MSG_920
msgid "Perform bad blocks checks, including detection of \"fake\" flash drives"

View File

@ -1,9 +1,9 @@
msgid ""
msgstr ""
"Project-Id-Version: 3.22\n"
"Project-Id-Version: 4.5\n"
"Report-Msgid-Bugs-To: pete@akeo.ie\n"
"POT-Creation-Date: 2023-02-16 20:14+0100\n"
"PO-Revision-Date: 2023-02-17 12:30+0000\n"
"POT-Creation-Date: 2024-04-25 20:58+0200\n"
"PO-Revision-Date: 2024-04-25 21:23+0200\n"
"Last-Translator: \n"
"Language-Team: \n"
"Language: cs_CZ\n"
@ -13,7 +13,7 @@ msgstr ""
"X-Poedit-SourceCharset: UTF-8\n"
"X-Rufus-LanguageName: Czech (Čeština)\n"
"X-Rufus-LCID: 0x0405\n"
"X-Generator: Poedit 3.2.2\n"
"X-Generator: Poedit 3.4.2\n"
#. • IDD_DIALOG → IDS_DRIVE_PROPERTIES_TXT
msgid "Drive Properties"
@ -54,13 +54,11 @@ msgstr "Seznam USB disků"
msgid "Add fixes for old BIOSes (extra partition, align, etc.)"
msgstr "Přidat opravu pro starší BIOSy (extra partition, align, etc.)"
#. • IDD_DIALOG → IDC_RUFUS_MBR
#. • IDD_DIALOG → IDC_UEFI_MEDIA_VALIDATION
#.
#. 'MBR': See http://en.wikipedia.org/wiki/Master_boot_record
#. Rufus can install it's own custom MBR (the Rufus MBR), which also allows users to
#. specify a custom disk ID for the BIOS. The tooltip for this control is MSG_167.
msgid "Use Rufus MBR with BIOS ID"
msgstr "Použijte Rufus MBR s ID BIOS"
#. It is acceptable to drop the "runtime" if you are running out of space
msgid "Enable runtime UEFI media validation"
msgstr "Povolit ověřování médií UEFI za běhu"
#. • IDD_DIALOG → IDS_FORMAT_OPTIONS_TXT
msgid "Format Options"
@ -105,7 +103,7 @@ msgstr "Zavřít"
#. • IDD_DIALOG → IDC_START
msgid "Start"
msgstr ""
msgstr "Spustit"
#. • IDD_ABOUTBOX → IDD_ABOUTBOX
msgid "About Rufus"
@ -397,7 +395,7 @@ msgstr "Zařízení USB (Obecné)"
#. • MSG_046
msgid "%s (Disk %d) [%s]"
msgstr ""
msgstr "%s (Disk %d) [%s]"
#. • MSG_047
#.
@ -770,7 +768,7 @@ msgid ""
msgstr ""
"Tento obraz používá Syslinux %s%s, tato aplikace však obsahuje pouze instalační soubory pro Syslinux %s%s.\n"
"\n"
"Jelikož nové verze Syslinux nejsou vzájemně kompatibilní a není možné v programu Rufus zahrnout všechny verze, je nutné z Internetu stáhnout dodatečné dva soubory (ldlinux.sys a ldlinux.bss):\n"
"Jelikož nové verze Syslinux nejsou vzájemně kompatibilní a není možné v programu Rufus zahrnout všechny verze, je nutné z Internetu stáhnout dodatečné dva soubory (ldlinux.sys a ldlinux.bss):\n"
"- Zvolte 'Ano' pro stažení souborů z Internetu\n"
"- Zvolte 'Ne' pro zrušení operace\n"
"\n"
@ -1047,16 +1045,8 @@ msgid "Check this box to allow the display of international labels and set a dev
msgstr "Povolíte v názvu disku zobrazení mezinárodních znaků a vytvoření ikony zařízení (vytvořením souboru autorun.inf)"
#. • MSG_167
msgid "Install an MBR that allows boot selection and can masquerade the BIOS USB drive ID"
msgstr "Instalovat MBR, který umožní výběr při zavádění systému a zamaskování BIOS ID disku USB"
#. • MSG_168
msgid ""
"Try to masquerade first bootable USB drive (usually 0x80) as a different disk.\n"
"This should only be necessary if you install Windows XP and have more than one disk."
msgstr ""
"Pokusit se o zamaskování boot USB jednotky (většinou 0x80) jako jiného disku.\n"
"Obvykle nutné pouze pokud chcete instalovat Windows XP a máte více jak jeden disk."
msgid "Install a UEFI bootloader, that will perform MD5Sum file validation of the media"
msgstr "Nainstalujte zavaděč UEFI, který provede ověření souboru MD5Sum na médiu"
#. • MSG_169
msgid ""
@ -1410,7 +1400,7 @@ msgid ""
"\n"
"The download will be deleted. Please check the log for more details."
msgstr ""
"Podpis stažené aktualizace nelze ověřit. To může znamenat, že systém je nesprávně nakonfigurován pro ověření podpisu nebo označil stažený soubor jako škodlivý.\n"
"Podpis stažené aktualizace nelze ověřit. To může znamenat, že systém je nesprávně nakonfigurován pro ověření podpisu nebo označil stažený soubor jako škodlivý.\n"
"\n"
"Stahování bude smazáno. Zkontrolujte podrobnosti v protokolu."
@ -1857,6 +1847,82 @@ msgstr "Zakázání automatického šifrování zařízení nástrojem BitLocker
msgid "Persistent log"
msgstr "Trvalý protokol"
#. • MSG_337
msgid ""
"An additional file ('diskcopy.dll') must be downloaded from Microsoft to install MS-DOS:\n"
"- Select 'Yes' to connect to the Internet and download it\n"
"- Select 'No' to cancel the operation\n"
"\n"
"Note: The file will be downloaded in the application's directory and will be reused automatically if present."
msgstr ""
"Pro instalaci systému MS-DOS je nutné stáhnout další soubor ('diskcopy.dll') od společnosti Microsoft:\n"
"- Vyberte 'Ano' pro připojení k internetu a stažení\n"
"- Výběrem možnosti \"Ne\" operaci zrušíte\n"
"\n"
"Poznámka: Soubor bude stažen do adresáře aplikace a bude automaticky znovu použit, pokud je přítomen."
#. • MSG_338
msgid "Revoked UEFI bootloader detected"
msgstr "Byl zjištěn odvolaný zavaděč UEFI"
#. • MSG_339
msgid ""
"Rufus detected that the ISO you have selected contains a UEFI bootloader that has been revoked and that will produce %s, when Secure Boot is enabled on a fully up to date UEFI system.\n"
"\n"
"- If you obtained this ISO image from a non reputable source, you should consider the possibility that it might contain UEFI malware and avoid booting from it.\n"
"- If you obtained it from a trusted source, you should try to locate a more up to date version, that will not produce this warning."
msgstr ""
"Rufus zjistil, že vámi vybraný ISO obsahuje zavaděč UEFI, který byl odvolán a který vytvoří %s, když je v plně aktuálním systému UEFI povoleno Secure Boot.\n"
"\n"
"- Pokud jste tento obraz ISO získali z nerenomovaného zdroje, měli byste zvážit možnost, že by mohl obsahovat malware UEFI a vyhnout se bootování z něj.\n"
"- Pokud jste jej získali z důvěryhodného zdroje, měli byste se pokusit najít aktuálnější verzi, která toto varování nevyvolá."
#. • MSG_340
msgid "a \"Security Violation\" screen"
msgstr "obrazovka \"Porušení zabezpečení\""
#. • MSG_341
msgid "a Windows Recovery Screen (BSOD) with '%s'"
msgstr "a Obrazovka zotavení systému Windows (BSOD) s '%s'"
#. • MSG_342
msgid "Compressed VHDX Image"
msgstr "Komprimovaný obraz VHDX"
#. • MSG_343
msgid "Uncompressed VHD Image"
msgstr "Nekomprimovaný obraz VHD"
#. • MSG_344
msgid "Full Flash Update Image"
msgstr "Úplná aktualizace Flash Image"
#. • MSG_345
msgid ""
"Some additional data must be downloaded from Microsoft to use this functionality:\n"
"- Select 'Yes' to connect to the Internet and download it\n"
"- Select 'No' to cancel the operation"
msgstr ""
"K použití této funkce je třeba stáhnout některá další data od společnosti Microsoft:\n"
"- Vyberte 'Ano' pro připojení k internetu a stažení\n"
"- Výběrem možnosti \"Ne\" operaci zrušíte"
#. • MSG_346
msgid "Restrict Windows to S-Mode (INCOMPATIBLE with online account bypass)"
msgstr "Omezit Windows na S-Mode (NEKOMPATIBILNÍ s online vynecháním účtu)"
#. • MSG_347
msgid "Expert Mode"
msgstr "Expertní režim"
#. • MSG_348
msgid "Extracting archive files: %s"
msgstr "Rozbalení archivních souborů: %s"
#. • MSG_349
msgid "Use Rufus MBR"
msgstr "Použijte Rufus MBR"
#. • MSG_900
#.
#. The following messages are for the Windows Store listing only and are not used by the application

View File

@ -1,9 +1,9 @@
msgid ""
msgstr ""
"Project-Id-Version: 3.22\n"
"Project-Id-Version: 4.5\n"
"Report-Msgid-Bugs-To: pete@akeo.ie\n"
"POT-Creation-Date: 2023-04-05 13.03+0200\n"
"PO-Revision-Date: 2023-04-25 13:46+0100\n"
"POT-Creation-Date: 2024-04-25 13:41-0700\n"
"PO-Revision-Date: 2024-04-25 14:34-0700\n"
"Last-Translator: \n"
"Language-Team: \n"
"Language: da_DK\n"
@ -13,7 +13,7 @@ msgstr ""
"X-Poedit-SourceCharset: UTF-8\n"
"X-Rufus-LanguageName: Danish (Dansk)\n"
"X-Rufus-LCID: 0x0406\n"
"X-Generator: Poedit 3.2.2\n"
"X-Generator: Poedit 3.4.2\n"
#. • IDD_DIALOG → IDS_DRIVE_PROPERTIES_TXT
msgid "Drive Properties"
@ -54,13 +54,11 @@ msgstr "Vis USB-harddiske"
msgid "Add fixes for old BIOSes (extra partition, align, etc.)"
msgstr "Tilføj rettelser for ældre BIOS'er"
#. • IDD_DIALOG → IDC_RUFUS_MBR
#. • IDD_DIALOG → IDC_UEFI_MEDIA_VALIDATION
#.
#. 'MBR': See http://en.wikipedia.org/wiki/Master_boot_record
#. Rufus can install it's own custom MBR (the Rufus MBR), which also allows users to
#. specify a custom disk ID for the BIOS. The tooltip for this control is MSG_167.
msgid "Use Rufus MBR with BIOS ID"
msgstr "Brug Rufus MBR med BIOS ID"
#. It is acceptable to drop the "runtime" if you are running out of space
msgid "Enable runtime UEFI media validation"
msgstr "Slå runtime UEFI medie validering til"
#. • IDD_DIALOG → IDS_FORMAT_OPTIONS_TXT
msgid "Format Options"
@ -1044,16 +1042,8 @@ msgid "Check this box to allow the display of international labels and set a dev
msgstr "Vælg denne mulighed for at tillade visning af internationale etiketter og skabe et enheds-ikon (opretter en autorun.inf)"
#. • MSG_167
msgid "Install an MBR that allows boot selection and can masquerade the BIOS USB drive ID"
msgstr "Installer en MBR, der tillader boot valg og kan maskere et BIOS USB-drev ID"
#. • MSG_168
msgid ""
"Try to masquerade first bootable USB drive (usually 0x80) as a different disk.\n"
"This should only be necessary if you install Windows XP and have more than one disk."
msgstr ""
"Forsøg at maskere det først fundne USB boot-drev (normalt 0x80) som en anden disk.\n"
"Dette burde kun være nødvendigt hvis du installerer Windows XP og ejer mere end én disk."
msgid "Install a UEFI bootloader, that will perform MD5Sum file validation of the media"
msgstr "Installer en UEFI bootloader, der vil udføre en MD5Sum fil validering af mediet"
#. • MSG_169
msgid ""
@ -1856,6 +1846,82 @@ msgstr "Deaktiver Bitlockers automatiske apparat kryptering"
msgid "Persistent log"
msgstr "Vedvarende log"
#. • MSG_337
msgid ""
"An additional file ('diskcopy.dll') must be downloaded from Microsoft to install MS-DOS:\n"
"- Select 'Yes' to connect to the Internet and download it\n"
"- Select 'No' to cancel the operation\n"
"\n"
"Note: The file will be downloaded in the application's directory and will be reused automatically if present."
msgstr ""
"En ekstra fil ('diskcopy.dll') skal hentes fra Microsoft for at installere MS-DOS:\n"
"- Vælg 'Ja' for at tilslutte til internettet og hente den\n"
"- Vælg 'Nej' for at afbryde operationen\n"
"\n"
"Note: Filen vil blive hentet i programmets mappe og vil blive genbrugt automatisk hvis tilstede."
#. • MSG_338
msgid "Revoked UEFI bootloader detected"
msgstr "Tilbagekaldt UEFI Bootloader opdaget"
#. • MSG_339
msgid ""
"Rufus detected that the ISO you have selected contains a UEFI bootloader that has been revoked and that will produce %s, when Secure Boot is enabled on a fully up to date UEFI system.\n"
"\n"
"- If you obtained this ISO image from a non reputable source, you should consider the possibility that it might contain UEFI malware and avoid booting from it.\n"
"- If you obtained it from a trusted source, you should try to locate a more up to date version, that will not produce this warning."
msgstr ""
"Rufus har opdaget at ISO filen du har valgt indeholder en UEFI bootloader der er blevet tilbagekaldt og vil producere %s, når Secure Boot er slået til på et fuldt opdateret UEFI system.\n"
"\n"
"- Hvis du har hentet dette ISO billed fra en upålidelig kilde, bør du overveje muligheden for at den muligvis indeholder UEFI malware og undgå at boote fra den.\n"
"- Hvis du har hentet den fra en pålidelig kilde, bør du kigge efter en nyere version, som ikke vil producere denne advarsel."
#. • MSG_340
msgid "a \"Security Violation\" screen"
msgstr "en \"Sikkerhedsbrud\" skærm"
#. • MSG_341
msgid "a Windows Recovery Screen (BSOD) with '%s'"
msgstr "en Windows Gendannelsesskærm (BSOD) med '%s'"
#. • MSG_342
msgid "Compressed VHDX Image"
msgstr "Komprimeret VHDX Afbildning"
#. • MSG_343
msgid "Uncompressed VHD Image"
msgstr "Ukomprimeret VHD Afbildning"
#. • MSG_344
msgid "Full Flash Update Image"
msgstr "Full Flash Update Afbildning"
#. • MSG_345
msgid ""
"Some additional data must be downloaded from Microsoft to use this functionality:\n"
"- Select 'Yes' to connect to the Internet and download it\n"
"- Select 'No' to cancel the operation"
msgstr ""
"Noget ekstra data skal hentes fra Microsoft for at udnytte denne funktionalitet:\n"
"- Vælg 'Ja' for at tilslutte til internettet og hente det\n"
"- Vælg 'Nej' for at afbryde operationen"
#. • MSG_346
msgid "Restrict Windows to S-Mode (INCOMPATIBLE with online account bypass)"
msgstr "Begræns Windows til S-Mode (Inkompatibel med Online bruger bypass)"
#. • MSG_347
msgid "Expert Mode"
msgstr "Ekspert Tilstand"
#. • MSG_348
msgid "Extracting archive files: %s"
msgstr "Udpakker arkiv filer: %s"
#. • MSG_349
msgid "Use Rufus MBR"
msgstr "Brug Rufus MBR"
#. • MSG_900
#.
#. The following messages are for the Windows Store listing only and are not used by the application

View File

@ -1,9 +1,9 @@
msgid ""
msgstr ""
"Project-Id-Version: 3.22\n"
"Project-Id-Version: 4.5\n"
"Report-Msgid-Bugs-To: pete@akeo.ie\n"
"POT-Creation-Date: 2023-02-18 16:30+0100\n"
"PO-Revision-Date: 2023-04-05 12:34+0200\n"
"POT-Creation-Date: 2024-04-26 11:11+0200\n"
"PO-Revision-Date: 2024-04-26 11:48+0200\n"
"Last-Translator: \n"
"Language-Team: \n"
"Language: de_DE\n"
@ -13,7 +13,7 @@ msgstr ""
"X-Poedit-SourceCharset: UTF-8\n"
"X-Rufus-LanguageName: German (Deutsch)\n"
"X-Rufus-LCID: 0x0407, 0x0807, 0x0c07, 0x1007, 0x1407\n"
"X-Generator: Poedit 3.2.2\n"
"X-Generator: Poedit 3.4.2\n"
#. • IDD_DIALOG → IDS_DRIVE_PROPERTIES_TXT
msgid "Drive Properties"
@ -54,13 +54,11 @@ msgstr "USB-Festplatten anzeigen"
msgid "Add fixes for old BIOSes (extra partition, align, etc.)"
msgstr "Fix für ältere BIOSe verwenden (zusätzliche Partition usw.)"
#. • IDD_DIALOG → IDC_RUFUS_MBR
#. • IDD_DIALOG → IDC_UEFI_MEDIA_VALIDATION
#.
#. 'MBR': See http://en.wikipedia.org/wiki/Master_boot_record
#. Rufus can install it's own custom MBR (the Rufus MBR), which also allows users to
#. specify a custom disk ID for the BIOS. The tooltip for this control is MSG_167.
msgid "Use Rufus MBR with BIOS ID"
msgstr "Rufus-MBR mit BIOS-ID benutzen"
#. It is acceptable to drop the "runtime" if you are running out of space
msgid "Enable runtime UEFI media validation"
msgstr "UEFI-Medienvalidierung zur Laufzeit aktivieren"
#. • IDD_DIALOG → IDS_FORMAT_OPTIONS_TXT
msgid "Format Options"
@ -1044,16 +1042,8 @@ msgid "Check this box to allow the display of international labels and set a dev
msgstr "Wählen Sie diese Option, um die Anzeige internationaler Bezeichnungen zu ermöglichen und ein Gerätesymbol zu erzeugen (autorun.inf)"
#. • MSG_167
msgid "Install an MBR that allows boot selection and can masquerade the BIOS USB drive ID"
msgstr "Erzeugt einen MBR, der ein Bootmenü erzeugt und die ID des BIOS-USB-Laufwerks maskieren kann"
#. • MSG_168
msgid ""
"Try to masquerade first bootable USB drive (usually 0x80) as a different disk.\n"
"This should only be necessary if you install Windows XP and have more than one disk."
msgstr ""
"Das erste startfähige USB-Laufwerk als andere Festplatte (normalerweise 0x80) maskieren.\n"
"Das sollte nur notwendig sein, wenn Sie Windows XP installieren und mehr als eine Festplatte haben."
msgid "Install a UEFI bootloader, that will perform MD5Sum file validation of the media"
msgstr "Ein UEFI Startprogramm installieren, das eine MD5Sum Dateiüberprüfung auf dem Datenträger durchführt"
#. • MSG_169
msgid ""
@ -1840,7 +1830,7 @@ msgstr "Verhindern, dass Windows To Go auf interne Laufwerke zugreifen kann"
#. • MSG_333
msgid "Create a local account with username:"
msgstr "Ein lokales Benutzerkonto erstellen: "
msgstr "Ein lokales Benutzerkonto erstellen:"
#. • MSG_334
msgid "Set regional options to the same values as this user's"
@ -1854,6 +1844,82 @@ msgstr "Deaktivieren der automatischen BitLocker-Laufwerksverschlüsselung"
msgid "Persistent log"
msgstr "Dauerhaftes Protokoll"
#. • MSG_337
msgid ""
"An additional file ('diskcopy.dll') must be downloaded from Microsoft to install MS-DOS:\n"
"- Select 'Yes' to connect to the Internet and download it\n"
"- Select 'No' to cancel the operation\n"
"\n"
"Note: The file will be downloaded in the application's directory and will be reused automatically if present."
msgstr ""
"Eine zusätzliche Datei ('diskcopy.dll') muss von Microsoft heruntergeladen werden um MS-DOS zu installieren:\n"
"- 'Ja' um eine Verbindung mit dem Internet herzustellen und die Datei herunterzuladen\n"
"- 'Nein' um den Vorgang abzubrechen\n"
"\n"
"Hinweis: Die Datei wird ins Programmverzeichnis heruntergeladen und bei Bedarf wiederverwendet."
#. • MSG_338
msgid "Revoked UEFI bootloader detected"
msgstr "Zurückgezogenes UEFI Startprogramm erkannt"
#. • MSG_339
msgid ""
"Rufus detected that the ISO you have selected contains a UEFI bootloader that has been revoked and that will produce %s, when Secure Boot is enabled on a fully up to date UEFI system.\n"
"\n"
"- If you obtained this ISO image from a non reputable source, you should consider the possibility that it might contain UEFI malware and avoid booting from it.\n"
"- If you obtained it from a trusted source, you should try to locate a more up to date version, that will not produce this warning."
msgstr ""
"Rufus hat erkannt, dass das gewählte ISO-Image ein UEFI-Startprogramm enthält, dass zurückgezogen wurde und das führt zu %s, wenn das UEFI-System aktuell ist und Secure Boot aktiv ist.\n"
"\n"
"- Wenn Sie das ISO-Image aus einer unzuverlässigen Quelle haben, sollten Sie in Betracht ziehen, dass es UEFI-Schadcode enthält und es deshalb nicht verwenden.\n"
"- Wenn Sie es aus einer vertrauenswürdigen Quelle haben, sollten Sie versuchen eine aktuellere Version zu bekommen, die dieses problem nicht hat."
#. • MSG_340
msgid "a \"Security Violation\" screen"
msgstr "ein Bildschirm \"Sicherheitsverletzung\""
#. • MSG_341
msgid "a Windows Recovery Screen (BSOD) with '%s'"
msgstr "ein Windows Wiederherstellung-Bildschirm (BSOD) mit '%s'"
#. • MSG_342
msgid "Compressed VHDX Image"
msgstr "Komprimiertes VHDX Image"
#. • MSG_343
msgid "Uncompressed VHD Image"
msgstr "Unkomprimiertes VHD Image"
#. • MSG_344
msgid "Full Flash Update Image"
msgstr "Full Flash Update Image"
#. • MSG_345
msgid ""
"Some additional data must be downloaded from Microsoft to use this functionality:\n"
"- Select 'Yes' to connect to the Internet and download it\n"
"- Select 'No' to cancel the operation"
msgstr ""
"Einige weitere Daten müssen von Microsoft heruntergeladen werden, um diese Funktion zu verwenden:\n"
"- 'Ja' um eine Verbindung mit dem Internet herzustellen und diese herunterzuladen\n"
"- 'Nein' um den Vorgang abzubrechen"
#. • MSG_346
msgid "Restrict Windows to S-Mode (INCOMPATIBLE with online account bypass)"
msgstr "Windows im S-Modus (nicht kompatibel mit Online Konto-Umgehung)"
#. • MSG_347
msgid "Expert Mode"
msgstr "Experten-Modus"
#. • MSG_348
msgid "Extracting archive files: %s"
msgstr "Archiv-Datei extrahieren: %s"
#. • MSG_349
msgid "Use Rufus MBR"
msgstr "Rufus MBR verwenden"
#. • MSG_900
#.
#. The following messages are for the Windows Store listing only and are not used by the application

View File

@ -1,9 +1,9 @@
msgid ""
msgstr ""
"Project-Id-Version: 3.22\n"
"Project-Id-Version: 4.5\n"
"Report-Msgid-Bugs-To: pete@akeo.ie\n"
"POT-Creation-Date: 2023-03-04 18:22+0000\n"
"PO-Revision-Date: 2023-03-04 18:27+0000\n"
"POT-Creation-Date: 2024-05-09 12:52+0300\n"
"PO-Revision-Date: 2024-05-09 13:07+0300\n"
"Last-Translator: \n"
"Language-Team: \n"
"Language: el_GR\n"
@ -13,7 +13,7 @@ msgstr ""
"X-Poedit-SourceCharset: UTF-8\n"
"X-Rufus-LanguageName: Greek (Ελληνικά)\n"
"X-Rufus-LCID: 0x0408\n"
"X-Generator: Poedit 3.2.2\n"
"X-Generator: Poedit 3.4.2\n"
#. • IDD_DIALOG → IDS_DRIVE_PROPERTIES_TXT
msgid "Drive Properties"
@ -54,13 +54,11 @@ msgstr "Εμφάνιση συσκευων USB"
msgid "Add fixes for old BIOSes (extra partition, align, etc.)"
msgstr "Προσθήκη διορθώσεων για παλαιότερα BIOS(επιπλέον διχοτόμηση, ευθυγράμμιση, κλπ.)"
#. • IDD_DIALOG → IDC_RUFUS_MBR
#. • IDD_DIALOG → IDC_UEFI_MEDIA_VALIDATION
#.
#. 'MBR': See http://en.wikipedia.org/wiki/Master_boot_record
#. Rufus can install it's own custom MBR (the Rufus MBR), which also allows users to
#. specify a custom disk ID for the BIOS. The tooltip for this control is MSG_167.
msgid "Use Rufus MBR with BIOS ID"
msgstr "Χρήση του Rufus MBR με BIOS ID"
#. It is acceptable to drop the "runtime" if you are running out of space
msgid "Enable runtime UEFI media validation"
msgstr "Ενεργοποίηση επικύρωσης μέσων UEFI χρόνου εκτέλεσης"
#. • IDD_DIALOG → IDS_FORMAT_OPTIONS_TXT
msgid "Format Options"
@ -117,7 +115,7 @@ msgstr "Άδεια χρήσης"
#. • IDD_ABOUTBOX → IDOK
msgid "OK"
msgstr ""
msgstr "OK"
#. • IDD_LICENSE → IDD_LICENSE
msgid "Rufus License"
@ -523,7 +521,7 @@ msgstr "Δεν είναι δυνατή η εγκατάσταση/τροποπο
#. • MSG_077
msgid "Unable to assign a drive letter."
msgstr "Αδυναμία αναθέτησης γράμματος στη μονάδα δίσκου."
msgstr "Αδυναμία αναθέτησης γράμματος στη μονάδα δίσκου."
#. • MSG_078
msgid "Can't mount GUID volume."
@ -654,7 +652,7 @@ msgid ""
"\n"
"Note: The 'FIXED/REMOVABLE' attribute is a hardware property that can only be changed using custom tools from the drive manufacturer. However those tools are ALMOST NEVER provided to the public..."
msgstr ""
"ΣΗΜΑΝΤΙΚΟ: Προσπαθείτε να εγκαταστήσετε τα 'Windows To Go', αλλά ο επιλεγμένος δίσκος δεν διαθέτει το χαρακτηριστικό 'ΣΤΑΘΕΡΑ'. Λόγω αυτού, τα Windows πιθανότατα θα 'παγώνουν' κατά τη διάρκεια της εκκίνησης εφόσον η Microsoft δεν έχει σχεδιάσει τα 'Windows To Go' για λειτουργία με δίσκους που έχουν το χαρακτηριστικό 'ΑΦΑΙΡΟΥΜΕΝΟΣ'.\n"
"ΣΗΜΑΝΤΙΚΟ: Προσπαθείτε να εγκαταστήσετε τα 'Windows To Go', αλλά ο επιλεγμένος δίσκος δεν διαθέτει το χαρακτηριστικό 'ΣΤΑΘΕΡΑ'. Λόγω αυτού, τα Windows πιθανότατα θα 'παγώνουν' κατά τη διάρκεια της εκκίνησης εφόσον η Microsoft δεν έχει σχεδιάσει τα 'Windows To Go' για λειτουργία με δίσκους που έχουν το χαρακτηριστικό 'ΑΦΑΙΡΟΥΜΕΝΟΣ'.\n"
"\n"
"Είστε σίγουροι ότι θέλετε να συνεχίσετε?\n"
"\n"
@ -766,7 +764,7 @@ msgid ""
"\n"
"Note: The files will be downloaded in the current application directory and will be reused automatically if present."
msgstr ""
"Αυτό το αρχείο χρησιμοποιεί το Syslinux %s%s παρόλα αυτά η εφαρμογή(Rufus) εμπεριέχει μόνο τα αρχεία εγκατάστασης του Syslinux %s%s.\n"
"Αυτό το αρχείο χρησιμοποιεί το Syslinux %s%s παρόλα αυτά η εφαρμογή(Rufus) εμπεριέχει μόνο τα αρχεία εγκατάστασης του Syslinux %s%s.\n"
"\n"
" Εφόσον οι νέες εκδόσεις του Syslinux δεν είναι συμβατές μεταξύ τους, δεν είναι δυνατό για το Rufus να τις εμπεριέχει όλες. Επομένως, απαιτείται η λήψη δύο νέων αρχείων απο το διαδίκτυο ('ldlinux.sys' και 'ldlinux.bss'): \n"
"- Επιλέξτε το 'Ναι' για να συνδεθείτε στο διαδίκτυο και να κάνετε λήψη των αρχείων\n"
@ -1040,16 +1038,8 @@ msgid "Check this box to allow the display of international labels and set a dev
msgstr "Επιλέξτε αυτό το πλαίσιο για να επιτραπεί η εμφάνιση των διεθνών ετικετών και ο ορισμός ενός εικονιδίου συσκευής (δημιουργείτε ένα autorun.inf)"
#. • MSG_167
msgid "Install an MBR that allows boot selection and can masquerade the BIOS USB drive ID"
msgstr "Εγκατάσταση ενός MBR που επιτρέπει την επιλογή εκκίνησης και μπορεί να υποδυθεί το ρόλο του ID του BIOS USB δίσκου"
#. • MSG_168
msgid ""
"Try to masquerade first bootable USB drive (usually 0x80) as a different disk.\n"
"This should only be necessary if you install Windows XP and have more than one disk."
msgstr ""
"Μετατροπή του πρώτου δίσκου USB με δυνατότητα εκκίνησης (συνήθως 0x80) ως ενός διαφορετικού δίσκου.\n"
"Αυτό θα είναι απαραίτητο μόνο αν εγκαταστήσετε τα Windows XP και έχετε περισσότερους από ένα δίσκους."
msgid "Install a UEFI bootloader, that will perform MD5Sum file validation of the media"
msgstr "Εγκαταστήστε UEFI bootloader, ο οποίος θα εκτελέσει την επικύρωση του αρχείου MD5Sum των μέσων"
#. • MSG_169
msgid ""
@ -1756,7 +1746,7 @@ msgstr "Χρησιμοποιήστε %s (στο κύριο παράθυρο τη
#. • MSG_312
msgid "Extra hashes (SHA512)"
msgstr "Επιπλέον hashes (SHA512)"
msgstr "Επιπλέον hashes (SHA512)"
#. • MSG_313
msgid "Save to VHD"
@ -1780,7 +1770,7 @@ msgstr "ID δίσκου"
#. • MSG_318
msgid "Default thread priority: %d"
msgstr "Προεπιλεγμένη προτεραιότητα πυρήνα %d"
msgstr "Προεπιλεγμένη προτεραιότητα πυρήνα %d"
#. • MSG_319
msgid "Ignore Boot Marker"
@ -1850,6 +1840,82 @@ msgstr "Απενεργοποιήστε την αυτόματη κρυπτογρ
msgid "Persistent log"
msgstr "Διατήρηση log"
#. • MSG_337
msgid ""
"An additional file ('diskcopy.dll') must be downloaded from Microsoft to install MS-DOS:\n"
"- Select 'Yes' to connect to the Internet and download it\n"
"- Select 'No' to cancel the operation\n"
"\n"
"Note: The file will be downloaded in the application's directory and will be reused automatically if present."
msgstr ""
"Πρέπει να γίνει λήψη ενός πρόσθετου αρχείου ('diskcopy.dll') από τη Microsoft για να εγκαταστήσετε το MS-DOS:\n"
"- Επιλέξτε 'Ναι' για να συνδεθείτε στο Internet και να το κατεβάσετε\n"
"- Επιλέξτε 'Όχι' για να ακυρώσετε τη λειτουργία\n"
"\n"
"Σημείωση: Το αρχείο θα ληφθεί στον κατάλογο της εφαρμογής και θα επαναχρησιμοποιηθεί αυτόματα εάν υπάρχει."
#. • MSG_338
msgid "Revoked UEFI bootloader detected"
msgstr "Εντοπίστηκε ανακληθέν bootloader UEFI"
#. • MSG_339
msgid ""
"Rufus detected that the ISO you have selected contains a UEFI bootloader that has been revoked and that will produce %s, when Secure Boot is enabled on a fully up to date UEFI system.\n"
"\n"
"- If you obtained this ISO image from a non reputable source, you should consider the possibility that it might contain UEFI malware and avoid booting from it.\n"
"- If you obtained it from a trusted source, you should try to locate a more up to date version, that will not produce this warning."
msgstr ""
"Ο Rufus εντόπισε ότι το ISO που επιλέξατε περιέχει έναν bootloader UEFI που έχει ανακληθεί και θα παράγει %s, όταν η Ασφαλής Εκκίνηση είναι ενεργοποιημένη σε ένα πλήρως ενημερωμένο σύστημα UEFI.\n"
"\n"
"- Εάν λάβατε αυτήν την εικόνα ISO από μη αξιόπιστη πηγή, θα πρέπει να εξετάσετε το ενδεχόμενο να περιέχει κακόβουλο λογισμικό UEFI και να αποφύγετε την εκκίνηση από αυτό.\n"
"- Εάν το λάβατε από αξιόπιστη πηγή, θα πρέπει να προσπαθήσετε να εντοπίσετε μια πιο ενημερωμένη έκδοση, η οποία δεν θα παράγει αυτήν την προειδοποίηση."
#. • MSG_340
msgid "a \"Security Violation\" screen"
msgstr "μια οθόνη \"Παραβίαση ασφαλείας\""
#. • MSG_341
msgid "a Windows Recovery Screen (BSOD) with '%s'"
msgstr "μια οθόνη αποκατάστασης των Windows (BSOD) με '%s'"
#. • MSG_342
msgid "Compressed VHDX Image"
msgstr "Συμπιεσμένη εικόνα VHDX"
#. • MSG_343
msgid "Uncompressed VHD Image"
msgstr "Μη συμπιεσμένη εικόνα VHDX"
#. • MSG_344
msgid "Full Flash Update Image"
msgstr "Full Flash Update Image"
#. • MSG_345
msgid ""
"Some additional data must be downloaded from Microsoft to use this functionality:\n"
"- Select 'Yes' to connect to the Internet and download it\n"
"- Select 'No' to cancel the operation"
msgstr ""
"Ορισμένα πρόσθετα δεδομένα πρέπει να ληφθούν από τη Microsoft για να χρησιμοποιήσετε αυτήν τη λειτουργία:\n"
"- Επιλέξτε 'Ναι' για να συνδεθείτε στο Internet και να τα κατεβάσετε\n"
"- Επιλέξτε 'Όχι' για να ακυρώσετε τη λειτουργία"
#. • MSG_346
msgid "Restrict Windows to S-Mode (INCOMPATIBLE with online account bypass)"
msgstr "Περιορισμός των Windows σε S-Mode (ΑΣΥΜΒΑΤΟ με ηλεκτρονική παράκαμψη λογαριασμού)"
#. • MSG_347
msgid "Expert Mode"
msgstr "Λειτουργία ειδικού"
#. • MSG_348
msgid "Extracting archive files: %s"
msgstr "Εξαγωγή αρχείων: %s"
#. • MSG_349
msgid "Use Rufus MBR"
msgstr "Χρησιμοποίηση του Rufus MBR"
#. • MSG_900
#.
#. The following messages are for the Windows Store listing only and are not used by the application

View File

@ -1,9 +1,9 @@
msgid ""
msgstr ""
"Project-Id-Version: 3.22\n"
"Project-Id-Version: 4.5\n"
"Report-Msgid-Bugs-To: pete@akeo.ie\n"
"POT-Creation-Date: 2023-03-15 23:07+0000\n"
"PO-Revision-Date: 2023-03-15 23:15+0000\n"
"POT-Creation-Date: 2024-05-09 12:54-0300\n"
"PO-Revision-Date: 2024-05-09 12:58-0300\n"
"Last-Translator: \n"
"Language-Team: \n"
"Language: es_ES\n"
@ -13,7 +13,7 @@ msgstr ""
"X-Poedit-SourceCharset: UTF-8\n"
"X-Rufus-LanguageName: Spanish (Español)\n"
"X-Rufus-LCID: 0x040a, 0x080a, 0x0c0a, 0x100a, 0x140a, 0x180a, 0x1c0a, 0x200a, 0x240a, 0x280a, 0x2c0a, 0x300a, 0x340a, 0x380a, 0x3c0a, 0x400a, 0x440a, 0x480a, 0x4c0a, 0x500a, 0x540a, 0x580a\n"
"X-Generator: Poedit 3.2.2\n"
"X-Generator: Poedit 3.4.2\n"
#. • IDD_DIALOG → IDS_DRIVE_PROPERTIES_TXT
msgid "Drive Properties"
@ -54,13 +54,11 @@ msgstr "Listar los discos duros USB"
msgid "Add fixes for old BIOSes (extra partition, align, etc.)"
msgstr "Agrega correcciones para BIOS viejos (partición extra, alineación, etc.)"
#. • IDD_DIALOG → IDC_RUFUS_MBR
#. • IDD_DIALOG → IDC_UEFI_MEDIA_VALIDATION
#.
#. 'MBR': See http://en.wikipedia.org/wiki/Master_boot_record
#. Rufus can install it's own custom MBR (the Rufus MBR), which also allows users to
#. specify a custom disk ID for the BIOS. The tooltip for this control is MSG_167.
msgid "Use Rufus MBR with BIOS ID"
msgstr "Usar MBR de Rufus con ID de BIOS"
#. It is acceptable to drop the "runtime" if you are running out of space
msgid "Enable runtime UEFI media validation"
msgstr "Habilitar la validación de medios UEFI en tiempo de ejecución"
#. • IDD_DIALOG → IDS_FORMAT_OPTIONS_TXT
msgid "Format Options"
@ -911,7 +909,7 @@ msgid ""
"\n"
"Are you sure you want to continue?"
msgstr ""
"Debido a que has seleccionado MBR para el sistema de particiones, Rufus sólo puede crear una partición de hasta 2TB en este dispositivo, lo que dejará %s del disco no disponibles.\n"
"Debido a que has seleccionado MBR para el sistema de particiones, Rufus sólo puede crear una partición de hasta 2TB en este dispositivo, lo que dejará %s del disco no disponibles.\n"
"\n"
"¿Estas seguro de que deseas continuar?"
@ -1046,16 +1044,8 @@ msgid "Check this box to allow the display of international labels and set a dev
msgstr "Seleccione esta opción para permitir que se muestren caracteres internacionales y establecer un icono para la unidad (crea un archivo autorun.inf)"
#. • MSG_167
msgid "Install an MBR that allows boot selection and can masquerade the BIOS USB drive ID"
msgstr "Instala un MBR que permite seleccionar el dispositivo de arranque y puede enmascarar el ID de identificación del dispositivo USB del BIOS"
#. • MSG_168
msgid ""
"Try to masquerade first bootable USB drive (usually 0x80) as a different disk.\n"
"This should only be necessary if you install Windows XP and have more than one disk."
msgstr ""
"Trata de enmascarar el primer dispositivo USB de arranque (normalmente 0x80) como un disco diferente.\n"
"Sólo debiera ser necesario si instala Windows XP y tiene más de un disco duro."
msgid "Install a UEFI bootloader, that will perform MD5Sum file validation of the media"
msgstr "Instale un gestor de arranque UEFI, que realizará la validación del archivo MD5Sum del medio"
#. • MSG_169
msgid ""
@ -1856,6 +1846,82 @@ msgstr "Deshabilitar el cifrado automático de dispositivos BitLocker"
msgid "Persistent log"
msgstr "Registro persistente"
#. • MSG_337
msgid ""
"An additional file ('diskcopy.dll') must be downloaded from Microsoft to install MS-DOS:\n"
"- Select 'Yes' to connect to the Internet and download it\n"
"- Select 'No' to cancel the operation\n"
"\n"
"Note: The file will be downloaded in the application's directory and will be reused automatically if present."
msgstr ""
"Se debe descargar un archivo adicional ('diskcopy.dll') de Microsoft para instalar MS-DOS:\n"
"- Seleccione 'Sí' para conectarse a Internet y descargarlo\n"
"- Seleccione 'No' para cancelar la operación.\n"
"\n"
"Nota: El archivo se descargará en el directorio de la aplicación y se reutilizará automáticamente si está presente."
#. • MSG_338
msgid "Revoked UEFI bootloader detected"
msgstr "Se detectó un gestor de arranque UEFI revocado"
#. • MSG_339
msgid ""
"Rufus detected that the ISO you have selected contains a UEFI bootloader that has been revoked and that will produce %s, when Secure Boot is enabled on a fully up to date UEFI system.\n"
"\n"
"- If you obtained this ISO image from a non reputable source, you should consider the possibility that it might contain UEFI malware and avoid booting from it.\n"
"- If you obtained it from a trusted source, you should try to locate a more up to date version, that will not produce this warning."
msgstr ""
"Rufus detectó que el ISO que seleccionó contiene un gestor de arranque UEFI que ha sido revocado y que producirá %s, cuando el arranque seguro esté habilitado en un sistema UEFI completamente actualizado.\n"
"\n"
"- Si obtuvo esta imagen ISO de una fuente no confiable, debe considerar la posibilidad de que contenga malware UEFI y evitar arrancar desde allí.\n"
"- Si lo obtuvo de una fuente confiable, debe intentar localizar una versión más actualizada, que no producirá esta advertencia."
#. • MSG_340
msgid "a \"Security Violation\" screen"
msgstr "una pantalla de \"violación de seguridad\""
#. • MSG_341
msgid "a Windows Recovery Screen (BSOD) with '%s'"
msgstr "una pantalla de recuperación de Windows (BSOD) con '%s'"
#. • MSG_342
msgid "Compressed VHDX Image"
msgstr "Imagen VHDX comprimida"
#. • MSG_343
msgid "Uncompressed VHD Image"
msgstr "Imagen VHD sin comprimir"
#. • MSG_344
msgid "Full Flash Update Image"
msgstr "Imagen de actualización completa de Flash"
#. • MSG_345
msgid ""
"Some additional data must be downloaded from Microsoft to use this functionality:\n"
"- Select 'Yes' to connect to the Internet and download it\n"
"- Select 'No' to cancel the operation"
msgstr ""
"Se deben descargar algunos datos adicionales de Microsoft para utilizar esta funcionalidad:\n"
"- Seleccione 'Sí' para conectarse a Internet y descargarlo\n"
"- Seleccione 'No' para cancelar la operación."
#. • MSG_346
msgid "Restrict Windows to S-Mode (INCOMPATIBLE with online account bypass)"
msgstr "Restringir Windows al Modo S (INCOMPATIBLE con la omisión de cuenta en línea)"
#. • MSG_347
msgid "Expert Mode"
msgstr "Modo experto"
#. • MSG_348
msgid "Extracting archive files: %s"
msgstr "Extrayendo archivos comprimidos: %s"
#. • MSG_349
msgid "Use Rufus MBR"
msgstr "Utilice Rufus MBR"
#. • MSG_900
#.
#. The following messages are for the Windows Store listing only and are not used by the application

View File

@ -1,10 +1,10 @@
msgid ""
msgstr ""
"Project-Id-Version: 3.22\n"
"Project-Id-Version: 4.5\n"
"Report-Msgid-Bugs-To: pete@akeo.ie\n"
"POT-Creation-Date: 2023-03-13 17:25+0000\n"
"PO-Revision-Date: 2023-03-13 17:25+0000\n"
"Last-Translator: \n"
"POT-Creation-Date: 2024-04-29 19:24+0300\n"
"PO-Revision-Date: 2024-04-29 20:25+0330\n"
"Last-Translator: MasterVito <mv@mvaop.ir>\n"
"Language-Team: \n"
"Language: fa_IR\n"
"MIME-Version: 1.0\n"
@ -13,7 +13,7 @@ msgstr ""
"X-Poedit-SourceCharset: UTF-8\n"
"X-Rufus-LanguageName: Persian (پارسی)\n"
"X-Rufus-LCID: 0x0429\n"
"X-Generator: Poedit 3.2.2\n"
"X-Generator: Poedit 3.4.2\n"
#. • IDD_DIALOG → IDS_DRIVE_PROPERTIES_TXT
msgid "Drive Properties"
@ -54,13 +54,11 @@ msgstr "نمایش هارد دیسک‌های اکسترنال در فهرست
msgid "Add fixes for old BIOSes (extra partition, align, etc.)"
msgstr "بهسازی و اصلاح تنظیمات برای شناسایی بهتر درایو در BIOSهای قدیمی"
#. • IDD_DIALOG → IDC_RUFUS_MBR
#. • IDD_DIALOG → IDC_UEFI_MEDIA_VALIDATION
#.
#. 'MBR': See http://en.wikipedia.org/wiki/Master_boot_record
#. Rufus can install it's own custom MBR (the Rufus MBR), which also allows users to
#. specify a custom disk ID for the BIOS. The tooltip for this control is MSG_167.
msgid "Use Rufus MBR with BIOS ID"
msgstr "استفاده از Rufus MBR با BIOS ID برابر با"
#. It is acceptable to drop the "runtime" if you are running out of space
msgid "Enable runtime UEFI media validation"
msgstr "فغال سازی زمان اجرا UEFI media تایید"
#. • IDD_DIALOG → IDS_FORMAT_OPTIONS_TXT
msgid "Format Options"
@ -349,7 +347,7 @@ msgstr "BIOS (یا UEFI-CSM)"
#. • MSG_032
msgid "UEFI (non CSM)"
msgstr ""
msgstr "UEFI (بجز CSM)"
#. • MSG_033
msgid "BIOS or UEFI"
@ -406,7 +404,7 @@ msgstr ""
#. • MSG_046
msgid "%s (Disk %d) [%s]"
msgstr ""
msgstr "%s (هارد %d) [%s]"
#. • MSG_047
#.
@ -1054,16 +1052,8 @@ msgid "Check this box to allow the display of international labels and set a dev
msgstr "اگر نامی که برای درایو موردنظر انتخاب کرده‌اید طولانی و یا دارای حروف غیر انگلیسی است و یا اگر می‌خواهید درایو موردنظر آیکون داشته باشد؛ این گزینه را انتخاب کنید."
#. • MSG_167
msgid "Install an MBR that allows boot selection and can masquerade the BIOS USB drive ID"
msgstr "نصبِ MBR سفارشیِ نرم‌افزارِ Rufus که با استفاده از آن می‌توان نحوه راه‌اندازی را انتخاب و شناسه (ID) درایو USB بایوس را جعل کرد"
#. • MSG_168
msgid ""
"Try to masquerade first bootable USB drive (usually 0x80) as a different disk.\n"
"This should only be necessary if you install Windows XP and have more than one disk."
msgstr ""
"با انتخاب یکی از این گزینه‌ها می‌توانید به‌صورت ساختگی و جعلی، اولین درایو USB با قابلیت راه‌اندازی (معمولاً 0x80) را به‌عنوان هارددیسک جداگانه معرفی کنید.\n"
"انتخاب این گزینه فقط زمانی ضروری است که بیش از یک هارددیسک دارید و می‌خواهید ویندوز XP نصب کنید."
msgid "Install a UEFI bootloader, that will perform MD5Sum file validation of the media"
msgstr "نصب یک UEFI bootloader این کار باعث اعتبارسنجی نوع md5sUM برای رسانه میشود"
#. • MSG_169
msgid ""
@ -1252,7 +1242,7 @@ msgstr "فایل %s موجود نیست"
#. The name proposed by Windows' Computer Management → Disk Management when you try to format
#. a drive with an empty label. For an example, see https://rufus.ie/pics/default_name.png.
msgid "New Volume"
msgstr ""
msgstr "بخش جدید"
#. • MSG_208
#.
@ -1856,7 +1846,81 @@ msgstr "رمزگذاری خودکار دستگاه BitLocker را غیرفعال
#. • MSG_336
msgid "Persistent log"
msgstr "لیست مداوم"
#. • MSG_337
msgid ""
"An additional file ('diskcopy.dll') must be downloaded from Microsoft to install MS-DOS:\n"
"- Select 'Yes' to connect to the Internet and download it\n"
"- Select 'No' to cancel the operation\n"
"\n"
"Note: The file will be downloaded in the application's directory and will be reused automatically if present."
msgstr ""
"فایل دیگری ('diskcopy.dll:) نیاز است دانلود شود از مایکروسافت برای نصب MS-DOS:\n"
"- انتخاب :'بله' برای وصل شدن به اینترنت و دانلود آن\n"
"- انتخاب 'نه' برای کنسل کردن این کار\n"
"\n"
"نکته: فایل در مکان نرم افزار دانلود میشود و دوباره استفاده میشود درصورت انجام مجدد این کار."
#. • MSG_338
msgid "Revoked UEFI bootloader detected"
msgstr "بوت لودر UEFI کنسل شده شناسایی شد"
#. • MSG_339
msgid ""
"Rufus detected that the ISO you have selected contains a UEFI bootloader that has been revoked and that will produce %s, when Secure Boot is enabled on a fully up to date UEFI system.\n"
"\n"
"- If you obtained this ISO image from a non reputable source, you should consider the possibility that it might contain UEFI malware and avoid booting from it.\n"
"- If you obtained it from a trusted source, you should try to locate a more up to date version, that will not produce this warning."
msgstr ""
"Rufus متوجه شده که فایل ISO که انتخاب کردید دارای UEFI بوت لودری است که لفو شده و باعث %s, درصورتی که بوت امن فعال شده بر روی سیستم کاملا اپدیت شده UEFI\v\v- اگه شما این فایل ISO رو از یک جای غیر قابل اعتماد دریافت کردید ممکن است این فایل دارای ویروس UEFI باشد و نباید آنرا بوت کرد \n"
"\v- اگه شما شما از جای مورد اغفماد دریافت کردیدش, میتونید تلاش کنید برای پیدا کردن نسخه جدیدتر, با اینکار دیگر این هشتار را دریافت نمیکنید."
#. • MSG_340
msgid "a \"Security Violation\" screen"
msgstr "یک صفحه \"مشکلی امنیتی\""
#. • MSG_341
msgid "a Windows Recovery Screen (BSOD) with '%s'"
msgstr "یک صفخه ریکاوری ویندوز (BSOD) با '%S\""
#. • MSG_342
msgid "Compressed VHDX Image"
msgstr "فایل VHDX فشرده شده"
#. • MSG_343
msgid "Uncompressed VHD Image"
msgstr "فایل VHD فشرده نشده"
#. • MSG_344
msgid "Full Flash Update Image"
msgstr ""
#. • MSG_345
msgid ""
"Some additional data must be downloaded from Microsoft to use this functionality:\n"
"- Select 'Yes' to connect to the Internet and download it\n"
"- Select 'No' to cancel the operation"
msgstr ""
"دیتا های دیگری نیاز به دانلود از مایکروسافت برای انجام دادن این کار نیاز است:\n"
"- انتخاب 'بله' برای وصل شدن به اینترنت و دانلود آنها\n"
"- انتخاب 'نه' برای لغو کردن این کار"
#. • MSG_346
msgid "Restrict Windows to S-Mode (INCOMPATIBLE with online account bypass)"
msgstr "مجبور کردن ویندوز به S-Mode ( دارای مشکلات با حذفز استفاده اکانت آنلاین )"
#. • MSG_347
msgid "Expert Mode"
msgstr "بخش حرفه ای"
#. • MSG_348
msgid "Extracting archive files: %s"
msgstr "استراج کردن فایل های آرشیو: %s"
#. • MSG_349
msgid "Use Rufus MBR"
msgstr "استفاده از Rufus MBR"
#. • MSG_900
#.

View File

@ -1,9 +1,9 @@
msgid ""
msgstr ""
"Project-Id-Version: 3.22\n"
"Project-Id-Version: 4.5\n"
"Report-Msgid-Bugs-To: pete@akeo.ie\n"
"POT-Creation-Date: 2023-03-03 15:43+0200\n"
"PO-Revision-Date: 2023-03-03 16:58+0200\n"
"POT-Creation-Date: 2024-05-14 12:47+0300\n"
"PO-Revision-Date: 2024-05-14 14:07+0300\n"
"Last-Translator: \n"
"Language-Team: \n"
"Language: fi_FI\n"
@ -13,7 +13,7 @@ msgstr ""
"X-Poedit-SourceCharset: UTF-8\n"
"X-Rufus-LanguageName: Finnish (Suomi)\n"
"X-Rufus-LCID: 0x040B\n"
"X-Generator: Poedit 3.2.2\n"
"X-Generator: Poedit 3.4.4\n"
#. • IDD_DIALOG → IDS_DRIVE_PROPERTIES_TXT
msgid "Drive Properties"
@ -54,13 +54,11 @@ msgstr "Näytä USB-kiintolevyt"
msgid "Add fixes for old BIOSes (extra partition, align, etc.)"
msgstr "Lisää korjauksia vanhoja BIOS-versioita varten"
#. • IDD_DIALOG → IDC_RUFUS_MBR
#. • IDD_DIALOG → IDC_UEFI_MEDIA_VALIDATION
#.
#. 'MBR': See http://en.wikipedia.org/wiki/Master_boot_record
#. Rufus can install it's own custom MBR (the Rufus MBR), which also allows users to
#. specify a custom disk ID for the BIOS. The tooltip for this control is MSG_167.
msgid "Use Rufus MBR with BIOS ID"
msgstr "Käytä Rufus-MBR:ää, BIOS ID:llä"
#. It is acceptable to drop the "runtime" if you are running out of space
msgid "Enable runtime UEFI media validation"
msgstr "Ota käyttöön ajonaikainen UEFI-tietovälineen tarkistus"
#. • IDD_DIALOG → IDS_FORMAT_OPTIONS_TXT
msgid "Format Options"
@ -579,7 +577,7 @@ msgstr ""
"- Valitse 'Ei' jättääksesi ISO-levykuvan alkuperäiseen muotoonsa\n"
"Jos et ole varma, sinun kannattaa valita 'Kyllä'.\n"
"\n"
"Huomio: Uusi tiedosto ladataan nykyiseen sijaintiin ja kun '%s' löytyy sijainnista, sitä käytetään automaattisesti."
"Huomio: Uusi tiedosto ladataan nykyiseen sijaintiin ja kun '%s' löytyy sijainnista, sitä käytetään automaattisesti."
#. • MSG_085
msgid "Downloading %s"
@ -768,11 +766,11 @@ msgid ""
msgstr ""
"Tämä kuva käyttää Syslinuxia %s%s, mutta tämä sovellus sisältää asennustiedostot vain Syslinuxille %s%s.\n"
"\n"
"Koska Syslinuxin uudet versiot eivät ole keskenään yhteensopivia, eikä Rufus voisi sisältää niitä kaikkia, on kaksi lisätiedostoa ladattava internetistä ('ldlinux.sys' ja 'ldlinux.bss'):\n"
"Koska Syslinuxin uudet versiot eivät ole keskenään yhteensopivia, eikä Rufus voisi sisältää niitä kaikkia, on kaksi lisätiedostoa ladattava internetistä ('ldlinux.sys' ja 'ldlinux.bss'):\n"
"- Valitse 'Kyllä' yhdistääksesi internetiin ja ladataksesi nämä tiedostot\n"
"- Valitse 'Ei' peruaksesi toiminnon\n"
"\n"
"Huomio: Tiedosto ladataan nykyiseen sovelluskansioon ja niitä käytetäänautomaattisesti uudelleen niiden löytyessä."
"Huomio: Tiedostot ladataan nykyiseen sovelluskansioon ja niitä uudelleenkäytetään automaattisesti, jos se ovat jo olemassa."
#. • MSG_115
msgid "Download required"
@ -1043,16 +1041,8 @@ msgid "Check this box to allow the display of international labels and set a dev
msgstr "Valitse valintaruutu salliaksesi kansainvälisten merkkien näyttämisen ja asettaaksesi laitekuvakkeen (luo autorun.inf-tiedoston)"
#. • MSG_167
msgid "Install an MBR that allows boot selection and can masquerade the BIOS USB drive ID"
msgstr "Asenna MBR, joka sallii käynnistysvalinnan ja voi naamioida USB-aseman BIOS ID:n"
#. • MSG_168
msgid ""
"Try to masquerade first bootable USB drive (usually 0x80) as a different disk.\n"
"This should only be necessary if you install Windows XP and have more than one disk."
msgstr ""
"Yritä naamioida ensimmäinen boottaava USB-asema (yleensä 0x80) eri asemaksi.\n"
"Tämän tulisi olla tarpeellista vain asennettaessa Windows XP:tä, kun levyjä on useampia."
msgid "Install a UEFI bootloader, that will perform MD5Sum file validation of the media"
msgstr "Asenna UEFI-käynnistyslataaja, joka tulee suorittamaan tietovälineelle MD5Sum-tiedostotarkistuksen"
#. • MSG_169
msgid ""
@ -1733,7 +1723,7 @@ msgstr "Pikanollataan asemaa: %s"
#. • MSG_307
msgid "this may take a while"
msgstr "Tämä voi viedä hetken"
msgstr "tämä voi viedä hetken"
#. • MSG_308
msgid "VHD detection"
@ -1843,7 +1833,7 @@ msgstr "Luo paikallinen käyttäjätili käyttäjänimellä:"
#. • MSG_334
msgid "Set regional options to the same values as this user's"
msgstr "Aseta alueelliset vaihtoehdot samoihin asetuksiin kuin llä käyttäjällä"
msgstr "Aseta alueelliset vaihtoehdot samoihin asetuksiin kuin nykyisellä käyttäjällä"
#. • MSG_335
msgid "Disable BitLocker automatic device encryption"
@ -1853,6 +1843,82 @@ msgstr "Poista käytöstä automaattinen laitteen BitLocker-salaus"
msgid "Persistent log"
msgstr "Pysyvä lokitiedosto"
#. • MSG_337
msgid ""
"An additional file ('diskcopy.dll') must be downloaded from Microsoft to install MS-DOS:\n"
"- Select 'Yes' to connect to the Internet and download it\n"
"- Select 'No' to cancel the operation\n"
"\n"
"Note: The file will be downloaded in the application's directory and will be reused automatically if present."
msgstr ""
"Uusi tiedosto ('diskcopy.dll') on ladattava Microsoftilta MS-DOSin asennusta varten:\n"
"- Valitse 'Kyllä' yhdistääksesi internetiin ja ladataksesi sen\n"
"- Valitse 'Ei' peruuttaaksesi toiminnon\n"
"\n"
"Huomio: Tiedosto ladataan sovelluksen kansioon ja sitä uudelleenkäytetään automaattisesti, jos se on jo olemassa."
#. • MSG_338
msgid "Revoked UEFI bootloader detected"
msgstr "Mitätöity UEFI-käynnistyslataaja havaittu"
#. • MSG_339
msgid ""
"Rufus detected that the ISO you have selected contains a UEFI bootloader that has been revoked and that will produce %s, when Secure Boot is enabled on a fully up to date UEFI system.\n"
"\n"
"- If you obtained this ISO image from a non reputable source, you should consider the possibility that it might contain UEFI malware and avoid booting from it.\n"
"- If you obtained it from a trusted source, you should try to locate a more up to date version, that will not produce this warning."
msgstr ""
"Rufus havaitsi, että käyttämäsi ISO-levykuva sisältää UEFI-käynnistyslataajan, joka on mitätöity ja tulee aiheuttamaan %s Secure Bootin ollessa päällä ajantasaisessa UEFI-kokoonpanossa.\n"
"\n"
"- Jos olet hankkinut tämän ISO-levykuvan ei-luotettavasta lähteestä, huomioi UEFI-haittaohjelmien mahdollisuus ja vältä siltä käynnistämistä.\n"
"- Jos olet hankkinut sen luotettavasta lähteestä, sinun tulisi yrittää etsiä uudempi versio, joka ei aiheuta tätä varoitusta."
#. • MSG_340
msgid "a \"Security Violation\" screen"
msgstr "\"Turvallisuusrikkomus\"-näkymän"
#. • MSG_341
msgid "a Windows Recovery Screen (BSOD) with '%s'"
msgstr "Windowsin palautusnäkymän (BSOD) viestillä '%s'"
#. • MSG_342
msgid "Compressed VHDX Image"
msgstr "Pakattu VHDX-levykuva"
#. • MSG_343
msgid "Uncompressed VHD Image"
msgstr "Pakkaamaton VHD-levykuva"
#. • MSG_344
msgid "Full Flash Update Image"
msgstr "Full Flash Update -levykuva"
#. • MSG_345
msgid ""
"Some additional data must be downloaded from Microsoft to use this functionality:\n"
"- Select 'Yes' to connect to the Internet and download it\n"
"- Select 'No' to cancel the operation"
msgstr ""
"Tämän toiminnon käyttäminen vaatii lisätiedostojen lataamista Microsoftilta:\n"
"- Valitse 'Kyllä' yhdistääksesi internetiin ja ladataksesi ne\n"
"- Valitse 'Ei' peruuttaaksesi toiminnon"
#. • MSG_346
msgid "Restrict Windows to S-Mode (INCOMPATIBLE with online account bypass)"
msgstr "Rajoita Windows S Mode-tilaan (EI YHTEENSOPIVA verkkotilin ohituksen kanssa)"
#. • MSG_347
msgid "Expert Mode"
msgstr "Asiantuntijatila"
#. • MSG_348
msgid "Extracting archive files: %s"
msgstr "Puretaan tiedostoarkistoja: %s"
#. • MSG_349
msgid "Use Rufus MBR"
msgstr "Rufusin MBR:n käyttö"
#. • MSG_900
#.
#. The following messages are for the Windows Store listing only and are not used by the application

View File

@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: 3.22\n"
"Report-Msgid-Bugs-To: pete@akeo.ie\n"
"POT-Creation-Date: 2023-07-10 11:13+0200\n"
"PO-Revision-Date: 2023-07-10 11:25+0200\n"
"POT-Creation-Date: 2024-04-25 12:25+0100\n"
"PO-Revision-Date: 2024-04-25 12:46+0100\n"
"Last-Translator: \n"
"Language-Team: \n"
"Language: fr_FR\n"
@ -13,7 +13,7 @@ msgstr ""
"X-Poedit-SourceCharset: UTF-8\n"
"X-Rufus-LanguageName: French (Français)\n"
"X-Rufus-LCID: 0x040c, 0x080c, 0x0c0c, 0x100c, 0x140c, 0x180c, 0x1c0c, 0x200c, 0x240c, 0x280c, 0x2c0c, 0x300c, 0x340c, 0x380c, 0xe40c\n"
"X-Generator: Poedit 3.3.2\n"
"X-Generator: Poedit 3.4.2\n"
#. • IDD_DIALOG → IDS_DRIVE_PROPERTIES_TXT
msgid "Drive Properties"
@ -54,13 +54,11 @@ msgstr "Lister les disques durs USB"
msgid "Add fixes for old BIOSes (extra partition, align, etc.)"
msgstr "Ajouter les options de compatibilité pour vieux BIOS"
#. • IDD_DIALOG → IDC_RUFUS_MBR
#. • IDD_DIALOG → IDC_UEFI_MEDIA_VALIDATION
#.
#. 'MBR': See http://en.wikipedia.org/wiki/Master_boot_record
#. Rufus can install it's own custom MBR (the Rufus MBR), which also allows users to
#. specify a custom disk ID for the BIOS. The tooltip for this control is MSG_167.
msgid "Use Rufus MBR with BIOS ID"
msgstr "Utiliser le MBR Rufus avec ID"
#. It is acceptable to drop the "runtime" if you are running out of space
msgid "Enable runtime UEFI media validation"
msgstr "Activer la validation des média sous UEFI"
#. • IDD_DIALOG → IDS_FORMAT_OPTIONS_TXT
msgid "Format Options"
@ -1041,16 +1039,8 @@ msgid "Check this box to allow the display of international labels and set a dev
msgstr "Cochez cette case pour permettre laffichage des caractères étendus/internationaux et ajouter une icône (ceci crée un fichier autorun.inf)"
#. • MSG_167
msgid "Install an MBR that allows boot selection and can masquerade the BIOS USB drive ID"
msgstr "Installe un MBR permettant la sélection du périphérique de démarrage. Peut aussi camoufler lID de disque pour le BIOS"
#. • MSG_168
msgid ""
"Try to masquerade first bootable USB drive (usually 0x80) as a different disk.\n"
"This should only be necessary if you install Windows XP and have more than one disk."
msgstr ""
"Camoufle le premier disque USB démarrable (généralement 0x80) sous une ID différente.\n"
"Changez cette option si vous installez Windows XP avec plus dun disque dur."
msgid "Install a UEFI bootloader, that will perform MD5Sum file validation of the media"
msgstr "Installe un fichier de démarrage UEFI, qui effectue une validation MD5Sum du média"
#. • MSG_169
msgid ""
@ -1822,7 +1812,7 @@ msgstr "Supprimer la nécessité d'avoir 4Go+ de RAM, Secure Boot et TPM 2.0"
#. • MSG_330
msgid "Remove requirement for an online Microsoft account"
msgstr "Supprimer la nécessité d'utiliser un compte Microsoft en ligne"
msgstr "Supprimer la nécessité d'utiliser un compte utilisateur Microsoft en ligne"
#. • MSG_331
msgid "Disable data collection (Skip privacy questions)"
@ -1908,6 +1898,22 @@ msgstr ""
"- Sélectionnez 'Oui' pour vous connecter à Internet et le télécharger ces données\n"
"- Sélectionnez 'Non' pour annuler lopération"
#. • MSG_346
msgid "Restrict Windows to S-Mode (INCOMPATIBLE with online account bypass)"
msgstr "Restreint Windows au mode \"S\" (INCOMPATIBLE avec l'option de désactivation d'un compte utilisateur Microsoft en ligne)"
#. • MSG_347
msgid "Expert Mode"
msgstr "Mode expert"
#. • MSG_348
msgid "Extracting archive files: %s"
msgstr "Extraction d'archive : %s"
#. • MSG_349
msgid "Use Rufus MBR"
msgstr "Utilisation du MBR Rufus"
#. • MSG_900
#.
#. The following messages are for the Windows Store listing only and are not used by the application

View File

@ -1,9 +1,9 @@
msgid ""
msgstr ""
"Project-Id-Version: 3.22\n"
"Project-Id-Version: 4.5\n"
"Report-Msgid-Bugs-To: pete@akeo.ie\n"
"POT-Creation-Date: 2023-02-16 22:57+0200\n"
"PO-Revision-Date: 2023-02-24 13:13+0000\n"
"POT-Creation-Date: 2024-04-25 21:07+0300\n"
"PO-Revision-Date: 2024-04-26 01:31+0300\n"
"Last-Translator: \n"
"Language-Team: \n"
"Language: he_IL\n"
@ -13,7 +13,7 @@ msgstr ""
"X-Poedit-SourceCharset: UTF-8\n"
"X-Rufus-LanguageName: Hebrew (עברית)\n"
"X-Rufus-LCID: 0x040d\n"
"X-Generator: Poedit 3.2.2\n"
"X-Generator: Poedit 3.4.2\n"
#. • IDD_DIALOG → IDS_DRIVE_PROPERTIES_TXT
msgid "Drive Properties"
@ -54,13 +54,11 @@ msgstr "הצגת רשימה של כונני USB קשיחים"
msgid "Add fixes for old BIOSes (extra partition, align, etc.)"
msgstr "הוספת תיקונים ל־BIOS־ים ישנים (מחיצה נוספת, יישור...)"
#. • IDD_DIALOG → IDC_RUFUS_MBR
#. • IDD_DIALOG → IDC_UEFI_MEDIA_VALIDATION
#.
#. 'MBR': See http://en.wikipedia.org/wiki/Master_boot_record
#. Rufus can install it's own custom MBR (the Rufus MBR), which also allows users to
#. specify a custom disk ID for the BIOS. The tooltip for this control is MSG_167.
msgid "Use Rufus MBR with BIOS ID"
msgstr "שימוש ב־MBR של Rufus עם מזהה BIOS"
#. It is acceptable to drop the "runtime" if you are running out of space
msgid "Enable runtime UEFI media validation"
msgstr "הפעלת אימות מדיה של UEFI בזמן ריצה"
#. • IDD_DIALOG → IDS_FORMAT_OPTIONS_TXT
msgid "Format Options"
@ -481,7 +479,7 @@ msgstr "שגיאת התקנה"
#. • MSG_067
msgid "Could not open media. It may be in use by another process. Please re-plug the media and try again."
msgstr "לא ניתן לפתוח את המדיה. יתכן שהיא בשימוש על־ידי תהליך אחר. נא לחבר מחדש את המדיה ולנסות שוב."
msgstr "לא ניתן לפתוח את המדיה. ייתכן שהיא בשימוש על־ידי תהליך אחר. נא לחבר מחדש את המדיה ולנסות שוב."
#. • MSG_068
msgid "Could not partition drive."
@ -572,7 +570,7 @@ msgid ""
"Note: The new file will be downloaded in the current directory and once a '%s' exists there, it will be reused automatically."
msgstr ""
"נראה שקובץ ה־ISO הזה משתמש בגרסה מיושנת של '%s'.\n"
"לפיכך, יתכן שתפריטי האתחול לא יוצגו כראוי.\n"
"לפיכך, ייתכן שתפריטי האתחול לא יוצגו כראוי.\n"
"\n"
"Rufus יכול להוריד גרסה חדשה יותר כדי לתקן בעיה זו:\n"
"- יש לבחור 'כן' כדי להתחבר לאינטרנט ולהוריד את הקובץ\n"
@ -1043,16 +1041,8 @@ msgid "Check this box to allow the display of international labels and set a dev
msgstr "יש לסמן תיבה זו כדי לאפשר הצגה של תוויות שם בינלאומיות וכדי להגדיר סמל להתקן (יוצר קובץ autorun.inf)"
#. • MSG_167
msgid "Install an MBR that allows boot selection and can masquerade the BIOS USB drive ID"
msgstr "מתקין MBR שמאפשר בחירת אתחול ויכול לגרום למזהה כונן ה־USB ב־BIOS להזדהות כמזהה אחר"
#. • MSG_168
msgid ""
"Try to masquerade first bootable USB drive (usually 0x80) as a different disk.\n"
"This should only be necessary if you install Windows XP and have more than one disk."
msgstr ""
"מנסה לגרום לכונן ה־USB בר־האתחול הראשון (בדרך כלל 0x80) להזדהות כדיסק אחר.\n"
"זה אמור להיות נחוץ רק אם ברצונך להתקין Windows XP ויש לך יותר מדיסק אחד."
msgid "Install a UEFI bootloader, that will perform MD5Sum file validation of the media"
msgstr "מתקין מנהל אתחול UEFI שיבצע אימות קבצים שעל המדיה בשיטת MD5Sum"
#. • MSG_169
msgid ""
@ -1127,7 +1117,7 @@ msgstr "כתובת ה־IP שלך"
#. • MSG_184
msgid "For the purpose of generating private usage statistics, we may keep the information collected, \\b for at most a year\\b0 . However, we will not willingly disclose any of this individual data to third parties."
msgstr "לצורך יצירת סטטיסטיקת שימוש פרטית, יתכן שנשמור את המידע שייאסף \\b לשנה לכל היותר\\b0 . עם זאת, אנחנו לא נמסור מרצוננו החופשי את הנתונים האלה לשום גורם צד שלישי."
msgstr "לצורך יצירת סטטיסטיקת שימוש פרטית, ייתכן שנשמור את המידע שייאסף \\b לשנה לכל היותר\\b0 . עם זאת, אנחנו לא נמסור מרצוננו החופשי את הנתונים האלה לשום גורם צד שלישי."
#. • MSG_185
msgid "Update Process:"
@ -1665,7 +1655,7 @@ msgid ""
"The last version of Rufus compatible with this platform is v%d.%d."
msgstr ""
"גרסה זו של Windows אינה נתמכת יותר על־ידי Rufus.\n"
"הגרסה האחרונה של Rufus הנתמכת בפלטפורמה זו היא %d.%d."
"הגרסה האחרונה של Rufus הנתמכת בפלטפורמה זו היא v%d.%d."
#. • MSG_295
msgid "Warning: Unofficial version"
@ -1862,6 +1852,82 @@ msgstr "השבתת הצפנת מכשיר אוטומטית של BitLocker"
msgid "Persistent log"
msgstr "יומן קבוע"
#. • MSG_337
msgid ""
"An additional file ('diskcopy.dll') must be downloaded from Microsoft to install MS-DOS:\n"
"- Select 'Yes' to connect to the Internet and download it\n"
"- Select 'No' to cancel the operation\n"
"\n"
"Note: The file will be downloaded in the application's directory and will be reused automatically if present."
msgstr ""
"יש להוריד קובץ נוסף ('diskcopy.dll') מ־Microsoft על מנת להתקין MS-DOS:\n"
"- יש לבחור 'כן' כדי להתחבר לאינטרנט ולהוריד אותו\n"
"- יש לבחור 'לא' כדי לבטל את הפעולה\n"
"\n"
"הערה: הקובץ יירד לספרייה בה ממוקם היישום וכל עוד הקובץ יהיה שם, Rufus ישתמש בו באופן אוטומטי במידת הצורך."
#. • MSG_338
msgid "Revoked UEFI bootloader detected"
msgstr "אותר מנהל אתחול UEFI שנאסר לשימוש"
#. • MSG_339
msgid ""
"Rufus detected that the ISO you have selected contains a UEFI bootloader that has been revoked and that will produce %s, when Secure Boot is enabled on a fully up to date UEFI system.\n"
"\n"
"- If you obtained this ISO image from a non reputable source, you should consider the possibility that it might contain UEFI malware and avoid booting from it.\n"
"- If you obtained it from a trusted source, you should try to locate a more up to date version, that will not produce this warning."
msgstr ""
"Rufus איתר שקובץ ה־ISO שבחרת מכיל מנהל אתחול UEFI שנאסר לשימוש ושיציג %s, כאשר Secure Boot מופעל על מערכת UEFI מעודכנת לחלוטין.\n"
"\n"
"- אם השגת את קובץ תמונת ISO זה ממקור מפוקפק, כדאי לשקול את האפשרות שייתכן שהוא מכיל נוזקת UEFI, ולהימנע מלאתחל ממנו.\n"
"- אם השגת אותה ממקור מהימן, כדאי לנסות לאתר גרסה יותר עדכנית, שלא תציג אזהרה זו."
#. • MSG_340
msgid "a \"Security Violation\" screen"
msgstr "מסך \"הפרת אבטחה\""
#. • MSG_341
msgid "a Windows Recovery Screen (BSOD) with '%s'"
msgstr "מסך שחזור של Windows (BSOD) עם '%s'"
#. • MSG_342
msgid "Compressed VHDX Image"
msgstr "קובץ תמונה VHDX מכווץ"
#. • MSG_343
msgid "Uncompressed VHD Image"
msgstr "קובץ תמונה VHD שאינו מכווץ"
#. • MSG_344
msgid "Full Flash Update Image"
msgstr "קובץ תמונה של Full Flash Update"
#. • MSG_345
msgid ""
"Some additional data must be downloaded from Microsoft to use this functionality:\n"
"- Select 'Yes' to connect to the Internet and download it\n"
"- Select 'No' to cancel the operation"
msgstr ""
"יש להוריד נתונים נוספים מ־Microsoft על מנת להשתמש באפשרות זו:\n"
"- יש לבחור 'כן' כדי להתחבר לאינטרנט ולהוריד אותם\n"
"- יש לבחור 'לא' כדי לבטל את הפעולה"
#. • MSG_346
msgid "Restrict Windows to S-Mode (INCOMPATIBLE with online account bypass)"
msgstr "הגבלת ההתקנה של Windows למצב S-Mode (אינו נתמך עם האפשרות לעקיפת חשבון מקוון)"
#. • MSG_347
msgid "Expert Mode"
msgstr "מצב מומחה"
#. • MSG_348
msgid "Extracting archive files: %s"
msgstr "מחלץ קובצי ארכיון: %s"
#. • MSG_349
msgid "Use Rufus MBR"
msgstr "שימוש ב־MBR של Rufus"
#. • MSG_900
#.
#. The following messages are for the Windows Store listing only and are not used by the application

View File

@ -1,9 +1,9 @@
msgid ""
msgstr ""
"Project-Id-Version: 3.22\n"
"Project-Id-Version: 4.5\n"
"Report-Msgid-Bugs-To: pete@akeo.ie\n"
"POT-Creation-Date: 2023-04-25 13:11+0100\n"
"PO-Revision-Date: 2023-04-25 13:14+0100\n"
"POT-Creation-Date: 2024-05-09 18:57+0200\n"
"PO-Revision-Date: 2024-05-09 19:30+0200\n"
"Last-Translator: \n"
"Language-Team: \n"
"Language: hr_HR\n"
@ -13,7 +13,7 @@ msgstr ""
"X-Poedit-SourceCharset: UTF-8\n"
"X-Rufus-LanguageName: Croatian (Hrvatski)\n"
"X-Rufus-LCID: 0x041a, 0x081a, 0x101a\n"
"X-Generator: Poedit 3.2.2\n"
"X-Generator: Poedit 3.4.2\n"
#. • IDD_DIALOG → IDS_DRIVE_PROPERTIES_TXT
msgid "Drive Properties"
@ -54,13 +54,11 @@ msgstr "Prikaži USB čvrste diskove"
msgid "Add fixes for old BIOSes (extra partition, align, etc.)"
msgstr "Dodavanje zakrpa za stari BIOS (dodatne particije, poravnanje, itd.)"
#. • IDD_DIALOG → IDC_RUFUS_MBR
#. • IDD_DIALOG → IDC_UEFI_MEDIA_VALIDATION
#.
#. 'MBR': See http://en.wikipedia.org/wiki/Master_boot_record
#. Rufus can install it's own custom MBR (the Rufus MBR), which also allows users to
#. specify a custom disk ID for the BIOS. The tooltip for this control is MSG_167.
msgid "Use Rufus MBR with BIOS ID"
msgstr "Koristi Rufus MBR za BIOS ID"
#. It is acceptable to drop the "runtime" if you are running out of space
msgid "Enable runtime UEFI media validation"
msgstr "Omogućite provjeru valjanosti UEFI medija"
#. • IDD_DIALOG → IDS_FORMAT_OPTIONS_TXT
msgid "Format Options"
@ -1041,16 +1039,8 @@ msgid "Check this box to allow the display of international labels and set a dev
msgstr "Potvrdite ovo da dozvolite prikaz internacionalnih oznaka i napravite ikonu (stvara autorun.inf)"
#. • MSG_167
msgid "Install an MBR that allows boot selection and can masquerade the BIOS USB drive ID"
msgstr "Instaliraj MBR koji omogućuje boot odabir i može pretvoriti BIOS USB drive ID"
#. • MSG_168
msgid ""
"Try to masquerade first bootable USB drive (usually 0x80) as a different disk.\n"
"This should only be necessary if you install Windows XP and have more than one disk."
msgstr ""
"Maskiraj prvi butabilni USB pogon (uobičajeno 0x80) kao drugačiji disk.\n"
"Ovo je potrebno ako instalirate Windows XP i imate više diskova."
msgid "Install a UEFI bootloader, that will perform MD5Sum file validation of the media"
msgstr "Instaliraj UEFI bootloader koji će izvršiti MD5 Sum provjeru valjanosti datoteke medije"
#. • MSG_169
msgid ""
@ -1851,6 +1841,82 @@ msgstr "Onemogući BitLocker automatsko šifriranje uređaja"
msgid "Persistent log"
msgstr "Stalni zapisnik"
#. • MSG_337
msgid ""
"An additional file ('diskcopy.dll') must be downloaded from Microsoft to install MS-DOS:\n"
"- Select 'Yes' to connect to the Internet and download it\n"
"- Select 'No' to cancel the operation\n"
"\n"
"Note: The file will be downloaded in the application's directory and will be reused automatically if present."
msgstr ""
"Dodatnu datoteku ('diskcopy.dll') potrebno je preuzeti s Microsofta da biste instalirali MS-DOS:\n"
"- Odaberite 'Da' za spajanje na Internet i preuzimanje\n"
"- Odaberite 'Ne' za poništavanje operacije\n"
"\n"
"Napomena: Datoteka će se preuzeti u imenik aplikacije i automatski će se ponovno koristiti ako postoji."
#. • MSG_338
msgid "Revoked UEFI bootloader detected"
msgstr "Otkriven opozvani UEFI pokretački program"
#. • MSG_339
msgid ""
"Rufus detected that the ISO you have selected contains a UEFI bootloader that has been revoked and that will produce %s, when Secure Boot is enabled on a fully up to date UEFI system.\n"
"\n"
"- If you obtained this ISO image from a non reputable source, you should consider the possibility that it might contain UEFI malware and avoid booting from it.\n"
"- If you obtained it from a trusted source, you should try to locate a more up to date version, that will not produce this warning."
msgstr ""
"Rufus je otkrio da ISO koji ste odabrali sadrži UEFI bootloader koji je opozvan i koji će proizvesti %s, kada je Secure Boot omogućen na potpuno ažuriranom UEFI sustavu.\n"
"\n"
"- Ako ste nabavili ovu ISO sliku iz izvora koji nije renomiran, trebali biste razmotriti mogućnost da ona sadrži zlonamjerni softver UEFI i izbjegavati pokretanje ga.\n"
"- Ako ste ga dobili od pouzdanog izvora, trebali biste pokušati locirati noviju verziju koja neće proizvesti ovo upozorenje."
#. • MSG_340
msgid "a \"Security Violation\" screen"
msgstr "zaslon \"Sigurnosna povreda\""
#. • MSG_341
msgid "a Windows Recovery Screen (BSOD) with '%s'"
msgstr "zaslon za oporavak sustava Windows (BSOD) s '%s'"
#. • MSG_342
msgid "Compressed VHDX Image"
msgstr "Komprimirana VHDX slika"
#. • MSG_343
msgid "Uncompressed VHD Image"
msgstr "Nekomprimirana VHD slika"
#. • MSG_344
msgid "Full Flash Update Image"
msgstr "Potpuna ažuriranje flash slike"
#. • MSG_345
msgid ""
"Some additional data must be downloaded from Microsoft to use this functionality:\n"
"- Select 'Yes' to connect to the Internet and download it\n"
"- Select 'No' to cancel the operation"
msgstr ""
"Za korištenje ove funkcije potrebno je preuzeti neke dodatne podatke od Microsofta:\n"
"- Odaberite 'Da' za spajanje na Internet i preuzimanje\n"
"- Odaberite 'Ne' za poništavanje operacije"
#. • MSG_346
msgid "Restrict Windows to S-Mode (INCOMPATIBLE with online account bypass)"
msgstr "Ograniči Windows na S-Mode (NEKOMPATIBILNO s mrežnim zaobilaženjem računa)"
#. • MSG_347
msgid "Expert Mode"
msgstr "Stručnog načina rada"
#. • MSG_348
msgid "Extracting archive files: %s"
msgstr "Izdvajanje arhivskih datoteka: %s"
#. • MSG_349
msgid "Use Rufus MBR"
msgstr "Koristiti Rufus MBR"
#. • MSG_900
#.
#. The following messages are for the Windows Store listing only and are not used by the application

View File

@ -1,9 +1,9 @@
msgid ""
msgstr ""
"Project-Id-Version: 3.22\n"
"Project-Id-Version: 4.5\n"
"Report-Msgid-Bugs-To: pete@akeo.ie\n"
"POT-Creation-Date: 2023-03-12 13:52+0000\n"
"PO-Revision-Date: 2023-03-12 13:52+0000\n"
"POT-Creation-Date: 2024-05-09 13:01+0200\n"
"PO-Revision-Date: 2024-05-10 10:46+0100\n"
"Last-Translator: \n"
"Language-Team: \n"
"Language: hu_HU\n"
@ -13,7 +13,7 @@ msgstr ""
"X-Poedit-SourceCharset: UTF-8\n"
"X-Rufus-LanguageName: Hungarian (Magyar)\n"
"X-Rufus-LCID: 0x040e\n"
"X-Generator: Poedit 3.2.2\n"
"X-Generator: Poedit 3.4.4\n"
#. • IDD_DIALOG → IDS_DRIVE_PROPERTIES_TXT
msgid "Drive Properties"
@ -54,13 +54,11 @@ msgstr "USB merevlemezek listázása"
msgid "Add fixes for old BIOSes (extra partition, align, etc.)"
msgstr "Javítások hozzáadása régi BIOS-okhoz (extra partíció, igazítás, stb.)"
#. • IDD_DIALOG → IDC_RUFUS_MBR
#. • IDD_DIALOG → IDC_UEFI_MEDIA_VALIDATION
#.
#. 'MBR': See http://en.wikipedia.org/wiki/Master_boot_record
#. Rufus can install it's own custom MBR (the Rufus MBR), which also allows users to
#. specify a custom disk ID for the BIOS. The tooltip for this control is MSG_167.
msgid "Use Rufus MBR with BIOS ID"
msgstr "Rufus MBR használata BIOS azonosítóval"
#. It is acceptable to drop the "runtime" if you are running out of space
msgid "Enable runtime UEFI media validation"
msgstr "Futásidejű UEFI adathordozó érvényesítés"
#. • IDD_DIALOG → IDS_FORMAT_OPTIONS_TXT
msgid "Format Options"
@ -1044,16 +1042,8 @@ msgid "Check this box to allow the display of international labels and set a dev
msgstr "Pipáld be a nemzetközi címkék megjelenítésének engedélyezéséhez, és az eszköz ikon beállításához (egy autorun.inf fájlt készít)"
#. • MSG_167
msgid "Install an MBR that allows boot selection and can masquerade the BIOS USB drive ID"
msgstr "Olyan MBR telepítése, ami engedélyezi a boot meghajtó kiválasztását, és képes a BIOS USB eszköz azonosítóját maszkolni"
#. • MSG_168
msgid ""
"Try to masquerade first bootable USB drive (usually 0x80) as a different disk.\n"
"This should only be necessary if you install Windows XP and have more than one disk."
msgstr ""
"Próbáld meg az első bootolható USB eszközt (általában: 0x80) egy másik lemezként mutatni.\n"
"Ez csak akkor lehet szükséges, ha Windows XP-t telepítesz, és egynél több lemezed van."
msgid "Install a UEFI bootloader, that will perform MD5Sum file validation of the media"
msgstr "Olyan UEFI rendszerbetöltő telepítése, ami elvégzi az adathordozón található fájlok MD5Sum érvényesítését"
#. • MSG_169
msgid ""
@ -1855,6 +1845,82 @@ msgstr "BitLocker automatikus eszköz titkosítás letiltása"
msgid "Persistent log"
msgstr "Tartós naplózás"
#. • MSG_337
msgid ""
"An additional file ('diskcopy.dll') must be downloaded from Microsoft to install MS-DOS:\n"
"- Select 'Yes' to connect to the Internet and download it\n"
"- Select 'No' to cancel the operation\n"
"\n"
"Note: The file will be downloaded in the application's directory and will be reused automatically if present."
msgstr ""
"Az MS-DOS telepítéséhez egy további fájlt ('diskcopy.dll') kell letölteni a Microsofttól:\n"
"- Válaszd az 'Igen' gombot az internethez történő kapcsolódáshoz, és a fájl letöltéséhez\n"
"- Válaszd a 'Nem' gombot a művelet megszakításához\n"
"\n"
"Megjegyzés: A fájl a program mappájába lesz letöltve, és automatikusan újra lesz használva, ha létezik."
#. • MSG_338
msgid "Revoked UEFI bootloader detected"
msgstr "Visszavont UEFI rendszerbetöltő detektálva"
#. • MSG_339
msgid ""
"Rufus detected that the ISO you have selected contains a UEFI bootloader that has been revoked and that will produce %s, when Secure Boot is enabled on a fully up to date UEFI system.\n"
"\n"
"- If you obtained this ISO image from a non reputable source, you should consider the possibility that it might contain UEFI malware and avoid booting from it.\n"
"- If you obtained it from a trusted source, you should try to locate a more up to date version, that will not produce this warning."
msgstr ""
"A Rufus észlelte, hogy a kiválasztott ISO egy olyan UEFI rendszerbetöltőt tartalmaz, amelyet visszavontak, és ha a Secure Boot engedélyezve van egy teljesen naprakész UEFI rendszeren, akkor ehhez vezet: %s.\n"
"\n"
"- Ha ezt az ISO képet nem megbízható forrásból szerezted be, akkor számolnod kell azzal a lehetőséggel, hogy UEFI kártevőt tartalmazhat, és elkerülendő az erről történő rendszerindítás.\n"
"- Ha megbízható forrásból szerezted be, akkor próbálj meg egy naprakészebb verziót találni, amelyre ez a figyelmeztetés nem jelenik meg."
#. • MSG_340
msgid "a \"Security Violation\" screen"
msgstr "\"Security Violation\" képernyő"
#. • MSG_341
msgid "a Windows Recovery Screen (BSOD) with '%s'"
msgstr "Windows helyreállítási képernyő (BSOD / kék halál) ezzel: '%s'"
#. • MSG_342
msgid "Compressed VHDX Image"
msgstr "Tömörített VHDX képfájl"
#. • MSG_343
msgid "Uncompressed VHD Image"
msgstr "Nem tömörített VHD képfájl"
#. • MSG_344
msgid "Full Flash Update Image"
msgstr "Full Flash Update (FFU) képfájl"
#. • MSG_345
msgid ""
"Some additional data must be downloaded from Microsoft to use this functionality:\n"
"- Select 'Yes' to connect to the Internet and download it\n"
"- Select 'No' to cancel the operation"
msgstr ""
"E funkcionalitás használatához néhány további adat letöltése szükséges a Microsofttól:\n"
"- Válaszd az 'Igen' gombot az internethez történő csatlakozáshoz, és az adatok letöltéséhez\n"
"- Válaszd a 'Nem' gombot a művelet megszakításához"
#. • MSG_346
msgid "Restrict Windows to S-Mode (INCOMPATIBLE with online account bypass)"
msgstr "Windows korlátozása S módra (NEM KOMPATIBILIS az online Microsoft-fiók követelmény eltávolításával)"
#. • MSG_347
msgid "Expert Mode"
msgstr "Szakértő mód"
#. • MSG_348
msgid "Extracting archive files: %s"
msgstr "Archív fájlok kibontása: %s"
#. • MSG_349
msgid "Use Rufus MBR"
msgstr "Rufus MBR használata"
#. • MSG_900
#.
#. The following messages are for the Windows Store listing only and are not used by the application

View File

@ -1,9 +1,9 @@
msgid ""
msgstr ""
"Project-Id-Version: 3.22\n"
"Project-Id-Version: 4.5\n"
"Report-Msgid-Bugs-To: pete@akeo.ie\n"
"POT-Creation-Date: 2023-02-17 10:50+0100\n"
"PO-Revision-Date: 2023-02-21 19:52+0000\n"
"POT-Creation-Date: 2024-05-12 12:06+0100\n"
"PO-Revision-Date: 2024-05-12 12:12+0100\n"
"Last-Translator: \n"
"Language-Team: \n"
"Language: it_IT\n"
@ -13,7 +13,7 @@ msgstr ""
"X-Poedit-SourceCharset: UTF-8\n"
"X-Rufus-LanguageName: Italian (Italiano)\n"
"X-Rufus-LCID: 0x0410, 0x0810\n"
"X-Generator: Poedit 3.2.2\n"
"X-Generator: Poedit 3.4.4\n"
#. • IDD_DIALOG → IDS_DRIVE_PROPERTIES_TXT
msgid "Drive Properties"
@ -25,7 +25,7 @@ msgstr "Dispositivo/unità"
#. • IDD_DIALOG → IDS_BOOT_SELECTION_TXT
msgid "Boot selection"
msgstr "Selezione boot"
msgstr "Tipo boot sistema"
#. • IDD_DIALOG → IDC_SELECT
msgid "Select"
@ -37,11 +37,11 @@ msgstr "Opzioni immagine"
#. • IDD_DIALOG → IDS_PARTITION_TYPE_TXT
msgid "Partition scheme"
msgstr "Schema partizione"
msgstr "Tipo schema partizione"
#. • IDD_DIALOG → IDS_TARGET_SYSTEM_TXT
msgid "Target system"
msgstr "Sistema destinazione"
msgstr "Tipo sistema destinazione"
#. • IDD_DIALOG → IDC_LIST_USB_HDD
msgid "List USB Hard Drives"
@ -54,13 +54,11 @@ msgstr "Elenco unità disco USB"
msgid "Add fixes for old BIOSes (extra partition, align, etc.)"
msgstr "Aggiungi correzioni per vecchi BIOS (partizioni extra, allineamento, etc)"
#. • IDD_DIALOG → IDC_RUFUS_MBR
#. • IDD_DIALOG → IDC_UEFI_MEDIA_VALIDATION
#.
#. 'MBR': See http://en.wikipedia.org/wiki/Master_boot_record
#. Rufus can install it's own custom MBR (the Rufus MBR), which also allows users to
#. specify a custom disk ID for the BIOS. The tooltip for this control is MSG_167.
msgid "Use Rufus MBR with BIOS ID"
msgstr "Usa MBR Rufus con ID BIOS"
#. It is acceptable to drop the "runtime" if you are running out of space
msgid "Enable runtime UEFI media validation"
msgstr "Abilita convalida multimediale UEFI in runtime"
#. • IDD_DIALOG → IDS_FORMAT_OPTIONS_TXT
msgid "Format Options"
@ -208,7 +206,7 @@ msgid ""
"WARNING: ALL DATA ON DEVICE '%s' WILL BE DESTROYED.\n"
"To continue with this operation, click OK. To quit click CANCEL."
msgstr ""
"ATTENZIONE: TUTTI I DATI SULL'UNITÀ '%s' SARANNO CANCELLATI.\n"
"ATTENZIONE: TUTTI I DATI NELL'UNITÀ '%s' SARANNO CANCELLATI.\n"
"Per continuare seleziona 'OK'. Per annullare seleziona 'ANNULLA'."
#. • MSG_004
@ -677,7 +675,7 @@ msgid ""
"Your platform cannot extract files from WIM archives. WIM extraction is required to create EFI bootable Windows 7 and Windows Vista USB drives. You can fix that by installing a recent version of 7-Zip.\n"
"Do you want to visit the 7-zip download page?"
msgstr ""
"Il tuo sistema operativo non può estrarre file dall'archivio WIM. L'estrazione WIM è necessaria per creare una unità USB avviabile EFI Windows 7 e Windows Vista. Puoi correggere ciò installando una versione recente di 7-Zip.\n"
"Il sistema operativo non può estrarre file dall'archivio WIM. L'estrazione WIM è necessaria per creare una unità USB avviabile EFI Windows 7 e Windows Vista. Puoi correggere ciò installando una versione recente di 7-Zip.\n"
"Vuoi visitare la pagina web da cui scaricare 7-zip?"
#. • MSG_103
@ -1048,17 +1046,9 @@ msgid "Check this box to allow the display of international labels and set a dev
msgstr "Abilita questa opzione per permettere la visualizzazione delle etichette internazionali e impostare una icona dispositivo (creerà un file autorun.inf)"
#. • MSG_167
msgid "Install an MBR that allows boot selection and can masquerade the BIOS USB drive ID"
msgid "Install a UEFI bootloader, that will perform MD5Sum file validation of the media"
msgstr "Installa un MBR che permette la selezione all'avvio e maschera l'ID unità USB del BIOS"
#. • MSG_168
msgid ""
"Try to masquerade first bootable USB drive (usually 0x80) as a different disk.\n"
"This should only be necessary if you install Windows XP and have more than one disk."
msgstr ""
"Prova prima a mascherare l'unità avviabile USB (normalmente 0x80) come un disco differente.\n"
"Questo potrebbe essere necessario solo se installi Windows XP e hai più di un disco."
#. • MSG_169
msgid ""
"Create an extra hidden partition and try to align partitions boundaries.\n"
@ -1100,7 +1090,7 @@ msgstr "Versione %d.%d (build %d)"
#. • MSG_176
msgid "English translation: Pete Batard <mailto:pete@akeo.ie>"
msgstr "Traduzione italiana a cura di bovirus"
msgstr "Traduzione italiana a cura di R.B."
#. • MSG_177
msgid "Report bugs or request enhancements at:"
@ -1116,11 +1106,11 @@ msgstr "Policy aggiornamenti:"
#. • MSG_180
msgid "If you choose to allow this program to check for application updates, you agree that the following information may be collected on our server(s):"
msgstr "Se scegli di permettere a questo programma di controllare automaticamente gli aggiornamenti, accetti che le seguenti informazioni saranno catalogate nei nostri server:"
msgstr "Se permetti a questo programma di controllare automaticamente gli aggiornamenti, accetti che le seguenti informazioni saranno catalogate nei nostri server:"
#. • MSG_181
msgid "Your operating system's architecture and version"
msgstr "L'architettura del tuo sistema operativo e la versione"
msgstr "L'architettura del sistema operativo e la versione"
#. • MSG_182
msgid "The version of the application you use"
@ -1128,7 +1118,7 @@ msgstr "La versione dell'applicazione in uso"
#. • MSG_183
msgid "Your IP address"
msgstr "Il tuo indirizzo IP"
msgstr "Indirizzo IP"
#. • MSG_184
msgid "For the purpose of generating private usage statistics, we may keep the information collected, \\b for at most a year\\b0 . However, we will not willingly disclose any of this individual data to third parties."
@ -1595,7 +1585,7 @@ msgstr "Non avviabile"
#. • MSG_280
msgid "Disk or ISO image"
msgstr "Immagine disco o ISO"
msgstr "File immagine disco o file ISO"
#. • MSG_281
msgid "%s (Please select)"
@ -1820,7 +1810,7 @@ msgstr "Applicando opzioni utente..."
#. • MSG_327
msgid "Windows User Experience"
msgstr "Windows User Experience"
msgstr "Esperienza utente Windows"
#. • MSG_328
msgid "Customize Windows installation?"
@ -1858,6 +1848,82 @@ msgstr "Disabilita la crittografia automatica dei dispositivi BitLocker"
msgid "Persistent log"
msgstr "Log persistente"
#. • MSG_337
msgid ""
"An additional file ('diskcopy.dll') must be downloaded from Microsoft to install MS-DOS:\n"
"- Select 'Yes' to connect to the Internet and download it\n"
"- Select 'No' to cancel the operation\n"
"\n"
"Note: The file will be downloaded in the application's directory and will be reused automatically if present."
msgstr ""
"Per installare MS-DOS è necessario scaricare da Microsoft un file aggiuntivo (\"diskcopy.dll\"):\n"
"- Seleziona 'Sì' per connettersi ad internet e scaricarlo\n"
"- Seleziona 'No' per annullare l'operazione\n"
"\n"
"Nota: il file verrà scaricato nella cartella dell'applicazione e se presente verrà riutilizzato automaticamente."
#. • MSG_338
msgid "Revoked UEFI bootloader detected"
msgstr "Rilevato bootloader UEFI revocato"
#. • MSG_339
msgid ""
"Rufus detected that the ISO you have selected contains a UEFI bootloader that has been revoked and that will produce %s, when Secure Boot is enabled on a fully up to date UEFI system.\n"
"\n"
"- If you obtained this ISO image from a non reputable source, you should consider the possibility that it might contain UEFI malware and avoid booting from it.\n"
"- If you obtained it from a trusted source, you should try to locate a more up to date version, that will not produce this warning."
msgstr ""
"Rufus ha rilevato che l'ISO selezionata contiene un bootloader UEFI che è stato revocato e che quando Secure Boot è abilitato su un sistema UEFI completamente aggiornato produrrà %s. \n"
"\n"
"- Se hai ottenuto questa immagine ISO da una so0egente non affidabile, dovresti considerare la possibilità che possa contenere malware UEFI ed evitare di eseguire l'avvio da esso.\n"
"- Se l'hai ottenuto da una sorgente attendibile, dovresti provare a cercare una versione più aggiornata, che non genererà questo avviso."
#. • MSG_340
msgid "a \"Security Violation\" screen"
msgstr "una schermata \"Violazione sicurezza\""
#. • MSG_341
msgid "a Windows Recovery Screen (BSOD) with '%s'"
msgstr "una schermata di ripristino Windows (BSOD) con '%s'"
#. • MSG_342
msgid "Compressed VHDX Image"
msgstr "Immagine VHDX compressa"
#. • MSG_343
msgid "Uncompressed VHD Image"
msgstr "Immagine VHD non compressa"
#. • MSG_344
msgid "Full Flash Update Image"
msgstr "Immagine aggiornamento flash completa"
#. • MSG_345
msgid ""
"Some additional data must be downloaded from Microsoft to use this functionality:\n"
"- Select 'Yes' to connect to the Internet and download it\n"
"- Select 'No' to cancel the operation"
msgstr ""
"Per usare questa funzionalità è necessario scaricare da Microsoft alcuni dati aggiuntivi:\n"
"- Seleziona 'Sì' per connettersi ad internet e scaricarli\n"
"- Seleziona 'No' per annullare l'operazione"
#. • MSG_346
msgid "Restrict Windows to S-Mode (INCOMPATIBLE with online account bypass)"
msgstr "Limita Windows alla modalità S (INCOMPATIBILE con il bypass dell'account online)"
#. • MSG_347
msgid "Expert Mode"
msgstr "Modalità esperto"
#. • MSG_348
msgid "Extracting archive files: %s"
msgstr "Estrazione file archivio: %s"
#. • MSG_349
msgid "Use Rufus MBR"
msgstr "Usa MBR Rufus"
#. • MSG_900
#.
#. The following messages are for the Windows Store listing only and are not used by the application
@ -1874,7 +1940,7 @@ msgstr "Codice sorgente: %s"
#. • MSG_903
msgid "ChangeLog: %s"
msgstr "ChangeLog: %s"
msgstr "Novità: %s"
#. • MSG_904
#.

View File

@ -1,9 +1,9 @@
msgid ""
msgstr ""
"Project-Id-Version: 3.22\n"
"Project-Id-Version: 4.5\n"
"Report-Msgid-Bugs-To: pete@akeo.ie\n"
"POT-Creation-Date: 2023-04-06 11:46+0900\n"
"PO-Revision-Date: 2023-04-06 18:36+0200\n"
"POT-Creation-Date: 2024-05-09 21:04+0900\n"
"PO-Revision-Date: 2024-05-09 22:07+0900\n"
"Last-Translator: \n"
"Language-Team: \n"
"Language: ja_JP\n"
@ -13,7 +13,7 @@ msgstr ""
"X-Poedit-SourceCharset: UTF-8\n"
"X-Rufus-LanguageName: Japanese (日本語)\n"
"X-Rufus-LCID: 0x0411\n"
"X-Generator: Poedit 3.2.2\n"
"X-Generator: Poedit 3.4.2\n"
#. • IDD_DIALOG → IDS_DRIVE_PROPERTIES_TXT
msgid "Drive Properties"
@ -54,13 +54,11 @@ msgstr "USB 接続の HDD を一覧表示"
msgid "Add fixes for old BIOSes (extra partition, align, etc.)"
msgstr "古い BIOS のために修正を追加 (パーティションの拡張、並び替え、その他)"
#. • IDD_DIALOG → IDC_RUFUS_MBR
#. • IDD_DIALOG → IDC_UEFI_MEDIA_VALIDATION
#.
#. 'MBR': See http://en.wikipedia.org/wiki/Master_boot_record
#. Rufus can install it's own custom MBR (the Rufus MBR), which also allows users to
#. specify a custom disk ID for the BIOS. The tooltip for this control is MSG_167.
msgid "Use Rufus MBR with BIOS ID"
msgstr "BIOS ID で Rufus の MBR を作成"
#. It is acceptable to drop the "runtime" if you are running out of space
msgid "Enable runtime UEFI media validation"
msgstr "ランタイムUEFIメディア検証を有効化"
#. • IDD_DIALOG → IDS_FORMAT_OPTIONS_TXT
msgid "Format Options"
@ -1046,16 +1044,8 @@ msgid "Check this box to allow the display of international labels and set a dev
msgstr "機能拡張されたラベルの表示とデバイス アイコンの設定を有効するにはこのチェック ボックスをオンにします。“autorun.inf” を作成します。"
#. • MSG_167
msgid "Install an MBR that allows boot selection and can masquerade the BIOS USB drive ID"
msgstr "ブート選択が可能で BIOS の USB ドライブ ID に見えるよう偽装された MBR をインストールします。"
#. • MSG_168
msgid ""
"Try to masquerade first bootable USB drive (usually 0x80) as a different disk.\n"
"This should only be necessary if you install Windows XP and have more than one disk."
msgstr ""
"最優先でブートする USB ドライブ (通常は 0x80) を別のディスクとして偽装します。\n"
"Windows XP をインストールして複数のディスクを使用する場合にのみ必要です。"
msgid "Install a UEFI bootloader, that will perform MD5Sum file validation of the media"
msgstr "MD5チェックサム検証を行うUEFIブートローダーをインストールします。"
#. • MSG_169
msgid ""
@ -1857,6 +1847,82 @@ msgstr "BitLocker 自動デバイス暗号化を無効化します。"
msgid "Persistent log"
msgstr "永続ログ"
#. • MSG_337
msgid ""
"An additional file ('diskcopy.dll') must be downloaded from Microsoft to install MS-DOS:\n"
"- Select 'Yes' to connect to the Internet and download it\n"
"- Select 'No' to cancel the operation\n"
"\n"
"Note: The file will be downloaded in the application's directory and will be reused automatically if present."
msgstr ""
"MS-DOSをインストールするにはMicrosoftから追加のファイル(diskcopy.dll)をダウンロードする必要があります。\n"
"- はいを選択すると、インターネットに接続しダウンロードします。\n"
"- いいえを選択すると、キャンセルします\n"
"\n"
"注意:ファイルはアプリケーションのディレクトリへダウンロードされ、今後自動的に再利用されます。"
#. • MSG_338
msgid "Revoked UEFI bootloader detected"
msgstr "無効なUEFIブートローダーが検出されました。"
#. • MSG_339
msgid ""
"Rufus detected that the ISO you have selected contains a UEFI bootloader that has been revoked and that will produce %s, when Secure Boot is enabled on a fully up to date UEFI system.\n"
"\n"
"- If you obtained this ISO image from a non reputable source, you should consider the possibility that it might contain UEFI malware and avoid booting from it.\n"
"- If you obtained it from a trusted source, you should try to locate a more up to date version, that will not produce this warning."
msgstr ""
"Rufusは選択されたISOイメージが無効なUEFIブートローダーを含み、最新のUEFIでセキュアブートが有効である場合%sを引き起こすことを検出しました。\n"
"\n"
"- このファイルが信頼できないソースから入手されたものであれば、マルウェア混入の可能性があるため起動しないことをお勧めします。\n"
"- このファイルが信頼できるソースから取得したものであれば、警告が発生しない新しいバージョンを探すことをお勧めします。"
#. • MSG_340
msgid "a \"Security Violation\" screen"
msgstr "セキュリティ侵害表示"
#. • MSG_341
msgid "a Windows Recovery Screen (BSOD) with '%s'"
msgstr "\"%s\"によるWindowsのブルースクリーン"
#. • MSG_342
msgid "Compressed VHDX Image"
msgstr "圧縮されたVHDXイメージ"
#. • MSG_343
msgid "Uncompressed VHD Image"
msgstr "圧縮されていないVHDイメージ"
#. • MSG_344
msgid "Full Flash Update Image"
msgstr "Full Flash Updateイメージ"
#. • MSG_345
msgid ""
"Some additional data must be downloaded from Microsoft to use this functionality:\n"
"- Select 'Yes' to connect to the Internet and download it\n"
"- Select 'No' to cancel the operation"
msgstr ""
"この機能を使用するにはMicrosoftから追加のファイルをいくつかダウンロードする必要があります。\n"
"- はいを選択すると、インターネットに接続しダウンロードします。\n"
"- いいえを選択すると、キャンセルします"
#. • MSG_346
msgid "Restrict Windows to S-Mode (INCOMPATIBLE with online account bypass)"
msgstr "WindowsのSモードを強制する(オンラインアカウント要件の削除と同時に使用できません)"
#. • MSG_347
msgid "Expert Mode"
msgstr "エキスパートモード"
#. • MSG_348
msgid "Extracting archive files: %s"
msgstr "ファイルを展開中: %s"
#. • MSG_349
msgid "Use Rufus MBR"
msgstr "Rufus MBRを使用する"
#. • MSG_900
#.
#. The following messages are for the Windows Store listing only and are not used by the application

View File

@ -1,9 +1,9 @@
msgid ""
msgstr ""
"Project-Id-Version: 3.22\n"
"Project-Id-Version: 4.5\n"
"Report-Msgid-Bugs-To: pete@akeo.ie\n"
"POT-Creation-Date: 2023-03-10 13:36+0000\n"
"PO-Revision-Date: 2023-03-10 13:40+0000\n"
"POT-Creation-Date: 2024-04-29 04:19+0900\n"
"PO-Revision-Date: 2024-04-29 05:50+0900\n"
"Last-Translator: \n"
"Language-Team: \n"
"Language: ko_KR\n"
@ -13,7 +13,7 @@ msgstr ""
"X-Poedit-SourceCharset: UTF-8\n"
"X-Rufus-LanguageName: Korean (한국어)\n"
"X-Rufus-LCID: 0x0412\n"
"X-Generator: Poedit 3.2.2\n"
"X-Generator: Poedit 3.4.2\n"
#. • IDD_DIALOG → IDS_DRIVE_PROPERTIES_TXT
msgid "Drive Properties"
@ -54,13 +54,11 @@ msgstr "USB 하드 드라이브 목록"
msgid "Add fixes for old BIOSes (extra partition, align, etc.)"
msgstr "오래된 BIOS에 대한 수정 추가 (추가 파티션, 정렬 등)"
#. • IDD_DIALOG → IDC_RUFUS_MBR
#. • IDD_DIALOG → IDC_UEFI_MEDIA_VALIDATION
#.
#. 'MBR': See http://en.wikipedia.org/wiki/Master_boot_record
#. Rufus can install it's own custom MBR (the Rufus MBR), which also allows users to
#. specify a custom disk ID for the BIOS. The tooltip for this control is MSG_167.
msgid "Use Rufus MBR with BIOS ID"
msgstr "BIOS ID로 Rufus MBR 사용"
#. It is acceptable to drop the "runtime" if you are running out of space
msgid "Enable runtime UEFI media validation"
msgstr "런타임 UEFI 미디어 유효성 검증 사용"
#. • IDD_DIALOG → IDS_FORMAT_OPTIONS_TXT
msgid "Format Options"
@ -175,11 +173,11 @@ msgstr "업데이트 확인 - Rufus"
#. • IDD_NEW_VERSION → IDS_NEW_VERSION_AVAIL_TXT
msgid "A newer version is available. Please download the latest version!"
msgstr "새 버전을 사용할 수 있습니다. 최신 버전을 다운로드하십시오!"
msgstr "최신 버전을 사용할 수 있습니다. 최신 버전을 다운로드하세요!"
#. • IDD_NEW_VERSION → IDC_WEBSITE
msgid "Click here to go to the website"
msgstr "웹 사이트로 이동하려면 여기를 클릭하십시오"
msgstr "웹사이트로 이동하려면 여기를 클릭하세요"
#. • IDD_NEW_VERSION → IDS_NEW_VERSION_NOTES_GRP
msgid "Release Notes"
@ -201,7 +199,7 @@ msgid ""
"Please close the first application before running another one."
msgstr ""
"다른 Rufus 응용 프로그램이 실행 중입니다.\n"
"다른 응용 프로그램을 실행하기 전에 첫 번째 응용 프로그램을 닫으십시오."
"다른 응용 프로그램을 실행하기 전에 첫 번째 응용 프로그램을 닫아주세요."
#. • MSG_003
msgid ""
@ -209,7 +207,7 @@ msgid ""
"To continue with this operation, click OK. To quit click CANCEL."
msgstr ""
"경고: '%s' 장치의 모든 데이터가 삭제됩니다.\n"
"이 작업을 계속하려면 확인을 클릭하십시오. 끝내려면 취소를 클릭하십시오."
"이 작업을 계속하려면 확인을 클릭합니다. 종료하려면 취소를 클릭합니다."
#. • MSG_004
msgid "Rufus update policy"
@ -217,7 +215,7 @@ msgstr "Rufus 업데이트 정책"
#. • MSG_005
msgid "Do you want to allow Rufus to check for application updates online?"
msgstr "Rufus가 온라인으로 응용프로그램 업데이트를 확인할 수 있도록 허용하시겠습니까?"
msgstr "Rufus가 온라인으로 응용 프로그램 업데이트를 확인할 수 있도록 허용하시겠습니까?"
#. • MSG_007
msgid "Cancel"
@ -237,7 +235,7 @@ msgstr ""
"검사 완료: %d개의 불량 블록을 찾았습니다\n"
" %d개 읽기 오류\n"
" %d개 쓰기 오류\n"
" %d개 손상 오류"
" %d개 손상 오류"
#. • MSG_012
#.
@ -433,7 +431,7 @@ msgstr "미디어가 쓰기 금지되어 있습니다."
#. • MSG_055
msgid "The device is in use by another process. Please close any other process that may be accessing the device."
msgstr "장치가 다른 프로세스에서 사용 중입니다. 장치에 액세스할 수 있는 다른 프로세스를 닫으십시오."
msgstr "다른 프로세스에서 장치를 사용 중입니다. 장치에 액세스할 수 있는 다른 프로세스를 모두 닫으세요."
#. • MSG_056
msgid "Quick format is not available for this device."
@ -457,7 +455,7 @@ msgstr "볼륨 크기가 유효하지 않습니다."
#. • MSG_061
msgid "Please insert a removable media in drive."
msgstr "드라이브에 이동식 미디어를 삽입하십시오."
msgstr "드라이브에 이동식 미디어를 삽입하세요."
#. • MSG_062
msgid "An unsupported command was received."
@ -481,7 +479,7 @@ msgstr "설치 실패"
#. • MSG_067
msgid "Could not open media. It may be in use by another process. Please re-plug the media and try again."
msgstr "미디어를 열 수 없습니다. 다른 프로세스에서 사용 중일 수 있습니다. 미디어를 다시 연결하고 다시 시도하십시오."
msgstr "미디어를 열 수 없습니다. 다른 프로세스에서 사용 중일 수 있습니다. 미디어를 다시 연결하고 다시 시도하세요."
#. • MSG_068
msgid "Could not partition drive."
@ -575,8 +573,8 @@ msgstr ""
"이로 인해 부팅 메뉴가 제대로 표시되지 않을 수 있습니다.\n"
"\n"
"Rufus는 이 문제를 해결하기 위해 최신 버전을 다운로드할 수 있습니다:\n"
"- 인터넷에 연결하고 파일을 다운로드하려면 '예'를 선택하십시오.\n"
"- 기존 ISO 파일을 수정하지 않은 상태로 두려면 '아니오'를 선택하십시오.\n"
"- 인터넷에 연결하고 파일을 다운로드하려면 '예'를 선택합니다\n"
"- 기존 ISO 파일을 수정하지 않은 상태로 두려면 '아니오'를 선택합니다\n"
"무엇을 해야 할지 모르면 '예'를 선택해야 합니다.\n"
"\n"
"참고: 새 파일이 현재 디렉터리에 다운로드되고 '%s'가 있으면 자동으로 재사용됩니다."
@ -614,7 +612,7 @@ msgstr "지원되지 않는 ISO"
#. • MSG_091
msgid "When using UEFI Target Type, only EFI bootable ISO images are supported. Please select an EFI bootable ISO or set the Target Type to BIOS."
msgstr "UEFI 대상 유형을 사용하는 경우 EFI 부팅 ISO 이미지만 지원됩니다. EFI 부팅 ISO를 선택하거나 대상 유형을 BIOS로 설정하십시오."
msgstr "UEFI 대상 유형을 사용하는 경우, EFI 부팅 가능한 ISO 이미지만 지원됩니다. EFI 부팅 가능한 ISO를 선택하거나 대상 유형을 BIOS로 설정하세요."
#. • MSG_092
msgid "Unsupported filesystem"
@ -640,7 +638,7 @@ msgstr "DD 이미지"
#. • MSG_096
msgid "The file system currently selected can not be used with this type of ISO. Please select a different file system or use a different ISO."
msgstr "현재 선택한 파일 시스템은 이 유형의 ISO에서 사용할 수 없습니다. 다른 파일 시스템을 선택하거나 다른 ISO를 사용하십시오."
msgstr "현재 선택한 파일 시스템은 이 유형의 ISO와 함께 사용할 수 없습니다. 다른 파일 시스템을 선택하거나 다른 ISO를 사용하세요."
#. • MSG_097
msgid "'%s' can only be applied if the file system is NTFS."
@ -702,8 +700,8 @@ msgstr ""
"이 파일은 크기가 100KB 이상이고 항상 %s ISO 이미지에 존재하기 때문에 Rufus에 포함되어 있지 않습니다.\n"
"\n"
"Rufus가 누락된 파일을 다운로드할 수 있습니다:\n"
"- 인터넷에 연결하고 파일을 다운로드하려면 '예'를 선택하십시오\n"
"- 나중에 드라이브에 이 파일을 수동으로 복사하려면 '아니오'를 선택하십시오\n"
"- 인터넷에 연결하고 파일을 다운로드하려면 '예'를 선택합니다\n"
"- 나중에 드라이브에 이 파일을 수동으로 복사하려면 '아니오'를 선택합니다\n"
"\n"
"참고: 파일이 현재 디렉터리에 다운로드되고 '%s'가 있으면 자동으로 재사용됩니다."
@ -713,11 +711,11 @@ msgid ""
"If you are sure you want to cancel, click YES. Otherwise, click NO."
msgstr ""
"취소하면 장치를 사용할 수 없는 상태가 될 수 있습니다.\n"
"취소하려면 예를 클릭하십시오. 그렇지 않으면 아니요를 클릭합니다."
"취소하려면 예를 클릭합니다. 그렇지 않으면 아니오를 클릭합니다."
#. • MSG_106
msgid "Please select folder"
msgstr "폴더를 선택하십시오"
msgstr "폴더를 선택하세요"
#. • MSG_107
msgid "All files"
@ -740,7 +738,7 @@ msgid ""
"Please change the Cluster size or use FreeDOS."
msgstr ""
"MS-DOS는 64KB 클러스터 크기를 사용하는 드라이브에서 부팅할 수 없습니다.\n"
"클러스터 크기를 변경하거나 FreeDOS를 사용하십시오."
"클러스터 크기를 변경하거나 FreeDOS를 사용하세요."
#. • MSG_111
msgid "Incompatible Cluster size"
@ -769,8 +767,8 @@ msgstr ""
"이 이미지에서는 Syslinux %s%s를 사용하지만 이 응용 프로그램에는 Syslinux %s%s에 대한 설치 파일만 포함됩니다.\n"
"\n"
"새 버전의 Syslinux는 서로 호환되지 않으므로 Rufus가 모두 포함할 수 없으므로 인터넷에서 두 개의 추가 파일 ('ldlinux.sys' 및 'ldlinux.bss')을 다운로드해야 합니다:\n"
"- 인터넷에 연결하고 이러한 파일을 다운로드하려면 '예'를 선택하십시오\n"
"- 작업을 취소하려면 '아니오'를 선택하십시오\n"
"- 인터넷에 연결하고 이러한 파일을 다운로드하려면 '예'를 선택합니다\n"
"- 작업을 취소하려면 '아니오'를 선택합니다\n"
"\n"
"참고: 파일은 현재 응용 프로그램 디렉터리에 다운로드되며 있는 경우 자동으로 재사용됩니다."
@ -795,9 +793,9 @@ msgstr ""
"이 이미지는 Grub %s을(를) 사용하지만 응용 프로그램에는 Grub %s에 대한 설치 파일만 포함합니다.\n"
"\n"
"다른 버전의 Grub은 서로 호환되지 않을 수 있으며, 모두 포함할 수 없기 때문에 Rufus는 이미지에서 일치하는 Grub 설치 파일 ('core.img')의 버전을 찾으려고 시도합니다:\n"
"- 인터넷에 연결하고 다운로드하려면 '예'를 선택하십시오\n"
"- Rufus의 기본 버전을 사용하려면 '아니요'를 선택하십시오\n"
"- 작업을 중단하려면 '취소'를 선택하십시오\n"
"- 인터넷에 연결하고 다운로드하려면 '예'를 선택합니다\n"
"- Rufus의 기본 버전을 사용하려면 '아니오'를 선택합니다\n"
"- 작업을 중단하려면 '취소'를 선택합니다\n"
"\n"
"참고: 파일은 현재 응용 프로그램 디렉터리에 다운로드되며 있는 경우 자동으로 재사용됩니다. 일치하는 항목을 온라인으로 찾을 수 없는 경우 기본 버전이 사용됩니다."
@ -870,7 +868,7 @@ msgid ""
"For details on why this is necessary, see the 'More Information' button below."
msgstr ""
"UEFI:NTFS 부트 로더를 사용하는 미디어를 방금 만들었습니다. 이 미디어를 부팅하려면 보안 부팅을 비활성화해야 합니다.\n"
"이 작업이 필요한 이유에 대한 자세한 내용은 아래의 '추가 정보' 버튼을 참조하십시오."
"이 기능이 필요한 이유에 대한 자세한 내용은 아래의 '추가 정보' 버튼을 참조하세요."
#. • MSG_130
msgid "Windows image selection"
@ -882,7 +880,7 @@ msgid ""
"Please select the image you wish to use for this installation:"
msgstr ""
"이 ISO에는 여러 개의 Windows 이미지가 포함되어 있습니다.\n"
"이 설치에 사용할 이미지를 선택하십시오:"
"이 설치에 사용할 이미지를 선택하세요:"
#. • MSG_132
msgid "Another program or process is accessing this drive. Do you want to format it anyway?"
@ -950,7 +948,7 @@ msgstr "브라우저를 사용하여 다운로드"
#. • MSG_144
msgid "Download of Windows ISOs is unavailable due to Microsoft having altered their website to prevent it."
msgstr "너무 많은 다운로드를 요청하여 Microsoft에서 일시적으로 금지했습니다. 나중에 다시 시도하십시오."
msgstr "Microsoft가 이를 방지하기 위해 웹사이트를 변경했기 때문에 Windows ISO를 다운로드할 수 없습니다."
#. • MSG_145
msgid "PowerShell 3.0 or later is required to run this script."
@ -970,7 +968,7 @@ msgstr "ISO 이미지 다운로드"
#. • MSG_150
msgid "Type of computer you plan to use this bootable drive with. It is your responsibility to determine whether your target is of BIOS or UEFI type before you start creating the drive, as it may fail to boot otherwise."
msgstr "이 부팅 드라이브를 사용할 컴퓨터 유형입니다. 드라이브 생성을 시작하기 전에 대상이 BIOS인지 UEFI 유형인지 확인하는 것은 사용자의 책임입니다. 그렇지 않으면 부팅에 실패할 수 있습니다."
msgstr "이 부팅 가능한 드라이브를 사용하려는 컴퓨터 유형입니다. 드라이브를 만들기 전에 대상이 BIOS인지 UEFI 유형인지 확인해야 합니다. 그렇지 않으면 부팅에 실패할 수도 있기 때문입니다."
#. • MSG_151
#.
@ -1012,7 +1010,7 @@ msgid ""
"International characters are accepted."
msgstr ""
"이 필드를 사용하여 드라이브 레이블을 설정합니다.\n"
"국제 문자 사용할 수 있습니다."
"국제 문자 사용할 수 있습니다."
#. • MSG_160
msgid "Toggle advanced options"
@ -1028,31 +1026,23 @@ msgstr "\"느린\" 포맷 방법을 사용하려면 이 상자의 선택을 취
#. • MSG_163
msgid "Method that will be used to create partitions"
msgstr "파티션을 만드는 데 사용할 방식입니다"
msgstr "파티션을 만드는 데 사용할 방"
#. • MSG_164
msgid "Method that will be used to make the drive bootable"
msgstr "드라이브를 부팅 가능한 상태로 만드는 데 사용되는 방식입니다"
msgstr "드라이브를 부팅 가능하게 만드는 데 사용되는 방법"
#. • MSG_165
msgid "Click to select or download an image..."
msgstr "이미지를 선택하거나 다운로드하려면 클릭하십시오..."
msgstr "이미지를 선택하거나 다운로드하려면 클릭..."
#. • MSG_166
msgid "Check this box to allow the display of international labels and set a device icon (creates an autorun.inf)"
msgstr "국제 레이블을 표시하고 장치 아이콘을 설정하려면 이 확인란을 선택합니다 (autorun.inf 생성)."
msgstr "이 확인란을 선택하면 국제 레이블 표시를 허용하고 장치 아이콘을 설정할 수 있습니다 (autorun.inf 생성)."
#. • MSG_167
msgid "Install an MBR that allows boot selection and can masquerade the BIOS USB drive ID"
msgstr "부팅 선택을 허용하고 BIOS USB 드라이브 ID를 위장할 수 있는 MBR 설치"
#. • MSG_168
msgid ""
"Try to masquerade first bootable USB drive (usually 0x80) as a different disk.\n"
"This should only be necessary if you install Windows XP and have more than one disk."
msgstr ""
"부팅 가능한 첫 번째 USB 드라이브 (일반적으로 0x80)를 다른 디스크로 위장해 보십시오.\n"
"Windows XP를 설치하고 디스크가 두 개 이상인 경우에만 필요합니다."
msgid "Install a UEFI bootloader, that will perform MD5Sum file validation of the media"
msgstr "미디어의 MD5Sum 파일 유효성 검사를 수행할 UEFI 부트로더 설치"
#. • MSG_169
msgid ""
@ -1095,7 +1085,7 @@ msgstr "버전 %d.%d (빌드 %d)"
#. • MSG_176
msgid "English translation: Pete Batard <mailto:pete@akeo.ie>"
msgstr "한국어 번역:\\line• Uk-Jin Jang <mailto:doublestat@gmail.com>\\line• 비너스걸-VᴇɴsGɪʀʟ♥ <mailto:venusgirl@outlook.com>"
msgstr "한국어 번역:\\line• 비너스걸 (VᴇɴsGɪʀʟ♥) <mailto:venusgirl@outlook.com>"
#. • MSG_177
msgid "Report bugs or request enhancements at:"
@ -1111,7 +1101,7 @@ msgstr "업데이트 정책:"
#. • MSG_180
msgid "If you choose to allow this program to check for application updates, you agree that the following information may be collected on our server(s):"
msgstr "이 프로그램에서 응용프로그램 업데이트를 확인하도록 선택한 경우, 다음 정보가 서버에서 수집될 수 있다는 데 동의하는 것입니다:"
msgstr "이 프로그램에서 응용 프로그램 업데이트를 확인하도록 선택한 경우, 다음 정보가 서버에서 수집될 수 있다는 데 동의하는 것입니다:"
#. • MSG_181
msgid "Your operating system's architecture and version"
@ -1147,7 +1137,7 @@ msgstr "선택한 부팅 옵션에 대한 잘못된 이미지"
#. • MSG_188
msgid "The current image doesn't match the boot option selected. Please use a different image or choose a different boot option."
msgstr "현재 이미지가 선택한 부팅 옵션과 일치하지 않습니다. 다른 이미지를 사용하거나 다른 부팅 옵션을 선택하십시오."
msgstr "현재 이미지가 선택한 부팅 옵션과 일치하지 않습니다. 다른 이미지를 사용하거나 다른 부팅 옵션을 선택하세요."
#. • MSG_189
msgid "This ISO image is not compatible with the selected filesystem"
@ -1378,7 +1368,7 @@ msgstr "Syslinux %s 설치 중..."
#. Bad blocks status. Example: "Bad Blocks: Write pass 1/2 - 12.34% (0/0/1 errors)"
#. See MSG_191 & MSG_192 for "Write pass"/"Read pass" translation.
msgid "Bad Blocks: %s %d/%d - %0.2f%% (%d/%d/%d errors)"
msgstr "불량 블록: 통과 %d/%d - %0.2f%% (%d/%d/%d 오류)"
msgstr "불량 블록: %s %d/%d - %0.2f%% (%d/%d/%d 오류)"
#. • MSG_236
msgid "Bad Blocks: Testing with random pattern"
@ -1406,9 +1396,9 @@ msgid ""
"\n"
"The download will be deleted. Please check the log for more details."
msgstr ""
"다운로드한 업데이트의 서명을 확인할 수 없습니다. 이는 시스템이 서명 유효성 검사를 위해 잘못 구성되었거나 악의적인 다운로드를 나타냈음을 의미할 수 있습니다.\n"
"다운로드한 업데이트의 서명을 확인할 수 없습니다. 이는 시스템이 서명 유효성 검사를 위해 잘못 구성되었거나 악의적인 다운로드를 의미할 수 있습니다.\n"
"\n"
"다운로드가 삭제됩니다. 자세한 내용은 로그를 확인하십시오."
"다운로드가 삭제됩니다. 자세한 내용은 로그에서 확인하세요."
#. • MSG_241
msgid "Downloading: %s"
@ -1462,7 +1452,7 @@ msgstr "크기 확인"
#. • MSG_253
msgid "Hard disk detection"
msgstr "하드디스크 감지"
msgstr "하드 디스크 감지"
#. • MSG_254
msgid "Force large FAT32 formatting"
@ -1564,9 +1554,9 @@ msgid ""
msgstr ""
"선택한 이미지는 'ISO 하이브리드' 이미지입니다. 즉, %s (파일 복사) 모드 또는 %s (디스크 이미지) 모드로 쓸 수 있습니다.\n"
"Rufus는 %s 모드를 사용하는 것이 좋습니다. 따라서 드라이브를 작성한 후에는 항상 드라이브에 대한 전체 액세스 권한을 가질 수 있습니다.\n"
"그러나 부팅하는 동안 문제가 발생하면 %s 모드에서 이 이미지를 다시 쓰십시오.\n"
"그러나 부팅하는 동안 문제가 발생하면 %s 모드에서 이 이미지를 다시 작성해 볼 수 있습니다.\n"
"\n"
"이 이미지를 쓰는 데 사용할 모드를 선택하십시오:"
"이 이미지를 작성하는 데 사용할 모드를 선택하세요:"
#. • MSG_276
#.
@ -1594,7 +1584,7 @@ msgstr "디스크 또는 ISO 이미지"
#. • MSG_281
msgid "%s (Please select)"
msgstr "%s (선택하십시오)"
msgstr "%s (선택해 주세요)"
#. • MSG_282
msgid "Exclusive USB drive locking"
@ -1620,11 +1610,11 @@ msgstr ""
#. • MSG_286
msgid "Zeroing drive: %s"
msgstr "드라이브 0 채우기: %s"
msgstr "드라이브 제로화 중: %s"
#. • MSG_287
msgid "Detection of non-USB removable drives"
msgstr "USB가 아닌 이동식 드라이브 감지됩니다"
msgstr "USB 이동식 드라이브 감지"
#. • MSG_288
msgid "Missing elevated privileges"
@ -1644,7 +1634,7 @@ msgstr "버전 선택"
#. • MSG_292
msgid "Please select the version of Windows you want to install:"
msgstr "설치할 Windows 버전을 선택하십시오:"
msgstr "설치하려는 Windows 버전을 선택하세요:"
#. • MSG_293
msgid "Unsupported Windows version"
@ -1702,7 +1692,7 @@ msgid ""
msgstr ""
"Rufus가 다운로드한 업데이트의 타임스탬프가 현재 실행 파일의 타임스탬프보다 최신인지 확인할 수 없습니다.\n"
"\n"
"잠재적인 공격 시나리오를 방지하기 위해 업데이트 프로세스가 중단되었으며 다운로드가 삭제됩니다. 자세한 내용은 로그를 확인하십시오."
"잠재적인 공격 시나리오를 방지하기 위해 업데이트 프로세스가 중단되었으며 다운로드가 삭제됩니다. 자세한 내용은 로그를 확인하시기 바랍니다."
#. • MSG_301
msgid "Show application settings"
@ -1751,7 +1741,7 @@ msgid ""
msgstr ""
"선택한 ISO는 UEFI를 사용하며 EFI 시스템 파티션 (ESP)으로 작성할 수 있을 정도로 작습니다. 일부 유형의 설치에서는 전체 디스크를 차지하는 일반 데이터 파티션에 쓰는 대신 ESP에 쓰는 것이 바람직할 수 있습니다.\n"
"\n"
"이 이미지를 쓰는 데 사용할 모드를 선택하십시오:"
"이 이미지를 작성하는 데 사용할 모드를 선택하세요:"
#. • MSG_311
msgid "Use %s (in the main application window) to enable."
@ -1853,6 +1843,82 @@ msgstr "BitLocker 자동 장치 암호화 사용 안 함"
msgid "Persistent log"
msgstr "영구 로그"
#. • MSG_337
msgid ""
"An additional file ('diskcopy.dll') must be downloaded from Microsoft to install MS-DOS:\n"
"- Select 'Yes' to connect to the Internet and download it\n"
"- Select 'No' to cancel the operation\n"
"\n"
"Note: The file will be downloaded in the application's directory and will be reused automatically if present."
msgstr ""
"MS-DOS를 설치하려면 Microsoft에서 추가 파일 ('diskcopy.dll')을 다운로드해야 합니다:\n"
"- 인터넷에 연결하여 다운로드하려면 '예'를 선택합니다\n"
"- 작업을 취소하려면 '아니오'를 선택합니다\n"
"\n"
"참고: 해당 파일은 응용 프로그램의 디렉터리에 다운로드되며 존재하는 경우 자동으로 재사용됩니다."
#. • MSG_338
msgid "Revoked UEFI bootloader detected"
msgstr "취소된 UEFI 부트로더가 탐지됨"
#. • MSG_339
msgid ""
"Rufus detected that the ISO you have selected contains a UEFI bootloader that has been revoked and that will produce %s, when Secure Boot is enabled on a fully up to date UEFI system.\n"
"\n"
"- If you obtained this ISO image from a non reputable source, you should consider the possibility that it might contain UEFI malware and avoid booting from it.\n"
"- If you obtained it from a trusted source, you should try to locate a more up to date version, that will not produce this warning."
msgstr ""
"Rufus는 사용자가 선택한 ISO에 취소된 UEFI 부트로더가 포함되어 있으며, 이는 완전히 최신 UEFI 시스템에서 보안 부팅이 활성화된 경우에 %s을(를) 생성한다는 것을 감지했습니다.\n"
"\n"
"- 평판이 좋지 않은 소스에서 이 ISO 이미지를 가져온 경우 UEFI 멀웨어가 포함되어 있을 가능성을 고려하고 부팅을 피해야 합니다.\n"
"- 신뢰할 수 있는 소스에서 가져온 경우에는 보다 최신 버전을 찾아야 합니다. 그러면 이 경고가 발생하지 않습니다.."
#. • MSG_340
msgid "a \"Security Violation\" screen"
msgstr "\"보안 위반\" 화면"
#. • MSG_341
msgid "a Windows Recovery Screen (BSOD) with '%s'"
msgstr "%s이(가) 있는 Windows 복구 화면 (BSOD)"
#. • MSG_342
msgid "Compressed VHDX Image"
msgstr "압축된 VHDX 이미지"
#. • MSG_343
msgid "Uncompressed VHD Image"
msgstr "압축되지 않은 VHD 이미지"
#. • MSG_344
msgid "Full Flash Update Image"
msgstr "전체 플래시 업데이트 이미지"
#. • MSG_345
msgid ""
"Some additional data must be downloaded from Microsoft to use this functionality:\n"
"- Select 'Yes' to connect to the Internet and download it\n"
"- Select 'No' to cancel the operation"
msgstr ""
"이 기능을 사용하려면 Microsoft에서 몇 가지 추가 데이터를 다운로드해야 합니다:\n"
"- 인터넷에 연결하여 다운로드하려면 '예'를 선택합니다\n"
"- 작업을 취소하려면 '아니오'를 선택합니다"
#. • MSG_346
msgid "Restrict Windows to S-Mode (INCOMPATIBLE with online account bypass)"
msgstr "Windows를 S-Mode로 제한 (온라인 계정 우회와 호환되지 않음)"
#. • MSG_347
msgid "Expert Mode"
msgstr "전문가 모드"
#. • MSG_348
msgid "Extracting archive files: %s"
msgstr "압축 파일 추출 중: %s"
#. • MSG_349
msgid "Use Rufus MBR"
msgstr "Rufus MBR 사용"
#. • MSG_900
#.
#. The following messages are for the Windows Store listing only and are not used by the application

View File

@ -1,9 +1,9 @@
msgid ""
msgstr ""
"Project-Id-Version: 3.22\n"
"Project-Id-Version: 4.5\n"
"Report-Msgid-Bugs-To: pete@akeo.ie\n"
"POT-Creation-Date: 2023-02-24 15:38+0200\n"
"PO-Revision-Date: 2023-02-26 22:12+0000\n"
"POT-Creation-Date: 2024-05-14 16:22+0100\n"
"PO-Revision-Date: 2024-05-14 16:22+0100\n"
"Last-Translator: \n"
"Language-Team: \n"
"Language: lv_LV\n"
@ -13,7 +13,7 @@ msgstr ""
"X-Poedit-SourceCharset: UTF-8\n"
"X-Rufus-LanguageName: Latvian (Latviešu)\n"
"X-Rufus-LCID: 0x0426\n"
"X-Generator: Poedit 3.2.2\n"
"X-Generator: Poedit 3.4.4\n"
#. • IDD_DIALOG → IDS_DRIVE_PROPERTIES_TXT
msgid "Drive Properties"
@ -54,13 +54,11 @@ msgstr "USB disku saraksts"
msgid "Add fixes for old BIOSes (extra partition, align, etc.)"
msgstr "Pievienot vecāku BIOSu labojumus (partīcijām, dalījumam, u.c.)"
#. • IDD_DIALOG → IDC_RUFUS_MBR
#. • IDD_DIALOG → IDC_UEFI_MEDIA_VALIDATION
#.
#. 'MBR': See http://en.wikipedia.org/wiki/Master_boot_record
#. Rufus can install it's own custom MBR (the Rufus MBR), which also allows users to
#. specify a custom disk ID for the BIOS. The tooltip for this control is MSG_167.
msgid "Use Rufus MBR with BIOS ID"
msgstr "Izmantot MBR ar BIOS ID"
#. It is acceptable to drop the "runtime" if you are running out of space
msgid "Enable runtime UEFI media validation"
msgstr "Ieslēgt UEFI nesēja pārbaudi izpildīšanas laikā"
#. • IDD_DIALOG → IDS_FORMAT_OPTIONS_TXT
msgid "Format Options"
@ -117,7 +115,7 @@ msgstr "Licence"
#. • IDD_ABOUTBOX → IDOK
msgid "OK"
msgstr "Aprstiprināt"
msgstr "Apstiprināt"
#. • IDD_LICENSE → IDD_LICENSE
msgid "Rufus License"
@ -273,11 +271,11 @@ msgstr "Citādi"
#. • MSG_018
msgid "Your version: %d.%d (Build %d)"
msgstr "Jūsu versija: %d.%d (Build %d)"
msgstr "Jūsu versija: %d.%d (Būvējums %d)"
#. • MSG_019
msgid "Latest version: %d.%d (Build %d)"
msgstr "Pēdējā versija: %d.%d (Build %d)"
msgstr "Pēdējā versija: %d.%d (Būvējums %d)"
#. • MSG_020
#. • MSG_026
@ -768,7 +766,7 @@ msgid ""
msgstr ""
"Šis virtuālais attēls izmanto Syslinux %s%s, bet programma satur instalācijas failus Syslinux %s%s.\n"
"\n"
"Tā kā jaunās Syslinux versijas nav savstarpēji atbalstāmas, nepieciešams ielādēt no interneta vajadzīgos failus ('ldlinux.sys' un 'ldlinux.bss'):\n"
"Tā kā jaunās Syslinux versijas nav savstarpēji atbalstāmas, nepieciešams ielādēt no interneta vajadzīgos failus ('ldlinux.sys' un 'ldlinux.bss'):\n"
"- Izvēlieties 'Jā' lai pieslēgtos pie interneta un mēģināt ielādētu šos failus\n"
"- Izvēlieties 'Nē' lai atceltu šo darbību\n"
"\n"
@ -914,7 +912,7 @@ msgstr ""
#. • MSG_135
msgid "Version"
msgstr "Vesija"
msgstr "Versija"
#. • MSG_136
msgid "Release"
@ -1043,23 +1041,15 @@ msgid "Check this box to allow the display of international labels and set a dev
msgstr "Atzīmējiet starptautisko simbolu atbalstam un ierīces ikonas izveidei (tiek izveidots fails autorun.inf)"
#. • MSG_167
msgid "Install an MBR that allows boot selection and can masquerade the BIOS USB drive ID"
msgid "Install a UEFI bootloader, that will perform MD5Sum file validation of the media"
msgstr "Instalēt MBR, kur var izvēlēties ielādi un kurš var maskēties BIOS'ā ar ierīces identifikatoru"
#. • MSG_168
msgid ""
"Try to masquerade first bootable USB drive (usually 0x80) as a different disk.\n"
"This should only be necessary if you install Windows XP and have more than one disk."
msgstr ""
"Mēģināt maskēt pirmo USB ielādes ierīci (parasti 0x80) kā citu disku.\n"
"Tas nepieciešams, kad instalējat Windows XP un izmantojat vairāk nekā vienu dieskus."
#. • MSG_169
msgid ""
"Create an extra hidden partition and try to align partitions boundaries.\n"
"This can improve boot detection for older BIOSes."
msgstr ""
"IZveidot papildus slēpto partīciju un izlīdzināt partīciju robežas.\n"
"Izveidot papildus slēpto partīciju un izlīdzināt partīciju robežas.\n"
"Šī opcija var atvieglot ielādes noteikšanu vecākās BIOS versijās."
#. • MSG_170
@ -1734,7 +1724,7 @@ msgstr "Ātrā diska nullēšana: %s"
#. • MSG_307
msgid "this may take a while"
msgstr "Šī darbība var aizņemt laiku"
msgstr "šī darbība var aizņemt laiku"
#. • MSG_308
msgid "VHD detection"
@ -1750,7 +1740,7 @@ msgid ""
"\n"
"Please select the mode that you want to use to write this image:"
msgstr ""
"Izvēlētais ISO-fails izmanto UEFI un ir pietiekoši mazs, lai varētu tikt ierakstīts, kā EFI (ESP) sistēmas sadaļa. Ieraksts iekš ESP, nevis kopējā datu sadaļā, kas aizņem visu disku, var būt ieteicamāks dažu ielāžu tipiem.\n"
"Izvēlētais ISO-fails izmanto UEFI un ir pietiekoši mazs, lai varētu tikt ierakstīts, kā EFI (ESP) sistēmas sadaļa. Ieraksts iekš ESP, nevis kopējā datu sadaļā, kas aizņem visu disku, var būt ieteicamāks dažu ielāžu tipiem.\n"
"\n"
"Izvēlieties to režīmu, kuru nepieciešams izmantot lai ierakstīt šo virtuālo attēlu:"
@ -1816,7 +1806,7 @@ msgstr "Lietotāja opciju pielietošana..."
#. • MSG_327
msgid "Windows User Experience"
msgstr "Windows User Experience"
msgstr "Windows lietotāju pieredze"
#. • MSG_328
msgid "Customize Windows installation?"
@ -1854,6 +1844,82 @@ msgstr "Atslēgt automātisko šifrēšanu ar BitLocker"
msgid "Persistent log"
msgstr "Pastāvīgs žurnāls"
#. • MSG_337
msgid ""
"An additional file ('diskcopy.dll') must be downloaded from Microsoft to install MS-DOS:\n"
"- Select 'Yes' to connect to the Internet and download it\n"
"- Select 'No' to cancel the operation\n"
"\n"
"Note: The file will be downloaded in the application's directory and will be reused automatically if present."
msgstr ""
"Lai instalēt MS-DOS no Microsoft vietnes nepieciešams lejuplādēt papildus failu («diskcopy.dll»):\n"
"- Izvēlieties «Jā», lai pieslēgties pie Interneta un failu lejuplādēt.\n"
"- Izvēlieties «Nē», lai atcelt darbību.\n"
"\n"
"Piezīme. Fails tiks lejuplādēts programmas mapē, ja tas jau eksistē, tiks izmantots atkārtoti."
#. • MSG_338
msgid "Revoked UEFI bootloader detected"
msgstr "Pamanīts atceltais UEFI ielādes ieraksts"
#. • MSG_339
msgid ""
"Rufus detected that the ISO you have selected contains a UEFI bootloader that has been revoked and that will produce %s, when Secure Boot is enabled on a fully up to date UEFI system.\n"
"\n"
"- If you obtained this ISO image from a non reputable source, you should consider the possibility that it might contain UEFI malware and avoid booting from it.\n"
"- If you obtained it from a trusted source, you should try to locate a more up to date version, that will not produce this warning."
msgstr ""
"Rufus konstatēja Jūsu izvēlētais ISO-fails satur atceltu UEFI ielādes ierakstu, kurš izdos %s, ja būs ieslēgta drošā ielāde pilnīgi jauninātajā UEFI sistēmā.\n"
"\n"
"- Ja šis ISO fails ir iegūts no nedrošiem avotiem, vajag ņemt vērā, ka tas var saturēt UEFI ļaunatūru un censties no tā nestartēt.\n"
"- Ja fails iegūts no droša avota, būtu jāatrod jaunāka versija, kurai nerādīs šādu brīdinājumu."
#. • MSG_340
msgid "a \"Security Violation\" screen"
msgstr "a \"Drošības pārkāpuma\" ekrāns"
#. • MSG_341
msgid "a Windows Recovery Screen (BSOD) with '%s'"
msgstr "a Windows atkopšanas ekrāns (BSOD) ar '%s'"
#. • MSG_342
msgid "Compressed VHDX Image"
msgstr "Saspiests VHDX attēls"
#. • MSG_343
msgid "Uncompressed VHD Image"
msgstr "Nesaspiests VHDX attēls"
#. • MSG_344
msgid "Full Flash Update Image"
msgstr "Full Flash atjauninājuma attēls"
#. • MSG_345
msgid ""
"Some additional data must be downloaded from Microsoft to use this functionality:\n"
"- Select 'Yes' to connect to the Internet and download it\n"
"- Select 'No' to cancel the operation"
msgstr ""
"Lai izmantotu šo funkcionalitāti, no Microsoft ir jālejupielādē daži papildus dati:\n"
"- Izvēlieties 'Jā', lai izveidotu savienojumu ar Internetu un lejupielādētu tos\n"
"- Izvēlieties \"Nē\", lai atceltu darbību"
#. • MSG_346
msgid "Restrict Windows to S-Mode (INCOMPATIBLE with online account bypass)"
msgstr "Ierobežot Windows tikai S režīmā (NESADERĪGS ar tiešsaistes konta apiešanu)"
#. • MSG_347
msgid "Expert Mode"
msgstr "Eksperta režīms"
#. • MSG_348
msgid "Extracting archive files: %s"
msgstr "Atpakot arhīva failus: %s"
#. • MSG_349
msgid "Use Rufus MBR"
msgstr "Izmantot Rufus MBR"
#. • MSG_900
#.
#. The following messages are for the Windows Store listing only and are not used by the application
@ -1887,7 +1953,7 @@ msgstr ""
#.
#. Keyword for "boot" will be used for search in the Windows Store
msgid "Boot"
msgstr ""
msgstr "Ielāde"
#. • MSG_910
#.

View File

@ -1,9 +1,9 @@
msgid ""
msgstr ""
"Project-Id-Version: 3.22\n"
"Project-Id-Version: 4.5\n"
"Report-Msgid-Bugs-To: pete@akeo.ie\n"
"POT-Creation-Date: 2023-04-17 13:44+0100\n"
"PO-Revision-Date: 2024-01-10 12:20+0000\n"
"POT-Creation-Date: 2024-05-09 19:38+0100\n"
"PO-Revision-Date: 2024-05-09 19:44+0100\n"
"Last-Translator: \n"
"Language-Team: \n"
"Language: nb_NO\n"
@ -13,7 +13,7 @@ msgstr ""
"X-Poedit-SourceCharset: UTF-8\n"
"X-Rufus-LanguageName: Norwegian (Norsk)\n"
"X-Rufus-LCID: 0x0414\n"
"X-Generator: Poedit 3.4.2\n"
"X-Generator: Poedit 3.4.4\n"
#. • IDD_DIALOG → IDS_DRIVE_PROPERTIES_TXT
msgid "Drive Properties"
@ -54,13 +54,11 @@ msgstr "Før opp USB harddisker"
msgid "Add fixes for old BIOSes (extra partition, align, etc.)"
msgstr "Legger til fiks for gamle BIOSer (ekstra partisjon, etc.)"
#. • IDD_DIALOG → IDC_RUFUS_MBR
#. • IDD_DIALOG → IDC_UEFI_MEDIA_VALIDATION
#.
#. 'MBR': See http://en.wikipedia.org/wiki/Master_boot_record
#. Rufus can install it's own custom MBR (the Rufus MBR), which also allows users to
#. specify a custom disk ID for the BIOS. The tooltip for this control is MSG_167.
msgid "Use Rufus MBR with BIOS ID"
msgstr "Bruk Rufus MBR med BIOS ID"
#. It is acceptable to drop the "runtime" if you are running out of space
msgid "Enable runtime UEFI media validation"
msgstr "Aktiver runtime UEFI-medievalidering"
#. • IDD_DIALOG → IDS_FORMAT_OPTIONS_TXT
msgid "Format Options"
@ -1043,16 +1041,8 @@ msgid "Check this box to allow the display of international labels and set a dev
msgstr "Merk denne boksen for å tillate visning av internasjonal merkelapp og lage et stasjonsikon (lager en autorun.inf)"
#. • MSG_167
msgid "Install an MBR that allows boot selection and can masquerade the BIOS USB drive ID"
msgstr "Installerer en MBR som tillater oppstartsvalg og kan maskere BIOS USB-stasjons ID"
#. • MSG_168
msgid ""
"Try to masquerade first bootable USB drive (usually 0x80) as a different disk.\n"
"This should only be necessary if you install Windows XP and have more than one disk."
msgstr ""
"Forsøk å maskere første oppstartbare USB-stasjon (vanligvis 0x80) som en annen stasjon.\n"
"Dette er kun nødvendig hvis du installerer Windows XP og har mer enn en stasjon."
msgid "Install a UEFI bootloader, that will perform MD5Sum file validation of the media"
msgstr "Installer en UEFI bootloader, som vil utføre MD5Sum-filvalidering av media"
#. • MSG_169
msgid ""
@ -1095,7 +1085,7 @@ msgstr "Versjon %d.%d (Utgave %d)"
#. • MSG_176
msgid "English translation: Pete Batard <mailto:pete@akeo.ie>"
msgstr "Norsk oversettelse:\\line• JED <mailto:translator744@outlook.com>\\line• Thorbjørn Bruarøy <mailto:problemkontroll@gmail.com>\\line• Jakub Zieciak <mailto:jakub.zieciak@gmail.com>"
msgstr "Norsk oversettelse:\\line• JED <mailto:translator744@outlook.com>\\line• Thorbjørn Bruarøy <mailto:problemkontroll@gmail.com>\\line• Jakub Zieciak"
#. • MSG_177
msgid "Report bugs or request enhancements at:"
@ -1843,7 +1833,7 @@ msgstr "Lag en lokal brukerkonto med brukernavnet:"
#. • MSG_334
msgid "Set regional options to the same values as this user's"
msgstr "Sett regionale instillinger til det samme som den aktive brukerkontoen"
msgstr "Sett regionale innstillinger til det samme som den aktive brukerkontoen"
#. • MSG_335
msgid "Disable BitLocker automatic device encryption"
@ -1853,6 +1843,82 @@ msgstr "Deaktiver BitLocker kryptering av enheten"
msgid "Persistent log"
msgstr "Behold log"
#. • MSG_337
msgid ""
"An additional file ('diskcopy.dll') must be downloaded from Microsoft to install MS-DOS:\n"
"- Select 'Yes' to connect to the Internet and download it\n"
"- Select 'No' to cancel the operation\n"
"\n"
"Note: The file will be downloaded in the application's directory and will be reused automatically if present."
msgstr ""
"En ekstra fil ('diskcopy.dll') må lastes ned fra Microsoft for å installere MS-DOS:\n"
"- Velg \"Ja\" for å koble til Internett og laste den ned\n"
"- Velg 'Nei' for å avbryte operasjonen\n"
"\n"
"Merk: Filen vil bli lastet ned i programmets katalog og vil automatisk bli gjenbrukt hvis den er tilstede."
#. • MSG_338
msgid "Revoked UEFI bootloader detected"
msgstr "Opphevet UEFI bootloader oppdaget"
#. • MSG_339
msgid ""
"Rufus detected that the ISO you have selected contains a UEFI bootloader that has been revoked and that will produce %s, when Secure Boot is enabled on a fully up to date UEFI system.\n"
"\n"
"- If you obtained this ISO image from a non reputable source, you should consider the possibility that it might contain UEFI malware and avoid booting from it.\n"
"- If you obtained it from a trusted source, you should try to locate a more up to date version, that will not produce this warning."
msgstr ""
"Rufus oppdaget at ISO-en du har valgt inneholder en UEFI-oppstartslaster som har blitt tilbakekalt og som vil produsere %s, når sikker oppstart er aktivert på et fullstendig oppdatert UEFI-system.\n"
"\n"
"- Hvis du har fått dette ISO-bildet fra en ikke-anerkjent kilde, bør du vurdere muligheten for at det kan inneholde UEFI-malware og unngå å starte opp fra det.\n"
"- Hvis du har fått det fra en pålitelig kilde, bør du prøve å finne en mer oppdatert versjon, som ikke vil gi denne advarselen."
#. • MSG_340
msgid "a \"Security Violation\" screen"
msgstr "en \"Sikkerhetsbrudd\"-skjerm"
#. • MSG_341
msgid "a Windows Recovery Screen (BSOD) with '%s'"
msgstr "en Windows-gjenopprettingsskjerm (BSOD) med '%s'"
#. • MSG_342
msgid "Compressed VHDX Image"
msgstr "Komprimert VHDX-imaget"
#. • MSG_343
msgid "Uncompressed VHD Image"
msgstr "Ukomprimert VHD-imaget"
#. • MSG_344
msgid "Full Flash Update Image"
msgstr "Full Flash Update Image"
#. • MSG_345
msgid ""
"Some additional data must be downloaded from Microsoft to use this functionality:\n"
"- Select 'Yes' to connect to the Internet and download it\n"
"- Select 'No' to cancel the operation"
msgstr ""
"Noen tilleggsdata må lastes ned fra Microsoft for å bruke denne funksjonaliteten:\n"
"- Velg \"Ja\" for å koble til Internett og laste den ned\n"
"- Velg 'Nei' for å avbryte operasjonen"
#. • MSG_346
msgid "Restrict Windows to S-Mode (INCOMPATIBLE with online account bypass)"
msgstr "Begrens Windows til S-modus (INKOMPATIBEL med online kontoomgåelse)"
#. • MSG_347
msgid "Expert Mode"
msgstr "Ekspert modus"
#. • MSG_348
msgid "Extracting archive files: %s"
msgstr "Pakker ut arkivfiler: %s"
#. • MSG_349
msgid "Use Rufus MBR"
msgstr "Bruk Rufus MBR"
#. • MSG_900
#.
#. The following messages are for the Windows Store listing only and are not used by the application

View File

@ -1,9 +1,9 @@
msgid ""
msgstr ""
"Project-Id-Version: 3.22\n"
"Project-Id-Version: 4.5\n"
"Report-Msgid-Bugs-To: pete@akeo.ie\n"
"POT-Creation-Date: 2023-02-17 09:03+0100\n"
"PO-Revision-Date: 2023-02-17 17:02+0000\n"
"POT-Creation-Date: 2024-04-26 11:15+0200\n"
"PO-Revision-Date: 2024-04-26 11:44+0200\n"
"Last-Translator: \n"
"Language-Team: \n"
"Language: nl_NL\n"
@ -13,7 +13,7 @@ msgstr ""
"X-Poedit-SourceCharset: UTF-8\n"
"X-Rufus-LanguageName: Dutch (Nederlands)\n"
"X-Rufus-LCID: 0x0413, 0x0813\n"
"X-Generator: Poedit 3.2.2\n"
"X-Generator: Poedit 3.4.2\n"
#. • IDD_DIALOG → IDS_DRIVE_PROPERTIES_TXT
msgid "Drive Properties"
@ -54,13 +54,11 @@ msgstr "USB-harde schijven weergeven"
msgid "Add fixes for old BIOSes (extra partition, align, etc.)"
msgstr "Oplossingen voor oude BIOS'en toevoegen (extra partitie, uitlijnen, etc.)"
#. • IDD_DIALOG → IDC_RUFUS_MBR
#. • IDD_DIALOG → IDC_UEFI_MEDIA_VALIDATION
#.
#. 'MBR': See http://en.wikipedia.org/wiki/Master_boot_record
#. Rufus can install it's own custom MBR (the Rufus MBR), which also allows users to
#. specify a custom disk ID for the BIOS. The tooltip for this control is MSG_167.
msgid "Use Rufus MBR with BIOS ID"
msgstr "Rufus MBR met BIOS ID gebruiken"
#. It is acceptable to drop the "runtime" if you are running out of space
msgid "Enable runtime UEFI media validation"
msgstr "Media-validatie via UEFI inschakelen"
#. • IDD_DIALOG → IDS_FORMAT_OPTIONS_TXT
msgid "Format Options"
@ -92,7 +90,7 @@ msgstr "Uitgebreid label en pictogrambestanden aanmaken"
#. • IDD_DIALOG → IDS_STATUS_TXT
msgid "Status"
msgstr "Status"
msgstr ""
#. • IDD_DIALOG → IDCANCEL
#. • IDD_LICENSE → IDCANCEL
@ -139,7 +137,7 @@ msgstr "Nee"
#. • IDD_LOG → IDD_LOG
msgid "Log"
msgstr "Log"
msgstr ""
#. • IDD_LOG → IDC_LOG_CLEAR
msgid "Clear"
@ -282,7 +280,7 @@ msgstr "Laatste versie: %d.%d (Build %d)"
#. • MSG_020
#. • MSG_026
msgid "bytes"
msgstr "bytes"
msgstr ""
#. • MSG_021
#.
@ -294,19 +292,19 @@ msgstr "kB"
#.
#. *Short* version of the megabyte size suffix
msgid "MB"
msgstr "MB"
msgstr ""
#. • MSG_023
#.
#. *Short* version of the gigabyte size suffix
msgid "GB"
msgstr "GB"
msgstr ""
#. • MSG_024
#.
#. *Short* version of the terabyte size suffix
msgid "TB"
msgstr "TB"
msgstr ""
#. • MSG_025
#.
@ -811,7 +809,7 @@ msgstr "Standaard Windows-installatie"
#. http://en.wikipedia.org/wiki/Windows_To_Go in your language.
#. Otherwise, you may add a parenthesis eg. "Windows To Go (<hint at what it does>)"
msgid "Windows To Go"
msgstr "Windows To Go"
msgstr ""
#. • MSG_119
msgid "advanced drive properties"
@ -918,7 +916,7 @@ msgstr "Versie"
#. • MSG_136
msgid "Release"
msgstr "Release"
msgstr ""
#. • MSG_137
msgid "Edition"
@ -1043,16 +1041,8 @@ msgid "Check this box to allow the display of international labels and set a dev
msgstr "Aanvinken om weergave van internationale labels toe te laten en een apparaat-pictogram in te stellen (maakt een autorun.inf aan)"
#. • MSG_167
msgid "Install an MBR that allows boot selection and can masquerade the BIOS USB drive ID"
msgstr "Installeert een MBR die een opstartselectie toestaat en de BIOS USB-drive ID kan verbergen"
#. • MSG_168
msgid ""
"Try to masquerade first bootable USB drive (usually 0x80) as a different disk.\n"
"This should only be necessary if you install Windows XP and have more than one disk."
msgstr ""
"Probeert de eerste opstartbare USB drive (gewoonlijk 0x80) voor te laten doen als een andere schijf.\n"
"Dit is alleen nodig als u Windows XP installeert en meer dan één schijf heeft."
msgid "Install a UEFI bootloader, that will perform MD5Sum file validation of the media"
msgstr "Installeert een UEFI-bootloader die bij elke opstart vanaf het medium een MD5Sum-bestandsvalidatie uitvoert op het medium zelf"
#. • MSG_169
msgid ""
@ -1759,7 +1749,7 @@ msgstr "Gebruik %s (in het hoofdvenster) om in te schakelen."
#. • MSG_312
msgid "Extra hashes (SHA512)"
msgstr "Extra hashes (SHA512)"
msgstr ""
#. • MSG_313
msgid "Save to VHD"
@ -1851,7 +1841,83 @@ msgstr "Automatische Bitlocker-apparaatversleuteling uitschakelen"
#. • MSG_336
msgid "Persistent log"
msgstr "Persistent log"
msgstr ""
#. • MSG_337
msgid ""
"An additional file ('diskcopy.dll') must be downloaded from Microsoft to install MS-DOS:\n"
"- Select 'Yes' to connect to the Internet and download it\n"
"- Select 'No' to cancel the operation\n"
"\n"
"Note: The file will be downloaded in the application's directory and will be reused automatically if present."
msgstr ""
"Er moet een extra bestand ('diskcopy.dll') worden gedownload van Microsoft om MS-DOS te installeren:\n"
"- Selecteer 'Ja' om verbinding te maken met internet en het bestand te downloaden\n"
"- Selecteer 'Nee' om de bewerking te annuleren\n"
"\n"
"Opmerking: het bestand wordt gedownload in de map van de toepassing en wordt automatisch opnieuw gebruikt als het aanwezig is."
#. • MSG_338
msgid "Revoked UEFI bootloader detected"
msgstr "Ingetrokken UEFI-bootloader gedetecteerd"
#. • MSG_339
msgid ""
"Rufus detected that the ISO you have selected contains a UEFI bootloader that has been revoked and that will produce %s, when Secure Boot is enabled on a fully up to date UEFI system.\n"
"\n"
"- If you obtained this ISO image from a non reputable source, you should consider the possibility that it might contain UEFI malware and avoid booting from it.\n"
"- If you obtained it from a trusted source, you should try to locate a more up to date version, that will not produce this warning."
msgstr ""
"Rufus heeft gedetecteerd dat de ISO die u hebt geselecteerd een UEFI-bootloader bevat die is ingetrokken en %s zal produceren wanneer Secure Boot is ingeschakeld op een volledig bijgewerkt UEFI-systeem.\n"
"\n"
"- Als u deze ISO-image hebt verkregen van een niet-vertrouwde bron, houdt u best rekening met de mogelijkheid dat het UEFI-malware bevat en vermijdt u om ervan op te starten.\n"
"- Als u het van een betrouwbare bron hebt verkregen, moet u proberen een meer up-to-date versie te vinden die deze waarschuwing niet produceert."
#. • MSG_340
msgid "a \"Security Violation\" screen"
msgstr "een \"Security Violation\"-scherm"
#. • MSG_341
msgid "a Windows Recovery Screen (BSOD) with '%s'"
msgstr "een Windows-herstelscherm (BSOD) met '%s'"
#. • MSG_342
msgid "Compressed VHDX Image"
msgstr "Gecomprimeerde VHDX-image"
#. • MSG_343
msgid "Uncompressed VHD Image"
msgstr "Niet-gecomprimeerde VHD-image"
#. • MSG_344
msgid "Full Flash Update Image"
msgstr "Full Flash Update image"
#. • MSG_345
msgid ""
"Some additional data must be downloaded from Microsoft to use this functionality:\n"
"- Select 'Yes' to connect to the Internet and download it\n"
"- Select 'No' to cancel the operation"
msgstr ""
"Om deze functionaliteit te kunnen gebruiken, moeten enkele extra gegevens worden gedownload van Microsoft:\n"
"- Selecteer 'Ja' om verbinding te maken met internet en ze te downloaden\n"
"- Selecteer 'Nee' om de bewerking te annuleren"
#. • MSG_346
msgid "Restrict Windows to S-Mode (INCOMPATIBLE with online account bypass)"
msgstr "Windows beperken tot S-Modus (NIET COMPATIBEL met omzeiling voor online account)"
#. • MSG_347
msgid "Expert Mode"
msgstr "Expert-modus"
#. • MSG_348
msgid "Extracting archive files: %s"
msgstr "Archiefbestanden uitpakken: %s"
#. • MSG_349
msgid "Use Rufus MBR"
msgstr "Rufus MBR gebruiken"
#. • MSG_900
#.
@ -1886,7 +1952,7 @@ msgstr ""
#.
#. Keyword for "boot" will be used for search in the Windows Store
msgid "Boot"
msgstr "Boot"
msgstr "Opstarten"
#. • MSG_910
#.

View File

@ -1,9 +1,9 @@
msgid ""
msgstr ""
"Project-Id-Version: 3.22\n"
"Project-Id-Version: 4.5\n"
"Report-Msgid-Bugs-To: pete@akeo.ie\n"
"POT-Creation-Date: 2023-03-16 00:35+0000\n"
"PO-Revision-Date: 2023-04-05 12:41+0200\n"
"POT-Creation-Date: 2024-05-09 19:08+0100\n"
"PO-Revision-Date: 2024-05-09 19:38+0100\n"
"Last-Translator: \n"
"Language-Team: \n"
"Language: pl_PL\n"
@ -13,7 +13,7 @@ msgstr ""
"X-Poedit-SourceCharset: UTF-8\n"
"X-Rufus-LanguageName: Polish (Polski)\n"
"X-Rufus-LCID: 0x0415\n"
"X-Generator: Poedit 3.2.2\n"
"X-Generator: Poedit 3.4.4\n"
#. • IDD_DIALOG → IDS_DRIVE_PROPERTIES_TXT
msgid "Drive Properties"
@ -54,13 +54,11 @@ msgstr "Pokaż dyski twarde USB"
msgid "Add fixes for old BIOSes (extra partition, align, etc.)"
msgstr "Dodaj łatkę dla starych BIOSów (dodatkowa partycja, itp.)"
#. • IDD_DIALOG → IDC_RUFUS_MBR
#. • IDD_DIALOG → IDC_UEFI_MEDIA_VALIDATION
#.
#. 'MBR': See http://en.wikipedia.org/wiki/Master_boot_record
#. Rufus can install it's own custom MBR (the Rufus MBR), which also allows users to
#. specify a custom disk ID for the BIOS. The tooltip for this control is MSG_167.
msgid "Use Rufus MBR with BIOS ID"
msgstr "Użyj MBR Rufusa z ID BIOSu"
#. It is acceptable to drop the "runtime" if you are running out of space
msgid "Enable runtime UEFI media validation"
msgstr "Włącz weryfikację nośnika UEFI w czasie wykonywania"
#. • IDD_DIALOG → IDS_FORMAT_OPTIONS_TXT
msgid "Format Options"
@ -1043,16 +1041,8 @@ msgid "Check this box to allow the display of international labels and set a dev
msgstr "Zaznacz to pole, aby zezwolić na wyświetlanie etykiet międzynarodowych i ustawić ikonę urządzenia (tworzy plik autorun.inf)"
#. • MSG_167
msgid "Install an MBR that allows boot selection and can masquerade the BIOS USB drive ID"
msgstr "Instaluje MBR, który pozwala wybrać uruchamianie i może zmienić ID dysku USB w BIOSie"
#. • MSG_168
msgid ""
"Try to masquerade first bootable USB drive (usually 0x80) as a different disk.\n"
"This should only be necessary if you install Windows XP and have more than one disk."
msgstr ""
"Próbuje przedstawić pierwszy bootowalny dysk USB (zazwyczaj 0x80) jako inny dysk.\n"
"Będzie to konieczne tylko przy instalowaniu Windowsa XP i posiadaniu więcej niż jednego dysku."
msgid "Install a UEFI bootloader, that will perform MD5Sum file validation of the media"
msgstr "Zainstaluj bootloader UEFI, który przeprowadzi weryfikację typu MD5SUM na nośniku"
#. • MSG_169
msgid ""
@ -1095,7 +1085,7 @@ msgstr "Wersja %d.%d (Build %d)"
#. • MSG_176
msgid "English translation: Pete Batard <mailto:pete@akeo.ie>"
msgstr "Polskie tłumaczenie:\\line• Piotr Halama <http://halamix2.pl>\\line• Krzysztof J. Szklarski\\line• Jakub Zieciak <mailto:jakub.zieciak@gmail.com>\\line• Jakub Mierzejewski <mailto:jakmierzejewski@gmail.com>"
msgstr "Polskie tłumaczenie:\\line• Piotr Halama <http://halamix2.pl>\\line• Krzysztof J. Szklarski\\line• Jakub Zieciak\\line• Jakub Mierzejewski <mailto:jakmierzejewski@gmail.com>"
#. • MSG_177
msgid "Report bugs or request enhancements at:"
@ -1853,6 +1843,82 @@ msgstr "Dezaktywuj automatyczne szyfrowanie BitLocker"
msgid "Persistent log"
msgstr "Stały dziennik (log)"
#. • MSG_337
msgid ""
"An additional file ('diskcopy.dll') must be downloaded from Microsoft to install MS-DOS:\n"
"- Select 'Yes' to connect to the Internet and download it\n"
"- Select 'No' to cancel the operation\n"
"\n"
"Note: The file will be downloaded in the application's directory and will be reused automatically if present."
msgstr ""
"Dodatkowy plik (\"diskcopy.dll\") musi zostać pobrany od Microsoft, żeby zainstalować MS-DOS:\n"
"- Wybierz opcję \"Tak\", aby pobrać pliku z internetu\n"
"- Wybierz opcję \"Nie\", aby anulować operajcę\n"
"\n"
"Uwaga: Plik zostanie pobrany do folderu aplikacji i będzie użyty pownownie, gdy będzie dostępny."
#. • MSG_338
msgid "Revoked UEFI bootloader detected"
msgstr "Wykryto unieważniony bootloader UEFI"
#. • MSG_339
msgid ""
"Rufus detected that the ISO you have selected contains a UEFI bootloader that has been revoked and that will produce %s, when Secure Boot is enabled on a fully up to date UEFI system.\n"
"\n"
"- If you obtained this ISO image from a non reputable source, you should consider the possibility that it might contain UEFI malware and avoid booting from it.\n"
"- If you obtained it from a trusted source, you should try to locate a more up to date version, that will not produce this warning."
msgstr ""
"Rufus wykrył, że wybrany plik ISO zawiera bootloader UEFI, który został unieważniony, i który wygenereuje %s. gdy włączony zostanie \"Secure Boot\" w pełni zaktualizowanym systemie UEFI.\n"
"\n"
"- Jeśli uzyskałeś ten obraz ISO z niezaufanego źródła, powinienneś rozważyć możliwość, że może on zawierać złośliwe oprogramowanie dla UEFI i unikać jego uruchamiania.\n"
"- Jeśli uzyskałeś go z zaufanego źródła, powinieneś spróbować znaleźć nowszą wersję, która nie wygeneruje tego ostrzeżenia."
#. • MSG_340
msgid "a \"Security Violation\" screen"
msgstr "ekran \"Naruszenie Bezpieczeństwa\""
#. • MSG_341
msgid "a Windows Recovery Screen (BSOD) with '%s'"
msgstr "\"Ekran odzyskiwania systemu Windows\" (BSOD) z '%s'"
#. • MSG_342
msgid "Compressed VHDX Image"
msgstr "Zkompresowany obraz VHDX"
#. • MSG_343
msgid "Uncompressed VHD Image"
msgstr "Zdekompresowany obraz VHD"
#. • MSG_344
msgid "Full Flash Update Image"
msgstr "Obraz typu \"aktualizacja full flush\""
#. • MSG_345
msgid ""
"Some additional data must be downloaded from Microsoft to use this functionality:\n"
"- Select 'Yes' to connect to the Internet and download it\n"
"- Select 'No' to cancel the operation"
msgstr ""
"Aby móc korzystać z tej funkcji, należy pobrać pewne dodatkowe dane od firmy Microsoft:\n"
"- Wybierz opcję „Tak”, aby połączyć się z Internetem i pobrać plik\n"
"- Wybierz opcję „Nie”, aby anulować operację"
#. • MSG_346
msgid "Restrict Windows to S-Mode (INCOMPATIBLE with online account bypass)"
msgstr "Ogranicz system Windows do trybu S (NIEZGODNY z obejściem konta online)"
#. • MSG_347
msgid "Expert Mode"
msgstr "Tryb eksperta"
#. • MSG_348
msgid "Extracting archive files: %s"
msgstr "Wypakowywanie plików z archiwum: %s"
#. • MSG_349
msgid "Use Rufus MBR"
msgstr "Użyj Rufus MBR"
#. • MSG_900
#.
#. The following messages are for the Windows Store listing only and are not used by the application

View File

@ -1,9 +1,9 @@
msgid ""
msgstr ""
"Project-Id-Version: 3.22\n"
"Project-Id-Version: 4.5\n"
"Report-Msgid-Bugs-To: pete@akeo.ie\n"
"POT-Creation-Date: 2022-06-07 16:25+0100\n"
"PO-Revision-Date: 2023-03-17 14:32+0000\n"
"POT-Creation-Date: 2024-05-01 14:24-0300\n"
"PO-Revision-Date: 2024-05-04 12:06+0100\n"
"Last-Translator: \n"
"Language-Team: \n"
"Language: pt_BR\n"
@ -13,7 +13,7 @@ msgstr ""
"X-Poedit-SourceCharset: UTF-8\n"
"X-Rufus-LanguageName: Portuguese Brazilian (Português do Brasil)\n"
"X-Rufus-LCID: 0x0416\n"
"X-Generator: Poedit 3.2.2\n"
"X-Generator: Poedit 3.4.2\n"
#. • IDD_DIALOG → IDS_DRIVE_PROPERTIES_TXT
msgid "Drive Properties"
@ -54,13 +54,11 @@ msgstr "Listar Discos Rígidos USB"
msgid "Add fixes for old BIOSes (extra partition, align, etc.)"
msgstr "Opções de compatibilidade para BIOSs antigos"
#. • IDD_DIALOG → IDC_RUFUS_MBR
#. • IDD_DIALOG → IDC_UEFI_MEDIA_VALIDATION
#.
#. 'MBR': See http://en.wikipedia.org/wiki/Master_boot_record
#. Rufus can install it's own custom MBR (the Rufus MBR), which also allows users to
#. specify a custom disk ID for the BIOS. The tooltip for this control is MSG_167.
msgid "Use Rufus MBR with BIOS ID"
msgstr "Usar MBR do Rufus com ID de BIOS"
#. It is acceptable to drop the "runtime" if you are running out of space
msgid "Enable runtime UEFI media validation"
msgstr "Habilitar validação de mídia UEFI"
#. • IDD_DIALOG → IDS_FORMAT_OPTIONS_TXT
msgid "Format Options"
@ -655,7 +653,7 @@ msgid ""
"\n"
"Note: The 'FIXED/REMOVABLE' attribute is a hardware property that can only be changed using custom tools from the drive manufacturer. However those tools are ALMOST NEVER provided to the public..."
msgstr ""
"IMPORTANTE: Você está tentando instalar 'Windows Para Levar', porém o drive de destino não tem o atributo 'FIXED'. Portanto, é possível que o Windows trave durante a inicialização, pois a Microsoft não o desenvolveu para funcionar em drives que, em lugar daquele, tenham o atributo 'REMOVABLE'. \n"
"IMPORTANTE: Você está tentando instalar 'Windows To Go', porém o drive de destino não tem o atributo 'FIXED'. Portanto, é possível que o Windows trave durante a inicialização, pois a Microsoft não o desenvolveu para funcionar em drives que, em lugar daquele, tenham o atributo 'REMOVABLE'. \n"
"\n"
"Você ainda deseja continuar?\n"
"\n"
@ -1044,16 +1042,8 @@ msgid "Check this box to allow the display of international labels and set a dev
msgstr "Selecione esta opção para permitir a exibição de caracteres acentuados e atribuir um ícone para a unidade (cria um arquivo autorun.inf)"
#. • MSG_167
msgid "Install an MBR that allows boot selection and can masquerade the BIOS USB drive ID"
msgstr "Instalar um MBR que permita a seleção de inicialização e possa mascarar o ID de identificação do drive USB do BIOS"
#. • MSG_168
msgid ""
"Try to masquerade first bootable USB drive (usually 0x80) as a different disk.\n"
"This should only be necessary if you install Windows XP and have more than one disk."
msgstr ""
"Tenta mascarar o primeiro drive USB inicializável (geralmente 0x80) como um disco diferente.\n"
"Isso só deve ser necessário se você instalar o Windows XP e tiver mais de um disco."
msgid "Install a UEFI bootloader, that will perform MD5Sum file validation of the media"
msgstr "Instalar um carregador de inicialização que realizará validação da mídia usando MD5Sum"
#. • MSG_169
msgid ""
@ -1202,7 +1192,7 @@ msgstr "Detectado tamanho de setor fora do padrão"
#. • MSG_198
msgid "'Windows To Go' can only be installed on a GPT partitioned drive if it has the FIXED attribute set. The current drive was not detected as FIXED."
msgstr "'Windows Para Levar' só pode ser instalado em um drive particionado como GPT se ele tiver o atributo FIXO ativo. O drive atual não apresenta o atributo FIXO."
msgstr "'Windows To Go' só pode ser instalado em um drive particionado como GPT se ele tiver o atributo FIXO ativo. O drive atual não apresenta o atributo FIXO."
#. • MSG_199
msgid "This feature is not available on this platform."
@ -1722,9 +1712,7 @@ msgid "Create a disk image of the selected device"
msgstr "Criar uma imagem do dispositivo selecionado"
#. • MSG_305
msgid ""
"Use this option to indicate if you plan to install Windows to a different disk, or if you want to run Windows directly from this drive (Windows To Go).\r\n"
"In 'Extended Windows 11 Installation' mode, Rufus will patch the media so that Windows 11 can be installed on platforms that don't meet the TPM 2.0 or Secure Boot requirements."
msgid "Use this option to indicate if you plan to install Windows to a different disk, or if you want to run Windows directly from this drive (Windows To Go)."
msgstr "Use esta opção caso queira instalar o Windows neste dispositivo ou em outro, ou se deseja rodar o Windows direto deste dispositivo (Windows To Go)."
#. • MSG_306
@ -1856,6 +1844,82 @@ msgstr "Desativar a encriptação automática BitLocker"
msgid "Persistent log"
msgstr "Registo persistente"
#. • MSG_337
msgid ""
"An additional file ('diskcopy.dll') must be downloaded from Microsoft to install MS-DOS:\n"
"- Select 'Yes' to connect to the Internet and download it\n"
"- Select 'No' to cancel the operation\n"
"\n"
"Note: The file will be downloaded in the application's directory and will be reused automatically if present."
msgstr ""
"Um arquivo adicional ('diskcopy.dll') precisa ser baixado da Microsoft para instalar o MS-DOS:\n"
"- Selecione 'Sim' para se conectar à Internet e baixá-lo\n"
"- Selecione 'Não' para cancelar a operação\n"
"\n"
"Nota: O arquivo será baixado no diretório da aplicação e será reutilizado automaticamente caso presente."
#. • MSG_338
msgid "Revoked UEFI bootloader detected"
msgstr "Detectado carregador de inicialização UEFI revogado"
#. • MSG_339
msgid ""
"Rufus detected that the ISO you have selected contains a UEFI bootloader that has been revoked and that will produce %s, when Secure Boot is enabled on a fully up to date UEFI system.\n"
"\n"
"- If you obtained this ISO image from a non reputable source, you should consider the possibility that it might contain UEFI malware and avoid booting from it.\n"
"- If you obtained it from a trusted source, you should try to locate a more up to date version, that will not produce this warning."
msgstr ""
"Rufus detectou que o ISO selecionado contém um carregador de inicialização UEFI que foi revogado e produzirá %s quando Secure Boot estiver habilitado em um sistema UEFI atualizado.\n"
"\n"
"- Se você obteve essa imagem ISO de uma fonte não confiável, você deve considerar a possibilidade da mesma conter malware UEFI e evitar inicializar através dela.\n"
"- Se você a obteve de uma fonte confiável, você deve tentar achar uma versão mais recente, que não produza este aviso."
#. • MSG_340
msgid "a \"Security Violation\" screen"
msgstr "uma tela \"Security Violation\""
#. • MSG_341
msgid "a Windows Recovery Screen (BSOD) with '%s'"
msgstr "uma tela de Reparo do Windows (BSOD) com '%s'"
#. • MSG_342
msgid "Compressed VHDX Image"
msgstr "Imagem VHDX comprimida"
#. • MSG_343
msgid "Uncompressed VHD Image"
msgstr "Imagem VHD não comprimida"
#. • MSG_344
msgid "Full Flash Update Image"
msgstr "Imagem Full Flash Update"
#. • MSG_345
msgid ""
"Some additional data must be downloaded from Microsoft to use this functionality:\n"
"- Select 'Yes' to connect to the Internet and download it\n"
"- Select 'No' to cancel the operation"
msgstr ""
"Alguns dados adicionais precisam ser baixados da Microsoft para usar essa funcionalidade:\n"
"- Selecione 'Sim' para se conectar à Internet e baixá-los\n"
"- Selecione 'Não' para cancelar a operação"
#. • MSG_346
msgid "Restrict Windows to S-Mode (INCOMPATIBLE with online account bypass)"
msgstr "Restringir Windows ao modo S (INCOMPATÍVEL com remoção de exigência de conta online)"
#. • MSG_347
msgid "Expert Mode"
msgstr "Modo Especialista"
#. • MSG_348
msgid "Extracting archive files: %s"
msgstr "Extraindo arquivos: %s"
#. • MSG_349
msgid "Use Rufus MBR"
msgstr "Usar MBR do Rufus"
#. • MSG_900
#.
#. The following messages are for the Windows Store listing only and are not used by the application

View File

@ -1,9 +1,9 @@
msgid ""
msgstr ""
"Project-Id-Version: 3.22\n"
"Project-Id-Version: 4.5\n"
"Report-Msgid-Bugs-To: pete@akeo.ie\n"
"POT-Creation-Date: 2023-03-20 12:57+0000\n"
"PO-Revision-Date: 2023-03-20 12:57+0000\n"
"POT-Creation-Date: 2024-04-25 21:23+0300\n"
"PO-Revision-Date: 2024-04-25 22:00+0300\n"
"Last-Translator: \n"
"Language-Team: \n"
"Language: ro_RO\n"
@ -13,7 +13,7 @@ msgstr ""
"X-Poedit-SourceCharset: UTF-8\n"
"X-Rufus-LanguageName: Romanian (Română)\n"
"X-Rufus-LCID: 0x0418, 0x0818\n"
"X-Generator: Poedit 3.2.2\n"
"X-Generator: Poedit 3.4.2\n"
#. • IDD_DIALOG → IDS_DRIVE_PROPERTIES_TXT
msgid "Drive Properties"
@ -54,13 +54,11 @@ msgstr "Afișare unități conectate prin USB"
msgid "Add fixes for old BIOSes (extra partition, align, etc.)"
msgstr "Adăugare remedieri pentru BIOS-uri vechi (partiție extra, aliniere, etc.)"
#. • IDD_DIALOG → IDC_RUFUS_MBR
#. • IDD_DIALOG → IDC_UEFI_MEDIA_VALIDATION
#.
#. 'MBR': See http://en.wikipedia.org/wiki/Master_boot_record
#. Rufus can install it's own custom MBR (the Rufus MBR), which also allows users to
#. specify a custom disk ID for the BIOS. The tooltip for this control is MSG_167.
msgid "Use Rufus MBR with BIOS ID"
msgstr "Utilizare MBR Rufus cu ID BIOS"
#. It is acceptable to drop the "runtime" if you are running out of space
msgid "Enable runtime UEFI media validation"
msgstr "Activați validarea mediilor UEFI în timpul execuției"
#. • IDD_DIALOG → IDS_FORMAT_OPTIONS_TXT
msgid "Format Options"
@ -338,7 +336,7 @@ msgstr "BIOS (sau UEFI-CSM)"
#. • MSG_032
msgid "UEFI (non CSM)"
msgstr ""
msgstr "UEFI (fără CSM)"
#. • MSG_033
msgid "BIOS or UEFI"
@ -1043,16 +1041,8 @@ msgid "Check this box to allow the display of international labels and set a dev
msgstr "Bifați această casetă pentru a permite afișarea etichetelor internaționale și pentru a seta o pictogramă pentru dispozitiv (se va crea un fișier autorun.inf)"
#. • MSG_167
msgid "Install an MBR that allows boot selection and can masquerade the BIOS USB drive ID"
msgstr "Instalează un MBR care permite pornirea și selecția dispozitivului USB din BIOS"
#. • MSG_168
msgid ""
"Try to masquerade first bootable USB drive (usually 0x80) as a different disk.\n"
"This should only be necessary if you install Windows XP and have more than one disk."
msgstr ""
"Se va încerca mascarea primei unități USB (de obicei 0x80) ca fiind un alt disc.\n"
"Acest lucru este necesar numai dacă instalați Windows XP și aveți mai mult decât un singur disc."
msgid "Install a UEFI bootloader, that will perform MD5Sum file validation of the media"
msgstr "Instalează un bootloader UEFI care poate performa validări MD5sum a fișierelor media"
#. • MSG_169
msgid ""
@ -1853,6 +1843,82 @@ msgstr "Blochează BitLocker de la encriptarea automată a dispozitivului"
msgid "Persistent log"
msgstr "Logare persistentă"
#. • MSG_337
msgid ""
"An additional file ('diskcopy.dll') must be downloaded from Microsoft to install MS-DOS:\n"
"- Select 'Yes' to connect to the Internet and download it\n"
"- Select 'No' to cancel the operation\n"
"\n"
"Note: The file will be downloaded in the application's directory and will be reused automatically if present."
msgstr ""
"Un fișier adițional ('diskcopy.dll') trebuie să fie descărcat de la Microsoft pentru a instala MS-DOS:\n"
"- Selectează 'Da' ca să te conectezi la Internet și să le descarci\n"
"- Selectează 'Nu' pentru a anula operațiunea\n"
"\n"
"Notiță: Acest fișier va fi descărcat in aceeași locație cu aplicația și va fi reutilizat automat dacă este prezent."
#. • MSG_338
msgid "Revoked UEFI bootloader detected"
msgstr "Bootloader UEFI nepermis detectat"
#. • MSG_339
msgid ""
"Rufus detected that the ISO you have selected contains a UEFI bootloader that has been revoked and that will produce %s, when Secure Boot is enabled on a fully up to date UEFI system.\n"
"\n"
"- If you obtained this ISO image from a non reputable source, you should consider the possibility that it might contain UEFI malware and avoid booting from it.\n"
"- If you obtained it from a trusted source, you should try to locate a more up to date version, that will not produce this warning."
msgstr ""
"Rufus a detectat că fișierul ISO care lai selectat conține un bootloader UEFI care nu este permis si ar produce %s, cand Secure Boot este activat pe un system UEFI actualizat.\n"
"\n"
"- Dacă ai făcut rost de aceasta imagine ISO de la o sursă de neîncredere, este recomandat să consideri posibilitatea că ar putea conține malware UEFI ce nu ar permite pornirea de la aceasta.\n"
"- Dacă ai făcut rost de aceasta de la o sursă de încredere, ar putea fi necesară căutarea unei versiuni mai noi, care nu ar produce acest avertisment."
#. • MSG_340
msgid "a \"Security Violation\" screen"
msgstr "un ecran de \"Încălcare de Securitate\""
#. • MSG_341
msgid "a Windows Recovery Screen (BSOD) with '%s'"
msgstr "un ecran de Recuperare Windows (BSOD) cu '%s'"
#. • MSG_342
msgid "Compressed VHDX Image"
msgstr "Imagine VHDX comprimată"
#. • MSG_343
msgid "Uncompressed VHD Image"
msgstr "Imagine VHD necomprimată"
#. • MSG_344
msgid "Full Flash Update Image"
msgstr "Flash complet de imagine de actualizare"
#. • MSG_345
msgid ""
"Some additional data must be downloaded from Microsoft to use this functionality:\n"
"- Select 'Yes' to connect to the Internet and download it\n"
"- Select 'No' to cancel the operation"
msgstr ""
"Niște date adiționale trebuie descărcate de la Microsoft pentru a folosii această funție:\n"
"- Selectează 'Da' ca să te conectezi la Internet și să le descarci\n"
"- Selectează 'Nu' pentru a anula operațiunea"
#. • MSG_346
msgid "Restrict Windows to S-Mode (INCOMPATIBLE with online account bypass)"
msgstr "Restricționează Windows la S-Mode (INCOMPATIBIL cu bypass-ul pentru un cont online)"
#. • MSG_347
msgid "Expert Mode"
msgstr "Mod expert"
#. • MSG_348
msgid "Extracting archive files: %s"
msgstr "Extractând fișiere arhivate: %s"
#. • MSG_349
msgid "Use Rufus MBR"
msgstr "Folosește Rufus MBR"
#. • MSG_900
#.
#. The following messages are for the Windows Store listing only and are not used by the application

File diff suppressed because it is too large Load Diff

View File

@ -1,10 +1,10 @@
msgid ""
msgstr ""
"Project-Id-Version: 3.22\n"
"Project-Id-Version: 4.5\n"
"Report-Msgid-Bugs-To: pete@akeo.ie\n"
"POT-Creation-Date: 2023-02-26 22:16+0000\n"
"PO-Revision-Date: 2023-02-26 22:16+0000\n"
"Last-Translator: \n"
"POT-Creation-Date: 2024-05-12 10:18+0200\n"
"PO-Revision-Date: 2024-05-12 10:38+0200\n"
"Last-Translator: martinco78\n"
"Language-Team: \n"
"Language: sk_SK\n"
"MIME-Version: 1.0\n"
@ -13,7 +13,7 @@ msgstr ""
"X-Poedit-SourceCharset: UTF-8\n"
"X-Rufus-LanguageName: Slovak (Slovensky)\n"
"X-Rufus-LCID: 0x041B\n"
"X-Generator: Poedit 3.2.2\n"
"X-Generator: Poedit 3.4.4\n"
#. • IDD_DIALOG → IDS_DRIVE_PROPERTIES_TXT
msgid "Drive Properties"
@ -54,13 +54,11 @@ msgstr "Zobraziť zoznam USB pevných diskov (USB HDD)"
msgid "Add fixes for old BIOSes (extra partition, align, etc.)"
msgstr "Pridať úpravy pre staré BIOSy (extra partície, ...)"
#. • IDD_DIALOG → IDC_RUFUS_MBR
#. • IDD_DIALOG → IDC_UEFI_MEDIA_VALIDATION
#.
#. 'MBR': See http://en.wikipedia.org/wiki/Master_boot_record
#. Rufus can install it's own custom MBR (the Rufus MBR), which also allows users to
#. specify a custom disk ID for the BIOS. The tooltip for this control is MSG_167.
msgid "Use Rufus MBR with BIOS ID"
msgstr "Použiť Rufus MBR s BIOS ID"
#. It is acceptable to drop the "runtime" if you are running out of space
msgid "Enable runtime UEFI media validation"
msgstr "Povoliť overenie médií UEFI v runtime režime"
#. • IDD_DIALOG → IDS_FORMAT_OPTIONS_TXT
msgid "Format Options"
@ -117,7 +115,7 @@ msgstr "Licencia"
#. • IDD_ABOUTBOX → IDOK
msgid "OK"
msgstr ""
msgstr "OK"
#. • IDD_LICENSE → IDD_LICENSE
msgid "Rufus License"
@ -290,31 +288,31 @@ msgstr "bajtov"
#.
#. *Short* version of the kilobyte size suffix
msgid "KB"
msgstr ""
msgstr "KB"
#. • MSG_022
#.
#. *Short* version of the megabyte size suffix
msgid "MB"
msgstr ""
msgstr "MB"
#. • MSG_023
#.
#. *Short* version of the gigabyte size suffix
msgid "GB"
msgstr ""
msgstr "GB"
#. • MSG_024
#.
#. *Short* version of the terabyte size suffix
msgid "TB"
msgstr ""
msgstr "TB"
#. • MSG_025
#.
#. *Short* version of the pentabyte size suffix
msgid "PB"
msgstr ""
msgstr "PB"
#. • MSG_027
msgid "kilobytes"
@ -397,7 +395,7 @@ msgstr "Úložné zariadenie USB (všeobecné)"
#. • MSG_046
msgid "%s (Disk %d) [%s]"
msgstr ""
msgstr "%s (Disk %d) [%s]"
#. • MSG_047
#.
@ -491,7 +489,7 @@ msgstr "Nie je možné vytvoriť oddiely."
#. • MSG_069
msgid "Could not copy files to target drive."
msgstr "Nie je možné kopírovať súbory do cieľovej jednotky."
msgstr "Nie je možné kopírovať súbory do cieľovej jednotky."
#. • MSG_070
msgid "Cancelled by user."
@ -735,7 +733,7 @@ msgstr "Záznam programu Rufus"
#. • MSG_109
msgid "0x%02X (Disk %d)"
msgstr ""
msgstr "0x%02X (Disk %d)"
#. • MSG_110
#.
@ -745,7 +743,7 @@ msgid ""
"MS-DOS cannot boot from a drive using a 64 kilobytes Cluster size.\n"
"Please change the Cluster size or use FreeDOS."
msgstr ""
"MS-DOS nemôže byť bootovaný z jednotky používajúcich klastre s veľkosťou 64kb.\n"
"Systém MS-DOS nemôže byť spustený z jednotky používajúcej klastre s veľkosťou 64kb.\n"
"Zmeňte veľkosť klastra alebo použite FreeDOS."
#. • MSG_111
@ -774,7 +772,7 @@ msgid ""
msgstr ""
"Tento obraz používa Syslinux %s%s ale tento program obsahuje inštaláciu pre Syslinux %s%s.\n"
"\n"
"Ak nová verzia Syslinuxu nie je kompaktibilná s ďalším obrazom, je možné, že program Rufus neobsahuje dva doplnkové súbory, ktoré budú musieť byť stiahnuté z internetu (ldlinux.sys a ldlinux.bss):\n"
"Ak nová verzia Syslinuxu nie je kompaktibilná s ďalším obrazom, je možné, že program Rufus neobsahuje dva doplnkové súbory, ktoré budú musieť byť stiahnuté z internetu (ldlinux.sys a ldlinux.bss):\n"
"- Stlačte „Áno\" pre stiahnutie týchto súborov z internetu\n"
"- Stlačte „Nie\" pre zrušenie operácie\n"
"\n"
@ -1051,16 +1049,8 @@ msgid "Check this box to allow the display of international labels and set a dev
msgstr "Označením tohto políčka povolíte v názve disku zobrazenie medzinárodných znakov a vytvorenie ikony zariadenia (vytvorením súboru autorun.inf)"
#. • MSG_167
msgid "Install an MBR that allows boot selection and can masquerade the BIOS USB drive ID"
msgstr "Inštalovaním MBR programu povolíte výber pri bootovaní a možnosť maskovania použitím BIOS USB drive ID"
#. • MSG_168
msgid ""
"Try to masquerade first bootable USB drive (usually 0x80) as a different disk.\n"
"This should only be necessary if you install Windows XP and have more than one disk."
msgstr ""
"Vyskúšajte maskovanie prvej bootovacej USB jednotky (zvyčajne 0x80) ako odlišného disku.\n"
"Toto je nevyhnutné, ak chcete inštalovať Windows XP a máte viac ako jeden disk."
msgid "Install a UEFI bootloader, that will perform MD5Sum file validation of the media"
msgstr "Nainštalovať zavádzač UEFI, ktorý vykoná overenie média prostredníctvom MD5Sum súboru"
#. • MSG_169
msgid ""
@ -1861,6 +1851,82 @@ msgstr "Vypnutie automatického šifrovania zariadenia BitLocker"
msgid "Persistent log"
msgstr "Trvalý záznam činností"
#. • MSG_337
msgid ""
"An additional file ('diskcopy.dll') must be downloaded from Microsoft to install MS-DOS:\n"
"- Select 'Yes' to connect to the Internet and download it\n"
"- Select 'No' to cancel the operation\n"
"\n"
"Note: The file will be downloaded in the application's directory and will be reused automatically if present."
msgstr ""
"Pre inštaláciu systému MS-DOS je potrebné prevziať od spoločnosti Microsoft ďalší súbor („diskcopy.dll\"):\n"
"- Výberom možnosti „Áno\" ho stiahnete z internetu\n"
"- Výberom možnosti „Nie\" zrušíte operáciu\n"
"\n"
"Poznámka: Súbor sa stiahne do adresára aplikácie a automaticky sa znova použije, ak je k dispozícii."
#. • MSG_338
msgid "Revoked UEFI bootloader detected"
msgstr "Bol zistený zrušený zavádzač UEFI"
#. • MSG_339
msgid ""
"Rufus detected that the ISO you have selected contains a UEFI bootloader that has been revoked and that will produce %s, when Secure Boot is enabled on a fully up to date UEFI system.\n"
"\n"
"- If you obtained this ISO image from a non reputable source, you should consider the possibility that it might contain UEFI malware and avoid booting from it.\n"
"- If you obtained it from a trusted source, you should try to locate a more up to date version, that will not produce this warning."
msgstr ""
"Program Rufus zistil, že ISO, ktoré ste vybrali, obsahuje zavádzač UEFI, ktorý bol zrušený a ktorý bude produkovať %s, keď je povolené zabezpečené spustenie na plne aktuálnom systéme UEFI.\n"
"\n"
"- Ak ste tento obraz ISO získali z neseriózneho zdroja, mali by ste zvážiť možnosť, že by mohol obsahovať malvér UEFI a vyhnúť sa bootovaniu z neho.\n"
"- Ak ste ho získali z dôveryhodného zdroja, mali by ste sa pokúsiť nájsť aktuálnejšiu verziu, ktorá toto upozornenie nespustí."
#. • MSG_340
msgid "a \"Security Violation\" screen"
msgstr "obrazovka „Narušenie bezpečnosti\""
#. • MSG_341
msgid "a Windows Recovery Screen (BSOD) with '%s'"
msgstr "a Obrazovka obnovenia systému Windows (BSOD) s %s"
#. • MSG_342
msgid "Compressed VHDX Image"
msgstr "Komprimovaný obraz VHDX"
#. • MSG_343
msgid "Uncompressed VHD Image"
msgstr "Nekomprimovaný obraz VHD"
#. • MSG_344
msgid "Full Flash Update Image"
msgstr "Obraz úplnej flash aktualizácie"
#. • MSG_345
msgid ""
"Some additional data must be downloaded from Microsoft to use this functionality:\n"
"- Select 'Yes' to connect to the Internet and download it\n"
"- Select 'No' to cancel the operation"
msgstr ""
"Ak chcete používať túto funkciu, musíte si od spoločnosti Microsoft stiahnuť niektoré ďalšie dáta:\n"
"- Výberom možnosti „Áno\" ich stiahnete z internetu\n"
"- Výberom možnosti „Nie\" zrušíte túto operáciu"
#. • MSG_346
msgid "Restrict Windows to S-Mode (INCOMPATIBLE with online account bypass)"
msgstr "Obmedziť systém Windows s režimom S (NEKOMPATIBILNÝ s obídením konta online)"
#. • MSG_347
msgid "Expert Mode"
msgstr "Expertný režim"
#. • MSG_348
msgid "Extracting archive files: %s"
msgstr "Extrahovanie archívnych súborov: %s"
#. • MSG_349
msgid "Use Rufus MBR"
msgstr "Použiť Rufus MBR"
#. • MSG_900
#.
#. The following messages are for the Windows Store listing only and are not used by the application
@ -1894,7 +1960,7 @@ msgstr ""
#.
#. Keyword for "boot" will be used for search in the Windows Store
msgid "Boot"
msgstr ""
msgstr "boot"
#. • MSG_910
#.

View File

@ -1,9 +1,9 @@
msgid ""
msgstr ""
"Project-Id-Version: 3.22\n"
"Project-Id-Version: 4.5\n"
"Report-Msgid-Bugs-To: pete@akeo.ie\n"
"POT-Creation-Date: 2023-02-17 17:21+0000\n"
"PO-Revision-Date: 2023-02-17 17:22+0000\n"
"POT-Creation-Date: 2024-05-10 22:14+0200\n"
"PO-Revision-Date: 2024-05-10 22:25+0200\n"
"Last-Translator: \n"
"Language-Team: \n"
"Language: sr_RS\n"
@ -13,7 +13,7 @@ msgstr ""
"X-Poedit-SourceCharset: UTF-8\n"
"X-Rufus-LanguageName: Serbian (Srpski)\n"
"X-Rufus-LCID: 0x241a, 0x081a, 0x181a, 0x2c1a, 0x701a, 0x7c1a\n"
"X-Generator: Poedit 3.2.2\n"
"X-Generator: Poedit 3.4.4\n"
#. • IDD_DIALOG → IDS_DRIVE_PROPERTIES_TXT
msgid "Drive Properties"
@ -54,13 +54,11 @@ msgstr "Pokaži USB čvrste diskove"
msgid "Add fixes for old BIOSes (extra partition, align, etc.)"
msgstr "Dodaj ispravke za stare BIOS-e (dodatne particije, svrstanje, itd.)"
#. • IDD_DIALOG → IDC_RUFUS_MBR
#. • IDD_DIALOG → IDC_UEFI_MEDIA_VALIDATION
#.
#. 'MBR': See http://en.wikipedia.org/wiki/Master_boot_record
#. Rufus can install it's own custom MBR (the Rufus MBR), which also allows users to
#. specify a custom disk ID for the BIOS. The tooltip for this control is MSG_167.
msgid "Use Rufus MBR with BIOS ID"
msgstr "Koristi Rufus MBR sa BIOS ID-em"
#. It is acceptable to drop the "runtime" if you are running out of space
msgid "Enable runtime UEFI media validation"
msgstr "Омогућите проверу UEFI медија током извршавања"
#. • IDD_DIALOG → IDS_FORMAT_OPTIONS_TXT
msgid "Format Options"
@ -545,7 +543,7 @@ msgstr ""
"\n"
"Zavsino od brzine vašeg USB uređaja, ova operacija može potrajati dugo, naročito za velike datoteke.\n"
"\n"
"Preporučujemo da dozvolite Windows-u da završi, kako bi izbjegli korupciju. Ukoliko ne želite čekati, samo izvadite USB uređaj..."
"Preporučujemo da dozvolite Windows-u da završi, kako bi izbjegli korupciju. Ukoliko ne želite čekati, samo izvadite USB uređaj..."
#. • MSG_081
msgid "Unsupported image"
@ -850,7 +848,7 @@ msgstr "Bez stalne veličine"
#.
#. Tooltips used for the peristence size slider and edit control
msgid "Set the size of the persistent partition for live USB media. Setting the size to 0 disables the persistent partition."
msgstr "Izaberite veličinu stalne particije za live USB datoteku. Podešavanjem na 0 onemogućava stalnu particiju."
msgstr "Izaberite veličinu stalne particije za live USB datoteku. Podešavanjem na 0 onemogućava stalnu particiju."
#. • MSG_126
msgid "Set the partition size units."
@ -1043,16 +1041,8 @@ msgid "Check this box to allow the display of international labels and set a dev
msgstr "Označite ovo polje kako biste dozvolili prikaz internacionalnih oznaka i napravite ikonicu uređaja (izrađuje autorun.inf)"
#. • MSG_167
msgid "Install an MBR that allows boot selection and can masquerade the BIOS USB drive ID"
msgstr "Instaliraj MBR koji omogućava odabir pri podizanju sistema i može pretvoriti ID BIOS-a USB uređaja"
#. • MSG_168
msgid ""
"Try to masquerade first bootable USB drive (usually 0x80) as a different disk.\n"
"This should only be necessary if you install Windows XP and have more than one disk."
msgstr ""
"Pokušaj maskirati prvi USB uređaj za podizanje sistema (uobičajeno 0x80) kao drugačiji disk.\n"
"Ovo je samo potrebno ako instalirate Windows XP i imate više od jednog diska."
msgid "Install a UEFI bootloader, that will perform MD5Sum file validation of the media"
msgstr "Инсталирајте UEFI боотлоадер, који ће извршити проверу МД5Сум-y датотеке медија"
#. • MSG_169
msgid ""
@ -1853,6 +1843,82 @@ msgstr "Onemogući BitLocker automatsku enkripciju uređaja"
msgid "Persistent log"
msgstr "Trajna evidencija"
#. • MSG_337
msgid ""
"An additional file ('diskcopy.dll') must be downloaded from Microsoft to install MS-DOS:\n"
"- Select 'Yes' to connect to the Internet and download it\n"
"- Select 'No' to cancel the operation\n"
"\n"
"Note: The file will be downloaded in the application's directory and will be reused automatically if present."
msgstr ""
"Додатна датотека ('diskcopy.dll') мора да се преузме са Microsoft-a да би се инсталирао MS-DOS:\n"
"- Изаберите „Да“ да бисте се повезали на Интернет и преузели га\n"
"- Изаберите „Не“ да бисте отказали операцију\n"
"\n"
"Напомена: Датотека ће бити преузета у директоријум апликације и аутоматски ће се поново користити ако постоји."
#. • MSG_338
msgid "Revoked UEFI bootloader detected"
msgstr "Откривен је опозвани UEFI покретач"
#. • MSG_339
msgid ""
"Rufus detected that the ISO you have selected contains a UEFI bootloader that has been revoked and that will produce %s, when Secure Boot is enabled on a fully up to date UEFI system.\n"
"\n"
"- If you obtained this ISO image from a non reputable source, you should consider the possibility that it might contain UEFI malware and avoid booting from it.\n"
"- If you obtained it from a trusted source, you should try to locate a more up to date version, that will not produce this warning."
msgstr ""
"Руфус је открио да ISO који сте изабрали садржи UEFI покретач који је опозван и који ће произвести %s када је безбедно покретање омогућено на потпуно ажурираном UEFI систему.\n"
"\n"
"- Ако сте ову ISO слику добили од неугледног извора, требало би да размотрите могућност да садржи UEIFI малвер и избегавајте покретање са њега.\n"
"- Ако сте га добили од поузданог извора, покушајте да пронађете новију верзију, која неће произвести ово упозорење."
#. • MSG_340
msgid "a \"Security Violation\" screen"
msgstr "екран „Нарушавање безбедности“"
#. • MSG_341
msgid "a Windows Recovery Screen (BSOD) with '%s'"
msgstr "Windows Рековери Екран (BSOD) са „%s“"
#. • MSG_342
msgid "Compressed VHDX Image"
msgstr "Компресована VHDX слика"
#. • MSG_343
msgid "Uncompressed VHD Image"
msgstr "Некомпримована VHD слика"
#. • MSG_344
msgid "Full Flash Update Image"
msgstr "Фулл Фласх Упдате Имаге"
#. • MSG_345
msgid ""
"Some additional data must be downloaded from Microsoft to use this functionality:\n"
"- Select 'Yes' to connect to the Internet and download it\n"
"- Select 'No' to cancel the operation"
msgstr ""
"Неки додатни подаци морају се преузети од Microsoft-a да бисте користили ову функцију:\n"
"- Изаберите „Да“ да бисте се повезали на Интернет и преузели га\n"
"- Изаберите „Не“ да бисте отказали операцију"
#. • MSG_346
msgid "Restrict Windows to S-Mode (INCOMPATIBLE with online account bypass)"
msgstr "Ограничите Виндовс на С-Моде (НИЈЕ КОМПАТИБИЛАН са заобилажењем налога на мрежи)"
#. • MSG_347
msgid "Expert Mode"
msgstr "Ekspertni Rezim"
#. • MSG_348
msgid "Extracting archive files: %s"
msgstr "Распакивање архивских датотека: %s"
#. • MSG_349
msgid "Use Rufus MBR"
msgstr "Koritsti Rufus MBR"
#. • MSG_900
#.
#. The following messages are for the Windows Store listing only and are not used by the application

View File

@ -1,11 +1,11 @@
msgid ""
msgstr ""
"Project-Id-Version: 3.22\n"
"Project-Id-Version: 4.5\n"
"Report-Msgid-Bugs-To: pete@akeo.ie\n"
"POT-Creation-Date: 2023-02-16 22:33+0100\n"
"PO-Revision-Date: 2023-02-16 23:43+0100\n"
"Last-Translator: Sopor <sopor@hotmail.com>\n"
"Language-Team: \n"
"POT-Creation-Date: 2024-04-26 00:51+0200\n"
"PO-Revision-Date: 2024-04-26 14:23+0100\n"
"Last-Translator: \n"
"Language-Team: Sopor <sopor@users.noreply.github.com>\n"
"Language: sv_SE\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@ -13,7 +13,7 @@ msgstr ""
"X-Poedit-SourceCharset: UTF-8\n"
"X-Rufus-LanguageName: Swedish (Svenska)\n"
"X-Rufus-LCID: 0x041d, 0x081d\n"
"X-Generator: Poedit 3.2.2\n"
"X-Generator: Poedit 3.4.2\n"
#. • IDD_DIALOG → IDS_DRIVE_PROPERTIES_TXT
msgid "Drive Properties"
@ -52,15 +52,13 @@ msgstr "Lista USB-hårddiskar"
#. It is acceptable to drop the parenthesis () if you are running out of space
#. as there is a tooltip (MSG_169) providing these details.
msgid "Add fixes for old BIOSes (extra partition, align, etc.)"
msgstr "Lägg till korrigeringar för äldre BIOS:ar"
msgstr "Lägg till korrigeringar för äldre BIOS:ar (extra partition, etc)"
#. • IDD_DIALOG → IDC_RUFUS_MBR
#. • IDD_DIALOG → IDC_UEFI_MEDIA_VALIDATION
#.
#. 'MBR': See http://en.wikipedia.org/wiki/Master_boot_record
#. Rufus can install it's own custom MBR (the Rufus MBR), which also allows users to
#. specify a custom disk ID for the BIOS. The tooltip for this control is MSG_167.
msgid "Use Rufus MBR with BIOS ID"
msgstr "Använd Rufus MBR med BIOS-ID"
#. It is acceptable to drop the "runtime" if you are running out of space
msgid "Enable runtime UEFI media validation"
msgstr "Aktivera runtime UEFI-mediavalidering"
#. • IDD_DIALOG → IDS_FORMAT_OPTIONS_TXT
msgid "Format Options"
@ -92,7 +90,7 @@ msgstr "Skapa utökat namn och ikonfiler"
#. • IDD_DIALOG → IDS_STATUS_TXT
msgid "Status"
msgstr "Status"
msgstr ""
#. • IDD_DIALOG → IDCANCEL
#. • IDD_LICENSE → IDCANCEL
@ -117,7 +115,7 @@ msgstr "Licens"
#. • IDD_ABOUTBOX → IDOK
msgid "OK"
msgstr "OK"
msgstr ""
#. • IDD_LICENSE → IDD_LICENSE
msgid "Rufus License"
@ -171,7 +169,7 @@ msgstr "Uppdatera nu"
#. • IDD_NEW_VERSION → IDD_NEW_VERSION
msgid "Check For Updates - Rufus"
msgstr "Kontrollera efter uppdateringar - Rufus"
msgstr "Sök efter uppdateringar - Rufus"
#. • IDD_NEW_VERSION → IDS_NEW_VERSION_AVAIL_TXT
msgid "A newer version is available. Please download the latest version!"
@ -193,7 +191,7 @@ msgstr "Nerladdning"
#. • MSG_001
msgid "Other instance detected"
msgstr "Program redan i gång"
msgstr "Programmet körs redan"
#. • MSG_002
msgid ""
@ -201,7 +199,7 @@ msgid ""
"Please close the first application before running another one."
msgstr ""
"Rufus körs redan.\n"
"Stäng det andra programmet innan du startar ännu ett."
"Stäng det första programmet innan du startar ett nytt."
#. • MSG_003
msgid ""
@ -209,8 +207,8 @@ msgid ""
"To continue with this operation, click OK. To quit click CANCEL."
msgstr ""
"VARNING: ALL DATA PÅ ENHETEN '%s'\n"
"KOMMER ATT FÖRSVINNA.\n"
"För att fortsätta, tryck OK. För att avbryta tryck AVBRYT."
"KOMMER ATT TAS BORT.\n"
"För att fortsätta tryck OK. För att avbryta tryck AVBRYT."
#. • MSG_004
msgid "Rufus update policy"
@ -283,37 +281,37 @@ msgstr "Senaste version: %d.%d (Build %d)"
#. • MSG_020
#. • MSG_026
msgid "bytes"
msgstr "bytes"
msgstr ""
#. • MSG_021
#.
#. *Short* version of the kilobyte size suffix
msgid "KB"
msgstr "KB"
msgstr ""
#. • MSG_022
#.
#. *Short* version of the megabyte size suffix
msgid "MB"
msgstr "MB"
msgstr ""
#. • MSG_023
#.
#. *Short* version of the gigabyte size suffix
msgid "GB"
msgstr "GB"
msgstr ""
#. • MSG_024
#.
#. *Short* version of the terabyte size suffix
msgid "TB"
msgstr "TB"
msgstr ""
#. • MSG_025
#.
#. *Short* version of the pentabyte size suffix
msgid "PB"
msgstr "PB"
msgstr ""
#. • MSG_027
msgid "kilobytes"
@ -396,7 +394,7 @@ msgstr "USB-lagringsenhet (Allmänt)"
#. • MSG_046
msgid "%s (Disk %d) [%s]"
msgstr "%s (Disk %d) [%s]"
msgstr ""
#. • MSG_047
#.
@ -728,7 +726,7 @@ msgstr "Rufus logg"
#. • MSG_109
msgid "0x%02X (Disk %d)"
msgstr "0x%02X (Disk %d)"
msgstr ""
#. • MSG_110
#.
@ -810,7 +808,7 @@ msgstr "Standard Windowsinstallation"
#. http://en.wikipedia.org/wiki/Windows_To_Go in your language.
#. Otherwise, you may add a parenthesis eg. "Windows To Go (<hint at what it does>)"
msgid "Windows To Go"
msgstr "Windows To Go"
msgstr ""
#. • MSG_119
msgid "advanced drive properties"
@ -913,11 +911,11 @@ msgstr ""
#. • MSG_135
msgid "Version"
msgstr "Version"
msgstr ""
#. • MSG_136
msgid "Release"
msgstr "Release"
msgstr ""
#. • MSG_137
msgid "Edition"
@ -975,11 +973,11 @@ msgstr "Typ av dator du planerar att använda den här startbara enheten på. De
#.
#. You shouldn't translate 'Legacy Mode' as this is an option that usually appears in English in the UEFI settings.
msgid "'UEFI-CSM' means that the device will only boot in BIOS emulation mode (also known as 'Legacy Mode') under UEFI, and not in native UEFI mode."
msgstr "'UEFI-CSM' innebär att enheten startar i BIOS-emuleringsläge (kallas också för 'Legacy Mode') under UEFI och inte i nativ UEFI-läge."
msgstr "\"UEFI-CSM\" innebär att enheten startar i BIOS-emuleringsläge (kallas också för 'Legacy Mode') under UEFI och inte i nativ UEFI-läge."
#. • MSG_152
msgid "'non CSM' means that the device will only boot in native UEFI mode, and not in BIOS emulation mode (also known as 'Legacy Mode')."
msgstr "'icke CSM' innebär att enheten startar i nativ UEFI-läge och inte i BIOS-emuleringsläge (kallas också för 'Legacy Mode')."
msgstr "\"icke CSM\" innebär att enheten startar i nativ UEFI-läge och inte i BIOS-emuleringsläge (kallas också för 'Legacy Mode')."
#. • MSG_153
msgid "Test pattern: 0x%02X"
@ -1015,7 +1013,7 @@ msgstr ""
#. • MSG_160
msgid "Toggle advanced options"
msgstr "Visa/Dölj avancerat"
msgstr "Visa/dölj avancerat"
#. • MSG_161
msgid "Check the device for bad blocks using a test pattern"
@ -1042,16 +1040,8 @@ msgid "Check this box to allow the display of international labels and set a dev
msgstr "Markera för att tillåta visa internationella namn och sätta en enhetsikon (en autorun.inf skapas)"
#. • MSG_167
msgid "Install an MBR that allows boot selection and can masquerade the BIOS USB drive ID"
msgstr "Installera en MBR som tillåter flera uppstartsmöjligheter och som kan maskera bort BIOS USB enhets-ID"
#. • MSG_168
msgid ""
"Try to masquerade first bootable USB drive (usually 0x80) as a different disk.\n"
"This should only be necessary if you install Windows XP and have more than one disk."
msgstr ""
"Prova att maskera bort den första startbara USB-enheten (vanligtvis 0x80) som en annan disk.\n"
"Detta är endast nödvändigt om du installerar Windows XP och du har mer än en disk."
msgid "Install a UEFI bootloader, that will perform MD5Sum file validation of the media"
msgstr "Installera en UEFI-starthanterare som kommer att utföra MD5Sum-filvalidering av media"
#. • MSG_169
msgid ""
@ -1092,11 +1082,11 @@ msgstr "Rufus - Det pålitliga verktyget för USB-formatering"
#. • MSG_175
msgid "Version %d.%d (Build %d)"
msgstr "Version %d.%d (Build %d)"
msgstr ""
#. • MSG_176
msgid "English translation: Pete Batard <mailto:pete@akeo.ie>"
msgstr "Svensk översättning: Sopor <mailto:sopor@hotmail.com>"
msgstr "Svensk översättning: Sopor"
#. • MSG_177
msgid "Report bugs or request enhancements at:"
@ -1202,7 +1192,7 @@ msgstr "En icke standard sektorstorlek upptäckt"
#. • MSG_198
msgid "'Windows To Go' can only be installed on a GPT partitioned drive if it has the FIXED attribute set. The current drive was not detected as FIXED."
msgstr "'Windows To Go' kan endast installeras på en enhet med GPT-partition om det är en FIXERAD enhet. Nuvarande enhet är inte FIXERAD."
msgstr "\"Windows To Go\" kan endast installeras på en enhet med GPT-partition om det är en FIXERAD enhet. Nuvarande enhet är inte FIXERAD."
#. • MSG_199
msgid "This feature is not available on this platform."
@ -1563,7 +1553,7 @@ msgid ""
"\n"
"Please select the mode that you want to use to write this image:"
msgstr ""
"Avbilden du har valt är en 'ISOHybrid-avbild'. Detta innebär att den kan skrivas i både läge %s (filkopiering) eller i läge %s (disk-avbild).\n"
"Avbilden du har valt är en \"ISOHybrid-avbild\". Detta innebär att den kan skrivas i både läge %s (filkopiering) eller i läge %s (disk-avbild).\n"
"Rufus rekommenderar att läge %s används, så att du alltid har full tillgång till enheten efter att du skrivit till den.\n"
"Skulle du få problem vid uppstarten, kan du i stället prova skriva avbilden i läge %s.\n"
"\n"
@ -1824,7 +1814,7 @@ msgstr "Anpassa Windows-installationen?"
#. • MSG_329
msgid "Remove requirement for 4GB+ RAM, Secure Boot and TPM 2.0"
msgstr "Ta bort kravet på 4 GB+ RAM, Secure Boot och TPM 2.0"
msgstr "Ta bort kravet på 4GB+ RAM, Secure Boot och TPM 2.0"
#. • MSG_330
msgid "Remove requirement for an online Microsoft account"
@ -1836,7 +1826,7 @@ msgstr "Inaktivera datainsamling (Hoppa över sekretessfrågor)"
#. • MSG_332
msgid "Prevent Windows To Go from accessing internal disks"
msgstr "Förhindra Windows To Go från att komma åt interna diskar"
msgstr "Förhindra \"Windows To Go\" från att komma åt interna diskar"
#. • MSG_333
msgid "Create a local account with username:"
@ -1854,6 +1844,82 @@ msgstr "Inaktivera BitLockers automatiska enhetskryptering"
msgid "Persistent log"
msgstr "Bestående logg"
#. • MSG_337
msgid ""
"An additional file ('diskcopy.dll') must be downloaded from Microsoft to install MS-DOS:\n"
"- Select 'Yes' to connect to the Internet and download it\n"
"- Select 'No' to cancel the operation\n"
"\n"
"Note: The file will be downloaded in the application's directory and will be reused automatically if present."
msgstr ""
"En fil (diskcopy.dll) måste laddas ner från Microsoft för att installera MS-DOS:\n"
"- Välj \"Ja\" för att ansluta till Internet och ladda ner den\n"
"- Välj \"Nej\" för att avbryta operationen\n"
"\n"
"Obs: Filen kommer att laddas ner i programmets katalog och kommer att återanvändas automatiskt om den finns."
#. • MSG_338
msgid "Revoked UEFI bootloader detected"
msgstr "Återkallad UEFI-starthanterare upptäcktes"
#. • MSG_339
msgid ""
"Rufus detected that the ISO you have selected contains a UEFI bootloader that has been revoked and that will produce %s, when Secure Boot is enabled on a fully up to date UEFI system.\n"
"\n"
"- If you obtained this ISO image from a non reputable source, you should consider the possibility that it might contain UEFI malware and avoid booting from it.\n"
"- If you obtained it from a trusted source, you should try to locate a more up to date version, that will not produce this warning."
msgstr ""
"Rufus upptäckte att den ISO-filen du har valt innehåller en UEFI-starthanterare som har återkallats och som kommer att producera %s, när \"Secure Boot\" är aktiverat på ett helt uppdaterat UEFI-system.\n"
"\n"
"- Om du skaffade den här ISO-avbilden från en icke ansedd källa bör du överväga möjligheten att den kan innehålla UEFI-skadlig programvara och undvika att starta från den.\n"
"- Om du har fått det från en pålitlig källa bör du försöka hitta en mer uppdaterad version som inte ger den här varningen."
#. • MSG_340
msgid "a \"Security Violation\" screen"
msgstr "en \"Säkerhetsöverträdelseskärm\""
#. • MSG_341
msgid "a Windows Recovery Screen (BSOD) with '%s'"
msgstr "en Windows-återställningsskärm (BSOD) med '%s'"
#. • MSG_342
msgid "Compressed VHDX Image"
msgstr "Komprimerad VHDX-avbild"
#. • MSG_343
msgid "Uncompressed VHD Image"
msgstr "Okomprimerad VHD-avbild"
#. • MSG_344
msgid "Full Flash Update Image"
msgstr "Full flash uppdateringsavbild"
#. • MSG_345
msgid ""
"Some additional data must be downloaded from Microsoft to use this functionality:\n"
"- Select 'Yes' to connect to the Internet and download it\n"
"- Select 'No' to cancel the operation"
msgstr ""
"Ytterligare data måste laddas ner från Microsoft för att kunna använda den här funktionen:\n"
"- Välj \"Ja\" för att ansluta till Internet och ladda ner den\n"
"- Välj \"Nej\" för att avbryta operationen"
#. • MSG_346
msgid "Restrict Windows to S-Mode (INCOMPATIBLE with online account bypass)"
msgstr "Begränsa Windows till S-läge (INKOMPATIBEL med förbikoppling av onlinekonto)"
#. • MSG_347
msgid "Expert Mode"
msgstr "Expertläge"
#. • MSG_348
msgid "Extracting archive files: %s"
msgstr "Extraherar arkivfiler: %s"
#. • MSG_349
msgid "Use Rufus MBR"
msgstr "Använd Rufus MBR"
#. • MSG_900
#.
#. The following messages are for the Windows Store listing only and are not used by the application
@ -1913,7 +1979,7 @@ msgstr "Skapa BIOS- eller UEFI-startbara enheter, inklusive UEFI-startbar NTFS"
#. • MSG_915
msgid "Create 'Windows To Go' drives"
msgstr "Skapa 'Windows To Go'-enheter"
msgstr "Skapa \"Windows To Go\"-enheter"
#. • MSG_916
msgid "Create Windows 11 installation drives for PCs that don't have TPM or Secure Boot"
@ -1941,4 +2007,4 @@ msgstr "Ladda ner officiella Microsoft Windows ISO-filer"
#. • MSG_922
msgid "Download UEFI Shell ISOs"
msgstr "Ladda ner UEFI-shell ISO-filer"
msgstr "Ladda ner UEFI-skal ISO-filer"

File diff suppressed because it is too large Load Diff

View File

@ -1,9 +1,9 @@
msgid ""
msgstr ""
"Project-Id-Version: 3.22\n"
"Project-Id-Version: 4.5\n"
"Report-Msgid-Bugs-To: pete@akeo.ie\n"
"POT-Creation-Date: 2023-02-23 15:14+0300\n"
"PO-Revision-Date: 2023-04-05 12:42+0200\n"
"POT-Creation-Date: 2024-04-28 09:05+0300\n"
"PO-Revision-Date: 2024-04-28 09:32+0300\n"
"Last-Translator: \n"
"Language-Team: \n"
"Language: tr_TR\n"
@ -13,7 +13,7 @@ msgstr ""
"X-Poedit-SourceCharset: UTF-8\n"
"X-Rufus-LanguageName: Turkish (Türkçe)\n"
"X-Rufus-LCID: 0x041F\n"
"X-Generator: Poedit 3.2.2\n"
"X-Generator: Poedit 3.4.2\n"
#. • IDD_DIALOG → IDS_DRIVE_PROPERTIES_TXT
msgid "Drive Properties"
@ -54,13 +54,11 @@ msgstr "USB Sabit Sürücüleri Listele"
msgid "Add fixes for old BIOSes (extra partition, align, etc.)"
msgstr "Eski BIOSlar için düzeltme ekle (ekstra bölüm, hizalama vs.)"
#. • IDD_DIALOG → IDC_RUFUS_MBR
#. • IDD_DIALOG → IDC_UEFI_MEDIA_VALIDATION
#.
#. 'MBR': See http://en.wikipedia.org/wiki/Master_boot_record
#. Rufus can install it's own custom MBR (the Rufus MBR), which also allows users to
#. specify a custom disk ID for the BIOS. The tooltip for this control is MSG_167.
msgid "Use Rufus MBR with BIOS ID"
msgstr "Rufus MBR kullan. BIOS Kimliği Seçin"
#. It is acceptable to drop the "runtime" if you are running out of space
msgid "Enable runtime UEFI media validation"
msgstr "Çalışma zamanı UEFI ortam doğrulamasını etkinleştir"
#. • IDD_DIALOG → IDS_FORMAT_OPTIONS_TXT
msgid "Format Options"
@ -1043,16 +1041,8 @@ msgid "Check this box to allow the display of international labels and set a dev
msgstr "Uluslararası etiketleri görüntülemek için bu onay kutusunu seçin ve aygıt simgesini belirleyin (autorun.inf oluşturur)"
#. • MSG_167
msgid "Install an MBR that allows boot selection and can masquerade the BIOS USB drive ID"
msgstr "Açılış seçimine izin veren ve BIOS USB Sürücü kimliğini taklit edebilen bir MBR yükler"
#. • MSG_168
msgid ""
"Try to masquerade first bootable USB drive (usually 0x80) as a different disk.\n"
"This should only be necessary if you install Windows XP and have more than one disk."
msgstr ""
"İlk açılabilir USB sürücüsünü farklı bir disk olarak taklit etmeye çalış (genellikle 0x80).\n"
"Bu sadece Windows XP yüklemesinde ve birden fazla diske varsa gerekebilir."
msgid "Install a UEFI bootloader, that will perform MD5Sum file validation of the media"
msgstr "Medyanın MD5Sum dosya doğrulamasını gerçekleştirecek bir UEFI önyükleyici yükleyin"
#. • MSG_169
msgid ""
@ -1798,7 +1788,7 @@ msgid ""
"The image you have selected is an ISOHybrid, but its creators have not made it compatible with ISO/File copy mode.\n"
"As a result, DD image writing mode will be enforced."
msgstr ""
"Seçtiğiniz yansı bir ISOHybrid, ancak yansı ISO/Dosya kopyalama modu ile uyumlu hale olrak oluşturulmamış.\n"
"Seçtiğiniz yansı bir ISOHybrid, ancak yansı ISO/Dosya kopyalama modu ile uyumlu hale olrak oluşturulmamış.\n"
"Sonuç olarak, DD yansısı yazma modu uygulanacaktır."
#. • MSG_322
@ -1853,6 +1843,82 @@ msgstr "BitLocker otomatik cihaz şifrelemesini devre dışı bırakın"
msgid "Persistent log"
msgstr "Kalıcı günlük"
#. • MSG_337
msgid ""
"An additional file ('diskcopy.dll') must be downloaded from Microsoft to install MS-DOS:\n"
"- Select 'Yes' to connect to the Internet and download it\n"
"- Select 'No' to cancel the operation\n"
"\n"
"Note: The file will be downloaded in the application's directory and will be reused automatically if present."
msgstr ""
"MS-DOS'u yüklemek için Microsoft'tan ek bir dosyanın ('diskcopy.dll') indirilmesi gerekir:\n"
"- İnternete bağlanıp indirmek için 'Evet'i seçin\n"
"- İşlemden vazgeçmek için 'Hayır'ı seçin\n"
"\n"
"Not: Dosya uygulamanın dizinine indirilecek ve varsa otomatik olarak yeniden kullanılacaktır."
#. • MSG_338
msgid "Revoked UEFI bootloader detected"
msgstr "İptal edilen UEFI önyükleyici algılandı"
#. • MSG_339
msgid ""
"Rufus detected that the ISO you have selected contains a UEFI bootloader that has been revoked and that will produce %s, when Secure Boot is enabled on a fully up to date UEFI system.\n"
"\n"
"- If you obtained this ISO image from a non reputable source, you should consider the possibility that it might contain UEFI malware and avoid booting from it.\n"
"- If you obtained it from a trusted source, you should try to locate a more up to date version, that will not produce this warning."
msgstr ""
"Rufus, seçtiğiniz ISO'nun iptal edilmiş bir UEFI önyükleyici içerdiğini ve tamamen güncel bir UEFI sisteminde Güvenli Önyükleme etkinleştirildiğinde %s oluşturacağını algıladı.\n"
"\n"
"- Bu ISO görüntüsünü saygın olmayan bir kaynaktan aldıysanız, bunun UEFI kötü amaçlı yazılım içerme olasılığını göz önünde bulundurmalı ve bu görüntüden önyükleme yapmaktan kaçınmalısınız.\n"
"- Eğer güvenilir bir kaynaktan aldıysanız bu uyarıyı vermeyecek daha güncel bir versiyon bulmaya çalışmalısınız."
#. • MSG_340
msgid "a \"Security Violation\" screen"
msgstr "\"Güvenlik İhlali\" ekranı"
#. • MSG_341
msgid "a Windows Recovery Screen (BSOD) with '%s'"
msgstr "'%s' içeren bir Windows Kurtarma Ekranı (BSOD)"
#. • MSG_342
msgid "Compressed VHDX Image"
msgstr "Sıkıştırılmış VHDX Yansısı"
#. • MSG_343
msgid "Uncompressed VHD Image"
msgstr "Sıkıştırılmamış VHD Yansısı"
#. • MSG_344
msgid "Full Flash Update Image"
msgstr "Full Flash Update Yansısı"
#. • MSG_345
msgid ""
"Some additional data must be downloaded from Microsoft to use this functionality:\n"
"- Select 'Yes' to connect to the Internet and download it\n"
"- Select 'No' to cancel the operation"
msgstr ""
"Bu işlevselliği kullanmak için Microsoft'tan bazı ek verilerin indirilmesi gerekir:\n"
"- İnternete bağlanıp indirmek için 'Evet'i seçin\n"
"- İşlemden vazgeçmek için 'Hayır'ı seçin"
#. • MSG_346
msgid "Restrict Windows to S-Mode (INCOMPATIBLE with online account bypass)"
msgstr "Windows'u S-Mode ile Kısıtlayın (çevrimiçi hesap atlamayla UYUMSUZ)"
#. • MSG_347
msgid "Expert Mode"
msgstr "Uzman Modu"
#. • MSG_348
msgid "Extracting archive files: %s"
msgstr "Arşiv dosyaları çıkarılıyor: %s"
#. • MSG_349
msgid "Use Rufus MBR"
msgstr "Rufus MBR'yi kullanın"
#. • MSG_900
#.
#. The following messages are for the Windows Store listing only and are not used by the application

View File

@ -1,9 +1,9 @@
msgid ""
msgstr ""
"Project-Id-Version: 3.22\n"
"Project-Id-Version: 4.5\n"
"Report-Msgid-Bugs-To: pete@akeo.ie\n"
"POT-Creation-Date: 2023-03-09 10:21+0200\n"
"PO-Revision-Date: 2023-03-12 14:09+0000\n"
"POT-Creation-Date: 2024-05-14 13:59+0300\n"
"PO-Revision-Date: 2024-05-15 21:15+0300\n"
"Last-Translator: \n"
"Language-Team: \n"
"Language: uk_UA\n"
@ -13,7 +13,7 @@ msgstr ""
"X-Poedit-SourceCharset: UTF-8\n"
"X-Rufus-LanguageName: Ukrainian (Українська)\n"
"X-Rufus-LCID: 0x0422\n"
"X-Generator: Poedit 3.2.2\n"
"X-Generator: Poedit 3.4.4\n"
#. • IDD_DIALOG → IDS_DRIVE_PROPERTIES_TXT
msgid "Drive Properties"
@ -54,13 +54,11 @@ msgstr "Список USB накопичувачів"
msgid "Add fixes for old BIOSes (extra partition, align, etc.)"
msgstr "Додати виправлення для старих BIOS (додатковий розділ, вирівнювання, тощо)"
#. • IDD_DIALOG → IDC_RUFUS_MBR
#. • IDD_DIALOG → IDC_UEFI_MEDIA_VALIDATION
#.
#. 'MBR': See http://en.wikipedia.org/wiki/Master_boot_record
#. Rufus can install it's own custom MBR (the Rufus MBR), which also allows users to
#. specify a custom disk ID for the BIOS. The tooltip for this control is MSG_167.
msgid "Use Rufus MBR with BIOS ID"
msgstr "Використовувати Rufus MBR з BIOS ID"
#. It is acceptable to drop the "runtime" if you are running out of space
msgid "Enable runtime UEFI media validation"
msgstr "Увімкнути перевірку носія UEFI під час виконання"
#. • IDD_DIALOG → IDS_FORMAT_OPTIONS_TXT
msgid "Format Options"
@ -92,7 +90,7 @@ msgstr "Створити розширену мітку та значок при
#. • IDD_DIALOG → IDS_STATUS_TXT
msgid "Status"
msgstr "Статус"
msgstr "Стан"
#. • IDD_DIALOG → IDCANCEL
#. • IDD_LICENSE → IDCANCEL
@ -433,7 +431,7 @@ msgstr "Вибраний пристрій захищений від запису
#. • MSG_055
msgid "The device is in use by another process. Please close any other process that may be accessing the device."
msgstr "Вибраний пристрій використовується іншим процесом. Будь ласка, закінчіть процес перед використанням вибраного пристрою."
msgstr "Вибраний пристрій використовується іншим процесом. Будь ласка, завершіть процес перед використанням вибраного пристрою."
#. • MSG_056
msgid "Quick format is not available for this device."
@ -575,9 +573,9 @@ msgstr ""
"Через це завантажувальне меню може відображатися неправильно.\n"
"\n"
"Нову версію можна завантажити за допомогою Rufus:\n"
"- Оберіть 'Так', щоб завантажити файл з інтернету\n"
"- Оберіть 'Ні', щоб не модифікувати ISO-образ\n"
"Якщо ви не знаєте що робити, то оберіть 'Так'.\n"
"- Виберіть 'Так', щоб завантажити файл з інтернету\n"
"- Виберіть 'Ні', щоб не модифікувати ISO-образ\n"
"Якщо ви не знаєте що робити, то виберіть 'Так'.\n"
"\n"
"Файл буде завантажений в поточну директорію, а в разі наявності '%s' - замінений автоматично."
@ -614,7 +612,7 @@ msgstr "Непідтримуваний ISO-образ"
#. • MSG_091
msgid "When using UEFI Target Type, only EFI bootable ISO images are supported. Please select an EFI bootable ISO or set the Target Type to BIOS."
msgstr "При використанні системного інтерфейсу UEFI підтримуються тільки завантажувальні EFI ISO-образи. Будь ласка, оберіть завантажувальний EFI ISO-образ чи змініть системний інтерфейс на BIOS."
msgstr "При використанні системного інтерфейсу UEFI підтримуються тільки завантажувальні EFI ISO-образи. Будь ласка, виберіть завантажувальний EFI ISO-образ чи змініть системний інтерфейс на BIOS."
#. • MSG_092
msgid "Unsupported filesystem"
@ -702,8 +700,8 @@ msgstr ""
"Оскільки цей файл більший за 100 Кб, і завжди присутній в %s ISO-образах, він не був вбудований в Rufus.\n"
"\n"
"Rufus може завантажити відсутній файл:\n"
"- Оберіть 'Так', якщо хочете завантажити даний файл\n"
"- Оберіть 'Ні', якщо хочете завантажити його вручну пізніше\n"
"- Виберіть 'Так', якщо хочете завантажити даний файл\n"
"- Виберіть 'Ні', якщо хочете завантажити його вручну пізніше\n"
"\n"
"Примітка: Файл буде завантажений в поточну директорію. За наявності '%s', він буде перезаписаний автоматично."
@ -717,7 +715,7 @@ msgstr ""
#. • MSG_106
msgid "Please select folder"
msgstr "Будь ласка, оберіть теку"
msgstr "Будь ласка, виберіть теку"
#. • MSG_107
msgid "All files"
@ -769,8 +767,8 @@ msgstr ""
"Даний образ використовує Syslinux %s%s, проте даний додаток включає в себе тільки настановні файли для Syslinux %s%s.\n"
"\n"
"Так як нові версії Syslinux несумісні одна з одною, необхідно, щоб додаткові файли ('ldlinux.sys' та 'ldlinux.bss') були завантажені з інтернету:\n"
"- Оберіть 'Так', щоб завантажити файли з інтернету\n"
"- Оберіть 'Ні', щоб відмінити операцію\n"
"- Виберіть 'Так', щоб завантажити файли з інтернету\n"
"- Виберіть 'Ні', щоб відмінити операцію\n"
"\n"
"Примітка: Файли будуть завантажені в поточний каталог додатку і будуть використовуватися повторно за необхідності."
@ -795,9 +793,9 @@ msgstr ""
"Даний образ використовує завантажувач Grub %s, але додаток включає тільки настановні файли для завантажувача Grub %s.\n"
"\n"
"Різні версії завантажувача Grub можуть бути несумісними одна з одною та увімкнення їх усіх не являється можливим. Rufus намагатиметься знайти потрібну версію настановного файла завантажувача Grub ('core.img'), що відповідає версії завантажувача вашого образу:\n"
"- Оберіть 'Так', щоб скачати завантажувальний файл з Інтернета\n"
"- Оберіть 'Ні', щоб використовувати версію за замовчуванням із Rufus\n"
"- Оберіть 'Відмінити', щоб відмінити операцію\n"
"- Виберіть 'Так', щоб скачати завантажувальний файл з інтернету\n"
"- Виберіть 'Ні', щоб використовувати версію за замовчуванням із Rufus\n"
"- Виберіть 'Відмінити', щоб відмінити операцію\n"
"\n"
"Примітка: Файл буде завантажено в поточний каталог додатку та буде використаний повторно наступного разу. Якщо потрібна версія настановного файла не буде знайдена в інтернеті, то буде використовуватися версія за замовчуванням."
@ -811,7 +809,7 @@ msgstr "Стандартне встановлення Windows"
#. http://en.wikipedia.org/wiki/Windows_To_Go in your language.
#. Otherwise, you may add a parenthesis eg. "Windows To Go (<hint at what it does>)"
msgid "Windows To Go"
msgstr "Windows To Go"
msgstr ""
#. • MSG_119
msgid "advanced drive properties"
@ -1043,16 +1041,8 @@ msgid "Check this box to allow the display of international labels and set a dev
msgstr "Дозволити відображення міток з міжнародними символами та задати значок пристрою (створюється autorun.inf)"
#. • MSG_167
msgid "Install an MBR that allows boot selection and can masquerade the BIOS USB drive ID"
msgstr "Використовувати MBR, що дозволяє вибрати завантажувач та може замаскувати ідентифікатор пристрою в BIOS"
#. • MSG_168
msgid ""
"Try to masquerade first bootable USB drive (usually 0x80) as a different disk.\n"
"This should only be necessary if you install Windows XP and have more than one disk."
msgstr ""
"Спробуйте замаскувати перший завантажувальний USB-накопичувач (зазвичай 0x80) як інший диск.\n"
"Це необхідно тільки якщо ви встановлюєте Windows XP та маєте більше ніж один диск."
msgid "Install a UEFI bootloader, that will perform MD5Sum file validation of the media"
msgstr "Встановити завантажувач UEFI, який буде виконувати перевірку MD5Sum"
#. • MSG_169
msgid ""
@ -1095,7 +1085,7 @@ msgstr "Версія %d.%d (Збірка %d)"
#. • MSG_176
msgid "English translation: Pete Batard <mailto:pete@akeo.ie>"
msgstr "Українською переклав:\\line• Великожон Костянтин <mailto:mind.converter@gmail.com>"
msgstr "Українською переклав: Великожон Костянтин <mailto:mind.converter@gmail.com>"
#. • MSG_177
msgid "Report bugs or request enhancements at:"
@ -1566,7 +1556,7 @@ msgstr ""
"Rufus рекомендує використовувати %s режим для повного доступу до диска після запису.\n"
"Однак, якщо ви зіштовхнетесь з проблемами під час завантаження ви можете ще раз спробувати записати образ в %s режимі.\n"
"\n"
"Будь ласка, оберіть режим, який ви хочете використовувати для запису обраного образа:"
"Будь ласка, виберіть режим, який ви хочете використовувати для запису обраного образа:"
#. • MSG_276
#.
@ -1594,7 +1584,7 @@ msgstr "Диск чи ISO-образ"
#. • MSG_281
msgid "%s (Please select)"
msgstr "%s (Будь ласка, оберіть)"
msgstr "%s (Будь ласка, виберіть)"
#. • MSG_282
msgid "Exclusive USB drive locking"
@ -1686,7 +1676,7 @@ msgid ""
msgstr ""
"Розмір вибраного файла ISO не співпадає з оголошеним розміром: %s даних відсутні!\n"
"\n"
"Якщо ви завантажили цей файл з Інтернету, вам слід завантажити нову копію файла або перевірити співпадіння контрольних сум MD5 чи SHA з офіційним файлом.\n"
"Якщо ви завантажили цей файл з інтернету, вам слід завантажити нову копію файла або перевірити співпадіння контрольних сум MD5 чи SHA з офіційним файлом.\n"
"\n"
"Пам'ятайте, що ви можете порівняти MD5 чи SHA в Rufus, натиснувши кнопку (✓)."
@ -1853,6 +1843,82 @@ msgstr "Вимкнути автоматичне шифрування прист
msgid "Persistent log"
msgstr "Постійний журнал"
#. • MSG_337
msgid ""
"An additional file ('diskcopy.dll') must be downloaded from Microsoft to install MS-DOS:\n"
"- Select 'Yes' to connect to the Internet and download it\n"
"- Select 'No' to cancel the operation\n"
"\n"
"Note: The file will be downloaded in the application's directory and will be reused automatically if present."
msgstr ""
"Необхідно завантажити додатковий файл ('diskcopy.dll') з сайту Microsoft для встановлення MS-DOS:\n"
"- Виберіть 'Так' для з'єднання з інтернетом та його завантаження\n"
"- Виберіть 'Ні' для скасування операції\n"
"\n"
"Примітка: файл буде завантажено в каталог додатку та повторно використано за наявності."
#. • MSG_338
msgid "Revoked UEFI bootloader detected"
msgstr "Виявлено відкликаний завантажувач UEFI"
#. • MSG_339
msgid ""
"Rufus detected that the ISO you have selected contains a UEFI bootloader that has been revoked and that will produce %s, when Secure Boot is enabled on a fully up to date UEFI system.\n"
"\n"
"- If you obtained this ISO image from a non reputable source, you should consider the possibility that it might contain UEFI malware and avoid booting from it.\n"
"- If you obtained it from a trusted source, you should try to locate a more up to date version, that will not produce this warning."
msgstr ""
"Rufus виявив, що вибраний ISO містить відкликаний завантажувач UEFI, що буде створювати %s, коли в оновленій системі UEFI буде ввімкнено безпечне завантаження.\n"
"\n"
"- Якщо ви отримали цей образ з неперевіреного джерела, Вам слід розглянути можливість того, що він може містити зловмисне ПЗ і уникнути завантаження з нього.\n"
"- Якщо ви отримали цей образ з довіреного джерела, Вам слід спробувати знайти більш актуальну версію, що не буде провокувати це попередження."
#. • MSG_340
msgid "a \"Security Violation\" screen"
msgstr "вікно \"Security Violation\""
#. • MSG_341
msgid "a Windows Recovery Screen (BSOD) with '%s'"
msgstr "вікно Windows Recovery Screen (BSOD) з '%s'"
#. • MSG_342
msgid "Compressed VHDX Image"
msgstr "Образ VHDX зі стисненням"
#. • MSG_343
msgid "Uncompressed VHD Image"
msgstr "Образ VHD без стиснення"
#. • MSG_344
msgid "Full Flash Update Image"
msgstr "Образ Full Flash Update"
#. • MSG_345
msgid ""
"Some additional data must be downloaded from Microsoft to use this functionality:\n"
"- Select 'Yes' to connect to the Internet and download it\n"
"- Select 'No' to cancel the operation"
msgstr ""
"Для використання даного функціоналу необхідно завантажити деякі додаткові дані з сайту Microsoft:\n"
"- Виберіть 'Так' для з'єднання з інтернетом та завантаження даних\n"
"- Виберіть 'Ні' для скасування операції"
#. • MSG_346
msgid "Restrict Windows to S-Mode (INCOMPATIBLE with online account bypass)"
msgstr "Обмежити Windows до S-Mode (НЕСУМІСНО з обходом облікового запису)"
#. • MSG_347
msgid "Expert Mode"
msgstr "Просунутий режим"
#. • MSG_348
msgid "Extracting archive files: %s"
msgstr "Видобування архівованих файлів: %s"
#. • MSG_349
msgid "Use Rufus MBR"
msgstr "Використовувати Rufus MBR"
#. • MSG_900
#.
#. The following messages are for the Windows Store listing only and are not used by the application

View File

@ -1,9 +1,9 @@
msgid ""
msgstr ""
"Project-Id-Version: 3.22\n"
"Project-Id-Version: 4.5\n"
"Report-Msgid-Bugs-To: pete@akeo.ie\n"
"POT-Creation-Date: 2023-04-16 06:07+0700\n"
"PO-Revision-Date: 2023-04-17 13:37+0100\n"
"POT-Creation-Date: 2024-04-26 02:45+0900\n"
"PO-Revision-Date: 2024-04-26 03:13+0900\n"
"Last-Translator: \n"
"Language-Team: \n"
"Language: vi_VN\n"
@ -13,7 +13,7 @@ msgstr ""
"X-Poedit-SourceCharset: UTF-8\n"
"X-Rufus-LanguageName: Vietnamese (Tiếng Việt)\n"
"X-Rufus-LCID: 0x042A\n"
"X-Generator: Poedit 3.2.2\n"
"X-Generator: Poedit 3.4.2\n"
#. • IDD_DIALOG → IDS_DRIVE_PROPERTIES_TXT
msgid "Drive Properties"
@ -54,13 +54,11 @@ msgstr "Danh sách ổ cứng USB"
msgid "Add fixes for old BIOSes (extra partition, align, etc.)"
msgstr "Thêm khắc phục cho BIOS cũ (phân vùng, sắp xếp...khác)"
#. • IDD_DIALOG → IDC_RUFUS_MBR
#. • IDD_DIALOG → IDC_UEFI_MEDIA_VALIDATION
#.
#. 'MBR': See http://en.wikipedia.org/wiki/Master_boot_record
#. Rufus can install it's own custom MBR (the Rufus MBR), which also allows users to
#. specify a custom disk ID for the BIOS. The tooltip for this control is MSG_167.
msgid "Use Rufus MBR with BIOS ID"
msgstr "Dùng MBR của Rufus với ID BIOS"
#. It is acceptable to drop the "runtime" if you are running out of space
msgid "Enable runtime UEFI media validation"
msgstr "Bật xác thực phương tiện UEFI tại thời điểm chạy"
#. • IDD_DIALOG → IDS_FORMAT_OPTIONS_TXT
msgid "Format Options"
@ -1043,16 +1041,8 @@ msgid "Check this box to allow the display of international labels and set a dev
msgstr "Chọn mục này để cho phép hiện tên ổ đĩa toàn hệ thống và đặt biểu tượng thiết bị (khởi tạo autorun.inf)"
#. • MSG_167
msgid "Install an MBR that allows boot selection and can masquerade the BIOS USB drive ID"
msgstr "Cài đặt một MBR cho phép lựa chọn khởi động và có thể giả ID ổ đĩa USB BIOS"
#. • MSG_168
msgid ""
"Try to masquerade first bootable USB drive (usually 0x80) as a different disk.\n"
"This should only be necessary if you install Windows XP and have more than one disk."
msgstr ""
"Thử giả ổ đĩa USB khởi động đầu tiên (thường là 0x80) như một đĩa khác.\n"
"Điều này chỉ cần thiết nếu bạn cài đặt Windows XP và có nhiều hơn một đĩa."
msgid "Install a UEFI bootloader, that will perform MD5Sum file validation of the media"
msgstr "Cài đặt bộ khởi động UEFI, cùng với việc tiến trình xác thực MD5Sum của phương tiện"
#. • MSG_169
msgid ""
@ -1853,6 +1843,82 @@ msgstr "Vô hiệu tự động mã hoá thiết bị BitLocker"
msgid "Persistent log"
msgstr "Nhật ký"
#. • MSG_337
msgid ""
"An additional file ('diskcopy.dll') must be downloaded from Microsoft to install MS-DOS:\n"
"- Select 'Yes' to connect to the Internet and download it\n"
"- Select 'No' to cancel the operation\n"
"\n"
"Note: The file will be downloaded in the application's directory and will be reused automatically if present."
msgstr ""
"Một tệp tin bổ sung ('diskcopy.dll') phải được tải về từ Microsoft để cài đặt MS-DOS:\n"
"- Chọn 'Có' để kết nối tới Internet và tải nó xuống\n"
"- Chọn 'Không' để huỷ tiến trình\n"
"\n"
"Ghi chú: Tệp tin sẽ được tải xuống tại đường dẫn của phần mềm và sẽ được tự động tái sử dụng nếu có sẵn."
#. • MSG_338
msgid "Revoked UEFI bootloader detected"
msgstr "Đã phát hiện bộ khởi động UEFI bị thu hồi"
#. • MSG_339
msgid ""
"Rufus detected that the ISO you have selected contains a UEFI bootloader that has been revoked and that will produce %s, when Secure Boot is enabled on a fully up to date UEFI system.\n"
"\n"
"- If you obtained this ISO image from a non reputable source, you should consider the possibility that it might contain UEFI malware and avoid booting from it.\n"
"- If you obtained it from a trusted source, you should try to locate a more up to date version, that will not produce this warning."
msgstr ""
"Rufus đã phát hiện ra rằng tệp ISO bạn đã chọn có chứa một bộ khởi động UEFI đã bị thu hồi và nó sẽ tạo ra %s, khi Secure Boot được kích hoạt trên một hệ thống UEFI được cập nhật đầy đủ và mới nhất.\n"
"\n"
"- Nếu bạn sở hữu tệp ISO này từ một nguồn không đáng tin cậy, bạn nên cân nhắc khả năng có thể chứa mã độc UEFI và tránh khởi động từ nó.\n"
"- Nếu bạn sở hữu từ một nguồn uy tín, bạn nên thử tìm một bản mới hơn, theo đó cảnh báo này sẽ không hiện ra."
#. • MSG_340
msgid "a \"Security Violation\" screen"
msgstr "một màn hình \"Vi phạm Bảo mật\""
#. • MSG_341
msgid "a Windows Recovery Screen (BSOD) with '%s'"
msgstr "một Màn hình Khôi phục Windows (BSOD) với '%s'"
#. • MSG_342
msgid "Compressed VHDX Image"
msgstr "Tệp VHDX đã nén"
#. • MSG_343
msgid "Uncompressed VHD Image"
msgstr "Tệp VHD chưa nén"
#. • MSG_344
msgid "Full Flash Update Image"
msgstr "Ghi Đầy đủ Tệp Cập nhật"
#. • MSG_345
msgid ""
"Some additional data must be downloaded from Microsoft to use this functionality:\n"
"- Select 'Yes' to connect to the Internet and download it\n"
"- Select 'No' to cancel the operation"
msgstr ""
"Một vài dữ lieu phải được tải xuống từ Microsoft để sử dụng tính năng này:\n"
"- Chọn 'Có' để kết nối tới Internet và tải xuống nó\n"
"- Chọn 'Không' để huỷ tiến trình"
#. • MSG_346
msgid "Restrict Windows to S-Mode (INCOMPATIBLE with online account bypass)"
msgstr "Giới hạn Windows vào S-Mode (KHÔNG TƯƠNG THÍCH với việc bỏ qua tài khoản trực tuyến)"
#. • MSG_347
msgid "Expert Mode"
msgstr "Chế độ Chuyên nghiệp"
#. • MSG_348
msgid "Extracting archive files: %s"
msgstr "Đang giải nén tệp lưu trữ: %s"
#. • MSG_349
msgid "Use Rufus MBR"
msgstr "Sử dụng Rufus MBR"
#. • MSG_900
#.
#. The following messages are for the Windows Store listing only and are not used by the application

View File

@ -1,9 +1,9 @@
msgid ""
msgstr ""
"Project-Id-Version: 3.22\n"
"Project-Id-Version: 4.5\n"
"Report-Msgid-Bugs-To: pete@akeo.ie\n"
"POT-Creation-Date: 2023-02-19 23:07+0800\n"
"PO-Revision-Date: 2023-02-20 13:37+0000\n"
"POT-Creation-Date: 2024-04-28 10:38+0800\n"
"PO-Revision-Date: 2024-04-28 10:59+0800\n"
"Last-Translator: \n"
"Language-Team: \n"
"Language: zh_CN\n"
@ -13,7 +13,7 @@ msgstr ""
"X-Poedit-SourceCharset: UTF-8\n"
"X-Rufus-LanguageName: Chinese Simplified (简体中文)\n"
"X-Rufus-LCID: 0x0804, 0x1004\n"
"X-Generator: Poedit 3.2.2\n"
"X-Generator: Poedit 3.4.2\n"
#. • IDD_DIALOG → IDS_DRIVE_PROPERTIES_TXT
msgid "Drive Properties"
@ -54,13 +54,11 @@ msgstr "显示 USB 外置硬盘"
msgid "Add fixes for old BIOSes (extra partition, align, etc.)"
msgstr "添加对旧 BIOS 修正(额外的分区,校准等)"
#. • IDD_DIALOG → IDC_RUFUS_MBR
#. • IDD_DIALOG → IDC_UEFI_MEDIA_VALIDATION
#.
#. 'MBR': See http://en.wikipedia.org/wiki/Master_boot_record
#. Rufus can install it's own custom MBR (the Rufus MBR), which also allows users to
#. specify a custom disk ID for the BIOS. The tooltip for this control is MSG_167.
msgid "Use Rufus MBR with BIOS ID"
msgstr "使用 Rufus MBR 配合 BIOS ID"
#. It is acceptable to drop the "runtime" if you are running out of space
msgid "Enable runtime UEFI media validation"
msgstr "启用运行时 UEFI 介质验证"
#. • IDD_DIALOG → IDS_FORMAT_OPTIONS_TXT
msgid "Format Options"
@ -1047,16 +1045,8 @@ msgid "Check this box to allow the display of international labels and set a dev
msgstr "勾选本框允许国际卷标的显示并设置一个设备图标(创建一个 autorun.inf)"
#. • MSG_167
msgid "Install an MBR that allows boot selection and can masquerade the BIOS USB drive ID"
msgstr "安装一个可以引导选择内容并可以伪装 BIOS USB 盘 ID 的 MBR"
#. • MSG_168
msgid ""
"Try to masquerade first bootable USB drive (usually 0x80) as a different disk.\n"
"This should only be necessary if you install Windows XP and have more than one disk."
msgstr ""
"尝试将首个可引导的 USB 驱动器 (通常为 0x80) 伪装为不同的磁盘。\n"
"只有当您安装 Windows XP并拥有多个磁盘时才需要此选项。"
msgid "Install a UEFI bootloader, that will perform MD5Sum file validation of the media"
msgstr "安装 UEFI 引导加载器,该加载器将对介质进行 MD5 校验"
#. • MSG_169
msgid ""
@ -1859,6 +1849,82 @@ msgstr "禁用 BitLocker 自动设备加密"
msgid "Persistent log"
msgstr "持久化日志"
#. • MSG_337
msgid ""
"An additional file ('diskcopy.dll') must be downloaded from Microsoft to install MS-DOS:\n"
"- Select 'Yes' to connect to the Internet and download it\n"
"- Select 'No' to cancel the operation\n"
"\n"
"Note: The file will be downloaded in the application's directory and will be reused automatically if present."
msgstr ""
"必须从微软下载额外的文件(\"diskcopy.dll\"),以安装 MS-DOS\n"
"- 选择 '是' 连接网络并下载这些文件\n"
"- 选择 '否' 取消此项操作\n"
"\n"
"注意:文件将会被下载到当前应用程序目录,如果存在则会自动选用。"
#. • MSG_338
msgid "Revoked UEFI bootloader detected"
msgstr "检测到被吊销的 UEFI 引导加载器"
#. • MSG_339
msgid ""
"Rufus detected that the ISO you have selected contains a UEFI bootloader that has been revoked and that will produce %s, when Secure Boot is enabled on a fully up to date UEFI system.\n"
"\n"
"- If you obtained this ISO image from a non reputable source, you should consider the possibility that it might contain UEFI malware and avoid booting from it.\n"
"- If you obtained it from a trusted source, you should try to locate a more up to date version, that will not produce this warning."
msgstr ""
"Rufus 检测到您选择的 ISO 包含一个已被吊销的 UEFI 引导加载器,当在最新的 UEFI 系统上启用安全启动时,将产生%s。\n"
"\n"
"- 如果您从非可信来源获取此 ISO 镜像,则应考虑其中可能包含 UEFI 恶意软件,应当避免启动此镜像。\n"
"- 如果是从可信来源获取的,则应尝试查找不会产生此警告的最新版本。"
#. • MSG_340
msgid "a \"Security Violation\" screen"
msgstr "一个“安全违规”界面"
#. • MSG_341
msgid "a Windows Recovery Screen (BSOD) with '%s'"
msgstr "一个包含 '%s' 的蓝屏界面"
#. • MSG_342
msgid "Compressed VHDX Image"
msgstr "压缩的 VHDX 镜像"
#. • MSG_343
msgid "Uncompressed VHD Image"
msgstr "未压缩的 VHD 镜像"
#. • MSG_344
msgid "Full Flash Update Image"
msgstr "完整闪存更新镜像"
#. • MSG_345
msgid ""
"Some additional data must be downloaded from Microsoft to use this functionality:\n"
"- Select 'Yes' to connect to the Internet and download it\n"
"- Select 'No' to cancel the operation"
msgstr ""
"使用此功能需要从微软下载一些额外数据:\n"
"- 选择 '是' 连接网络并下载这些文件\n"
"- 选择 '否' 取消此项操作"
#. • MSG_346
msgid "Restrict Windows to S-Mode (INCOMPATIBLE with online account bypass)"
msgstr "将 Windows 限制为 S 模式(与绕过在线账户功能不兼容)"
#. • MSG_347
msgid "Expert Mode"
msgstr "专家模式"
#. • MSG_348
msgid "Extracting archive files: %s"
msgstr "正在解压文件: %s"
#. • MSG_349
msgid "Use Rufus MBR"
msgstr "使用 Rufus MBR"
#. • MSG_900
#.
#. The following messages are for the Windows Store listing only and are not used by the application
@ -1902,7 +1968,7 @@ msgstr "将 U 盘、存储卡或虚拟驱动器格式化为 FAT/FAT32/NTFS/UDF/e
#. • MSG_911
msgid "Create FreeDOS bootable USB drives"
msgstr "创建 FreeDOS 可启动驱动器"
msgstr "创建 FreeDOS 可启动驱动器"
#. • MSG_912
msgid "Create bootable drives from bootable ISOs (Windows, Linux, etc.)"

View File

@ -1,7 +1,7 @@
/*
* Rufus: The Reliable USB Formatting Utility
* Poedit <-> rufus.loc conversion utility
* Copyright © 2018-2023 Pete Batard <pete@akeo.ie>
* Copyright © 2018-2024 Pete Batard <pete@akeo.ie>
*
* 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
@ -41,9 +41,9 @@ using System.Windows.Forms;
[assembly: AssemblyDescription("Poedit ↔ Rufus loc conversion utility")]
[assembly: AssemblyCompany("Akeo Consulting")]
[assembly: AssemblyProduct("Pollock")]
[assembly: AssemblyCopyright("Copyright © 2018-2023 Pete Batard <pete@akeo.ie>")]
[assembly: AssemblyCopyright("Copyright © 2018-2024 Pete Batard <pete@akeo.ie>")]
[assembly: AssemblyTrademark("GNU GPLv3")]
[assembly: AssemblyVersion("1.5.*")]
[assembly: AssemblyVersion("1.6.*")]
namespace pollock
{
@ -1244,9 +1244,9 @@ Retry:
if ((list.Count >= 2) && (index >= 0))
{
Process.Start($"mailto:pete@akeo.ie?subject=Rufus {list[index][0]} translation v{list[0][2]} update" +
$"&body=Hi Pete,%0D%0A%0D%0APlease find attached the latest {list[index][0]} translation." +
$"%0D%0A%0D%0A<PLEASE ATTACH '{app_dir}{po_file}' AND REMOVE THIS LINE>" +
Process.Start($"mailto:pete@akeo.ie?subject=Rufus%20{list[index][0]}%20translation%20v{list[0][2]}%20update" +
$"&body=Hi%20Pete,%0D%0A%0D%0APlease%20find%20attached%20the%20latest%20{list[index][0]}%20translation." +
$"%0D%0A%0D%0A<PLEASE%20ATTACH%20'{app_dir}{po_file}'%20AND%20REMOVE%20THIS%20LINE>" +
$"%0D%0A%0D%0ARegards,");
}
return;

File diff suppressed because it is too large Load Diff

BIN
res/md5/bootaa64.efi Normal file

Binary file not shown.

BIN
res/md5/bootarm.efi Normal file

Binary file not shown.

BIN
res/md5/bootia32.efi Normal file

Binary file not shown.

BIN
res/md5/bootriscv64.efi Normal file

Binary file not shown.

BIN
res/md5/bootx64.efi Normal file

Binary file not shown.

3
res/md5/readme.txt Normal file
View File

@ -0,0 +1,3 @@
This directory contains the uefi-md5sum bootloaders added by Rufus for media validation.
See https://github.com/pbatard/uefi-md5sum for details.

Binary file not shown.

View File

@ -4,7 +4,7 @@
* Copyright 1992-1994 Remy Card <card@masi.ibp.fr>
* Copyright 1995-1999 Theodore Ts'o
* Copyright 1999 David Beattie
* Copyright 2011-2023 Pete Batard <pete@akeo.ie>
* Copyright 2011-2024 Pete Batard <pete@akeo.ie>
*
* This file is based on the minix file system programs fsck and mkfs
* written and copyrighted by Linus Torvalds <Linus.Torvalds@cs.helsinki.fi>
@ -318,7 +318,7 @@ static void CALLBACK alarm_intr(HWND hwnd, UINT uMsg, UINT_PTR idEvent, DWORD dw
{
if (!num_blocks)
return;
if (FormatStatus) {
if (ErrorStatus) {
uprintf("%sInterrupting at block %" PRIu64 "\n", bb_prefix,
(unsigned long long) currently_testing);
cancel_ops = -1;

View File

@ -7,7 +7,7 @@
*
* Copyright 1995, 1996, 1997, 1998, 1999 by Theodore Ts'o
* Copyright 1999 by David Beattie
* Copyright 2011-2018 by Pete Batard
* Copyright 2011-2024 by Pete Batard
*
* This file is based on the minix file system programs fsck and mkfs
* written and copyrighted by Linus Torvalds <Linus.Torvalds@cs.helsinki.fi>
@ -28,12 +28,11 @@ typedef struct bb_struct_u64_iterate *bb_badblocks_iterate;
typedef struct bb_struct_u64_list *bb_u64_list;
typedef struct bb_struct_u64_iterate *bb_u64_iterate;
#define BB_ET_NO_MEMORY (ERROR_SEVERITY_ERROR|FAC(FACILITY_STORAGE)|ERROR_NOT_ENOUGH_MEMORY)
#define BB_ET_MAGIC_BADBLOCKS_LIST (ERROR_SEVERITY_ERROR|FAC(FACILITY_STORAGE)|ERROR_OBJECT_IN_LIST)
#define BB_ET_MAGIC_BADBLOCKS_ITERATE (ERROR_SEVERITY_ERROR|FAC(FACILITY_STORAGE)|ERROR_INVALID_BLOCK)
#define BB_ET_NO_MEMORY RUFUS_ERROR(ERROR_NOT_ENOUGH_MEMORY)
#define BB_ET_MAGIC_BADBLOCKS_LIST RUFUS_ERROR(ERROR_OBJECT_IN_LIST)
#define BB_ET_MAGIC_BADBLOCKS_ITERATE RUFUS_ERROR(ERROR_INVALID_BLOCK)
#define BB_CHECK_MAGIC(struct, code) \
if ((struct)->magic != (code)) return (code)
#define BB_CHECK_MAGIC(struct, code) if ((struct)->magic != (code)) return (code)
#define BB_BAD_BLOCKS_THRESHOLD 256
#define BB_BLOCKS_AT_ONCE 64
#define BB_SYS_PAGE_SIZE 4096

View File

@ -255,6 +255,11 @@ unpack_lzma_stream(transformer_state_t *xstate)
header.dict_size = SWAP_LE32(header.dict_size);
header.dst_size = SWAP_LE64(header.dst_size);
if (header.dict_size > 1024 * 1024 * 1024) {
bb_simple_error_msg("lzma dictionary size too large");
return -1;
}
if (header.dict_size == 0)
header.dict_size++;

View File

@ -384,8 +384,7 @@ BOOL GetOpticalMedia(IMG_SAVE* img_save)
FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_FLAG_SEQUENTIAL_SCAN, NULL);
if (hDrive == INVALID_HANDLE_VALUE)
continue;
if (!DeviceIoControl(hDrive, IOCTL_DISK_GET_DRIVE_GEOMETRY_EX,
NULL, 0, geometry, sizeof(geometry), &size, NULL))
if (!DeviceIoControl(hDrive, IOCTL_DISK_GET_DRIVE_GEOMETRY_EX, NULL, 0, geometry, sizeof(geometry), &size, NULL))
continue;
// Rewritable media usually has a one sector
if (DiskGeometry->DiskSize.QuadPart <= 4096)
@ -594,7 +593,7 @@ BOOL GetDevices(DWORD devnum)
uprintf("Could not allocate Device ID list");
goto out;
}
for (s=0, i=0; s<ARRAYSIZE(usbstor_name); s++) {
for (s = 0, i = 0; s < ARRAYSIZE(usbstor_name); s++) {
list_start[s] = i;
if (list_size[s] > 1) {
if (CM_Get_Device_ID_ListA(usbstor_name[s], &devid_list[i], list_size[s], ulFlags) != CR_SUCCESS)
@ -891,8 +890,8 @@ BOOL GetDevices(DWORD devnum)
break;
}
drive_size = GetDriveSize(drive_index);
if (drive_size < (MIN_DRIVE_SIZE * MB)) {
uprintf("Device eliminated because it is smaller than %d MB", MIN_DRIVE_SIZE);
if (drive_size < MIN_DRIVE_SIZE) {
uprintf("Device eliminated because it is smaller than %s", SizeToHumanReadable(MIN_DRIVE_SIZE, FALSE, FALSE));
safe_free(devint_detail_data);
break;
}
@ -928,8 +927,9 @@ BOOL GetDevices(DWORD devnum)
uprintf("NOTE: You can enable the listing of Hard Drives under 'advanced drive properties'");
safe_free(devint_detail_data);
break;
} else if ((!enable_HDDs) && (props.is_CARD) && (drive_size > MAX_DEFAULT_LIST_CARD_SIZE * GB)) {
uprintf("Device eliminated because it was detected as a card larger than %d GB", MAX_DEFAULT_LIST_CARD_SIZE);
} else if ((!enable_HDDs) && (props.is_CARD) && (drive_size > MAX_DEFAULT_LIST_CARD_SIZE)) {
uprintf("Device eliminated because it was detected as a card larger than %s",
SizeToHumanReadable(MAX_DEFAULT_LIST_CARD_SIZE, FALSE, FALSE));
uprintf("To use such a card, check 'List USB Hard Drives' under 'advanced drive properties'");
safe_free(devint_detail_data);
break;
@ -986,8 +986,8 @@ BOOL GetDevices(DWORD devnum)
safe_free(devint_detail_data);
break;
}
safe_sprintf(&display_msg[strlen(display_msg)], sizeof(display_msg) - strlen(display_msg),
"%s [%s]", (right_to_left_mode)?RIGHT_TO_LEFT_MARK:"",
safe_sprintf(&display_msg[strlen(display_msg)], sizeof(display_msg) - strlen(display_msg) - 1,
"%s [%s]", (right_to_left_mode) ? RIGHT_TO_LEFT_MARK : "",
SizeToHumanReadable(drive_size, FALSE, use_fake_units));
display_name = display_msg;
}

View File

@ -2,7 +2,7 @@
* Rufus: The Reliable USB Formatting Utility
* DOS boot file extraction, from the FAT12 floppy image in diskcopy.dll
* (MS WinME DOS) or from the embedded FreeDOS resource files
* Copyright © 2011-2023 Pete Batard <pete@akeo.ie>
* Copyright © 2011-2024 Pete Batard <pete@akeo.ie>
*
* 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
@ -352,7 +352,7 @@ BOOL ExtractFreeDOS(const char* path)
IDR_FD_EGA17_CPX, IDR_FD_EGA18_CPX };
char filename[MAX_PATH], locale_path[MAX_PATH];
BYTE* res_data;
DWORD res_size, Size;
DWORD res_size;
HANDLE hFile;
int i;
@ -366,10 +366,10 @@ BOOL ExtractFreeDOS(const char* path)
static_strcat(locale_path, "LOCALE\\");
CreateDirectoryA(locale_path, NULL);
for (i=0; i<ARRAYSIZE(res_name); i++) {
for (i = 0; i < ARRAYSIZE(res_name); i++) {
res_data = (BYTE*)GetResource(hMainInstance, MAKEINTRESOURCEA(res_id[i]), _RT_RCDATA, res_name[i], &res_size, FALSE);
static_strcpy(filename, ((i<2)?path:locale_path));
static_strcpy(filename, ((i<2) ? path : locale_path));
static_strcat(filename, res_name[i]);
hFile = CreateFileA(filename, GENERIC_READ|GENERIC_WRITE, FILE_SHARE_READ, NULL,
@ -379,7 +379,7 @@ BOOL ExtractFreeDOS(const char* path)
return FALSE;
}
if (!WriteFileWithRetry(hFile, res_data, res_size, &Size, WRITE_RETRIES)) {
if (!WriteFileWithRetry(hFile, res_data, res_size, NULL, WRITE_RETRIES)) {
uprintf("Could not write file '%s': %s.", filename, WindowsErrorString());
safe_closehandle(hFile);
return FALSE;

View File

@ -1,7 +1,7 @@
/*
* Rufus: The Reliable USB Formatting Utility
* DOS keyboard locale setup
* Copyright © 2011-2021 Pete Batard <pete@akeo.ie>
* Copyright © 2011-2024 Pete Batard <pete@akeo.ie>
*
* 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
@ -197,8 +197,8 @@ static kb_list fd_kb_list[] = {
static int ms_get_kbdrv(const char* kb)
{
unsigned int i, j;
for (i=0; i<ARRAYSIZE(ms_kb_list); i++) {
for (j=0; j<ms_kb_list[i].size; j++) {
for (i = 0; i<ARRAYSIZE(ms_kb_list); i++) {
for (j = 0; j < ms_kb_list[i].size; j++) {
if (safe_strcmp(ms_kb_list[i].list[j], kb) == 0) {
return i;
}
@ -210,8 +210,8 @@ static int ms_get_kbdrv(const char* kb)
static int fd_get_kbdrv(const char* kb)
{
unsigned int i, j;
for (i=0; i<ARRAYSIZE(fd_kb_list); i++) {
for (j=0; j<fd_kb_list[i].size; j++) {
for (i = 0; i < ARRAYSIZE(fd_kb_list); i++) {
for (j = 0; j < fd_kb_list[i].size; j++) {
if (safe_strcmp(fd_kb_list[i].list[j], kb) == 0) {
return i;
}
@ -250,7 +250,7 @@ static const char* kb_hr_list[][2] = {
{"is", "Icelandic"},
{"it", "Italian"},
{"jp", "Japanese"},
// {"ko", "Korean"}, // Unsupported by FreeDOS?
// {"ko", "Korean"}, // Unsupported by FreeDOS
{"nl", "Dutch"},
{"no", "Norwegian"},
{"pl", "Polish"},
@ -270,7 +270,7 @@ static const char* kb_hr_list[][2] = {
{"lv", "Latvian"},
{"lt", "Lithuanian"},
{"tj", "Tajik"},
// {"fa", "Persian"}; // Unsupported by FreeDOS?
// {"fa", "Persian"}; // Unsupported by FreeDOS
{"vi", "Vietnamese"},
{"hy", "Armenian"},
{"az", "Azeri"},
@ -288,7 +288,7 @@ static const char* kb_hr_list[][2] = {
static const char* kb_to_hr(const char* kb)
{
int i;
for (i=0; i<ARRAYSIZE(kb_hr_list); i++) {
for (i = 0; i < ARRAYSIZE(kb_hr_list); i++) {
if (safe_strcmp(kb, kb_hr_list[i][0]) == 0) {
return kb_hr_list[i][1];
}
@ -426,7 +426,7 @@ static cp_list cp_hr_list[] = {
static const char* cp_to_hr(ULONG cp)
{
int i;
for (i=0; i<ARRAYSIZE(cp_hr_list); i++) {
for (i = 0; i < ARRAYSIZE(cp_hr_list); i++) {
if (cp_hr_list[i].cp == cp) {
return cp_hr_list[i].name;
}
@ -449,13 +449,13 @@ static const char* get_kb(void)
// need an KLID which GetKeyboardLayoutNameA() does return ...but only as a
// string of an hex value...
GetKeyboardLayoutNameA(kbid_str);
if (sscanf(kbid_str, "%x", &kbid) == 0) {
uprintf("Could not scan keyboard layout name - falling back to US as default\n");
if (sscanf(kbid_str, "%x", &kbid) <= 0) {
uprintf("Could not scan keyboard layout name - defaulting to US");
kbid = 0x00000409;
}
uprintf("Windows KBID 0x%08x\n", kbid);
for (pass=0; pass<3; pass++) {
for (pass = 0; pass < 3; pass++) {
// Some of these return values are defined in
// HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Keyboard Layout\DosKeybCodes
// Others are picked up in FreeDOS official keyboard layouts, v3.0
@ -748,12 +748,12 @@ static const char* get_kb(void)
} else if (pass == 1) {
// If we still didn't get a match, use the system's primary language
kbid = PRIMARYLANGID(GetSystemDefaultLangID());
uprintf("Unable to match KBID, trying LangID 0x%04x\n", kbid);
uprintf("Unable to match KBID, trying LangID 0x%04x", kbid);
}
break;
}
}
uprintf("Unable to match KBID and LangID - defaulting to US\n");
uprintf("Unable to match KBID and LangID - defaulting to US");
return "us";
}
@ -976,14 +976,14 @@ BOOL SetDOSLocale(const char* path, BOOL bFreeDOS)
// First handle the codepage
kb = get_kb();
// We have a keyboard ID, but that doesn't mean it's supported
kbdrv = bFreeDOS?fd_get_kbdrv(kb):ms_get_kbdrv(kb);
kbdrv = bFreeDOS ? fd_get_kbdrv(kb) : ms_get_kbdrv(kb);
if (kbdrv < 0) {
uprintf("Keyboard id '%s' is not supported - falling back to 'us'\n", kb);
uprintf("Keyboard id '%s' is not supported - falling back to 'us'", kb);
kb = "us";
kbdrv = bFreeDOS?fd_get_kbdrv(kb):ms_get_kbdrv(kb); // Always succeeds
kbdrv = bFreeDOS ? fd_get_kbdrv(kb) : ms_get_kbdrv(kb); // Always succeeds
}
assert(kbdrv >= 0);
uprintf("Will use DOS keyboard '%s' [%s]\n", kb, kb_to_hr(kb));
uprintf("Will use DOS keyboard '%s' [%s]", kb, kb_to_hr(kb));
// Now get a codepage
cp = GetOEMCP();
@ -994,16 +994,16 @@ BOOL SetDOSLocale(const char* path, BOOL bFreeDOS)
(char*)&actual_cp, sizeof(actual_cp)))
cp = actual_cp;
}
egadrv = bFreeDOS?fd_get_ega(cp):ms_get_ega(cp);
egadrv = bFreeDOS ? fd_get_ega(cp) : ms_get_ega(cp);
if (egadrv == NULL) {
// We need to use the fallback CP from the keyboard we got above, as 437 is not always available
uprintf("Unable to find an EGA file with codepage %d [%s]\n", cp, cp_to_hr(cp));
uprintf("Unable to find an EGA file with codepage %d [%s]", cp, cp_to_hr(cp));
cp = kbdrv_data[kbdrv].default_cp;
egadrv = bFreeDOS?"ega.cpx":"ega.cpi";
egadrv = bFreeDOS ? "ega.cpx" : "ega.cpi";
} else if (bFreeDOS) {
cp = fd_upgrade_cp(cp);
}
uprintf("Will use codepage %d [%s]\n", cp, cp_to_hr(cp));
uprintf("Will use codepage %d [%s]", cp, cp_to_hr(cp));
if ((cp == 437) && (strcmp(kb, "us") == 0)) {
// Nothing much to do if US/US - just notify in autoexec.bat
@ -1011,14 +1011,14 @@ BOOL SetDOSLocale(const char* path, BOOL bFreeDOS)
static_strcat(filename, "\\AUTOEXEC.BAT");
fd = fopen(filename, "w+");
if (fd == NULL) {
uprintf("Unable to create 'AUTOEXEC.BAT': %s.\n", WindowsErrorString());
uprintf("Unable to create 'AUTOEXEC.BAT': %s", WindowsErrorString());
return FALSE;
}
fprintf(fd, "@echo off\n");
fprintf(fd, "set PATH=.;\\;\\LOCALE\n");
fprintf(fd, "echo Using %s keyboard with %s codepage [%d]\n", kb_to_hr("us"), cp_to_hr(437), 437);
fclose(fd);
uprintf("Successfully wrote 'AUTOEXEC.BAT'\n");
uprintf("Successfully wrote 'AUTOEXEC.BAT'");
return TRUE;
}
@ -1027,7 +1027,7 @@ BOOL SetDOSLocale(const char* path, BOOL bFreeDOS)
static_strcat(filename, "\\CONFIG.SYS");
fd = fopen(filename, "w+");
if (fd == NULL) {
uprintf("Unable to create 'CONFIG.SYS': %s.\n", WindowsErrorString());
uprintf("Unable to create 'CONFIG.SYS': %s.", WindowsErrorString());
return FALSE;
}
if (bFreeDOS) {
@ -1045,14 +1045,14 @@ BOOL SetDOSLocale(const char* path, BOOL bFreeDOS)
bFreeDOS?"MENU ":"MENUITEM=", bFreeDOS?')':',', kb_to_hr("us"), cp_to_hr(437), 437);
fprintf(fd, "%s", bFreeDOS?"MENU\n12?\n":"[1]\ndevice=\\locale\\display.sys con=(ega,,1)\n[2]\n");
fclose(fd);
uprintf("Successfully wrote 'CONFIG.SYS'\n");
uprintf("Successfully wrote 'CONFIG.SYS'");
// AUTOEXEC.BAT
static_strcpy(filename, path);
static_strcat(filename, "\\AUTOEXEC.BAT");
fd = fopen(filename, "w+");
if (fd == NULL) {
uprintf("Unable to create 'AUTOEXEC.BAT': %s.\n", WindowsErrorString());
uprintf("Unable to create 'AUTOEXEC.BAT': %s", WindowsErrorString());
return FALSE;
}
fprintf(fd, "@echo off\n");
@ -1066,7 +1066,7 @@ BOOL SetDOSLocale(const char* path, BOOL bFreeDOS)
fprintf(fd, "keyb %s,,\\locale\\%s\n", kb, kbdrv_data[kbdrv].name);
fprintf(fd, ":2\n");
fclose(fd);
uprintf("Successfully wrote 'AUTOEXEC.BAT'\n");
uprintf("Successfully wrote 'AUTOEXEC.BAT'");
return TRUE;
}

View File

@ -74,7 +74,7 @@ PF_TYPE_DECL(NTAPI, NTSTATUS, NtQueryVolumeInformationFile, (HANDLE, PIO_STATUS_
RUFUS_DRIVE_INFO SelectedDrive;
extern BOOL write_as_esp;
extern windows_version_t WindowsVersion;
uint64_t partition_offset[PI_MAX];
int partition_index[PI_MAX];
uint64_t persistence_size = 0;
/*
@ -90,13 +90,12 @@ uint64_t persistence_size = 0;
BOOL SetAutoMount(BOOL enable)
{
HANDLE hMountMgr;
DWORD size;
BOOL ret = FALSE;
hMountMgr = CreateFileA(MOUNTMGR_DOS_DEVICE_NAME, 0, FILE_SHARE_READ|FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
if (hMountMgr == INVALID_HANDLE_VALUE)
return FALSE;
ret = DeviceIoControl(hMountMgr, IOCTL_MOUNTMGR_SET_AUTO_MOUNT, &enable, sizeof(enable), NULL, 0, &size, NULL);
ret = DeviceIoControl(hMountMgr, IOCTL_MOUNTMGR_SET_AUTO_MOUNT, &enable, sizeof(enable), NULL, 0, NULL, NULL);
CloseHandle(hMountMgr);
return ret;
}
@ -137,7 +136,6 @@ static HANDLE GetHandle(char* Path, BOOL bLockDrive, BOOL bWriteAccess, BOOL bWr
{
int i;
BYTE access_mask = 0;
DWORD size;
uint64_t EndTime;
HANDLE hDrive = INVALID_HANDLE_VALUE;
char DevPath[MAX_PATH];
@ -186,22 +184,22 @@ static HANDLE GetHandle(char* Path, BOOL bLockDrive, BOOL bWriteAccess, BOOL bWr
}
if (bLockDrive) {
if (DeviceIoControl(hDrive, FSCTL_ALLOW_EXTENDED_DASD_IO, NULL, 0, NULL, 0, &size, NULL)) {
if (DeviceIoControl(hDrive, FSCTL_ALLOW_EXTENDED_DASD_IO, NULL, 0, NULL, 0, NULL, NULL)) {
uprintf("I/O boundary checks disabled");
}
EndTime = GetTickCount64() + DRIVE_ACCESS_TIMEOUT;
do {
if (DeviceIoControl(hDrive, FSCTL_LOCK_VOLUME, NULL, 0, NULL, 0, &size, NULL))
if (DeviceIoControl(hDrive, FSCTL_LOCK_VOLUME, NULL, 0, NULL, 0, NULL, NULL))
goto out;
if (IS_ERROR(FormatStatus)) // User cancel
if (IS_ERROR(ErrorStatus)) // User cancel
break;
Sleep(DRIVE_ACCESS_TIMEOUT / DRIVE_ACCESS_RETRIES);
} while (GetTickCount64() < EndTime);
// If we reached this section, either we didn't manage to get a lock or the user cancelled
uprintf("Could not lock access to %s: %s", Path, WindowsErrorString());
// See if we can report the processes are accessing the drive
if (!IS_ERROR(FormatStatus) && (access_mask == 0))
if (!IS_ERROR(ErrorStatus) && (access_mask == 0))
access_mask = GetProcessSearch(SEARCH_PROCESS_TIMEOUT, 0x07, FALSE);
// Try to continue if the only access rights we saw were for read-only
if ((access_mask & 0x07) != 0x01)
@ -311,8 +309,7 @@ char* GetLogicalName(DWORD DriveIndex, uint64_t PartitionOffset, BOOL bKeepTrail
continue;
}
r = DeviceIoControl(hDrive, IOCTL_VOLUME_GET_VOLUME_DISK_EXTENTS, NULL, 0,
&DiskExtents, sizeof(DiskExtents), &size, NULL);
r = DeviceIoControl(hDrive, IOCTL_VOLUME_GET_VOLUME_DISK_EXTENTS, NULL, 0, &DiskExtents, sizeof(DiskExtents), &size, NULL);
if ((!r) || (size == 0)) {
suprintf("Could not get Disk Extents: %s", r ? "(empty data)" : WindowsErrorString());
safe_closehandle(hDrive);
@ -392,7 +389,7 @@ char* AltGetLogicalName(DWORD DriveIndex, uint64_t PartitionOffset, BOOL bKeepTr
if (PartitionOffset == 0) {
i = 0;
} else if (matching_drive) {
for (i = 0; (i < MAX_PARTITIONS) && (PartitionOffset != SelectedDrive.PartitionOffset[i]); i++);
for (i = 0; (i < MAX_PARTITIONS) && (PartitionOffset != SelectedDrive.Partition[i].Offset); i++);
if (i >= MAX_PARTITIONS) {
suprintf("Error: Could not find a partition at offset %lld on this disk", PartitionOffset);
goto out;
@ -428,11 +425,11 @@ char* GetExtPartitionName(DWORD DriveIndex, uint64_t PartitionOffset)
if (DriveIndex != SelectedDrive.DeviceNumber)
goto out;
CheckDriveIndex(DriveIndex);
for (i = 0; (i < MAX_PARTITIONS) && (PartitionOffset != SelectedDrive.PartitionOffset[i]); i++);
for (i = 0; (i < MAX_PARTITIONS) && (PartitionOffset != SelectedDrive.Partition[i].Offset); i++);
if (i >= MAX_PARTITIONS)
goto out;
static_sprintf(volume_name, "\\\\.\\PhysicalDrive%lu %I64u %I64u", DriveIndex,
SelectedDrive.PartitionOffset[i], SelectedDrive.PartitionSize[i]);
SelectedDrive.Partition[i].Offset, SelectedDrive.Partition[i].Size);
ret = safe_strdup(volume_name);
out:
return ret;
@ -1006,7 +1003,7 @@ BOOL WaitForLogical(DWORD DriveIndex, uint64_t PartitionOffset)
return TRUE;
}
free(LogicalPath);
if (IS_ERROR(FormatStatus)) // User cancel
if (IS_ERROR(ErrorStatus)) // User cancel
return FALSE;
Sleep(DRIVE_ACCESS_TIMEOUT / DRIVE_ACCESS_RETRIES);
} while (GetTickCount64() < EndTime);
@ -1063,13 +1060,12 @@ int GetDriveNumber(HANDLE hDrive, char* path)
BOOL s;
int r = -1;
if (!DeviceIoControl(hDrive, IOCTL_VOLUME_GET_VOLUME_DISK_EXTENTS, NULL, 0,
&DiskExtents, sizeof(DiskExtents), &size, NULL) || (size <= 0) || (DiskExtents.NumberOfDiskExtents < 1) ) {
if (!DeviceIoControl(hDrive, IOCTL_VOLUME_GET_VOLUME_DISK_EXTENTS, NULL, 0, &DiskExtents, sizeof(DiskExtents), &size, NULL) ||
(size <= 0) || (DiskExtents.NumberOfDiskExtents < 1)) {
// DiskExtents are NO_GO (which is the case for external USB HDDs...)
s = DeviceIoControl(hDrive, IOCTL_STORAGE_GET_DEVICE_NUMBER, NULL, 0, &DeviceNumber, sizeof(DeviceNumber),
&size, NULL);
s = DeviceIoControl(hDrive, IOCTL_STORAGE_GET_DEVICE_NUMBER, NULL, 0, &DeviceNumber, sizeof(DeviceNumber), &size, NULL);
if ((!s) || (size == 0)) {
uprintf("Could not get device number for device %s %s", path, s ? "(empty data)" : WindowsErrorString());
uuprintf("Could not get device number for device %s %s", path, s ? "(empty data)" : WindowsErrorString());
return -1;
}
r = (int)DeviceNumber.DeviceNumber;
@ -1181,8 +1177,7 @@ static BOOL _GetDriveLettersAndType(DWORD DriveIndex, char* drive_letters, UINT*
// handling to determine if they are fixed or removable.
if ((drives_found == 0) && (drive_type != NULL)) {
hPhysical = GetPhysicalHandle(DriveIndex + DRIVE_INDEX_MIN, FALSE, FALSE, FALSE);
r = DeviceIoControl(hPhysical, IOCTL_DISK_GET_DRIVE_GEOMETRY_EX,
NULL, 0, geometry, sizeof(geometry), &size, NULL);
r = DeviceIoControl(hPhysical, IOCTL_DISK_GET_DRIVE_GEOMETRY_EX, NULL, 0, geometry, sizeof(geometry), &size, NULL);
safe_closehandle(hPhysical);
if (r && size > 0) {
if (DiskGeometry->Geometry.MediaType == FixedMedia)
@ -1314,7 +1309,7 @@ BOOL IsDriveLetterInUse(const char drive_letter)
BOOL GetDriveLabel(DWORD DriveIndex, char* letters, char** label, BOOL bSilent)
{
HANDLE hPhysical;
DWORD size, error;
DWORD error;
static char VolumeLabel[MAX_PATH + 1] = { 0 };
char DrivePath[] = "#:\\", AutorunPath[] = "#:\\autorun.inf", *AutorunLabel = NULL;
WCHAR VolumeName[MAX_PATH + 1] = { 0 }, FileSystemName[64];
@ -1344,7 +1339,7 @@ BOOL GetDriveLabel(DWORD DriveIndex, char* letters, char** label, BOOL bSilent)
// In the case of card readers with no card, users can get an annoying popup asking them
// to insert media. Use IOCTL_STORAGE_CHECK_VERIFY to prevent this
hPhysical = GetPhysicalHandle(DriveIndex, FALSE, FALSE, TRUE);
if (DeviceIoControl(hPhysical, IOCTL_STORAGE_CHECK_VERIFY, NULL, 0, NULL, 0, &size, NULL))
if (DeviceIoControl(hPhysical, IOCTL_STORAGE_CHECK_VERIFY, NULL, 0, NULL, 0, NULL, NULL))
AutorunLabel = get_token_data_file("label", AutorunPath);
else if (GetLastError() == ERROR_NOT_READY)
suprintf("Ignoring 'autorun.inf' label for drive %c: No media", toupper(letters[0]));
@ -1386,8 +1381,7 @@ uint64_t GetDriveSize(DWORD DriveIndex)
if (hPhysical == INVALID_HANDLE_VALUE)
return FALSE;
r = DeviceIoControl(hPhysical, IOCTL_DISK_GET_DRIVE_GEOMETRY_EX,
NULL, 0, geometry, sizeof(geometry), &size, NULL);
r = DeviceIoControl(hPhysical, IOCTL_DISK_GET_DRIVE_GEOMETRY_EX, NULL, 0, geometry, sizeof(geometry), &size, NULL);
safe_closehandle(hPhysical);
if (!r || size <= 0)
return 0;
@ -1405,8 +1399,7 @@ BOOL IsMediaPresent(DWORD DriveIndex)
BYTE geometry[128];
hPhysical = GetPhysicalHandle(DriveIndex, FALSE, FALSE, TRUE);
r = DeviceIoControl(hPhysical, IOCTL_DISK_GET_DRIVE_GEOMETRY_EX,
NULL, 0, geometry, sizeof(geometry), &size, NULL) && (size > 0);
r = DeviceIoControl(hPhysical, IOCTL_DISK_GET_DRIVE_GEOMETRY_EX, NULL, 0, geometry, sizeof(geometry), &size, NULL) && (size > 0);
safe_closehandle(hPhysical);
return r;
}
@ -1509,8 +1502,7 @@ uint64_t GetEspOffset(DWORD DriveIndex)
if (hPhysical == INVALID_HANDLE_VALUE)
return FALSE;
r = DeviceIoControl(hPhysical, IOCTL_DISK_GET_DRIVE_LAYOUT_EX,
NULL, 0, layout, sizeof(layout), &size, NULL);
r = DeviceIoControl(hPhysical, IOCTL_DISK_GET_DRIVE_LAYOUT_EX, NULL, 0, layout, sizeof(layout), &size, NULL);
if (!r || size <= 0) {
uprintf("Could not get layout for drive 0x%02x: %s", DriveIndex, WindowsErrorString());
goto out;
@ -1694,7 +1686,7 @@ BOOL ToggleEsp(DWORD DriveIndex, uint64_t PartitionOffset)
}
DriveLayout->PartitionEntry[esp_index].RewritePartition = TRUE; // Just in case
r = DeviceIoControl(hPhysical, IOCTL_DISK_SET_DRIVE_LAYOUT_EX, (BYTE*)DriveLayout, dl_size, NULL, 0, &dl_size, NULL);
r = DeviceIoControl(hPhysical, IOCTL_DISK_SET_DRIVE_LAYOUT_EX, (BYTE*)DriveLayout, dl_size, NULL, 0, NULL, NULL);
if (!r) {
uprintf("Could not set drive layout: %s", WindowsErrorString());
goto out;
@ -1868,8 +1860,7 @@ BOOL GetDrivePartitionData(DWORD DriveIndex, char* FileSystemName, DWORD FileSys
return FALSE;
SelectedDrive.nPartitions = 0;
memset(SelectedDrive.PartitionOffset, 0, sizeof(SelectedDrive.PartitionOffset));
memset(SelectedDrive.PartitionSize, 0, sizeof(SelectedDrive.PartitionSize));
memset(SelectedDrive.Partition, 0, sizeof(SelectedDrive.Partition));
// Populate the filesystem data
FileSystemName[0] = 0;
volume_name = GetLogicalName(DriveIndex, 0, TRUE, FALSE);
@ -1882,8 +1873,7 @@ BOOL GetDrivePartitionData(DWORD DriveIndex, char* FileSystemName, DWORD FileSys
if (hPhysical == INVALID_HANDLE_VALUE)
return FALSE;
r = DeviceIoControl(hPhysical, IOCTL_DISK_GET_DRIVE_GEOMETRY_EX,
NULL, 0, geometry, sizeof(geometry), &size, NULL);
r = DeviceIoControl(hPhysical, IOCTL_DISK_GET_DRIVE_GEOMETRY_EX, NULL, 0, geometry, sizeof(geometry), &size, NULL);
if (!r || size <= 0) {
suprintf("Could not get geometry for drive 0x%02x: %s", DriveIndex, WindowsErrorString());
safe_closehandle(hPhysical);
@ -1905,8 +1895,7 @@ BOOL GetDrivePartitionData(DWORD DriveIndex, char* FileSystemName, DWORD FileSys
suprintf("Cylinders: %" PRIi64 ", Tracks per cylinder: %d, Sectors per track: %d",
DiskGeometry->Geometry.Cylinders, DiskGeometry->Geometry.TracksPerCylinder, DiskGeometry->Geometry.SectorsPerTrack);
r = DeviceIoControl(hPhysical, IOCTL_DISK_GET_DRIVE_LAYOUT_EX,
NULL, 0, layout, sizeof(layout), &size, NULL );
r = DeviceIoControl(hPhysical, IOCTL_DISK_GET_DRIVE_LAYOUT_EX, NULL, 0, layout, sizeof(layout), &size, NULL );
if (!r || size <= 0) {
suprintf("Could not get layout for drive 0x%02x: %s", DriveIndex, WindowsErrorString());
safe_closehandle(hPhysical);
@ -1961,8 +1950,8 @@ BOOL GetDrivePartitionData(DWORD DriveIndex, char* FileSystemName, DWORD FileSys
}
}
if (i < MAX_PARTITIONS) {
SelectedDrive.PartitionOffset[i] = DriveLayout->PartitionEntry[i].StartingOffset.QuadPart;
SelectedDrive.PartitionSize[i] = DriveLayout->PartitionEntry[i].PartitionLength.QuadPart;
SelectedDrive.Partition[i].Offset = DriveLayout->PartitionEntry[i].StartingOffset.QuadPart;
SelectedDrive.Partition[i].Size = DriveLayout->PartitionEntry[i].PartitionLength.QuadPart;
}
suprintf(" Type: %s (0x%02x)\r\n Detected File System: %s\r\n"
" Size: %s (%lld bytes)\r\n Start Sector: %lld, Boot: %s",
@ -1992,12 +1981,13 @@ BOOL GetDrivePartitionData(DWORD DriveIndex, char* FileSystemName, DWORD FileSys
DriveLayout->Gpt.MaxPartitionCount, DriveLayout->Gpt.StartingUsableOffset.QuadPart, DriveLayout->Gpt.UsableLength.QuadPart);
for (i = 0; i < DriveLayout->PartitionCount; i++) {
if (i < MAX_PARTITIONS) {
SelectedDrive.PartitionOffset[i] = DriveLayout->PartitionEntry[i].StartingOffset.QuadPart;
SelectedDrive.PartitionSize[i] = DriveLayout->PartitionEntry[i].PartitionLength.QuadPart;
SelectedDrive.Partition[i].Offset = DriveLayout->PartitionEntry[i].StartingOffset.QuadPart;
SelectedDrive.Partition[i].Size = DriveLayout->PartitionEntry[i].PartitionLength.QuadPart;
wcscpy(SelectedDrive.Partition[i].Name, DriveLayout->PartitionEntry[i].Gpt.Name);
}
SelectedDrive.nPartitions++;
isUefiNtfs = (wcscmp(DriveLayout->PartitionEntry[i].Gpt.Name, L"UEFI:NTFS") == 0);
suprintf("Partition %d%s:\r\n Type: %s", i+1, isUefiNtfs ? " (UEFI:NTFS)" : "",
suprintf("Partition %d%s:\r\n Type: %s", i + 1, isUefiNtfs ? " (UEFI:NTFS)" : "",
GetGPTPartitionType(&DriveLayout->PartitionEntry[i].Gpt.PartitionType));
if (DriveLayout->PartitionEntry[i].Gpt.Name[0] != 0)
suprintf(" Name: '%S'", DriveLayout->PartitionEntry[i].Gpt.Name);
@ -2062,9 +2052,7 @@ out:
*/
BOOL UnmountVolume(HANDLE hDrive)
{
DWORD size;
if (!DeviceIoControl(hDrive, FSCTL_DISMOUNT_VOLUME, NULL, 0, NULL, 0, &size, NULL)) {
if (!DeviceIoControl(hDrive, FSCTL_DISMOUNT_VOLUME, NULL, 0, NULL, 0, NULL, NULL)) {
uprintf("Could not unmount drive: %s", WindowsErrorString());
return FALSE;
}
@ -2219,7 +2207,7 @@ BOOL RemountVolume(char* drive_name, BOOL bSilent)
} else {
suprintf("Could not remount %s as %c: %s", volume_name, toupper(drive_name[0]), WindowsErrorString());
// This will leave the drive inaccessible and must be flagged as an error
FormatStatus = ERROR_SEVERITY_ERROR|FAC(FACILITY_STORAGE)|APPERR(ERROR_CANT_REMOUNT_VOLUME);
ErrorStatus = RUFUS_ERROR(APPERR(ERROR_CANT_REMOUNT_VOLUME));
return FALSE;
}
}
@ -2232,15 +2220,17 @@ BOOL RemountVolume(char* drive_name, BOOL bSilent)
* (especially IOCTL_DISK_UPDATE_PROPERTIES is *USELESS*), and therefore the OS will try to
* read the file system data at an old location, even if the partition has just been deleted.
*/
static BOOL ClearPartition(HANDLE hDrive, LARGE_INTEGER offset, DWORD size)
static BOOL ClearPartition(HANDLE hDrive, uint64_t offset, DWORD size)
{
BOOL r = FALSE;
uint8_t* buffer = calloc(size, 1);
LARGE_INTEGER li_offset;
if (buffer == NULL)
return FALSE;
if (!SetFilePointerEx(hDrive, offset, NULL, FILE_BEGIN)) {
li_offset.QuadPart = offset;
if (!SetFilePointerEx(hDrive, li_offset, NULL, FILE_BEGIN)) {
free(buffer);
return FALSE;
}
@ -2260,17 +2250,14 @@ static BOOL ClearPartition(HANDLE hDrive, LARGE_INTEGER offset, DWORD size)
BOOL CreatePartition(HANDLE hDrive, int partition_style, int file_system, BOOL mbr_uefi_marker, uint8_t extra_partitions)
{
const char* PartitionTypeName[] = { "MBR", "GPT", "SFD" };
const wchar_t *extra_part_name = L"", *main_part_name = write_as_esp ? L"EFI System Partition" : L"Main Data Partition";
const LONGLONG main_part_size = write_as_esp ? MAX_ISO_TO_ESP_SIZE * MB : SelectedDrive.DiskSize;
const LONGLONG bytes_per_track = ((LONGLONG)SelectedDrive.SectorsPerTrack) * SelectedDrive.SectorSize;
const DWORD size_to_clear = MAX_SECTORS_TO_CLEAR * SelectedDrive.SectorSize;
uint8_t* buffer;
uint64_t last_offset = SelectedDrive.DiskSize;
size_t uefi_ntfs_size = 0;
DWORD pi = 0, mi, i, size, bufsize;
CREATE_DISK CreateDisk = { PARTITION_STYLE_RAW, { { 0 } } };
DRIVE_LAYOUT_INFORMATION_EX4 DriveLayoutEx = { 0 };
BOOL r;
DWORD i, size, bufsize, pn = 0;
LONGLONG main_part_size_in_sectors, extra_part_size_in_tracks = 0;
// Go for a 260 MB sized ESP by default to keep everyone happy, including 4K sector users:
// https://docs.microsoft.com/en-us/windows-hardware/manufacture/desktop/configure-uefigpt-based-hard-drive-partitions
// and folks using MacOS: https://github.com/pbatard/rufus/issues/979
@ -2288,17 +2275,19 @@ BOOL CreatePartition(HANDLE hDrive, int partition_style, int file_system, BOOL m
if (extra_partitions & XP_UEFI_NTFS) {
uefi_ntfs_size = GetResourceSize(hMainInstance, MAKEINTRESOURCEA(IDR_UEFI_NTFS), _RT_RCDATA, "uefi-ntfs.img");
if (uefi_ntfs_size == 0)
if (uefi_ntfs_size == 0) {
uprintf("Could not access embedded 'uefi-ntfs.img'");
return FALSE;
}
}
memset(partition_offset, 0, sizeof(partition_offset));
memset(SelectedDrive.PartitionOffset, 0, sizeof(SelectedDrive.PartitionOffset));
memset(SelectedDrive.PartitionSize, 0, sizeof(SelectedDrive.PartitionSize));
// Compute the start offset of our first partition
memset(partition_index, 0, sizeof(partition_index));
memset(SelectedDrive.Partition, 0, sizeof(SelectedDrive.Partition));
// Compute the starting offset of the first partition
if ((partition_style == PARTITION_STYLE_GPT) || (!IsChecked(IDC_OLD_BIOS_FIXES))) {
// Go with the MS 1 MB wastage at the beginning...
DriveLayoutEx.PartitionEntry[pn].StartingOffset.QuadPart = MB;
SelectedDrive.Partition[pi].Offset = 1 * MB;
} else {
// Some folks appear to think that 'Fixes for old BIOSes' is some kind of magic
// wand and are adamant to try to apply them when creating *MODERN* VHD drives.
@ -2308,11 +2297,10 @@ BOOL CreatePartition(HANDLE hDrive, int partition_style, int file_system, BOOL m
// CHS sizes that IBM imparted upon us. Long story short, we now align to a
// cylinder size that is itself aligned to the cluster size.
// If this actually breaks old systems, please send your complaints to IBM.
DriveLayoutEx.PartitionEntry[pn].StartingOffset.QuadPart =
((bytes_per_track + (ClusterSize - 1)) / ClusterSize) * ClusterSize;
SelectedDrive.Partition[pi].Offset = HI_ALIGN_X_TO_Y(bytes_per_track, ClusterSize);
// GRUB2 no longer fits in the usual 31½ KB that the above computation provides
// so just unconditionally double that size and get on with it.
DriveLayoutEx.PartitionEntry[pn].StartingOffset.QuadPart *= 2;
SelectedDrive.Partition[pi].Offset *= 2;
}
// Having the ESP up front may help (and is the Microsoft recommended way) but this
@ -2321,22 +2309,16 @@ BOOL CreatePartition(HANDLE hDrive, int partition_style, int file_system, BOOL m
if (((SelectedDrive.MediaType == FixedMedia) || (WindowsVersion.BuildNumber > 15000)) &&
(extra_partitions & XP_ESP)) {
assert(partition_style == PARTITION_STYLE_GPT);
extra_part_name = L"EFI System Partition";
DriveLayoutEx.PartitionEntry[pn].PartitionLength.QuadPart = esp_size;
DriveLayoutEx.PartitionEntry[pn].Gpt.PartitionType = PARTITION_GENERIC_ESP;
uprintf("● Creating %S (offset: %lld, size: %s)", extra_part_name, DriveLayoutEx.PartitionEntry[pn].StartingOffset.QuadPart,
SizeToHumanReadable(DriveLayoutEx.PartitionEntry[pn].PartitionLength.QuadPart, TRUE, FALSE));
IGNORE_RETVAL(CoCreateGuid(&DriveLayoutEx.PartitionEntry[pn].Gpt.PartitionId));
wcsncpy(DriveLayoutEx.PartitionEntry[pn].Gpt.Name, extra_part_name, ARRAYSIZE(DriveLayoutEx.PartitionEntry[pn].Gpt.Name));
// Zero the first sectors from this partition to avoid file system caching issues
if (!ClearPartition(hDrive, DriveLayoutEx.PartitionEntry[pn].StartingOffset, size_to_clear))
uprintf("Could not zero %S: %s", extra_part_name, WindowsErrorString());
SelectedDrive.PartitionOffset[pn] = DriveLayoutEx.PartitionEntry[pn].StartingOffset.QuadPart;
SelectedDrive.PartitionSize[pn] = DriveLayoutEx.PartitionEntry[pn].PartitionLength.QuadPart;
partition_offset[PI_ESP] = SelectedDrive.PartitionOffset[pn];
pn++;
DriveLayoutEx.PartitionEntry[pn].StartingOffset.QuadPart = DriveLayoutEx.PartitionEntry[pn - 1].StartingOffset.QuadPart +
DriveLayoutEx.PartitionEntry[pn - 1].PartitionLength.QuadPart;
partition_index[PI_ESP] = pi;
wcscpy(SelectedDrive.Partition[pi].Name, L"EFI System Partition");
SelectedDrive.Partition[pi].Size = esp_size;
SelectedDrive.Partition[pi + 1].Offset = SelectedDrive.Partition[pi].Offset + SelectedDrive.Partition[pi].Size;
// Align next partition to track and cluster
SelectedDrive.Partition[pi + 1].Offset = HI_ALIGN_X_TO_Y(SelectedDrive.Partition[pi + 1].Offset, bytes_per_track);
if (ClusterSize % SelectedDrive.SectorSize == 0)
SelectedDrive.Partition[pi + 1].Offset = LO_ALIGN_X_TO_Y(SelectedDrive.Partition[pi + 1].Offset, ClusterSize);
assert(SelectedDrive.Partition[pi + 1].Offset >= SelectedDrive.Partition[pi].Offset + SelectedDrive.Partition[pi].Size);
pi++;
// Clear the extra partition we processed
extra_partitions &= ~(XP_ESP);
}
@ -2344,192 +2326,166 @@ BOOL CreatePartition(HANDLE hDrive, int partition_style, int file_system, BOOL m
// If required, set the MSR partition (GPT only - must be created before the data part)
if (extra_partitions & XP_MSR) {
assert(partition_style == PARTITION_STYLE_GPT);
extra_part_name = L"Microsoft Reserved Partition";
DriveLayoutEx.PartitionEntry[pn].PartitionLength.QuadPart = 128*MB;
DriveLayoutEx.PartitionEntry[pn].Gpt.PartitionType = PARTITION_MICROSOFT_RESERVED;
uprintf("● Creating %S (offset: %lld, size: %s)", extra_part_name, DriveLayoutEx.PartitionEntry[pn].StartingOffset.QuadPart,
SizeToHumanReadable(DriveLayoutEx.PartitionEntry[pn].PartitionLength.QuadPart, TRUE, FALSE));
IGNORE_RETVAL(CoCreateGuid(&DriveLayoutEx.PartitionEntry[pn].Gpt.PartitionId));
wcsncpy(DriveLayoutEx.PartitionEntry[pn].Gpt.Name, extra_part_name, ARRAYSIZE(DriveLayoutEx.PartitionEntry[pn].Gpt.Name));
// Zero the first sectors from this partition to avoid file system caching issues
if (!ClearPartition(hDrive, DriveLayoutEx.PartitionEntry[pn].StartingOffset, size_to_clear))
uprintf("Could not zero %S: %s", extra_part_name, WindowsErrorString());
SelectedDrive.PartitionOffset[pn] = DriveLayoutEx.PartitionEntry[pn].StartingOffset.QuadPart;
SelectedDrive.PartitionSize[pn] = DriveLayoutEx.PartitionEntry[pn].PartitionLength.QuadPart;
pn++;
DriveLayoutEx.PartitionEntry[pn].StartingOffset.QuadPart = DriveLayoutEx.PartitionEntry[pn-1].StartingOffset.QuadPart +
DriveLayoutEx.PartitionEntry[pn-1].PartitionLength.QuadPart;
// Clear the extra partition we processed
wcscpy(SelectedDrive.Partition[pi].Name, L"Microsoft Reserved Partition");
SelectedDrive.Partition[pi].Size = 128 * MB;
SelectedDrive.Partition[pi + 1].Offset = SelectedDrive.Partition[pi].Offset + SelectedDrive.Partition[pi].Size;
SelectedDrive.Partition[pi + 1].Offset = HI_ALIGN_X_TO_Y(SelectedDrive.Partition[pi + 1].Offset, bytes_per_track);
if (ClusterSize % SelectedDrive.SectorSize == 0)
SelectedDrive.Partition[pi + 1].Offset = LO_ALIGN_X_TO_Y(SelectedDrive.Partition[pi + 1].Offset, ClusterSize);
assert(SelectedDrive.Partition[pi + 1].Offset >= SelectedDrive.Partition[pi].Offset + SelectedDrive.Partition[pi].Size);
pi++;
extra_partitions &= ~(XP_MSR);
}
// Set our main data partition
if (write_as_esp) {
// Align ESP to 64 MB while leaving at least 32 MB free space
esp_size = max(esp_size, ((((LONGLONG)img_report.projected_size / MB) + 96) / 64) * 64 * MB);
main_part_size_in_sectors = (esp_size - DriveLayoutEx.PartitionEntry[pn].StartingOffset.QuadPart) /
SelectedDrive.SectorSize;
} else {
main_part_size_in_sectors = (main_part_size - DriveLayoutEx.PartitionEntry[pn].StartingOffset.QuadPart) /
// Need 33 sectors at the end for secondary GPT
SelectedDrive.SectorSize - ((partition_style == PARTITION_STYLE_GPT) ? 33 : 0);
}
// Reserve an entry for the main partition
partition_index[PI_MAIN] = pi++;
// Shorthand for the main index.
mi = partition_index[PI_MAIN];
wcscpy(SelectedDrive.Partition[mi].Name, write_as_esp ? L"EFI System Partition" : L"Main Data Partition");
if (extra_partitions) {
// Adjust the size according to extra partitions (which we always align to a track)
if (extra_partitions & XP_ESP) {
extra_part_name = L"EFI System";
extra_part_size_in_tracks = (esp_size + bytes_per_track - 1) / bytes_per_track;
} else if (extra_partitions & XP_UEFI_NTFS) {
extra_part_name = L"UEFI:NTFS";
extra_part_size_in_tracks = (max(MIN_EXTRA_PART_SIZE, uefi_ntfs_size) + bytes_per_track - 1) / bytes_per_track;
} else if ((extra_partitions & XP_CASPER)) {
// TODO: Should we align these to cluster as well?
if (extra_partitions & XP_PERSISTENCE) {
assert(persistence_size != 0);
extra_part_name = L"Linux Persistence";
extra_part_size_in_tracks = persistence_size / bytes_per_track;
} else if (extra_partitions & XP_COMPAT) {
extra_part_name = L"BIOS Compatibility";
extra_part_size_in_tracks = 1; // One track for the extra partition
} else {
assert(FALSE);
partition_index[PI_CASPER] = pi;
wcscpy(SelectedDrive.Partition[pi].Name, L"Linux Persistence");
SelectedDrive.Partition[pi++].Size = HI_ALIGN_X_TO_Y(persistence_size, bytes_per_track);
}
if (extra_partitions & XP_ESP) {
partition_index[PI_ESP] = pi;
wcscpy(SelectedDrive.Partition[pi].Name, L"EFI System Partition");
SelectedDrive.Partition[pi++].Size = HI_ALIGN_X_TO_Y(esp_size, bytes_per_track);
} else if (extra_partitions & XP_UEFI_NTFS) {
partition_index[PI_UEFI_NTFS] = pi;
wcscpy(SelectedDrive.Partition[pi].Name, L"UEFI:NTFS");
SelectedDrive.Partition[pi++].Size = HI_ALIGN_X_TO_Y(uefi_ntfs_size, bytes_per_track);
} else if (extra_partitions & XP_COMPAT) {
wcscpy(SelectedDrive.Partition[pi].Name, L"BIOS Compatibility");
SelectedDrive.Partition[pi++].Size = bytes_per_track; // One track for the extra partition
}
// NB: Because we already subtracted the backup GPT size from the main partition size and
// this extra partition is indexed on main size, it does not overflow into the backup GPT.
main_part_size_in_sectors = ((main_part_size_in_sectors / SelectedDrive.SectorsPerTrack) -
extra_part_size_in_tracks) * SelectedDrive.SectorsPerTrack;
}
assert(pi <= MAX_PARTITIONS);
if (pi > MAX_PARTITIONS)
return FALSE;
// Compute the offsets of the extra partitions (which we always align to a track)
last_offset = SelectedDrive.DiskSize;
if (partition_style == PARTITION_STYLE_GPT)
last_offset -= 33ULL * SelectedDrive.SectorSize;
for (i = pi - 1; i > mi; i--) {
assert(SelectedDrive.Partition[i].Size < last_offset);
SelectedDrive.Partition[i].Offset = LO_ALIGN_X_TO_Y(last_offset - SelectedDrive.Partition[i].Size, bytes_per_track);
last_offset = SelectedDrive.Partition[i].Offset;
}
// With the above, Compute the main partition size (which we align to a track)
assert(last_offset > SelectedDrive.Partition[mi].Offset);
SelectedDrive.Partition[mi].Size = LO_ALIGN_X_TO_Y(last_offset - SelectedDrive.Partition[mi].Offset, bytes_per_track);
// Try to make sure that the main partition size is a multiple of the cluster size
// This can be especially important when trying to capture an NTFS partition as FFU, as, when
// the NTFS partition is aligned to cluster size, the FFU capture parses the NTFS allocated
// map to only record clusters that are in use, whereas, if not aligned, the FFU capture uses
// a full sector by sector scan of the NTFS partition and records any non-zero garbage, which
// may include garbage leftover data from a previous reformat...
if (ClusterSize % SelectedDrive.SectorSize == 0) {
main_part_size_in_sectors = (((main_part_size_in_sectors * SelectedDrive.SectorSize) /
ClusterSize) * ClusterSize) / SelectedDrive.SectorSize;
}
if (main_part_size_in_sectors <= 0) {
uprintf("Error: Invalid %S size", main_part_name);
if (ClusterSize % SelectedDrive.SectorSize == 0)
SelectedDrive.Partition[mi].Size = LO_ALIGN_X_TO_Y(SelectedDrive.Partition[mi].Size, ClusterSize);
if (SelectedDrive.Partition[mi].Size <= 0) {
uprintf("Error: Invalid %S size", SelectedDrive.Partition[mi].Name);
return FALSE;
}
uprintf("● Creating %S (offset: %lld, size: %s)", main_part_name, DriveLayoutEx.PartitionEntry[pn].StartingOffset.QuadPart,
SizeToHumanReadable(main_part_size_in_sectors * SelectedDrive.SectorSize, TRUE, FALSE));
// Zero the beginning of this partition to avoid conflicting leftovers
if (!ClearPartition(hDrive, DriveLayoutEx.PartitionEntry[pn].StartingOffset, size_to_clear))
uprintf("Could not zero %S: %s", main_part_name, WindowsErrorString());
DriveLayoutEx.PartitionEntry[pn].PartitionLength.QuadPart = main_part_size_in_sectors * SelectedDrive.SectorSize;
if (partition_style == PARTITION_STYLE_MBR) {
DriveLayoutEx.PartitionEntry[pn].Mbr.BootIndicator = (boot_type != BT_NON_BOOTABLE);
switch (file_system) {
case FS_FAT16:
DriveLayoutEx.PartitionEntry[pn].Mbr.PartitionType = 0x0e; // FAT16 LBA
break;
case FS_NTFS:
case FS_EXFAT:
case FS_UDF:
case FS_REFS:
DriveLayoutEx.PartitionEntry[pn].Mbr.PartitionType = 0x07;
break;
case FS_EXT2:
case FS_EXT3:
case FS_EXT4:
DriveLayoutEx.PartitionEntry[pn].Mbr.PartitionType = 0x83;
break;
case FS_FAT32:
DriveLayoutEx.PartitionEntry[pn].Mbr.PartitionType = 0x0c; // FAT32 LBA
break;
default:
uprintf("Unsupported file system");
return FALSE;
}
} else {
if (write_as_esp)
DriveLayoutEx.PartitionEntry[pn].Gpt.PartitionType = PARTITION_GENERIC_ESP;
else if (IS_EXT(file_system))
DriveLayoutEx.PartitionEntry[pn].Gpt.PartitionType = PARTITION_LINUX_DATA;
else
DriveLayoutEx.PartitionEntry[pn].Gpt.PartitionType = PARTITION_MICROSOFT_DATA;
IGNORE_RETVAL(CoCreateGuid(&DriveLayoutEx.PartitionEntry[pn].Gpt.PartitionId));
wcsncpy(DriveLayoutEx.PartitionEntry[pn].Gpt.Name, main_part_name, ARRAYSIZE(DriveLayoutEx.PartitionEntry[pn].Gpt.Name));
}
SelectedDrive.PartitionOffset[pn] = DriveLayoutEx.PartitionEntry[pn].StartingOffset.QuadPart;
SelectedDrive.PartitionSize[pn] = DriveLayoutEx.PartitionEntry[pn].PartitionLength.QuadPart;
partition_offset[PI_MAIN] = SelectedDrive.PartitionOffset[pn];
pn++;
// Set the optional extra partition
if (extra_partitions) {
// Should end on a track boundary
DriveLayoutEx.PartitionEntry[pn].StartingOffset.QuadPart = DriveLayoutEx.PartitionEntry[pn-1].StartingOffset.QuadPart +
DriveLayoutEx.PartitionEntry[pn-1].PartitionLength.QuadPart;
DriveLayoutEx.PartitionEntry[pn].PartitionLength.QuadPart = (extra_partitions & XP_UEFI_NTFS) ? uefi_ntfs_size :
extra_part_size_in_tracks * bytes_per_track;
uprintf("● Creating %S Partition (offset: %lld, size: %s)", extra_part_name, DriveLayoutEx.PartitionEntry[pn].StartingOffset.QuadPart,
SizeToHumanReadable(DriveLayoutEx.PartitionEntry[pn].PartitionLength.QuadPart, TRUE, FALSE));
SelectedDrive.PartitionOffset[pn] = DriveLayoutEx.PartitionEntry[pn].StartingOffset.QuadPart;
SelectedDrive.PartitionSize[pn] = DriveLayoutEx.PartitionEntry[pn].PartitionLength.QuadPart;
if (extra_partitions & XP_CASPER)
partition_offset[PI_CASPER] = SelectedDrive.PartitionOffset[pn];
else if (extra_partitions & XP_ESP)
partition_offset[PI_ESP] = SelectedDrive.PartitionOffset[pn];
if (partition_style == PARTITION_STYLE_GPT) {
if (extra_partitions & XP_ESP)
DriveLayoutEx.PartitionEntry[pn].Gpt.PartitionType = PARTITION_GENERIC_ESP;
else if (extra_partitions & XP_CASPER)
DriveLayoutEx.PartitionEntry[pn].Gpt.PartitionType = PARTITION_LINUX_DATA;
else
DriveLayoutEx.PartitionEntry[pn].Gpt.PartitionType = PARTITION_MICROSOFT_DATA;
if (extra_partitions & XP_UEFI_NTFS) {
// Build the DriveLayoutEx table
for (i = 0; i < pi; i++) {
uprintf("● Creating %S%s (offset: %lld, size: %s)", SelectedDrive.Partition[i].Name,
(wcsstr(SelectedDrive.Partition[i].Name, L"Partition") == NULL) ? " Partition" : "",
SelectedDrive.Partition[i].Offset,
SizeToHumanReadable(SelectedDrive.Partition[i].Size, TRUE, FALSE));
// Zero the first sectors of the partition to avoid file system caching issues
if (!ClearPartition(hDrive, SelectedDrive.Partition[i].Offset,
(DWORD)MIN(size_to_clear, SelectedDrive.Partition[i].Size)))
uprintf("Could not zero %S: %s", SelectedDrive.Partition[i].Name, WindowsErrorString());
DriveLayoutEx.PartitionEntry[i].PartitionStyle = partition_style;
DriveLayoutEx.PartitionEntry[i].StartingOffset.QuadPart = SelectedDrive.Partition[i].Offset;
DriveLayoutEx.PartitionEntry[i].PartitionLength.QuadPart = SelectedDrive.Partition[i].Size;
DriveLayoutEx.PartitionEntry[i].PartitionNumber = i + 1;
DriveLayoutEx.PartitionEntry[i].RewritePartition = TRUE;
if (partition_style == PARTITION_STYLE_MBR) {
if (i == mi) {
DriveLayoutEx.PartitionEntry[i].Mbr.BootIndicator = (boot_type != BT_NON_BOOTABLE);
switch (file_system) {
case FS_FAT16:
DriveLayoutEx.PartitionEntry[i].Mbr.PartitionType = 0x0e; // FAT16 LBA
break;
case FS_NTFS:
case FS_EXFAT:
case FS_UDF:
case FS_REFS:
DriveLayoutEx.PartitionEntry[i].Mbr.PartitionType = 0x07;
break;
case FS_EXT2:
case FS_EXT3:
case FS_EXT4:
DriveLayoutEx.PartitionEntry[i].Mbr.PartitionType = 0x83;
break;
case FS_FAT32:
DriveLayoutEx.PartitionEntry[i].Mbr.PartitionType = 0x0c; // FAT32 LBA
break;
default:
uprintf("Unsupported file system");
return FALSE;
}
}
// May override the the type of main partition if write_as_esp is active
if ((wcscmp(SelectedDrive.Partition[i].Name, L"EFI System Partition") == 0) ||
(wcscmp(SelectedDrive.Partition[i].Name, L"UEFI:NTFS") == 0))
DriveLayoutEx.PartitionEntry[i].Mbr.PartitionType = 0xef;
else if (wcscmp(SelectedDrive.Partition[i].Name, L"Linux Persistence") == 0)
DriveLayoutEx.PartitionEntry[i].Mbr.PartitionType = 0x83;
else if (wcscmp(SelectedDrive.Partition[i].Name, L"BIOS Compatibility") == 0)
DriveLayoutEx.PartitionEntry[i].Mbr.PartitionType = RUFUS_EXTRA_PARTITION_TYPE;
} else {
assert(partition_style == PARTITION_STYLE_GPT);
if (wcscmp(SelectedDrive.Partition[i].Name, L"UEFI:NTFS") == 0) {
DriveLayoutEx.PartitionEntry[i].Gpt.PartitionType = PARTITION_GENERIC_ESP;
// Prevent a drive letter from being assigned to the UEFI:NTFS partition
DriveLayoutEx.PartitionEntry[pn].Gpt.Attributes = GPT_BASIC_DATA_ATTRIBUTE_NO_DRIVE_LETTER;
DriveLayoutEx.PartitionEntry[i].Gpt.Attributes = GPT_BASIC_DATA_ATTRIBUTE_NO_DRIVE_LETTER;
#if !defined(_DEBUG)
// Also make the partition read-only for release versions
DriveLayoutEx.PartitionEntry[pn].Gpt.Attributes += GPT_BASIC_DATA_ATTRIBUTE_READ_ONLY;
DriveLayoutEx.PartitionEntry[i].Gpt.Attributes += GPT_BASIC_DATA_ATTRIBUTE_READ_ONLY;
#endif
}
IGNORE_RETVAL(CoCreateGuid(&DriveLayoutEx.PartitionEntry[pn].Gpt.PartitionId));
wcsncpy(DriveLayoutEx.PartitionEntry[pn].Gpt.Name, (extra_partitions & XP_ESP) ? L"EFI System Partition" : extra_part_name,
ARRAYSIZE(DriveLayoutEx.PartitionEntry[pn].Gpt.Name));
} else {
if (extra_partitions & (XP_UEFI_NTFS | XP_ESP)) {
DriveLayoutEx.PartitionEntry[pn].Mbr.PartitionType = 0xef;
} else if (extra_partitions & XP_CASPER) {
DriveLayoutEx.PartitionEntry[pn].Mbr.PartitionType = 0x83;
} else if (extra_partitions & XP_COMPAT) {
DriveLayoutEx.PartitionEntry[pn].Mbr.PartitionType = RUFUS_EXTRA_PARTITION_TYPE;
// Set the one track compatibility partition to be all hidden sectors
DriveLayoutEx.PartitionEntry[pn].Mbr.HiddenSectors = SelectedDrive.SectorsPerTrack;
} else {
assert(FALSE);
}
} else if (wcscmp(SelectedDrive.Partition[i].Name, L"EFI System Partition") == 0)
DriveLayoutEx.PartitionEntry[i].Gpt.PartitionType = PARTITION_GENERIC_ESP;
else if (wcscmp(SelectedDrive.Partition[i].Name, L"Linux Persistence") == 0)
DriveLayoutEx.PartitionEntry[i].Gpt.PartitionType = PARTITION_LINUX_DATA;
else if (wcscmp(SelectedDrive.Partition[i].Name, L"Microsoft Reserved Partition") == 0)
DriveLayoutEx.PartitionEntry[i].Gpt.PartitionType = PARTITION_MICROSOFT_RESERVED;
else
DriveLayoutEx.PartitionEntry[i].Gpt.PartitionType = PARTITION_MICROSOFT_DATA;
IGNORE_RETVAL(CoCreateGuid(&DriveLayoutEx.PartitionEntry[i].Gpt.PartitionId));
wcscpy(DriveLayoutEx.PartitionEntry[i].Gpt.Name, SelectedDrive.Partition[i].Name);
}
// We need to write the UEFI:NTFS partition before we refresh the disk
if (extra_partitions & XP_UEFI_NTFS) {
uprintf("Writing %S data...", extra_part_name);
if (!SetFilePointerEx(hDrive, DriveLayoutEx.PartitionEntry[pn].StartingOffset, NULL, FILE_BEGIN)) {
uprintf("Could not set position");
return FALSE;
}
buffer = GetResource(hMainInstance, MAKEINTRESOURCEA(IDR_UEFI_NTFS), _RT_RCDATA, "uefi-ntfs.img", &bufsize, FALSE);
if (buffer == NULL) {
uprintf("Could not access source image");
return FALSE;
}
if(!WriteFileWithRetry(hDrive, buffer, bufsize, &size, WRITE_RETRIES)) {
uprintf("Write error: %s", WindowsErrorString());
return FALSE;
}
}
pn++;
}
// Initialize the remaining partition data
for (i = 0; i < pn; i++) {
DriveLayoutEx.PartitionEntry[i].PartitionNumber = i + 1;
DriveLayoutEx.PartitionEntry[i].PartitionStyle = partition_style;
DriveLayoutEx.PartitionEntry[i].RewritePartition = TRUE;
// We need to write the UEFI:NTFS partition before we refresh the disk
if (extra_partitions & XP_UEFI_NTFS) {
LARGE_INTEGER li;
uprintf("Writing UEFI:NTFS data...", SelectedDrive.Partition[partition_index[PI_UEFI_NTFS]].Name);
li.QuadPart = SelectedDrive.Partition[partition_index[PI_UEFI_NTFS]].Offset;
if (!SetFilePointerEx(hDrive, li, NULL, FILE_BEGIN)) {
uprintf(" Could not set position");
return FALSE;
}
buffer = GetResource(hMainInstance, MAKEINTRESOURCEA(IDR_UEFI_NTFS), _RT_RCDATA,
"uefi-ntfs.img", &bufsize, FALSE);
if (buffer == NULL) {
uprintf(" Could not access source image");
return FALSE;
}
if(!WriteFileWithRetry(hDrive, buffer, bufsize, NULL, WRITE_RETRIES)) {
uprintf(" Write error: %s", WindowsErrorString());
return FALSE;
}
}
switch (partition_style) {
@ -2539,7 +2495,7 @@ BOOL CreatePartition(HANDLE hDrive, int partition_style, int file_system, BOOL m
// This helps us reselect the partition scheme option that was used when creating the
// drive in Rufus. As far as I can tell, Windows doesn't care much if this signature
// isn't unique for USB drives.
CreateDisk.Mbr.Signature = mbr_uefi_marker?MBR_UEFI_MARKER:(DWORD)GetTickCount64();
CreateDisk.Mbr.Signature = mbr_uefi_marker ? MBR_UEFI_MARKER : (DWORD)GetTickCount64();
DriveLayoutEx.PartitionStyle = PARTITION_STYLE_MBR;
DriveLayoutEx.PartitionCount = 4; // Must be multiple of 4 for MBR
@ -2558,10 +2514,10 @@ BOOL CreatePartition(HANDLE hDrive, int partition_style, int file_system, BOOL m
CreateDisk.Gpt.MaxPartitionCount = MAX_PARTITIONS;
DriveLayoutEx.PartitionStyle = PARTITION_STYLE_GPT;
DriveLayoutEx.PartitionCount = pn;
DriveLayoutEx.PartitionCount = pi;
// At the very least, a GPT disk has 34 reserved sectors at the beginning and 33 at the end.
DriveLayoutEx.Type.Gpt.StartingUsableOffset.QuadPart = 34 * SelectedDrive.SectorSize;
DriveLayoutEx.Type.Gpt.UsableLength.QuadPart = SelectedDrive.DiskSize - (34+33) * SelectedDrive.SectorSize;
DriveLayoutEx.Type.Gpt.UsableLength.QuadPart = SelectedDrive.DiskSize - (34 + 33) * SelectedDrive.SectorSize;
DriveLayoutEx.Type.Gpt.MaxPartitionCount = MAX_PARTITIONS;
DriveLayoutEx.Type.Gpt.DiskId = CreateDisk.Gpt.DiskId;
break;
@ -2569,8 +2525,7 @@ BOOL CreatePartition(HANDLE hDrive, int partition_style, int file_system, BOOL m
// If you don't call IOCTL_DISK_CREATE_DISK, the IOCTL_DISK_SET_DRIVE_LAYOUT_EX call will fail
size = sizeof(CreateDisk);
r = DeviceIoControl(hDrive, IOCTL_DISK_CREATE_DISK, (BYTE*)&CreateDisk, size, NULL, 0, &size, NULL);
if (!r) {
if (!DeviceIoControl(hDrive, IOCTL_DISK_CREATE_DISK, (BYTE*)&CreateDisk, size, NULL, 0, NULL, NULL)) {
uprintf("Could not reset disk: %s", WindowsErrorString());
return FALSE;
}
@ -2578,9 +2533,11 @@ BOOL CreatePartition(HANDLE hDrive, int partition_style, int file_system, BOOL m
// "The goggles, they do nothing!"
RefreshDriveLayout(hDrive);
size = sizeof(DriveLayoutEx) - ((partition_style == PARTITION_STYLE_GPT)?((4-pn)*sizeof(PARTITION_INFORMATION_EX)):0);
r = DeviceIoControl(hDrive, IOCTL_DISK_SET_DRIVE_LAYOUT_EX, (BYTE*)&DriveLayoutEx, size, NULL, 0, &size, NULL);
if (!r) {
size = sizeof(DriveLayoutEx) - ((partition_style == PARTITION_STYLE_GPT) ?
((MAX_PARTITIONS - pi) * sizeof(PARTITION_INFORMATION_EX)) : 0);
// The DRIVE_LAYOUT_INFORMATION_EX used by Microsoft, with its 1-sized array, is designed to overrun...
// coverity[overrun-buffer-arg]
if (!DeviceIoControl(hDrive, IOCTL_DISK_SET_DRIVE_LAYOUT_EX, (BYTE*)&DriveLayoutEx, size, NULL, 0, NULL, NULL)) {
uprintf("Could not set drive layout: %s", WindowsErrorString());
return FALSE;
}
@ -2594,10 +2551,9 @@ BOOL CreatePartition(HANDLE hDrive, int partition_style, int file_system, BOOL m
BOOL RefreshDriveLayout(HANDLE hDrive)
{
BOOL r;
DWORD size;
// Diskpart does call the following IOCTL this after updating the partition table, so we do too
r = DeviceIoControl(hDrive, IOCTL_DISK_UPDATE_PROPERTIES, NULL, 0, NULL, 0, &size, NULL );
r = DeviceIoControl(hDrive, IOCTL_DISK_UPDATE_PROPERTIES, NULL, 0, NULL, 0, NULL, NULL);
if (!r)
uprintf("Could not refresh drive layout: %s", WindowsErrorString());
return r;
@ -2607,20 +2563,17 @@ BOOL RefreshDriveLayout(HANDLE hDrive)
BOOL InitializeDisk(HANDLE hDrive)
{
BOOL r;
DWORD size;
CREATE_DISK CreateDisk = {PARTITION_STYLE_RAW, {{0}}};
uprintf("Initializing disk...");
size = sizeof(CreateDisk);
r = DeviceIoControl(hDrive, IOCTL_DISK_CREATE_DISK,
(BYTE*)&CreateDisk, size, NULL, 0, &size, NULL );
r = DeviceIoControl(hDrive, IOCTL_DISK_CREATE_DISK, (BYTE*)&CreateDisk, sizeof(CreateDisk), NULL, 0, NULL, NULL);
if (!r) {
uprintf("Could not delete drive layout: %s", WindowsErrorString());
return FALSE;
}
r = DeviceIoControl(hDrive, IOCTL_DISK_UPDATE_PROPERTIES, NULL, 0, NULL, 0, &size, NULL );
r = DeviceIoControl(hDrive, IOCTL_DISK_UPDATE_PROPERTIES, NULL, 0, NULL, 0, NULL, NULL);
if (!r) {
uprintf("Could not refresh drive layout: %s", WindowsErrorString());
return FALSE;
@ -2663,8 +2616,7 @@ BOOL IsMsDevDrive(DWORD DriveIndex)
if (hPhysical == INVALID_HANDLE_VALUE)
goto out;
r = DeviceIoControl(hPhysical, IOCTL_DISK_GET_DRIVE_LAYOUT_EX,
NULL, 0, layout, sizeof(layout), &size, NULL);
r = DeviceIoControl(hPhysical, IOCTL_DISK_GET_DRIVE_LAYOUT_EX, NULL, 0, layout, sizeof(layout), &size, NULL);
if (!r || size <= 0)
goto out;

View File

@ -36,12 +36,13 @@
#define XP_ESP 0x02
#define XP_UEFI_NTFS 0x04
#define XP_COMPAT 0x08
#define XP_CASPER 0x10
#define XP_PERSISTENCE 0x10
#define PI_MAIN 0
#define PI_ESP 1
#define PI_CASPER 2
#define PI_MAX 3
#define PI_UEFI_NTFS 3
#define PI_MAX 4
// The following should match VDS_FSOF_FLAGS as much as possible
#define FP_FORCE 0x00000001
@ -57,7 +58,7 @@
#define VDS_RESCAN_REFRESH 0x00000001
#define VDS_RESCAN_REENUMERATE 0x00000002
#define VDS_SET_ERROR(hr) do { if (hr != S_OK) { SetLastError((DWORD)hr); FormatStatus = ERROR_SEVERITY_ERROR|FAC(FACILITY_STORAGE)|ERROR_GEN_FAILURE; } } while(0)
#define VDS_SET_ERROR(hr) do { if (hr != S_OK) { SetLastError((DWORD)hr); ErrorStatus = RUFUS_ERROR(ERROR_GEN_FAILURE); } } while(0)
#if !defined(__MINGW32__)
typedef enum _FSINFOCLASS {
@ -347,8 +348,7 @@ typedef struct _DRIVE_LAYOUT_INFORMATION_EX4 {
} DRIVE_LAYOUT_INFORMATION_EX4, *PDRIVE_LAYOUT_INFORMATION_EX4;
static __inline BOOL UnlockDrive(HANDLE hDrive) {
DWORD size;
return DeviceIoControl(hDrive, FSCTL_UNLOCK_VOLUME, NULL, 0, NULL, 0, &size, NULL);
return DeviceIoControl(hDrive, FSCTL_UNLOCK_VOLUME, NULL, 0, NULL, 0, NULL, NULL);
}
#define safe_unlockclose(h) do {if ((h != INVALID_HANDLE_VALUE) && (h != NULL)) {UnlockDrive(h); CloseHandle(h); h = INVALID_HANDLE_VALUE;}} while(0)
@ -362,8 +362,11 @@ typedef struct {
MEDIA_TYPE MediaType;
int PartitionStyle;
int nPartitions; // number of partitions we actually care about
uint64_t PartitionOffset[MAX_PARTITIONS];
uint64_t PartitionSize[MAX_PARTITIONS];
struct {
wchar_t Name[36];
uint64_t Offset;
uint64_t Size;
} Partition[MAX_PARTITIONS];
int FSType;
char proposed_label[16];
BOOL has_protective_mbr;
@ -374,7 +377,7 @@ typedef struct {
} ClusterSize[FS_MAX];
} RUFUS_DRIVE_INFO;
extern RUFUS_DRIVE_INFO SelectedDrive;
extern uint64_t partition_offset[PI_MAX];
extern int partition_index[PI_MAX];
BOOL SetAutoMount(BOOL enable);
BOOL GetAutoMount(BOOL* enabled);

View File

@ -5,7 +5,7 @@
*
* Copyright (C) 1993, 1994, 1995 Theodore Ts'o.
* Copyright (C) 1998 Andrey Shedel <andreys@ns.cr.cyco.com>
* Copyright (C) 2018-2019 Pete Batard <pete@akeo.ie>
* Copyright (C) 2018-2024 Pete Batard <pete@akeo.ie>
*
* %Begin-Header%
* This file may be redistributed under the terms of the GNU Library
@ -180,7 +180,7 @@ static __inline unsigned _MapNtStatus(IN NTSTATUS Status)
// Return the last Windows Error
DWORD ext2_last_winerror(DWORD default_error)
{
return ERROR_SEVERITY_ERROR | FAC(FACILITY_STORAGE) | (LastWinError ? LastWinError : default_error);
return RUFUS_ERROR(LastWinError ? LastWinError : default_error);
}
//

View File

@ -65,16 +65,18 @@
* Globals
*/
const char* FileSystemLabel[FS_MAX] = { "FAT", "FAT32", "NTFS", "UDF", "exFAT", "ReFS", "ext2", "ext3", "ext4" };
DWORD FormatStatus = 0, LastWriteError = 0;
DWORD ErrorStatus = 0, LastWriteError = 0;
badblocks_report report = { 0 };
static float format_percent = 0.0f;
static int task_number = 0, actual_fs_type;
static unsigned int sec_buf_pos = 0;
extern const int nb_steps[FS_MAX];
extern const char* md5sum_name[2];
extern uint32_t dur_mins, dur_secs;
extern uint32_t wim_nb_files, wim_proc_files, wim_extra_files;
extern BOOL force_large_fat32, enable_ntfs_compression, lock_drive, zero_drive, fast_zeroing, enable_file_indexing;
extern BOOL write_as_image, use_vds, write_as_esp, is_vds_available, has_ffu_support;
extern BOOL write_as_image, use_vds, write_as_esp, is_vds_available, has_ffu_support, use_rufus_mbr;
extern char* archive_path;
uint8_t *grub2_buf = NULL, *sec_buf = NULL;
long grub2_len;
@ -112,7 +114,7 @@ out:
static BOOLEAN __stdcall FormatExCallback(FILE_SYSTEM_CALLBACK_COMMAND Command, DWORD Action, PVOID pData)
{
char percent_str[8];
if (IS_ERROR(FormatStatus))
if (IS_ERROR(ErrorStatus))
return FALSE;
assert((actual_fs_type >= 0) && (actual_fs_type < FS_MAX));
@ -139,38 +141,38 @@ static BOOLEAN __stdcall FormatExCallback(FILE_SYSTEM_CALLBACK_COMMAND Command,
UpdateProgress(OP_CREATE_FS, 100.0f);
if(*(BOOLEAN*)pData == FALSE) {
uprintf("Error while formatting");
FormatStatus = ERROR_SEVERITY_ERROR|FAC(FACILITY_STORAGE)|ERROR_GEN_FAILURE;
ErrorStatus = RUFUS_ERROR(ERROR_GEN_FAILURE);
}
break;
case FCC_DONE_WITH_STRUCTURE:
break;
case FCC_INCOMPATIBLE_FILE_SYSTEM:
uprintf("Incompatible File System");
FormatStatus = ERROR_SEVERITY_ERROR|FAC(FACILITY_STORAGE)|APPERR(ERROR_INCOMPATIBLE_FS);
ErrorStatus = RUFUS_ERROR(APPERR(ERROR_INCOMPATIBLE_FS));
break;
case FCC_ACCESS_DENIED:
uprintf("Access denied");
FormatStatus = ERROR_SEVERITY_ERROR|FAC(FACILITY_STORAGE)|ERROR_ACCESS_DENIED;
ErrorStatus = RUFUS_ERROR(ERROR_ACCESS_DENIED);
break;
case FCC_MEDIA_WRITE_PROTECTED:
uprintf("Media is write protected");
FormatStatus = ERROR_SEVERITY_ERROR|FAC(FACILITY_STORAGE)|ERROR_WRITE_PROTECT;
ErrorStatus = RUFUS_ERROR(ERROR_WRITE_PROTECT);
break;
case FCC_VOLUME_IN_USE:
uprintf("Volume is in use");
FormatStatus = ERROR_SEVERITY_ERROR|FAC(FACILITY_STORAGE)|ERROR_DEVICE_IN_USE;
ErrorStatus = RUFUS_ERROR(ERROR_DEVICE_IN_USE);
break;
case FCC_DEVICE_NOT_READY:
uprintf("The device is not ready");
FormatStatus = ERROR_SEVERITY_ERROR|FAC(FACILITY_STORAGE)|ERROR_NOT_READY;
ErrorStatus = RUFUS_ERROR(ERROR_NOT_READY);
break;
case FCC_CANT_QUICK_FORMAT:
uprintf("Cannot quick format this volume");
FormatStatus = ERROR_SEVERITY_ERROR|FAC(FACILITY_STORAGE)|APPERR(ERROR_CANT_QUICK_FORMAT);
ErrorStatus = RUFUS_ERROR(APPERR(ERROR_CANT_QUICK_FORMAT));
break;
case FCC_BAD_LABEL:
uprintf("Bad label");
FormatStatus = ERROR_SEVERITY_ERROR|FAC(FACILITY_STORAGE)|ERROR_LABEL_TOO_LONG;
ErrorStatus = RUFUS_ERROR(ERROR_LABEL_TOO_LONG);
break;
case FCC_OUTPUT:
OutputUTF8Message(((PTEXTOUTPUT)pData)->Output);
@ -178,27 +180,27 @@ static BOOLEAN __stdcall FormatExCallback(FILE_SYSTEM_CALLBACK_COMMAND Command,
case FCC_CLUSTER_SIZE_TOO_BIG:
case FCC_CLUSTER_SIZE_TOO_SMALL:
uprintf("Unsupported cluster size");
FormatStatus = ERROR_SEVERITY_ERROR|FAC(FACILITY_STORAGE)|APPERR(ERROR_INVALID_CLUSTER_SIZE);
ErrorStatus = RUFUS_ERROR(APPERR(ERROR_INVALID_CLUSTER_SIZE));
break;
case FCC_VOLUME_TOO_BIG:
case FCC_VOLUME_TOO_SMALL:
uprintf("Volume is too %s", (Command == FCC_VOLUME_TOO_BIG)?"big":"small");
FormatStatus = ERROR_SEVERITY_ERROR|FAC(FACILITY_STORAGE)|APPERR(ERROR_INVALID_VOLUME_SIZE);
uprintf("Volume is too %s", (Command == FCC_VOLUME_TOO_BIG) ? "big" : "small");
ErrorStatus = RUFUS_ERROR(APPERR(ERROR_INVALID_VOLUME_SIZE));
break;
case FCC_NO_MEDIA_IN_DRIVE:
uprintf("No media in drive");
FormatStatus = ERROR_SEVERITY_ERROR|FAC(FACILITY_STORAGE)|ERROR_NO_MEDIA_IN_DRIVE;
ErrorStatus = RUFUS_ERROR(ERROR_NO_MEDIA_IN_DRIVE);
break;
case FCC_ALIGNMENT_VIOLATION:
uprintf("Partition start offset is not aligned to the cluster size");
FormatStatus = ERROR_SEVERITY_ERROR|FAC(FACILITY_STORAGE)|ERROR_OFFSET_ALIGNMENT_VIOLATION;
ErrorStatus = RUFUS_ERROR(ERROR_OFFSET_ALIGNMENT_VIOLATION);
break;
default:
uprintf("FormatExCallback: Received unhandled command 0x%02X - aborting", Command);
FormatStatus = ERROR_SEVERITY_ERROR|FAC(FACILITY_STORAGE)|ERROR_NOT_SUPPORTED;
ErrorStatus = RUFUS_ERROR(ERROR_NOT_SUPPORTED);
break;
}
return (!IS_ERROR(FormatStatus));
return (!IS_ERROR(ErrorStatus));
}
/*
@ -207,7 +209,7 @@ static BOOLEAN __stdcall FormatExCallback(FILE_SYSTEM_CALLBACK_COMMAND Command,
static BOOLEAN __stdcall ChkdskCallback(FILE_SYSTEM_CALLBACK_COMMAND Command, DWORD Action, PVOID pData)
{
DWORD* percent;
if (IS_ERROR(FormatStatus))
if (IS_ERROR(ErrorStatus))
return FALSE;
switch (Command) {
@ -357,7 +359,7 @@ static BOOL FormatNativeVds(DWORD DriveIndex, uint64_t PartitionOffset, DWORD Cl
wVolumeName = utf8_to_wchar(VolumeName);
if (wVolumeName == NULL) {
uprintf("Could not read volume name");
FormatStatus = ERROR_SEVERITY_ERROR | FAC(FACILITY_STORAGE) | ERROR_GEN_FAILURE;
ErrorStatus = RUFUS_ERROR(ERROR_GEN_FAILURE);
goto out;
}
@ -528,7 +530,7 @@ static BOOL FormatNativeVds(DWORD DriveIndex, uint64_t PartitionOffset, DWORD Cl
hr = IVdsVolumeMF3_FormatEx2(pVolumeMF3, wFSName, usFsVersion, ClusterSize, wLabel, Flags, &pAsync);
while (SUCCEEDED(hr)) {
if (IS_ERROR(FormatStatus)) {
if (IS_ERROR(ErrorStatus)) {
IVdsAsync_Cancel(pAsync);
break;
}
@ -558,7 +560,7 @@ static BOOL FormatNativeVds(DWORD DriveIndex, uint64_t PartitionOffset, DWORD Cl
IVdsAsync_Release(pAsync);
IVdsVolumeMF3_Release(pVolumeMF3);
if (!IS_ERROR(FormatStatus)) {
if (!IS_ERROR(ErrorStatus)) {
uprintf("Format completed.");
r = TRUE;
}
@ -568,8 +570,8 @@ static BOOL FormatNativeVds(DWORD DriveIndex, uint64_t PartitionOffset, DWORD Cl
}
out:
if ((!bFoundVolume) && (FormatStatus == 0))
FormatStatus = ERROR_SEVERITY_ERROR | FAC(FACILITY_STORAGE) | ERROR_PATH_NOT_FOUND;
if ((!bFoundVolume) && (ErrorStatus == 0))
ErrorStatus = RUFUS_ERROR(ERROR_PATH_NOT_FOUND);
safe_free(VolumeName);
safe_free(wVolumeName);
safe_free(wLabel);
@ -601,7 +603,7 @@ static BOOL FormatNative(DWORD DriveIndex, uint64_t PartitionOffset, DWORD Clust
wVolumeName = utf8_to_wchar(VolumeName);
if (wVolumeName == NULL) {
uprintf("Could not read volume name (%s)", VolumeName);
FormatStatus = ERROR_SEVERITY_ERROR|FAC(FACILITY_STORAGE)|ERROR_GEN_FAILURE;
ErrorStatus = RUFUS_ERROR(ERROR_GEN_FAILURE);
goto out;
}
// Hey, nice consistency here, Microsoft! - FormatEx() fails if wVolumeName has
@ -630,12 +632,12 @@ static BOOL FormatNative(DWORD DriveIndex, uint64_t PartitionOffset, DWORD Clust
for (i = 0; i < WRITE_RETRIES; i++) {
pfFormatEx(wVolumeName, SelectedDrive.MediaType, wFSName, wLabel,
(Flags & FP_QUICK), ClusterSize, FormatExCallback);
if (!IS_ERROR(FormatStatus) || (HRESULT_CODE(FormatStatus) == ERROR_CANCELLED))
if (!IS_ERROR(ErrorStatus) || (HRESULT_CODE(ErrorStatus) == ERROR_CANCELLED))
break;
uprintf("%s - Retrying...", WindowsErrorString());
Sleep(WRITE_TIMEOUT);
}
if (IS_ERROR(FormatStatus))
if (IS_ERROR(ErrorStatus))
goto out;
if (Flags & FP_COMPRESSION) {
@ -647,14 +649,14 @@ static BOOL FormatNative(DWORD DriveIndex, uint64_t PartitionOffset, DWORD Clust
}
}
if (!IS_ERROR(FormatStatus)) {
if (!IS_ERROR(ErrorStatus)) {
uprintf("Format completed.");
r = TRUE;
}
out:
if (!r && !IS_ERROR(FormatStatus))
FormatStatus = ERROR_SEVERITY_ERROR|FAC(FACILITY_STORAGE)|SCODE_CODE(GetLastError());
if (!r && !IS_ERROR(ErrorStatus))
ErrorStatus = RUFUS_ERROR(SCODE_CODE(GetLastError()));
safe_free(VolumeName);
safe_free(wVolumeName);
safe_free(wLabel);
@ -666,7 +668,7 @@ BOOL FormatPartition(DWORD DriveIndex, uint64_t PartitionOffset, DWORD UnitAlloc
{
if ((DriveIndex < 0x80) || (DriveIndex > 0x100) || (FSType >= FS_MAX) ||
((UnitAllocationSize != 0) && (!IS_POWER_OF_2(UnitAllocationSize)))) {
ERROR_SEVERITY_ERROR | FAC(FACILITY_STORAGE) | ERROR_INVALID_PARAMETER;
ErrorStatus = RUFUS_ERROR(ERROR_INVALID_PARAMETER);
return FALSE;
}
actual_fs_type = FSType;
@ -706,8 +708,8 @@ static BOOL CheckDisk(char DriveLetter)
}
pfChkdsk(wDriveRoot, wFSType, FALSE, FALSE, FALSE, FALSE, NULL, NULL, ChkdskCallback);
if (!IS_ERROR(FormatStatus)) {
uprintf("NTFS Fixup completed.\n");
if (!IS_ERROR(ErrorStatus)) {
uprintf("NTFS Fixup completed.");
r = TRUE;
}
@ -740,7 +742,7 @@ static BOOL ClearMBRGPT(HANDLE hPhysicalDrive, LONGLONG DiskSize, DWORD SectorSi
uprintf("Erasing %llu sectors", num_sectors_to_clear);
pZeroBuf = calloc(SectorSize, (size_t)num_sectors_to_clear);
if (pZeroBuf == NULL) {
FormatStatus = ERROR_SEVERITY_ERROR | FAC(FACILITY_STORAGE) | ERROR_NOT_ENOUGH_MEMORY;
ErrorStatus = RUFUS_ERROR(ERROR_NOT_ENOUGH_MEMORY);
goto out;
}
liFilePointer.QuadPart = 0ULL;
@ -769,8 +771,8 @@ out:
static BOOL WriteMBR(HANDLE hPhysicalDrive)
{
BOOL r = FALSE;
DWORD size;
unsigned char* buffer = NULL;
BOOL needs_masquerading = HAS_WINPE(img_report) && (!img_report.uses_minint);
uint8_t* buffer = NULL;
FAKE_FD fake_fd = { 0 };
FILE* fp = (FILE*)&fake_fd;
const char* using_msg = "Using %s MBR";
@ -789,47 +791,46 @@ static BOOL WriteMBR(HANDLE hPhysicalDrive)
// FormatEx rewrites the MBR and removes the LBA attribute of FAT16
// and FAT32 partitions - we need to correct this in the MBR
buffer = (unsigned char*)_mm_malloc(SelectedDrive.SectorSize, 16);
buffer = (uint8_t*)_mm_malloc(SelectedDrive.SectorSize, 16);
if (buffer == NULL) {
uprintf("Could not allocate memory for MBR");
FormatStatus = ERROR_SEVERITY_ERROR|FAC(FACILITY_STORAGE)|ERROR_NOT_ENOUGH_MEMORY;
ErrorStatus = RUFUS_ERROR(ERROR_NOT_ENOUGH_MEMORY);
goto out;
}
if (!read_sectors(hPhysicalDrive, SelectedDrive.SectorSize, 0, 1, buffer)) {
uprintf("Could not read MBR\n");
FormatStatus = ERROR_SEVERITY_ERROR|FAC(FACILITY_STORAGE)|ERROR_READ_FAULT;
uprintf("Could not read MBR");
ErrorStatus = RUFUS_ERROR(ERROR_READ_FAULT);
goto out;
}
switch (ComboBox_GetCurItemData(hFileSystem)) {
case FS_FAT16:
if (buffer[0x1c2] == 0x0e) {
uprintf("Partition is already FAT16 LBA...\n");
uprintf("Partition is already FAT16 LBA...");
} else if ((buffer[0x1c2] != 0x04) && (buffer[0x1c2] != 0x06)) {
uprintf("Warning: converting a non FAT16 partition to FAT16 LBA: FS type=0x%02x\n", buffer[0x1c2]);
uprintf("Warning: converting a non FAT16 partition to FAT16 LBA: FS type=0x%02x", buffer[0x1c2]);
}
buffer[0x1c2] = 0x0e;
break;
case FS_FAT32:
if (buffer[0x1c2] == 0x0c) {
uprintf("Partition is already FAT32 LBA...\n");
uprintf("Partition is already FAT32 LBA...");
} else if (buffer[0x1c2] != 0x0b) {
uprintf("Warning: converting a non FAT32 partition to FAT32 LBA: FS type=0x%02x\n", buffer[0x1c2]);
uprintf("Warning: converting a non FAT32 partition to FAT32 LBA: FS type=0x%02x", buffer[0x1c2]);
}
buffer[0x1c2] = 0x0c;
break;
}
if ((boot_type != BT_NON_BOOTABLE) && (target_type == TT_BIOS)) {
// Set first partition bootable - masquerade as per the DiskID selected
buffer[0x1be] = IsChecked(IDC_RUFUS_MBR) ?
(BYTE)ComboBox_GetCurItemData(hDiskID):0x80;
uprintf("Set bootable USB partition as 0x%02X\n", buffer[0x1be]);
// Set first partition bootable or masquerade as second disk
buffer[0x1be] = needs_masquerading ? 0x81 : 0x80;
uprintf("Set bootable USB partition as 0x%02X", buffer[0x1be]);
}
if (!write_sectors(hPhysicalDrive, SelectedDrive.SectorSize, 0, 1, buffer)) {
uprintf("Could not write MBR\n");
FormatStatus = ERROR_SEVERITY_ERROR|FAC(FACILITY_STORAGE)|ERROR_WRITE_FAULT;
uprintf("Could not write MBR");
ErrorStatus = RUFUS_ERROR(ERROR_WRITE_FAULT);
goto out;
}
@ -886,7 +887,7 @@ static BOOL WriteMBR(HANDLE hPhysicalDrive)
// If everything else failed, fall back to a conventional Windows/Rufus MBR
windows_mbr:
if ((HAS_WINPE(img_report) && !img_report.uses_minint) || (IsChecked(IDC_RUFUS_MBR))) {
if (needs_masquerading || use_rufus_mbr) {
uprintf(using_msg, APPLICATION_NAME);
r = write_rufus_mbr(fp);
} else {
@ -896,8 +897,8 @@ windows_mbr:
notify:
// Tell the system we've updated the disk properties
if (!DeviceIoControl(hPhysicalDrive, IOCTL_DISK_UPDATE_PROPERTIES, NULL, 0, NULL, 0, &size, NULL))
uprintf("Failed to notify system about disk properties update: %s\n", WindowsErrorString());
if (!DeviceIoControl(hPhysicalDrive, IOCTL_DISK_UPDATE_PROPERTIES, NULL, 0, NULL, 0, NULL, NULL))
uprintf("Failed to notify system about disk properties update: %s", WindowsErrorString());
out:
safe_mm_free(buffer);
@ -972,7 +973,7 @@ static BOOL WriteSBR(HANDLE hPhysicalDrive)
}
// Ensure that we have sufficient space for the SBR
max_size = (DWORD)SelectedDrive.PartitionOffset[0];
max_size = (DWORD)SelectedDrive.Partition[0].Offset;
if (br_size + size > max_size) {
uprintf(" SBR size is too large - You may need to uncheck 'Add fixes for old BIOSes'.");
if (sub_type == BT_MAX)
@ -1022,7 +1023,7 @@ BOOL WritePBR(HANDLE hLogicalVolume)
} else if (boot_type == BT_REACTOS) {
if (!write_fat_16_ros_br(fp, 0)) break;
} else if ((boot_type == BT_IMAGE) && HAS_KOLIBRIOS(img_report)) {
uprintf("FAT16 is not supported for KolibriOS\n"); break;
uprintf("FAT16 is not supported for KolibriOS"); break;
} else {
if (!write_fat_16_br(fp, 0)) break;
}
@ -1034,11 +1035,11 @@ BOOL WritePBR(HANDLE hLogicalVolume)
uprintf(using_msg, bt_to_name(), "FAT32");
for (i = 0; i < 2; i++) {
if (!is_fat_32_fs(fp)) {
uprintf("New volume does not have a %s FAT32 boot sector - aborting\n", i?"secondary":"primary");
uprintf("New volume does not have a %s FAT32 boot sector - aborting", i ? "secondary" : "primary");
break;
}
uprintf("Confirmed new volume has a %s FAT32 boot sector\n", i?"secondary":"primary");
uprintf("Setting %s FAT32 boot sector for boot...\n", i?"secondary":"primary");
uprintf("Confirmed new volume has a %s FAT32 boot sector", i ? "secondary" : "primary");
uprintf("Setting %s FAT32 boot sector for boot...", i ? "secondary" : "primary");
if (boot_type == BT_FREEDOS) {
if (!write_fat_32_fd_br(fp, 0)) break;
} else if (boot_type == BT_REACTOS) {
@ -1061,10 +1062,10 @@ BOOL WritePBR(HANDLE hLogicalVolume)
case FS_NTFS:
uprintf(using_msg, bt_to_name(), "NTFS");
if (!is_ntfs_fs(fp)) {
uprintf("New volume does not have an NTFS boot sector - aborting\n");
uprintf("New volume does not have an NTFS boot sector - aborting");
break;
}
uprintf("Confirmed new volume has an NTFS boot sector\n");
uprintf("Confirmed new volume has an NTFS boot sector");
if (!write_ntfs_br(fp)) break;
// Note: NTFS requires a full remount after writing the PBR. We dismount when we lock
// and also go through a forced remount, so that shouldn't be an issue.
@ -1075,10 +1076,10 @@ BOOL WritePBR(HANDLE hLogicalVolume)
case FS_EXT4:
return TRUE;
default:
uprintf("Unsupported FS for FS BR processing - aborting\n");
uprintf("Unsupported FS for FS BR processing - aborting");
break;
}
FormatStatus = ERROR_SEVERITY_ERROR|FAC(FACILITY_STORAGE)|ERROR_WRITE_FAULT;
ErrorStatus = RUFUS_ERROR(ERROR_WRITE_FAULT);
return FALSE;
}
@ -1151,7 +1152,7 @@ static BOOL WriteDrive(HANDLE hPhysicalDrive, BOOL bZeroDrive)
HANDLE hSourceImage = INVALID_HANDLE_VALUE;
DWORD i, read_size[NUM_BUFFERS], write_size, comp_size, buf_size;
uint64_t wb, target_size = bZeroDrive ? SelectedDrive.DiskSize : img_report.image_size;
uint64_t cur_value, last_value = UINT64_MAX;
uint64_t cur_value, last_value = 0;
int64_t bled_ret;
uint8_t* buffer = NULL;
uint32_t zero_data, *cmp_buffer = NULL;
@ -1175,7 +1176,7 @@ static BOOL WriteDrive(HANDLE hPhysicalDrive, BOOL bZeroDrive)
buf_size = ((DD_BUFFER_SIZE + SelectedDrive.SectorSize - 1) / SelectedDrive.SectorSize) * SelectedDrive.SectorSize;
buffer = (uint8_t*)_mm_malloc(buf_size, SelectedDrive.SectorSize);
if (buffer == NULL) {
FormatStatus = ERROR_SEVERITY_ERROR | FAC(FACILITY_STORAGE) | ERROR_NOT_ENOUGH_MEMORY;
ErrorStatus = RUFUS_ERROR(ERROR_NOT_ENOUGH_MEMORY);
uprintf("Could not allocate disk zeroing buffer");
goto out;
}
@ -1187,7 +1188,7 @@ static BOOL WriteDrive(HANDLE hPhysicalDrive, BOOL bZeroDrive)
if (fast_zeroing) {
cmp_buffer = (uint32_t*)_mm_malloc(buf_size, SelectedDrive.SectorSize);
if (cmp_buffer == NULL) {
FormatStatus = ERROR_SEVERITY_ERROR | FAC(FACILITY_STORAGE) | ERROR_NOT_ENOUGH_MEMORY;
ErrorStatus = RUFUS_ERROR(ERROR_NOT_ENOUGH_MEMORY);
uprintf("Could not allocate disk comparison buffer");
goto out;
}
@ -1197,11 +1198,9 @@ static BOOL WriteDrive(HANDLE hPhysicalDrive, BOOL bZeroDrive)
read_size[0] = buf_size;
for (wb = 0, write_size = 0; wb < target_size; wb += write_size) {
UpdateProgressWithInfo(OP_FORMAT, fast_zeroing ? MSG_306 : MSG_286, wb, target_size);
cur_value = (wb * min(80, target_size)) / target_size;
if (cur_value != last_value) {
last_value = cur_value;
cur_value = (wb * 80) / target_size;
for (; cur_value > last_value && last_value < 80; last_value++)
uprintfs("+");
}
// Don't overflow our projected size (mostly for VHDs)
if (wb + read_size[0] > target_size)
read_size[0] = (DWORD)(target_size - wb);
@ -1267,7 +1266,7 @@ static BOOL WriteDrive(HANDLE hPhysicalDrive, BOOL bZeroDrive)
goto out;
}
} else {
FormatStatus = ERROR_SEVERITY_ERROR | FAC(FACILITY_STORAGE) | ERROR_WRITE_FAULT;
ErrorStatus = RUFUS_ERROR(ERROR_WRITE_FAULT);
goto out;
}
Sleep(200);
@ -1275,24 +1274,25 @@ static BOOL WriteDrive(HANDLE hPhysicalDrive, BOOL bZeroDrive)
if (i > WRITE_RETRIES)
goto out;
}
uprintfs("\r\n");
} else if (img_report.compression_type != BLED_COMPRESSION_NONE && img_report.compression_type < BLED_COMPRESSION_MAX) {
uprintf("Writing compressed image:");
hSourceImage = CreateFileU(image_path, GENERIC_READ, FILE_SHARE_READ, NULL,
OPEN_EXISTING, FILE_FLAG_SEQUENTIAL_SCAN, NULL);
if (hSourceImage == INVALID_HANDLE_VALUE) {
uprintf("Could not open image '%s': %s", image_path, WindowsErrorString());
FormatStatus = ERROR_SEVERITY_ERROR | FAC(FACILITY_STORAGE) | ERROR_OPEN_FAILED;
ErrorStatus = RUFUS_ERROR(ERROR_OPEN_FAILED);
goto out;
}
sec_buf = (uint8_t*)_mm_malloc(SelectedDrive.SectorSize, SelectedDrive.SectorSize);
if (sec_buf == NULL) {
FormatStatus = ERROR_SEVERITY_ERROR | FAC(FACILITY_STORAGE) | ERROR_NOT_ENOUGH_MEMORY;
ErrorStatus = RUFUS_ERROR(ERROR_NOT_ENOUGH_MEMORY);
uprintf("Could not allocate disk write buffer");
goto out;
}
assert((uintptr_t)sec_buf % SelectedDrive.SectorSize == 0);
sec_buf_pos = 0;
bled_init(256 * KB, uprintf, NULL, sector_write, update_progress, NULL, &FormatStatus);
bled_init(256 * KB, uprintf, NULL, sector_write, update_progress, NULL, &ErrorStatus);
bled_ret = bled_uncompress_with_handles(hSourceImage, hPhysicalDrive, img_report.compression_type);
bled_exit();
uprintfs("\r\n");
@ -1305,10 +1305,10 @@ static BOOL WriteDrive(HANDLE hPhysicalDrive, BOOL bZeroDrive)
WriteFile(hPhysicalDrive, sec_buf, SelectedDrive.SectorSize, &write_size, NULL);
}
safe_mm_free(sec_buf);
if ((bled_ret < 0) && (SCODE_CODE(FormatStatus) != ERROR_CANCELLED)) {
if ((bled_ret < 0) && (SCODE_CODE(ErrorStatus) != ERROR_CANCELLED)) {
// Unfortunately, different compression backends return different negative error codes
uprintf("Could not write compressed image: %lld", bled_ret);
FormatStatus = ERROR_SEVERITY_ERROR | FAC(FACILITY_STORAGE) | ERROR_WRITE_FAULT;
ErrorStatus = RUFUS_ERROR(ERROR_WRITE_FAULT);
goto out;
}
} else {
@ -1316,8 +1316,9 @@ static BOOL WriteDrive(HANDLE hPhysicalDrive, BOOL bZeroDrive)
// VHD/VHDX require mounting the image first
if (img_report.compression_type == IMG_COMPRESSION_VHD ||
img_report.compression_type == IMG_COMPRESSION_VHDX) {
vhd_path = VhdMountImage(image_path);
if (vhd_path == NULL)
// Since VHDX images are compressed, we need to obtain the actual size
vhd_path = VhdMountImageAndGetSize(image_path, &target_size);
if (vhd_path == NULL || target_size == 0)
goto out;
}
@ -1325,7 +1326,7 @@ static BOOL WriteDrive(HANDLE hPhysicalDrive, BOOL bZeroDrive)
FILE_SHARE_READ, OPEN_EXISTING, FILE_FLAG_SEQUENTIAL_SCAN);
if (hSourceImage == NULL) {
uprintf("Could not open image '%s': %s", image_path, WindowsErrorString());
FormatStatus = ERROR_SEVERITY_ERROR | FAC(FACILITY_STORAGE) | ERROR_OPEN_FAILED;
ErrorStatus = RUFUS_ERROR(ERROR_OPEN_FAILED);
goto out;
}
@ -1333,7 +1334,7 @@ static BOOL WriteDrive(HANDLE hPhysicalDrive, BOOL bZeroDrive)
buf_size = ((DD_BUFFER_SIZE + SelectedDrive.SectorSize - 1) / SelectedDrive.SectorSize) * SelectedDrive.SectorSize;
buffer = (uint8_t*)_mm_malloc(buf_size * NUM_BUFFERS, SelectedDrive.SectorSize);
if (buffer == NULL) {
FormatStatus = ERROR_SEVERITY_ERROR | FAC(FACILITY_STORAGE) | ERROR_NOT_ENOUGH_MEMORY;
ErrorStatus = RUFUS_ERROR(ERROR_NOT_ENOUGH_MEMORY);
uprintf("Could not allocate disk write buffer");
goto out;
}
@ -1346,17 +1347,18 @@ static BOOL WriteDrive(HANDLE hPhysicalDrive, BOOL bZeroDrive)
for (wb = 0; read_size[proc_bufnum] != 0; wb += read_size[proc_bufnum]) {
// 0. Update the progress
UpdateProgressWithInfo(OP_FORMAT, MSG_261, wb, target_size);
cur_value = (wb * min(80, target_size)) / target_size;
if (cur_value != last_value) {
last_value = cur_value;
cur_value = (wb * 80) / target_size;
for ( ; cur_value > last_value && last_value < 80; last_value++)
uprintfs("+");
}
if (wb >= target_size)
break;
// 1. Wait for the current read operation to complete (and update the read size)
if ((!WaitFileAsync(hSourceImage, DRIVE_ACCESS_TIMEOUT)) ||
(!GetSizeAsync(hSourceImage, &read_size[read_bufnum]))) {
uprintf("\r\nRead error: %s", WindowsErrorString());
FormatStatus = ERROR_SEVERITY_ERROR | FAC(FACILITY_STORAGE) | ERROR_READ_FAULT;
ErrorStatus = RUFUS_ERROR(ERROR_READ_FAULT);
goto out;
}
@ -1395,7 +1397,7 @@ static BOOL WriteDrive(HANDLE hPhysicalDrive, BOOL bZeroDrive)
goto out;
}
} else {
FormatStatus = ERROR_SEVERITY_ERROR | FAC(FACILITY_STORAGE) | ERROR_WRITE_FAULT;
ErrorStatus = RUFUS_ERROR(ERROR_WRITE_FAULT);
goto out;
}
Sleep(200);
@ -1456,23 +1458,32 @@ DWORD WINAPI FormatThread(void* param)
large_drive = (SelectedDrive.DiskSize > (1*TB));
if (large_drive)
uprintf("Notice: Large drive detected (may produce short writes)");
// Find out if we need to add any extra partitions
extra_partitions = 0;
if ((boot_type == BT_IMAGE) && !write_as_image && HAS_PERSISTENCE(img_report) && persistence_size)
extra_partitions |= XP_PERSISTENCE;
// According to Microsoft, every GPT disk (we RUN Windows from) must have an MSR due to not having hidden sectors
// https://learn.microsoft.com/en-us/windows-hardware/manufacture/desktop/windows-and-gpt-faq#disks-that-require-an-msr
if ((windows_to_go) && (target_type == TT_UEFI) && (partition_type == PARTITION_STYLE_GPT))
// According to Microsoft, every GPT disk (we RUN Windows from) must have an MSR due to not having hidden sectors
// https://learn.microsoft.com/en-us/windows-hardware/manufacture/desktop/windows-and-gpt-faq#disks-that-require-an-msr
extra_partitions = XP_ESP | XP_MSR;
else if ( ((fs_type == FS_NTFS) || (fs_type == FS_EXFAT)) &&
((boot_type == BT_UEFI_NTFS) || ((boot_type == BT_IMAGE) && IS_EFI_BOOTABLE(img_report) &&
((target_type == TT_UEFI) || (windows_to_go) || (allow_dual_uefi_bios) ||
(img_report.has_4GB_file) || (img_report.needs_ntfs)))) )
extra_partitions = XP_UEFI_NTFS;
else if ((boot_type == BT_IMAGE) && !write_as_image && HAS_PERSISTENCE(img_report) && persistence_size)
extra_partitions = XP_CASPER;
else if (IsChecked(IDC_OLD_BIOS_FIXES))
extra_partitions = XP_COMPAT;
extra_partitions |= XP_ESP | XP_MSR;
// If we have a bootable image with UEFI bootloaders and the target file system is NTFS or exFAT
// or the UEFI:NTFS option is selected, we add the UEFI:NTFS partition...
else if ((((boot_type == BT_IMAGE) && IS_EFI_BOOTABLE(img_report)) && ((fs_type == FS_NTFS) || (fs_type == FS_EXFAT))) ||
(boot_type == BT_UEFI_NTFS)) {
extra_partitions |= XP_UEFI_NTFS;
// ...but only if we're not dealing with a Windows image in installer mode with target
// system set to BIOS and without dual BIOS+UEFI boot enabled.
if ((boot_type == BT_IMAGE) && HAS_BOOTMGR_BIOS(img_report) && (!windows_to_go) &&
(target_type == TT_BIOS) && (!allow_dual_uefi_bios))
extra_partitions &= ~XP_UEFI_NTFS;
}
if (IsChecked(IDC_OLD_BIOS_FIXES))
extra_partitions |= XP_COMPAT;
// On pre 1703 platforms (and even on later ones), anything with ext2/ext3 doesn't sit
// too well with Windows. Same with ESPs. Relaxing our locking rules seems to help...
if ((extra_partitions & (XP_ESP | XP_CASPER)) || IS_EXT(fs_type))
if ((extra_partitions & (XP_ESP | XP_PERSISTENCE)) || IS_EXT(fs_type))
actual_lock_drive = FALSE;
// Windows 11 is a lot more proactive in locking ESPs and MSRs than previous versions
// were, meaning that we also can't lock the drive without incurring errors...
@ -1484,14 +1495,14 @@ DWORD WINAPI FormatThread(void* param)
PrintInfoDebug(0, MSG_225);
hPhysicalDrive = GetPhysicalHandle(DriveIndex, actual_lock_drive, FALSE, !actual_lock_drive);
if (hPhysicalDrive == INVALID_HANDLE_VALUE) {
FormatStatus = ERROR_SEVERITY_ERROR|FAC(FACILITY_STORAGE)|ERROR_OPEN_FAILED;
ErrorStatus = RUFUS_ERROR(ERROR_OPEN_FAILED);
goto out;
}
// At this stage we have both a handle and a lock to the physical drive
if (!GetDriveLetters(DriveIndex, drive_letters)) {
uprintf("Failed to get a drive letter");
FormatStatus = ERROR_SEVERITY_ERROR|FAC(FACILITY_STORAGE)|APPERR(ERROR_CANT_ASSIGN_LETTER);
ErrorStatus = RUFUS_ERROR(APPERR(ERROR_CANT_ASSIGN_LETTER));
goto out;
}
@ -1499,7 +1510,7 @@ DWORD WINAPI FormatThread(void* param)
drive_name[0] = RemoveDriveLetters(DriveIndex, TRUE, FALSE);
if (drive_name[0] == 0) {
uprintf("Unable to find a drive letter to use");
FormatStatus = ERROR_SEVERITY_ERROR | FAC(FACILITY_STORAGE) | APPERR(ERROR_CANT_ASSIGN_LETTER);
ErrorStatus = RUFUS_ERROR(APPERR(ERROR_CANT_ASSIGN_LETTER));
goto out;
}
uprintf("Will use '%c:' as volume mountpoint", toupper(drive_name[0]));
@ -1510,8 +1521,8 @@ DWORD WINAPI FormatThread(void* param)
PrintInfo(0, MSG_239, lmprintf(MSG_307));
if (!is_vds_available || !DeletePartition(DriveIndex, 0, TRUE)) {
uprintf("Warning: Could not delete partition(s): %s", is_vds_available ? WindowsErrorString() : "VDS is not available");
SetLastError(FormatStatus);
FormatStatus = 0;
SetLastError(ErrorStatus);
ErrorStatus = 0;
// If we couldn't delete partitions, Windows give us trouble unless we
// request access to the logical drive. Don't ask me why!
need_logical = TRUE;
@ -1525,7 +1536,7 @@ DWORD WINAPI FormatThread(void* param)
// Now get RW access to the physical drive
hPhysicalDrive = GetPhysicalHandle(DriveIndex, actual_lock_drive, TRUE, !actual_lock_drive);
if (hPhysicalDrive == INVALID_HANDLE_VALUE) {
FormatStatus = ERROR_SEVERITY_ERROR | FAC(FACILITY_STORAGE) | ERROR_OPEN_FAILED;
ErrorStatus = RUFUS_ERROR(ERROR_OPEN_FAILED);
goto out;
}
RefreshDriveLayout(hPhysicalDrive);
@ -1538,7 +1549,7 @@ DWORD WINAPI FormatThread(void* param)
hLogicalVolume = GetLogicalHandle(DriveIndex, 0, TRUE, FALSE, !actual_lock_drive);
if (hLogicalVolume == INVALID_HANDLE_VALUE) {
uprintf("Could not access logical volume");
FormatStatus = ERROR_SEVERITY_ERROR | FAC(FACILITY_STORAGE) | ERROR_OPEN_FAILED;
ErrorStatus = RUFUS_ERROR(ERROR_OPEN_FAILED);
goto out;
// If the call succeeds (and we don't get a NULL logical handle as returned for
// unpartitioned drives), try to unmount the volume.
@ -1567,7 +1578,7 @@ DWORD WINAPI FormatThread(void* param)
if ((!ClearMBRGPT(hPhysicalDrive, SelectedDrive.DiskSize, SelectedDrive.SectorSize, use_large_fat32)) ||
(!InitializeDisk(hPhysicalDrive))) {
uprintf("Could not reset partitions");
FormatStatus = (LastWriteError != 0) ? LastWriteError : (ERROR_SEVERITY_ERROR|FAC(FACILITY_STORAGE)|ERROR_PARTITION_FAILURE);
ErrorStatus = (LastWriteError != 0) ? LastWriteError : RUFUS_ERROR(ERROR_PARTITION_FAILURE);
goto out;
}
}
@ -1582,7 +1593,7 @@ DWORD WINAPI FormatThread(void* param)
static_strcpy(logfile, userdir);
safe_free(userdir);
GetLocalTime(&lt);
safe_sprintf(&logfile[strlen(logfile)], sizeof(logfile)-strlen(logfile)-1,
safe_sprintf(&logfile[strlen(logfile)], sizeof(logfile) - strlen(logfile) - 1,
"\\rufus_%04d%02d%02d_%02d%02d%02d.log",
lt.wYear, lt.wMonth, lt.wDay, lt.wHour, lt.wMinute, lt.wSecond);
log_fd = fopenU(logfile, "w+");
@ -1597,8 +1608,8 @@ DWORD WINAPI FormatThread(void* param)
if (!BadBlocks(hPhysicalDrive, SelectedDrive.DiskSize, (sel >= 2) ? 4 : sel +1, sel, &report, log_fd)) {
uprintf("Bad blocks: Check failed.");
if (!IS_ERROR(FormatStatus))
FormatStatus = ERROR_SEVERITY_ERROR|FAC(FACILITY_STORAGE)|APPERR(ERROR_BADBLOCKS_FAILURE);
if (!IS_ERROR(ErrorStatus))
ErrorStatus = RUFUS_ERROR(APPERR(ERROR_BADBLOCKS_FAILURE));
ClearMBRGPT(hPhysicalDrive, SelectedDrive.DiskSize, SelectedDrive.SectorSize, FALSE);
fclose(log_fd);
DeleteFileU(logfile);
@ -1617,7 +1628,7 @@ DWORD WINAPI FormatThread(void* param)
lt.wYear, lt.wMonth, lt.wDay, lt.wHour, lt.wMinute, lt.wSecond);
fclose(log_fd);
r = MessageBoxExU(hMainDialog, lmprintf(MSG_012, bb_msg, logfile),
lmprintf(MSG_010), MB_ABORTRETRYIGNORE|MB_ICONWARNING|MB_IS_RTL, selected_langid);
lmprintf(MSG_010), MB_ABORTRETRYIGNORE | MB_ICONWARNING | MB_IS_RTL, selected_langid);
} else {
// We didn't get any errors => delete the log file
fclose(log_fd);
@ -1625,7 +1636,7 @@ DWORD WINAPI FormatThread(void* param)
}
} while (r == IDRETRY);
if (r == IDABORT) {
FormatStatus = ERROR_SEVERITY_ERROR|FAC(FACILITY_STORAGE)|ERROR_CANCELLED;
ErrorStatus = RUFUS_ERROR(ERROR_CANCELLED);
goto out;
}
@ -1633,8 +1644,8 @@ DWORD WINAPI FormatThread(void* param)
// before repartitioning. Else, all kind of bad things happen.
if (!ClearMBRGPT(hPhysicalDrive, SelectedDrive.DiskSize, SelectedDrive.SectorSize, use_large_fat32)) {
uprintf("unable to zero MBR/GPT");
if (!IS_ERROR(FormatStatus))
FormatStatus = ERROR_SEVERITY_ERROR|FAC(FACILITY_STORAGE)|ERROR_WRITE_FAULT;
if (!IS_ERROR(ErrorStatus))
ErrorStatus = RUFUS_ERROR(ERROR_WRITE_FAULT);
goto out;
}
}
@ -1652,10 +1663,10 @@ DWORD WINAPI FormatThread(void* param)
safe_free(physical);
uprintf("Running command: '%s", cmd);
cr = RunCommandWithProgress(cmd, sysnative_dir, TRUE, MSG_261);
if (cr != 0 && !IS_ERROR(FormatStatus)) {
if (cr != 0 && !IS_ERROR(ErrorStatus)) {
SetLastError(cr);
uprintf("Failed to apply FFU image: %s", WindowsErrorString());
FormatStatus = ERROR_SEVERITY_ERROR | FAC(FACILITY_WINDOWS) | SCODE_CODE(cr);
ErrorStatus = RUFUS_ERROR(SCODE_CODE(cr));
}
} else {
WriteDrive(hPhysicalDrive, FALSE);
@ -1668,7 +1679,7 @@ DWORD WINAPI FormatThread(void* param)
if (!CreatePartition(hPhysicalDrive, partition_type, fs_type, (partition_type == PARTITION_STYLE_MBR)
&& (target_type == TT_UEFI), extra_partitions)) {
FormatStatus = (LastWriteError != 0) ? LastWriteError : (ERROR_SEVERITY_ERROR|FAC(FACILITY_STORAGE)|ERROR_PARTITION_FAILURE);
ErrorStatus = (LastWriteError != 0) ? LastWriteError : RUFUS_ERROR(ERROR_PARTITION_FAILURE);
goto out;
}
UpdateProgress(OP_PARTITION, -1.0f);
@ -1679,7 +1690,7 @@ DWORD WINAPI FormatThread(void* param)
if (!CloseHandle(hLogicalVolume)) {
hLogicalVolume = INVALID_HANDLE_VALUE;
uprintf("Could not close volume: %s", WindowsErrorString());
FormatStatus = ERROR_SEVERITY_ERROR|FAC(FACILITY_STORAGE)|ERROR_ACCESS_DENIED;
ErrorStatus = RUFUS_ERROR(ERROR_ACCESS_DENIED);
goto out;
}
}
@ -1710,16 +1721,16 @@ DWORD WINAPI FormatThread(void* param)
Sleep(200);
if (write_as_esp || write_as_ext) {
// Can't format ESPs or ext2/ext3 partitions unless we mount them ourselves
volume_name = AltMountVolume(DriveIndex, partition_offset[PI_MAIN], FALSE);
volume_name = AltMountVolume(DriveIndex, SelectedDrive.Partition[partition_index[PI_MAIN]].Offset, FALSE);
if (volume_name == NULL) {
FormatStatus = ERROR_SEVERITY_ERROR | FAC(FACILITY_STORAGE) | APPERR(ERROR_CANT_ASSIGN_LETTER);
ErrorStatus = RUFUS_ERROR(APPERR(ERROR_CANT_ASSIGN_LETTER));
goto out;
}
} else {
if (!WaitForLogical(DriveIndex, partition_offset[PI_MAIN])) {
if (!WaitForLogical(DriveIndex, SelectedDrive.Partition[partition_index[PI_MAIN]].Offset)) {
uprintf("Logical drive was not found - aborting");
if (!IS_ERROR(FormatStatus))
FormatStatus = ERROR_SEVERITY_ERROR | FAC(FACILITY_STORAGE) | ERROR_TIMEOUT;
if (!IS_ERROR(ErrorStatus))
ErrorStatus = RUFUS_ERROR(ERROR_TIMEOUT);
goto out;
}
}
@ -1727,17 +1738,17 @@ DWORD WINAPI FormatThread(void* param)
// Format Casper partition if required. Do it before we format anything with
// a file system that Windows will recognize, to avoid concurrent access.
if (extra_partitions & XP_CASPER) {
if (extra_partitions & XP_PERSISTENCE) {
uint32_t ext_version = ReadSetting32(SETTING_USE_EXT_VERSION);
if ((ext_version < 2) || (ext_version > 4))
ext_version = 3;
uprintf("Using %s-like method to enable persistence", img_report.uses_casper ? "Ubuntu" : "Debian");
if (!FormatPartition(DriveIndex, partition_offset[PI_CASPER], 0, FS_EXT2 + (ext_version - 2),
if (!FormatPartition(DriveIndex, SelectedDrive.Partition[partition_index[PI_CASPER]].Offset, 0, FS_EXT2 + (ext_version - 2),
img_report.uses_casper ? "casper-rw" : "persistence",
(img_report.uses_casper ? 0 : FP_CREATE_PERSISTENCE_CONF) |
(IsChecked(IDC_QUICK_FORMAT) ? FP_QUICK : 0))) {
if (!IS_ERROR(FormatStatus))
FormatStatus = ERROR_SEVERITY_ERROR|FAC(FACILITY_STORAGE)|ERROR_WRITE_FAULT;
if (!IS_ERROR(ErrorStatus))
ErrorStatus = RUFUS_ERROR(ERROR_WRITE_FAULT);
goto out;
}
}
@ -1757,10 +1768,10 @@ DWORD WINAPI FormatThread(void* param)
if (write_as_esp)
Flags |= FP_LARGE_FAT32;
ret = FormatPartition(DriveIndex, partition_offset[PI_MAIN], ClusterSize, fs_type, label, Flags);
ret = FormatPartition(DriveIndex, SelectedDrive.Partition[partition_index[PI_MAIN]].Offset, ClusterSize, fs_type, label, Flags);
if (!ret) {
// Error will be set by FormatPartition() in FormatStatus
uprintf("Format error: %s", StrError(FormatStatus, TRUE));
// Error will be set by FormatPartition() in ErrorStatus
uprintf("Format error: %s", StrError(ErrorStatus, TRUE));
goto out;
}
@ -1768,7 +1779,7 @@ DWORD WINAPI FormatThread(void* param)
// Get RW access back to the physical drive...
hPhysicalDrive = GetPhysicalHandle(DriveIndex, actual_lock_drive, TRUE, !actual_lock_drive);
if (hPhysicalDrive == INVALID_HANDLE_VALUE) {
FormatStatus = ERROR_SEVERITY_ERROR | FAC(FACILITY_STORAGE) | ERROR_OPEN_FAILED;
ErrorStatus = RUFUS_ERROR(ERROR_OPEN_FAILED);
goto out;
}
}
@ -1777,8 +1788,8 @@ DWORD WINAPI FormatThread(void* param)
if ((partition_type == PARTITION_STYLE_MBR) || ((boot_type != BT_NON_BOOTABLE) && (partition_type == PARTITION_STYLE_GPT))) {
PrintInfoDebug(0, MSG_228); // "Writing master boot record..."
if ((!WriteMBR(hPhysicalDrive)) || (!WriteSBR(hPhysicalDrive))) {
if (!IS_ERROR(FormatStatus))
FormatStatus = ERROR_SEVERITY_ERROR|FAC(FACILITY_STORAGE)|ERROR_WRITE_FAULT;
if (!IS_ERROR(ErrorStatus))
ErrorStatus = RUFUS_ERROR(ERROR_WRITE_FAULT);
goto out;
}
UpdateProgress(OP_FIX_MBR, -1.0f);
@ -1790,10 +1801,10 @@ DWORD WINAPI FormatThread(void* param)
// Try to continue
CHECK_FOR_USER_CANCEL;
volume_name = GetLogicalName(DriveIndex, partition_offset[PI_MAIN], TRUE, TRUE);
volume_name = GetLogicalName(DriveIndex, SelectedDrive.Partition[partition_index[PI_MAIN]].Offset, TRUE, TRUE);
if (volume_name == NULL) {
uprintf("Could not get volume name");
FormatStatus = ERROR_SEVERITY_ERROR | FAC(FACILITY_STORAGE) | ERROR_NO_VOLUME_ID;
ErrorStatus = RUFUS_ERROR(ERROR_NO_VOLUME_ID);
goto out;
}
uprintf("Found volume %s", volume_name);
@ -1803,8 +1814,8 @@ DWORD WINAPI FormatThread(void* param)
// we forcibly removed them, so add yet another explicit call to RemoveDriveLetters()
RemoveDriveLetters(DriveIndex, FALSE, TRUE);
if (!MountVolume(drive_name, volume_name)) {
uprintf("Could not remount %s as %c: %s\n", volume_name, toupper(drive_name[0]), WindowsErrorString());
FormatStatus = ERROR_SEVERITY_ERROR | FAC(FACILITY_STORAGE) | APPERR(ERROR_CANT_MOUNT_VOLUME);
uprintf("Could not remount %s as %c: %s", volume_name, toupper(drive_name[0]), WindowsErrorString());
ErrorStatus = RUFUS_ERROR(APPERR(ERROR_CANT_MOUNT_VOLUME));
goto out;
}
CHECK_FOR_USER_CANCEL;
@ -1835,31 +1846,31 @@ DWORD WINAPI FormatThread(void* param)
// For once, no need to do anything - just check our sanity
assert((boot_type == BT_IMAGE) && IS_EFI_BOOTABLE(img_report) && (fs_type <= FS_NTFS));
if ( (boot_type != BT_IMAGE) || !IS_EFI_BOOTABLE(img_report) || (fs_type > FS_NTFS) ) {
FormatStatus = ERROR_SEVERITY_ERROR|FAC(FACILITY_STORAGE)|ERROR_INSTALL_FAILURE;
ErrorStatus = RUFUS_ERROR(ERROR_INSTALL_FAILURE);
goto out;
}
} else if ( (boot_type == BT_SYSLINUX_V4) || (boot_type == BT_SYSLINUX_V6) ||
((boot_type == BT_IMAGE) && (HAS_SYSLINUX(img_report) || HAS_REACTOS(img_report)) &&
(!HAS_WINDOWS(img_report) || !allow_dual_uefi_bios)) ) {
if (!InstallSyslinux(DriveIndex, drive_name[0], fs_type)) {
FormatStatus = ERROR_SEVERITY_ERROR|FAC(FACILITY_STORAGE)|ERROR_INSTALL_FAILURE;
ErrorStatus = RUFUS_ERROR(ERROR_INSTALL_FAILURE);
goto out;
}
} else {
// We still have a lock, which we need to modify the volume boot record
// => no need to reacquire the lock...
hLogicalVolume = GetLogicalHandle(DriveIndex, partition_offset[PI_MAIN], FALSE, TRUE, FALSE);
hLogicalVolume = GetLogicalHandle(DriveIndex, SelectedDrive.Partition[partition_index[PI_MAIN]].Offset, FALSE, TRUE, FALSE);
if ((hLogicalVolume == INVALID_HANDLE_VALUE) || (hLogicalVolume == NULL)) {
uprintf("Could not re-mount volume for partition boot record access");
FormatStatus = ERROR_SEVERITY_ERROR|FAC(FACILITY_STORAGE)|ERROR_OPEN_FAILED;
ErrorStatus = RUFUS_ERROR(ERROR_OPEN_FAILED);
goto out;
}
// NB: if you unmount the logical volume here, XP will report error:
// [0x00000456] The media in the drive may have changed
PrintInfoDebug(0, MSG_229);
if (!WritePBR(hLogicalVolume)) {
if (!IS_ERROR(FormatStatus))
FormatStatus = ERROR_SEVERITY_ERROR|FAC(FACILITY_STORAGE)|ERROR_WRITE_FAULT;
if (!IS_ERROR(ErrorStatus))
ErrorStatus = RUFUS_ERROR(ERROR_WRITE_FAULT);
goto out;
}
// We must close and unlock the volume to write files to it
@ -1883,8 +1894,8 @@ DWORD WINAPI FormatThread(void* param)
UpdateProgress(OP_FILE_COPY, -1.0f);
PrintInfoDebug(0, MSG_230);
if (!ExtractDOS(drive_name)) {
if (!IS_ERROR(FormatStatus))
FormatStatus = ERROR_SEVERITY_ERROR|FAC(FACILITY_STORAGE)|ERROR_CANNOT_COPY;
if (!IS_ERROR(ErrorStatus))
ErrorStatus = RUFUS_ERROR(ERROR_CANNOT_COPY);
goto out;
}
} else if (boot_type == BT_GRUB4DOS) {
@ -1900,26 +1911,26 @@ DWORD WINAPI FormatThread(void* param)
if (windows_to_go) {
PrintInfoDebug(0, MSG_268);
if (!SetupWinToGo(DriveIndex, drive_name, (extra_partitions & XP_ESP))) {
if (!IS_ERROR(FormatStatus))
FormatStatus = ERROR_SEVERITY_ERROR | FAC(FACILITY_STORAGE) | APPERR(ERROR_ISO_EXTRACT);
if (!IS_ERROR(ErrorStatus))
ErrorStatus = RUFUS_ERROR(APPERR(ERROR_ISO_EXTRACT));
goto out;
}
if (unattend_xml_path != NULL) {
if (!ApplyWindowsCustomization(drive_name[0], unattend_xml_flags | UNATTEND_WINDOWS_TO_GO))
FormatStatus = ERROR_SEVERITY_ERROR | FAC(FACILITY_STORAGE) | APPERR(ERROR_CANT_PATCH);
ErrorStatus = RUFUS_ERROR(APPERR(ERROR_CANT_PATCH));
}
} else {
assert(!img_report.is_windows_img);
if (!ExtractISO(image_path, drive_name, FALSE)) {
if (!IS_ERROR(FormatStatus))
FormatStatus = ERROR_SEVERITY_ERROR|FAC(FACILITY_STORAGE)|APPERR(ERROR_ISO_EXTRACT);
if (!IS_ERROR(ErrorStatus))
ErrorStatus = RUFUS_ERROR(APPERR(ERROR_ISO_EXTRACT));
goto out;
}
if (HAS_KOLIBRIOS(img_report)) {
kolibri_dst[0] = drive_name[0];
uprintf("Installing: %s (KolibriOS loader)", kolibri_dst);
if (ExtractISOFile(image_path, "HD_Load/USB_Boot/MTLD_F32", kolibri_dst,
FILE_ATTRIBUTE_HIDDEN|FILE_ATTRIBUTE_SYSTEM) == 0) {
FILE_ATTRIBUTE_HIDDEN | FILE_ATTRIBUTE_SYSTEM) == 0) {
uprintf("Warning: loader installation failed - KolibriOS will not boot!");
}
}
@ -1932,12 +1943,12 @@ DWORD WINAPI FormatThread(void* param)
efi_dst[sizeof(efi_dst) - sizeof("\\bootx64.efi")] = 0;
if (!CreateDirectoryA(efi_dst, 0)) {
uprintf("Could not create directory '%s': %s", efi_dst, WindowsErrorString());
FormatStatus = ERROR_SEVERITY_ERROR|FAC(FACILITY_STORAGE)|APPERR(ERROR_CANT_PATCH);
ErrorStatus = RUFUS_ERROR(APPERR(ERROR_CANT_PATCH));
} else {
efi_dst[sizeof(efi_dst) - sizeof("\\bootx64.efi")] = '\\';
if (!WimExtractFile(img_report.wininst_path[0], 1, "Windows\\Boot\\EFI\\bootmgfw.efi", efi_dst, FALSE)) {
uprintf("Failed to setup Win7 EFI boot");
FormatStatus = ERROR_SEVERITY_ERROR|FAC(FACILITY_STORAGE)|APPERR(ERROR_CANT_PATCH);
ErrorStatus = RUFUS_ERROR(APPERR(ERROR_CANT_PATCH));
}
}
}
@ -1945,16 +1956,19 @@ DWORD WINAPI FormatThread(void* param)
if ( (target_type == TT_BIOS) && HAS_WINPE(img_report) ) {
// Apply WinPE fixup
if (!SetupWinPE(drive_name[0]))
FormatStatus = ERROR_SEVERITY_ERROR|FAC(FACILITY_STORAGE)|APPERR(ERROR_CANT_PATCH);
ErrorStatus = RUFUS_ERROR(APPERR(ERROR_CANT_PATCH));
}
if (unattend_xml_path != NULL) {
if (!ApplyWindowsCustomization(drive_name[0], unattend_xml_flags))
FormatStatus = ERROR_SEVERITY_ERROR | FAC(FACILITY_STORAGE) | APPERR(ERROR_CANT_PATCH);
ErrorStatus = RUFUS_ERROR(APPERR(ERROR_CANT_PATCH));
}
}
}
UpdateProgress(OP_FINALIZE, -1.0f);
PrintInfoDebug(0, MSG_233);
if ((boot_type == BT_IMAGE) && (image_path != NULL) && (img_report.is_iso) && (!windows_to_go))
UpdateMD5Sum(drive_name, md5sum_name[img_report.has_md5sum ? img_report.has_md5sum - 1 : 0]);
if (IsChecked(IDC_EXTENDED_LABEL))
SetAutorun(drive_name);
// Issue another complete remount before we exit, to ensure we're clean
@ -1972,6 +1986,14 @@ DWORD WINAPI FormatThread(void* param)
}
}
// Copy any additonal files from an optional zip archive selected by the user
if (!IS_ERROR(ErrorStatus)) {
UpdateProgress(OP_EXTRACT_ZIP, 0.0f);
drive_name[2] = 0;
if (archive_path != NULL && fs_type < FS_EXT2 && !ExtractZip(archive_path, drive_name) && !IS_ERROR(ErrorStatus))
uprintf("Warning: Could not copy additional files");
}
out:
if ((write_as_esp || write_as_ext) && volume_name != NULL)
AltUnmountVolume(volume_name, TRUE);
@ -1998,8 +2020,8 @@ out:
}
}
}
if (IS_ERROR(FormatStatus)) {
volume_name = GetLogicalName(DriveIndex, partition_offset[PI_MAIN], TRUE, TRUE);
if (IS_ERROR(ErrorStatus)) {
volume_name = GetLogicalName(DriveIndex, SelectedDrive.Partition[partition_index[PI_MAIN]].Offset, TRUE, TRUE);
if (volume_name != NULL) {
if (MountVolume(drive_name, volume_name))
uprintf("Re-mounted volume as %c: after error", toupper(drive_name[0]));

View File

@ -1,7 +1,7 @@
/*
* Rufus: The Reliable USB Formatting Utility
* extfs formatting
* Copyright © 2019-2021 Pete Batard <pete@akeo.ie>
* Copyright © 2019-2024 Pete Batard <pete@akeo.ie>
*
* 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
@ -178,7 +178,7 @@ const char* error_message(errcode_t error_code)
if ((error_code > EXT2_ET_BASE) && error_code < (EXT2_ET_BASE + 1000)) {
static_sprintf(error_string, "Unknown ext2fs error %ld (EXT2_ET_BASE + %ld)", error_code, error_code - EXT2_ET_BASE);
} else {
SetLastError((FormatStatus == 0) ? (ERROR_SEVERITY_ERROR | FAC(FACILITY_STORAGE) | (error_code & 0xFFFF)) : FormatStatus);
SetLastError((ErrorStatus == 0) ? RUFUS_ERROR(error_code & 0xFFFF) : ErrorStatus);
static_sprintf(error_string, "%s", WindowsErrorString());
}
return error_string;
@ -196,7 +196,7 @@ errcode_t ext2fs_print_progress(int64_t cur_value, int64_t max_value)
last_value = cur_value;
uprintfs("+");
}
return IS_ERROR(FormatStatus) ? EXT2_ET_CANCEL_REQUESTED : 0;
return IS_ERROR(ErrorStatus) ? EXT2_ET_CANCEL_REQUESTED : 0;
}
const char* GetExtFsLabel(DWORD DriveIndex, uint64_t PartitionOffset)
@ -223,7 +223,7 @@ const char* GetExtFsLabel(DWORD DriveIndex, uint64_t PartitionOffset)
#define TEST_IMG_PATH "\\??\\C:\\tmp\\disk.img"
#define TEST_IMG_SIZE 4000 // Size in MB
#define SET_EXT2_FORMAT_ERROR(x) if (!IS_ERROR(FormatStatus)) FormatStatus = ext2_last_winerror(x)
#define SET_EXT2_FORMAT_ERROR(x) if (!IS_ERROR(ErrorStatus)) ErrorStatus = ext2_last_winerror(x)
BOOL FormatExtFs(DWORD DriveIndex, uint64_t PartitionOffset, DWORD BlockSize, LPCSTR FSName, LPCSTR Label, DWORD Flags)
{
@ -273,7 +273,7 @@ BOOL FormatExtFs(DWORD DriveIndex, uint64_t PartitionOffset, DWORD BlockSize, LP
volume_name = GetExtPartitionName(DriveIndex, PartitionOffset);
#endif
if ((volume_name == NULL) | (strlen(FSName) != 4) || (strncmp(FSName, "ext", 3) != 0)) {
FormatStatus = ERROR_SEVERITY_ERROR | FAC(FACILITY_STORAGE) | ERROR_INVALID_PARAMETER;
ErrorStatus = RUFUS_ERROR(ERROR_INVALID_PARAMETER);
goto out;
}
if (strchr(volume_name, ' ') != NULL)
@ -491,7 +491,10 @@ BOOL FormatExtFs(DWORD DriveIndex, uint64_t PartitionOffset, DWORD BlockSize, LP
// Finally we can call close() to get the file system gets created
r = ext2fs_close(ext2fs);
if (r != 0) {
if (r == 0) {
// Make sure ext2fs isn't freed twice
ext2fs = NULL;
} else {
SET_EXT2_FORMAT_ERROR(ERROR_WRITE_FAULT);
uprintf("Could not create %s volume: %s", FSName, error_message(r));
goto out;

View File

@ -2,7 +2,7 @@
* Rufus: The Reliable USB Formatting Utility
* Large FAT32 formatting
* Copyright © 2007-2009 Tom Thornhill/Ridgecrop
* Copyright © 2011-2022 Pete Batard <pete@akeo.ie>
* Copyright © 2011-2024 Pete Batard <pete@akeo.ie>
*
* 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
@ -38,9 +38,7 @@
#include "msapi_utf8.h"
#include "localization.h"
#define die(msg, err) do { uprintf(msg); \
FormatStatus = ERROR_SEVERITY_ERROR|FAC(FACILITY_STORAGE)|err; \
goto out; } while(0)
#define die(msg, err) do { uprintf(msg); ErrorStatus = RUFUS_ERROR(err); goto out; } while(0)
extern BOOL write_as_esp;
@ -191,7 +189,7 @@ BOOL FormatLargeFAT32(DWORD DriveIndex, uint64_t PartitionOffset, DWORD ClusterS
ULONGLONG FatNeeded, ClusterCount;
if (safe_strncmp(FSName, "FAT", 3) != 0) {
FormatStatus = ERROR_SEVERITY_ERROR | FAC(FACILITY_STORAGE) | ERROR_INVALID_PARAMETER;
ErrorStatus = RUFUS_ERROR(ERROR_INVALID_PARAMETER);
goto out;
}
PrintInfoDebug(0, MSG_222, "Large FAT32");
@ -202,7 +200,7 @@ BOOL FormatLargeFAT32(DWORD DriveIndex, uint64_t PartitionOffset, DWORD ClusterS
hLogicalVolume = write_as_esp ?
AltGetLogicalHandle(DriveIndex, PartitionOffset, TRUE, TRUE, FALSE) :
GetLogicalHandle(DriveIndex, PartitionOffset, TRUE, TRUE, FALSE);
if (IS_ERROR(FormatStatus))
if (IS_ERROR(ErrorStatus))
goto out;
if ((hLogicalVolume == INVALID_HANDLE_VALUE) || (hLogicalVolume == NULL))
die("Invalid logical volume handle", ERROR_INVALID_HANDLE);
@ -222,7 +220,7 @@ BOOL FormatLargeFAT32(DWORD DriveIndex, uint64_t PartitionOffset, DWORD ClusterS
}
if (dgDrive.BytesPerSector < 512)
dgDrive.BytesPerSector = 512;
if (IS_ERROR(FormatStatus)) goto out;
if (IS_ERROR(ErrorStatus)) goto out;
if (!DeviceIoControl (hLogicalVolume, IOCTL_DISK_GET_PARTITION_INFO, NULL, 0, &piDrive,
sizeof(piDrive), &cbRet, NULL)) {
if (!DeviceIoControl (hLogicalVolume, IOCTL_DISK_GET_PARTITION_INFO_EX, NULL, 0, &xpiDrive,
@ -236,7 +234,7 @@ BOOL FormatLargeFAT32(DWORD DriveIndex, uint64_t PartitionOffset, DWORD ClusterS
piDrive.PartitionLength.QuadPart = xpiDrive.PartitionLength.QuadPart;
piDrive.HiddenSectors = (DWORD)(xpiDrive.StartingOffset.QuadPart / dgDrive.BytesPerSector);
}
if (IS_ERROR(FormatStatus)) goto out;
if (IS_ERROR(ErrorStatus)) goto out;
BytesPerSect = dgDrive.BytesPerSector;

View File

@ -5,7 +5,7 @@
* Copyright © 2004-2019 Tom St Denis
* Copyright © 2004 g10 Code GmbH
* Copyright © 2002-2015 Wei Dai & Igor Pavlov
* Copyright © 2015-2023 Pete Batard <pete@akeo.ie>
* Copyright © 2015-2024 Pete Batard <pete@akeo.ie>
* Copyright © 2022 Jeffrey Walton <noloader@gmail.com>
* Copyright © 2016 Alexander Graf
*
@ -60,6 +60,7 @@
#endif
#include <stdio.h>
#include <assert.h>
#include <stdlib.h>
#include <string.h>
#include <inttypes.h>
@ -97,34 +98,24 @@
#define BUFFER_SIZE (64*KB)
#define WAIT_TIME 5000
/* Blocksize for each algorithm - Must be a power of 2 */
#define MD5_BLOCKSIZE 64
#define SHA1_BLOCKSIZE 64
#define SHA256_BLOCKSIZE 64
#define SHA512_BLOCKSIZE 128
#define MAX_BLOCKSIZE SHA512_BLOCKSIZE
/* Hashsize for each algorithm */
#define MD5_HASHSIZE 16
#define SHA1_HASHSIZE 20
#define SHA256_HASHSIZE 32
#define SHA512_HASHSIZE 64
#define MAX_HASHSIZE SHA512_HASHSIZE
/* Number of buffers we work with */
#define NUM_BUFFERS 3 // 2 + 1 as a mere double buffered async I/O
// would modify the buffer being processed.
/* Globals */
char hash_str[HASH_MAX][150];
uint32_t proc_bufnum, hash_count[HASH_MAX] = { MD5_HASHSIZE, SHA1_HASHSIZE, SHA256_HASHSIZE, SHA512_HASHSIZE };
HANDLE data_ready[HASH_MAX] = { 0 }, thread_ready[HASH_MAX] = { 0 };
DWORD read_size[NUM_BUFFERS];
BOOL enable_extra_hashes = FALSE;
BOOL enable_extra_hashes = FALSE, validate_md5sum = FALSE;
uint8_t ALIGNED(64) buffer[NUM_BUFFERS][BUFFER_SIZE];
extern int default_thread_priority;
uint32_t pe256ssp_size = 0;
uint8_t* pe256ssp = NULL;
uint32_t proc_bufnum, hash_count[HASH_MAX] = { MD5_HASHSIZE, SHA1_HASHSIZE, SHA256_HASHSIZE, SHA512_HASHSIZE };
uint32_t pe256ssp_size = 0;
uint64_t md5sum_totalbytes;
StrArray modified_files = { 0 };
extern int default_thread_priority;
extern const char* efi_bootname[ARCH_MAX];
/*
* Rotate 32 or 64 bit integers by n bytes.
@ -178,16 +169,6 @@ static const uint64_t K512[80] = {
0x4cc5d4becb3e42b6ULL, 0x597f299cfc657e2aULL, 0x5fcb6fab3ad6faecULL, 0x6c44198c4a475817ULL
};
/*
* For convenience, we use a common context for all the hash algorithms,
* which means some elements may be unused...
*/
typedef struct ALIGNED(64) {
uint8_t buf[MAX_BLOCKSIZE];
uint64_t state[8];
uint64_t bytecount;
} HASH_CONTEXT;
static void md5_init(HASH_CONTEXT *ctx)
{
memset(ctx, 0, sizeof(*ctx));
@ -1467,9 +1448,6 @@ static void null_write(HASH_CONTEXT *ctx, const uint8_t *buf, size_t len) { }
static void null_final(HASH_CONTEXT *ctx) { }
#endif
typedef void hash_init_t(HASH_CONTEXT *ctx);
typedef void hash_write_t(HASH_CONTEXT *ctx, const uint8_t *buf, size_t len);
typedef void hash_final_t(HASH_CONTEXT *ctx);
hash_init_t *hash_init[HASH_MAX] = { md5_init, sha1_init , sha256_init, sha512_init };
hash_write_t *hash_write[HASH_MAX] = { md5_write, sha1_write , sha256_write, sha512_write };
hash_final_t *hash_final[HASH_MAX] = { md5_final, sha1_final , sha256_final, sha512_final };
@ -1490,7 +1468,7 @@ BOOL HashFile(const unsigned type, const char* path, uint8_t* hash)
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());
FormatStatus = ERROR_SEVERITY_ERROR | FAC(FACILITY_STORAGE) | ERROR_OPEN_FAILED;
ErrorStatus = RUFUS_ERROR(ERROR_OPEN_FAILED);
goto out;
}
@ -1498,7 +1476,7 @@ BOOL HashFile(const unsigned type, const char* path, uint8_t* hash)
for (rb = 0; ; rb += rs) {
CHECK_FOR_USER_CANCEL;
if (!ReadFile(h, buf, sizeof(buf), &rs, NULL)) {
FormatStatus = ERROR_SEVERITY_ERROR | FAC(FACILITY_STORAGE) | ERROR_READ_FAULT;
ErrorStatus = RUFUS_ERROR(ERROR_READ_FAULT);
uprintf(" Read error: %s", WindowsErrorString());
goto out;
}
@ -2005,7 +1983,7 @@ DWORD WINAPI HashThread(void* param)
fd = CreateFileAsync(image_path, GENERIC_READ, FILE_SHARE_READ, OPEN_EXISTING, FILE_FLAG_SEQUENTIAL_SCAN);
if (fd == NULL) {
uprintf("Could not open file: %s", WindowsErrorString());
FormatStatus = ERROR_SEVERITY_ERROR | FAC(FACILITY_STORAGE) | ERROR_OPEN_FAILED;
ErrorStatus = RUFUS_ERROR(ERROR_OPEN_FAILED);
goto out;
}
@ -2026,7 +2004,7 @@ DWORD WINAPI HashThread(void* param)
if ((!WaitFileAsync(fd, DRIVE_ACCESS_TIMEOUT)) ||
(!GetSizeAsync(fd, &read_size[read_bufnum]))) {
uprintf("Read error: %s", WindowsErrorString());
FormatStatus = ERROR_SEVERITY_ERROR | FAC(FACILITY_STORAGE) | ERROR_READ_FAULT;
ErrorStatus = RUFUS_ERROR(ERROR_READ_FAULT);
goto out;
}
@ -2149,6 +2127,140 @@ void PrintRevokedBootloaderInfo(void)
uprintf("WARNING: Could not parse this system's SkuSiPolicy.p7b for additional revoked UEFI bootloaders");
}
/*
* Updates the MD5SUMS/md5sum.txt file that some distros (Ubuntu, Mint...)
* use to validate the media. Because we may alter some of the validated files
* to add persistence and whatnot, we need to alter the MD5 list as a result.
* The format of the file is expected to always be "<MD5SUM> <FILE_PATH>" on
* individual lines.
* This function is also used to finalize the md5sum.txt we create for use with
* our uefi-md5sum bootloaders.
*/
void UpdateMD5Sum(const char* dest_dir, const char* md5sum_name)
{
BOOL display_header = TRUE;
BYTE* res_data;
DWORD res_size;
HANDLE hFile;
intptr_t pos;
uint32_t i, j, size, md5_size, new_size;
uint8_t sum[MD5_HASHSIZE];
char md5_path[64], path1[64], path2[64], *md5_data = NULL, *new_data = NULL, *str_pos;
char *d, *s, *p;
if (!img_report.has_md5sum && !validate_md5sum)
goto out;
static_sprintf(md5_path, "%s\\%s", dest_dir, md5sum_name);
md5_size = read_file(md5_path, (uint8_t**)&md5_data);
if (md5_size == 0)
goto out;
for (i = 0; i < modified_files.Index; i++) {
for (j = 0; j < (uint32_t)strlen(modified_files.String[i]); j++)
if (modified_files.String[i][j] == '\\')
modified_files.String[i][j] = '/';
str_pos = strstr(md5_data, &modified_files.String[i][2]);
if (str_pos == NULL)
// File is not listed in md5 sums
continue;
if (display_header) {
uprintf("Updating %s:", md5_path);
display_header = FALSE;
}
uprintf("● %s", &modified_files.String[i][2]);
pos = str_pos - md5_data;
HashFile(HASH_MD5, modified_files.String[i], sum);
while ((pos > 0) && (md5_data[pos - 1] != '\n'))
pos--;
assert(IS_HEXASCII(md5_data[pos]));
for (j = 0; j < 16; j++) {
md5_data[pos + 2 * j] = ((sum[j] >> 4) < 10) ? ('0' + (sum[j] >> 4)) : ('a' - 0xa + (sum[j] >> 4));
md5_data[pos + 2 * j + 1] = ((sum[j] & 15) < 10) ? ('0' + (sum[j] & 15)) : ('a' - 0xa + (sum[j] & 15));
}
}
// If we validate md5sum we need to update the original bootloader names and add md5sum_totalbytes
if (validate_md5sum) {
new_size = md5_size;
new_data = malloc(md5_size + 1024);
assert(new_data != NULL);
if (new_data == NULL)
goto out;
// Will be nonzero if we created the file, otherwise zero
if (md5sum_totalbytes != 0) {
snprintf(new_data, md5_size + 1024, "# md5sum_totalbytes = 0x%llx\n", md5sum_totalbytes);
new_size += (uint32_t)strlen(new_data);
d = &new_data[strlen(new_data)];
} else {
d = new_data;
}
s = md5_data;
// Extract the MD5Sum bootloader(s)
for (i = 1; i < ARRAYSIZE(efi_bootname); i++) {
static_sprintf(path1, "%s\\efi\\boot\\%s", dest_dir, efi_bootname[i]);
if (!PathFileExistsA(path1))
continue;
res_data = (BYTE*)GetResource(hMainInstance, MAKEINTRESOURCEA(IDR_MD5_BOOT + i),
_RT_RCDATA, efi_bootname[i], &res_size, FALSE);
static_strcpy(path2, path1);
path2[strlen(path2) - 4] = 0;
static_strcat(path2, "_original.efi");
if (res_data == NULL || !MoveFileU(path1, path2)) {
uprintf("Could not rename: %s → %s", path1, path2);
continue;
}
uprintf("Renamed: %s → %s", path1, path2);
hFile = CreateFileA(path1, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ, NULL,
CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
if ((hFile == NULL) || (hFile == INVALID_HANDLE_VALUE)) {
uprintf("Could not create '%s': %s.", path1, WindowsErrorString());
MoveFileU(path2, path1);
continue;
}
if (!WriteFileWithRetry(hFile, res_data, res_size, NULL, WRITE_RETRIES)) {
uprintf("Could not write '%s': %s.", path1, WindowsErrorString());
safe_closehandle(hFile);
MoveFileU(path2, path1);
continue;
}
safe_closehandle(hFile);
uprintf("Created: %s (%s)", path1, SizeToHumanReadable(res_size, FALSE, FALSE));
}
// Rename the original bootloaders if present in md5sum.txt
for (p = md5_data; (p = StrStrIA(p, " ./efi/boot/boot")) != NULL; ) {
for (i = 1; i < ARRAYSIZE(efi_bootname); i++) {
if (p[12 + strlen(efi_bootname[i])] != 0x0a)
continue;
p[12 + strlen(efi_bootname[i])] = 0;
if (lstrcmpiA(&p[12], efi_bootname[i]) == 0) {
size = (uint32_t)(p - s) + 12 + (uint32_t)strlen(efi_bootname[i]) - 4;
memcpy(d, s, size);
d = &d[size];
strcpy(d, "_original.efi\n");
new_size += 9;
d = &d[14];
s = &p[12 + strlen(efi_bootname[i]) + 1];
}
p[12 + strlen(efi_bootname[i])] = 0x0a;
}
p = &p[12];
}
p = &md5_data[md5_size];
memcpy(d, s, p - s);
free(md5_data);
md5_data = new_data;
md5_size = new_size;
}
write_file(md5_path, md5_data, md5_size);
free(md5_data);
out:
// We no longer need the string array at this stage
StrArrayDestroy(&modified_files);
}
#if defined(_DEBUG) || defined(TEST) || defined(ALPHA)
/* Convert a lowercase hex string to binary. Returned value must be freed */
uint8_t* to_bin(const char* str)

View File

@ -1,7 +1,7 @@
/*
* Rufus: The Reliable USB Formatting Utility
* Extract icon from executable and set autorun.inf
* Copyright © 2012-2021 Pete Batard <pete@akeo.ie>
* Copyright © 2012-2024 Pete Batard <pete@akeo.ie>
*
* 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
@ -95,12 +95,15 @@ BOOL ExtractAppIcon(const char* path, BOOL bSilent)
HRSRC res;
WORD i;
BYTE* res_data;
DWORD res_size, Size, offset;
DWORD res_size, offset;
HANDLE hFile = INVALID_HANDLE_VALUE;
BOOL r = FALSE;
GRPICONDIR* icondir;
icondir = (GRPICONDIR*)GetResource(hMainInstance, MAKEINTRESOURCEA(IDI_ICON), _RT_GROUP_ICON, "icon", &res_size, FALSE);
assert(icondir != NULL && icondir->idCount <= 64);
if (icondir == NULL || icondir->idCount > 64)
goto out;
hFile = CreateFileU(path, GENERIC_READ|GENERIC_WRITE, FILE_SHARE_READ,
NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
@ -110,34 +113,34 @@ BOOL ExtractAppIcon(const char* path, BOOL bSilent)
}
// Write .ico header
if (!WriteFileWithRetry(hFile, icondir, 3*sizeof(WORD), &Size, WRITE_RETRIES)) {
if (!WriteFileWithRetry(hFile, icondir, 3 * sizeof(WORD), NULL, WRITE_RETRIES)) {
uprintf("Could not write icon header: %s.", WindowsErrorString());
goto out;
}
// Write icon data
offset = 3*sizeof(WORD) + icondir->idCount*sizeof(ICONDIRENTRY);
for (i=0; i<icondir->idCount; i++) {
offset = 3 * sizeof(WORD) + icondir->idCount * sizeof(ICONDIRENTRY);
for (i = 0; i < icondir->idCount; i++) {
// Write the common part of ICONDIRENTRY
if (!WriteFileWithRetry(hFile, &icondir->idEntries[i], sizeof(GRPICONDIRENTRY)-sizeof(WORD), &Size, WRITE_RETRIES)) {
if (!WriteFileWithRetry(hFile, &icondir->idEntries[i], sizeof(GRPICONDIRENTRY)-sizeof(WORD), NULL, WRITE_RETRIES)) {
uprintf("Could not write ICONDIRENTRY[%d]: %s.", i, WindowsErrorString());
goto out;
}
res = FindResourceA(hMainInstance, MAKEINTRESOURCEA(icondir->idEntries[i].nID), _RT_ICON);
// Write the DWORD offset
if (!WriteFileWithRetry(hFile, &offset, sizeof(offset), &Size, WRITE_RETRIES)) {
if (!WriteFileWithRetry(hFile, &offset, sizeof(offset), NULL, WRITE_RETRIES)) {
uprintf("Could not write ICONDIRENTRY[%d] offset: %s.", i, WindowsErrorString());
goto out;
}
offset += SizeofResource(NULL, res);
}
for (i=0; i<icondir->idCount; i++) {
for (i = 0; i < icondir->idCount; i++) {
// Write icon data
res = FindResourceA(hMainInstance, MAKEINTRESOURCEA(icondir->idEntries[i].nID), _RT_ICON);
res_handle = LoadResource(NULL, res);
res_data = (BYTE*)LockResource(res_handle);
res_size = SizeofResource(NULL, res);
if (!WriteFileWithRetry(hFile, res_data, res_size, &Size, WRITE_RETRIES)) {
if (!WriteFileWithRetry(hFile, res_data, res_size, NULL, WRITE_RETRIES)) {
uprintf("Could not write icon data #%d: %s.", i, WindowsErrorString());
goto out;
}

481
src/iso.c
View File

@ -52,9 +52,10 @@
#include "localization.h"
#include "bled/bled.h"
// How often should we update the progress bar (in 2K blocks) as updating
// the progress bar for every block will bring extraction to a crawl
#define PROGRESS_THRESHOLD 128
// How often should we update the progress bar, as updating the
// progress bar too frequently will bring extraction to a crawl
_Static_assert(256 * KB >= ISO_BLOCKSIZE, "Can't set PROGRESS_THRESHOLD");
#define PROGRESS_THRESHOLD ((256 * KB) / ISO_BLOCKSIZE)
// Needed for UDF symbolic link testing
#define S_IFLNK 0xA000
@ -81,9 +82,10 @@ typedef struct {
RUFUS_IMG_REPORT img_report;
int64_t iso_blocking_status = -1;
extern BOOL preserve_timestamps, enable_ntfs_compression;
extern char* archive_path;
extern uint64_t md5sum_totalbytes;
extern BOOL preserve_timestamps, enable_ntfs_compression, validate_md5sum;
extern HANDLE format_thread;
extern StrArray modified_files;
BOOL enable_iso = TRUE, enable_joliet = TRUE, enable_rockridge = TRUE, has_ldlinux_c32;
#define ISO_BLOCKING(x) do {x; iso_blocking_status++; } while(0)
static const char* psz_extract_dir;
@ -92,7 +94,7 @@ const char* bootmgr_efi_name = "bootmgr.efi";
static const char* grldr_name = "grldr";
static const char* ldlinux_name = "ldlinux.sys";
static const char* ldlinux_c32 = "ldlinux.c32";
static const char* md5sum_name[] = { "MD5SUMS", "md5sum.txt" };
const char* md5sum_name[2] = { "md5sum.txt", "MD5SUMS" };
static const char* casper_dirname = "/casper";
static const char* proxmox_dirname = "/proxmox";
const char* efi_dirname = "/efi/boot";
@ -122,10 +124,12 @@ static const char* stupid_antivirus = " NOTE: This is usually caused by a poorl
const char* old_c32_name[NB_OLD_C32] = OLD_C32_NAMES;
static const int64_t old_c32_threshold[NB_OLD_C32] = OLD_C32_THRESHOLD;
static uint8_t joliet_level = 0;
static uint64_t total_blocks, extra_blocks, nb_blocks;
static uint32_t md5sum_size = 0;
static uint64_t total_blocks, extra_blocks, nb_blocks, last_nb_blocks;
static BOOL scan_only = FALSE;
static StrArray config_path, isolinux_path, modified_path;
static char symlinked_syslinux[MAX_PATH];
static FILE* fd_md5sum = NULL;
static StrArray config_path, isolinux_path;
static char symlinked_syslinux[MAX_PATH], *md5sum_data = NULL, *md5sum_pos = NULL;
// Ensure filenames do not contain invalid FAT32 or NTFS characters
static __inline char* sanitize_filename(char* filename, BOOL* is_identical)
@ -320,6 +324,11 @@ static BOOL check_iso_props(const char* psz_dirname, int64_t file_length, const
}
}
// Check for "\sources\\$OEM$\\$$\\Panther\\unattend.xml"
if ((safe_stricmp(psz_dirname, "/sources/$OEM$/$$/Panther") == 0) &&
(safe_stricmp(psz_basename, "unattend.xml") == 0))
img_report.has_panther_unattend = TRUE;
// Check for PE (XP) specific files in "/i386", "/amd64" or "/minint"
for (i = 0; i < ARRAYSIZE(pe_dirname); i++)
if (safe_stricmp(psz_dirname, pe_dirname[i]) == 0)
@ -375,9 +384,14 @@ static void fix_config(const char* psz_fullpath, const char* psz_path, const cha
if ((props->is_grub_cfg) && replace_in_token_data(src, "linux",
"maybe-ubiquity", "", TRUE))
uprintf(" Removed 'maybe-ubiquity' kernel option");
} else if (replace_in_token_data(src, "linux", "layerfs-path=minimal.standard.live.squashfs",
"persistent layerfs-path=minimal.standard.live.squashfs", TRUE) != NULL) {
// Ubuntu 23.04 uses GRUB only with the above and does not use "maybe-ubiquity"
} else if (replace_in_token_data(src, "linux", "/casper/vmlinuz",
"/casper/vmlinuz persistent", TRUE) != NULL) {
// Ubuntu 23.04 and 24.04 use GRUB only with the above and don't use "maybe-ubiquity"
uprintf(" Added 'persistent' kernel option");
modified = TRUE;
} else if (replace_in_token_data(src, props->is_grub_cfg ? "linux" : "append",
"boot=casper", "boot=casper persistent", TRUE) != NULL) {
// Linux Mint uses boot=casper.
uprintf(" Added 'persistent' kernel option");
modified = TRUE;
} else if (replace_in_token_data(src, props->is_grub_cfg ? "linux" : "append",
@ -419,7 +433,7 @@ static void fix_config(const char* psz_fullpath, const char* psz_path, const cha
}
}
if (patched)
uprintf(" Patched %s: '%s' ➔ '%s'\n", src, iso_label, usb_label);
uprintf(" Patched %s: '%s' ➔ '%s'", src, iso_label, usb_label);
// Since version 8.2, and https://github.com/rhinstaller/anaconda/commit/a7661019546ec1d8b0935f9cb0f151015f2e1d95,
// Red Hat derivatives have changed their CD-ROM detection policy which leads to the installation source
// not being found. So we need to use 'inst.repo' instead of 'inst.stage2' in the kernel options.
@ -436,7 +450,7 @@ static void fix_config(const char* psz_fullpath, const char* psz_path, const cha
}
}
if (patched)
uprintf(" Patched %s: '%s' ➔ '%s'\n", src, "inst.stage2", "inst.repo");
uprintf(" Patched %s: '%s' ➔ '%s'", src, "inst.stage2", "inst.repo");
}
}
safe_free(iso_label);
@ -449,7 +463,7 @@ static void fix_config(const char* psz_fullpath, const char* psz_path, const cha
(!img_report.has_efi_syslinux) && (dst = safe_strdup(src)) ) {
dst[nul_pos-12] = 's'; dst[nul_pos-11] = 'y'; dst[nul_pos-10] = 's';
CopyFileA(src, dst, TRUE);
uprintf("Duplicated %s to %s\n", src, dst);
uprintf("Duplicated %s to %s", src, dst);
free(dst);
}
@ -461,7 +475,7 @@ static void fix_config(const char* psz_fullpath, const char* psz_path, const cha
safe_sprintf(iso_label, MAX_PATH, "cd9660:/dev/iso9660/%s", img_report.label);
safe_sprintf(usb_label, MAX_PATH, "msdosfs:/dev/msdosfs/%s", img_report.usb_label);
if (replace_in_token_data(src, "set", iso_label, usb_label, TRUE) != NULL) {
uprintf(" Patched %s: '%s' ➔ '%s'\n", src, iso_label, usb_label);
uprintf(" Patched %s: '%s' ➔ '%s'", src, iso_label, usb_label);
modified = TRUE;
}
}
@ -470,65 +484,62 @@ static void fix_config(const char* psz_fullpath, const char* psz_path, const cha
}
if (modified)
StrArrayAdd(&modified_path, psz_fullpath, TRUE);
StrArrayAdd(&modified_files, psz_fullpath, TRUE);
free(src);
}
// This updates the MD5SUMS/md5sum.txt file that some distros (Ubuntu, Mint...)
// use to validate the media. Because we may alter some of the validated files
// to add persistence and whatnot, we need to alter the MD5 list as a result.
// The format of the file is expected to always be "<MD5SUM> <FILE_PATH>" on
// individual lines.
static void update_md5sum(void)
// Returns TRUE if a path appears in md5sum.txt
static BOOL is_in_md5sum(char* path)
{
BOOL display_header = TRUE;
intptr_t pos;
uint32_t i, j, size, md5_size;
uint8_t* buf = NULL, sum[16];
char md5_path[64], * md5_data = NULL, * str_pos;
BOOL found = FALSE;
char c[3], *p, *pos = md5sum_pos, *nul_pos;
if (!img_report.has_md5sum)
goto out;
// If we are creating the md5sum file from scratch, every file is in it.
if (fd_md5sum != NULL)
return TRUE;
assert(img_report.has_md5sum <= ARRAYSIZE(md5sum_name));
if (img_report.has_md5sum > ARRAYSIZE(md5sum_name))
goto out;
// If we don't have an existing file at this stage, then no file is in it.
if (md5sum_size == 0 || md5sum_data == NULL)
return FALSE;
static_sprintf(md5_path, "%s\\%s", psz_extract_dir, md5sum_name[img_report.has_md5sum - 1]);
md5_size = read_file(md5_path, (uint8_t**)&md5_data);
if (md5_size == 0)
goto out;
// We should have a "X:/xyz" path
assert(path[1] == ':' && path[2] == '/');
for (i = 0; i < modified_path.Index; i++) {
str_pos = strstr(md5_data, &modified_path.String[i][2]);
if (str_pos == NULL)
// File is not listed in md5 sums
continue;
if (display_header) {
uprintf("Updating %s:", md5_path);
display_header = FALSE;
}
uprintf("● %s", &modified_path.String[i][2]);
pos = str_pos - md5_data;
size = read_file(modified_path.String[i], &buf);
if (size == 0)
continue;
HashBuffer(HASH_MD5, buf, size, sum);
free(buf);
while ((pos > 0) && (md5_data[pos - 1] != '\n'))
pos--;
for (j = 0; j < 16; j++) {
md5_data[pos + 2 * j] = ((sum[j] >> 4) < 10) ? ('0' + (sum[j] >> 4)) : ('a' - 0xa + (sum[j] >> 4));
md5_data[pos + 2 * j + 1] = ((sum[j] & 15) < 10) ? ('0' + (sum[j] & 15)) : ('a' - 0xa + (sum[j] & 15));
// Modify the path to have " ./xyz"
c[0] = path[0];
c[1] = path[1];
path[0] = ' ';
path[1] = '.';
// Search for the string in the remainder of the md5sum.txt
// NB: md5sum_data is always NUL terminated.
p = strstr(pos, path);
// Cater for the case where we matched a partial string and look for the full one
while (p != NULL && p[strlen(path)] != '\n' && p[strlen(path)] != '\r' && p[strlen(path)] != '\0') {
pos = p + strlen(path);
p = strstr(pos, path);
}
found = (p != NULL);
// If not found in remainder and we have a remainder, loop to search from beginning
if (!found && pos != md5sum_data) {
nul_pos = pos;
c[2] = *nul_pos;
*nul_pos = 0;
p = strstr(md5sum_data, path);
while (p != NULL && p[strlen(path)] != '\n' && p[strlen(path)] != '\r' && p[strlen(path)] != '\0') {
pos = p + strlen(path);
p = strstr(pos, path);
}
*nul_pos = c[2];
found = (p != NULL);
}
write_file(md5_path, md5_data, md5_size);
free(md5_data);
out:
StrArrayDestroy(&modified_path);
path[0] = c[0];
path[1] = c[1];
if (found)
md5sum_pos = p + strlen(path);
return found;
}
static void print_extracted_file(char* psz_fullpath, uint64_t file_length)
@ -541,19 +552,16 @@ static void print_extracted_file(char* psz_fullpath, uint64_t file_length)
to_windows_path(psz_fullpath);
nul_pos = strlen(psz_fullpath);
safe_sprintf(&psz_fullpath[nul_pos], 24, " (%s)", SizeToHumanReadable(file_length, TRUE, FALSE));
uprintf("Extracting: %s\n", psz_fullpath);
uprintf("Extracting: %s", psz_fullpath);
safe_sprintf(&psz_fullpath[nul_pos], 24, " (%s)", SizeToHumanReadable(file_length, FALSE, FALSE));
PrintStatus(0, MSG_000, psz_fullpath); // MSG_000 is "%s"
// Remove the appended size for extraction
psz_fullpath[nul_pos] = 0;
// ISO9660 cannot handle backslashes
to_unix_path(psz_fullpath);
}
static void alt_print_extracted_file(const char* psz_fullpath, uint64_t file_length)
{
uprintf("Extracting: %s (%s)", psz_fullpath, SizeToHumanReadable(file_length, FALSE, FALSE));
PrintStatus(0, MSG_000, psz_fullpath);
// Update md5sum_totalbytes as needed
if (is_in_md5sum(psz_fullpath))
md5sum_totalbytes += file_length;
}
// Convert from time_t to FILETIME
@ -587,22 +595,27 @@ static int udf_extract_files(udf_t *p_udf, udf_dirent_t *p_udf_dirent, const cha
HANDLE file_handle = NULL;
DWORD buf_size, wr_size, err;
EXTRACT_PROPS props;
HASH_CONTEXT ctx;
BOOL r, is_identical;
int length;
size_t i;
size_t i, j, nb;
char tmp[128], *psz_fullpath = NULL, *psz_sanpath = NULL;
const char* psz_basename;
udf_dirent_t *p_udf_dirent2;
uint8_t buf[UDF_BLOCKSIZE];
_Static_assert(ISO_BUFFER_SIZE % UDF_BLOCKSIZE == 0,
"ISO_BUFFER_SIZE is not a multiple of UDF_BLOCKSIZE");
uint8_t* buf = malloc(ISO_BUFFER_SIZE);
int64_t read, file_length;
if ((p_udf_dirent == NULL) || (psz_path == NULL))
if ((p_udf_dirent == NULL) || (psz_path == NULL) || (buf == NULL)) {
safe_free(buf);
return 1;
}
if (psz_path[0] == 0)
UpdateProgressWithInfoInit(NULL, TRUE);
while ((p_udf_dirent = udf_readdir(p_udf_dirent)) != NULL) {
if (FormatStatus) goto out;
if (ErrorStatus) goto out;
psz_basename = udf_get_filename(p_udf_dirent);
if (strlen(psz_basename) == 0)
continue;
@ -612,10 +625,9 @@ static int udf_extract_files(udf_t *p_udf, udf_dirent_t *p_udf_dirent, const cha
uprintf("Error allocating file name");
goto out;
}
length = _snprintf(psz_fullpath, length, "%s%s/%s", psz_extract_dir, psz_path, psz_basename);
if (length < 0) {
length = _snprintf_s(psz_fullpath, length, _TRUNCATE, "%s%s/%s", psz_extract_dir, psz_path, psz_basename);
if (length < 0)
goto out;
}
if (S_ISLNK(udf_get_posix_filemode(p_udf_dirent)))
img_report.has_symlinks = SYMLINKS_UDF;
if (udf_is_dir(p_udf_dirent)) {
@ -666,23 +678,37 @@ static int udf_extract_files(udf_t *p_udf, udf_dirent_t *p_udf_dirent, const cha
else
goto out;
} else {
if (fd_md5sum != NULL)
hash_init[HASH_MD5](&ctx);
while (file_length > 0) {
if (FormatStatus) goto out;
memset(buf, 0, UDF_BLOCKSIZE);
read = udf_read_block(p_udf_dirent, buf, 1);
if (ErrorStatus)
goto out;
nb = (size_t)MIN(ISO_BUFFER_SIZE / UDF_BLOCKSIZE, (file_length + UDF_BLOCKSIZE - 1) / UDF_BLOCKSIZE);
read = udf_read_block(p_udf_dirent, buf, nb);
if (read < 0) {
uprintf(" Error reading UDF file %s", &psz_fullpath[strlen(psz_extract_dir)]);
goto out;
}
buf_size = (DWORD)MIN(file_length, read);
if (fd_md5sum != NULL)
hash_write[HASH_MD5](&ctx, buf, buf_size);
ISO_BLOCKING(r = WriteFileWithRetry(file_handle, buf, buf_size, &wr_size, WRITE_RETRIES));
if (!r) {
uprintf(" Error writing file: %s", WindowsErrorString());
if (!r || (wr_size != buf_size)) {
uprintf(" Error writing file: %s", r ? "Short write detected" : WindowsErrorString());
goto out;
}
file_length -= read;
if (nb_blocks++ % PROGRESS_THRESHOLD == 0)
file_length -= wr_size;
nb_blocks += nb;
if (nb_blocks - last_nb_blocks >= PROGRESS_THRESHOLD) {
UpdateProgressWithInfo(OP_FILE_COPY, MSG_231, nb_blocks, total_blocks);
last_nb_blocks = nb_blocks;
}
}
if (fd_md5sum != NULL) {
hash_final[HASH_MD5](&ctx);
for (j = 0; j < MD5_HASHSIZE; j++)
fprintf(fd_md5sum, "%02x", ctx.buf[j]);
fprintf(fd_md5sum, " ./%s\n", &psz_fullpath[3]);
}
}
if ((preserve_timestamps) && (!SetFileTime(file_handle, to_filetime(udf_get_attribute_time(p_udf_dirent)),
@ -701,6 +727,7 @@ static int udf_extract_files(udf_t *p_udf, udf_dirent_t *p_udf_dirent, const cha
}
safe_free(psz_fullpath);
}
safe_free(buf);
return 0;
out:
@ -708,6 +735,7 @@ out:
ISO_BLOCKING(safe_closehandle(file_handle));
safe_free(psz_sanpath);
safe_free(psz_fullpath);
safe_free(buf);
return 1;
}
@ -717,37 +745,42 @@ static int iso_extract_files(iso9660_t* p_iso, const char *psz_path)
HANDLE file_handle = NULL;
DWORD buf_size, wr_size, err;
EXTRACT_PROPS props;
HASH_CONTEXT ctx;
BOOL is_symlink, is_identical, create_file, free_p_statbuf = FALSE;
int length, r = 1;
char psz_fullpath[MAX_PATH], *psz_basename = NULL, *psz_sanpath = NULL;
char tmp[128], target_path[256];
const char *psz_iso_name = &psz_fullpath[strlen(psz_extract_dir)];
unsigned char buf[ISO_BLOCKSIZE];
_Static_assert(ISO_BUFFER_SIZE % ISO_BLOCKSIZE == 0,
"ISO_BUFFER_SIZE is not a multiple of ISO_BLOCKSIZE");
uint8_t* buf = malloc(ISO_BUFFER_SIZE);
CdioListNode_t* p_entnode;
iso9660_stat_t *p_statbuf;
CdioISO9660FileList_t* p_entlist;
size_t i;
CdioISO9660FileList_t* p_entlist = NULL;
size_t i, j, nb;
lsn_t lsn;
int64_t file_length;
if ((p_iso == NULL) || (psz_path == NULL))
if ((p_iso == NULL) || (psz_path == NULL) || (buf == NULL)) {
safe_free(buf);
return 1;
}
length = _snprintf(psz_fullpath, sizeof(psz_fullpath), "%s%s/", psz_extract_dir, psz_path);
length = _snprintf_s(psz_fullpath, sizeof(psz_fullpath), _TRUNCATE, "%s%s/", psz_extract_dir, psz_path);
if (length < 0)
return 1;
goto out;
psz_basename = &psz_fullpath[length];
p_entlist = iso9660_ifs_readdir(p_iso, psz_path);
if (!p_entlist) {
uprintf("Could not access directory %s", psz_path);
return 1;
goto out;
}
if (psz_path[0] == 0)
UpdateProgressWithInfoInit(NULL, TRUE);
_CDIO_LIST_FOREACH(p_entnode, p_entlist) {
if (FormatStatus) goto out;
if (ErrorStatus) goto out;
p_statbuf = (iso9660_stat_t*) _cdio_list_node_data(p_entnode);
free_p_statbuf = FALSE;
if (scan_only && (p_statbuf->rr.b3_rock == yep) && enable_rockridge) {
@ -908,25 +941,41 @@ static int iso_extract_files(iso9660_t* p_iso, const char *psz_path)
uprintf(" Error writing file: %s", WindowsErrorString());
goto out;
}
} else for (i = 0; file_length > 0; i++) {
if (FormatStatus) goto out;
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",
psz_iso_name, (long unsigned int)lsn);
goto out;
} else {
if (fd_md5sum != NULL)
hash_init[HASH_MD5](&ctx);
for (i = 0; file_length > 0; i += nb) {
if (ErrorStatus)
goto out;
lsn = p_statbuf->lsn + (lsn_t)i;
nb = (size_t)MIN(ISO_BUFFER_SIZE / ISO_BLOCKSIZE, (file_length + ISO_BLOCKSIZE - 1) / ISO_BLOCKSIZE);
if (iso9660_iso_seek_read(p_iso, buf, lsn, (long)nb) != (nb * ISO_BLOCKSIZE)) {
uprintf(" Error reading ISO9660 file %s at LSN %lu",
psz_iso_name, (long unsigned int)lsn);
goto out;
}
buf_size = (DWORD)MIN(file_length, ISO_BUFFER_SIZE);
if (fd_md5sum != NULL)
hash_write[HASH_MD5](&ctx, buf, buf_size);
ISO_BLOCKING(r = WriteFileWithRetry(file_handle, buf, buf_size, &wr_size, WRITE_RETRIES));
if (!r || wr_size != buf_size) {
uprintf(" Error writing file: %s", r ? "Short write detected" : WindowsErrorString());
goto out;
}
file_length -= wr_size;
nb_blocks += nb;
if (nb_blocks - last_nb_blocks >= PROGRESS_THRESHOLD) {
UpdateProgressWithInfo(OP_FILE_COPY, MSG_231, nb_blocks, total_blocks +
((fs_type != FS_NTFS) ? extra_blocks : 0));
last_nb_blocks = nb_blocks;
}
}
buf_size = (DWORD)MIN(file_length, ISO_BLOCKSIZE);
ISO_BLOCKING(r = WriteFileWithRetry(file_handle, buf, buf_size, &wr_size, WRITE_RETRIES));
if (!r) {
uprintf(" Error writing file: %s", WindowsErrorString());
goto out;
if (fd_md5sum != NULL) {
hash_final[HASH_MD5](&ctx);
for (j = 0; j < MD5_HASHSIZE; j++)
fprintf(fd_md5sum, "%02x", ctx.buf[j]);
fprintf(fd_md5sum, " ./%s\n", &psz_fullpath[3]);
}
file_length -= ISO_BLOCKSIZE;
if (nb_blocks++ % PROGRESS_THRESHOLD == 0)
UpdateProgressWithInfo(OP_FILE_COPY, MSG_231, nb_blocks, total_blocks +
((fs_type != FS_NTFS) ? extra_blocks : 0));
}
if (preserve_timestamps) {
LPFILETIME ft = to_filetime(mktime(&p_statbuf->tm));
@ -946,8 +995,10 @@ static int iso_extract_files(iso9660_t* p_iso, const char *psz_path)
out:
ISO_BLOCKING(safe_closehandle(file_handle));
iso9660_filelist_free(p_entlist);
if (p_entlist != NULL)
iso9660_filelist_free(p_entlist);
safe_free(psz_sanpath);
safe_free(buf);
return r;
}
@ -1034,20 +1085,19 @@ void GetGrubVersion(char* buf, size_t buf_size)
BOOL ExtractISO(const char* src_iso, const char* dest_dir, BOOL scan)
{
size_t i, j, size, sl_index = 0;
uint16_t sl_version;
FILE* fd;
const char* basedir[] = { "i386", "amd64", "minint" };
const char* tmp_sif = ".\\txtsetup.sif~";
int k, r = 1;
char *tmp, *buf = NULL, *ext, *spacing = " ";
char path[MAX_PATH], path2[16];
uint16_t sl_version;
size_t i, j, size, sl_index = 0;
FILE* fd;
iso9660_t* p_iso = NULL;
iso9660_pvd_t pvd;
udf_t* p_udf = NULL;
udf_dirent_t* p_udf_root;
char *tmp, *buf, *ext;
char path[MAX_PATH], path2[16];
const char* basedir[] = { "i386", "amd64", "minint" };
const char* tmp_sif = ".\\txtsetup.sif~";
iso_extension_mask_t iso_extension_mask = ISO_EXTENSION_ALL;
char* spacing = " ";
if ((!enable_iso) || (src_iso == NULL) || (dest_dir == NULL))
return FALSE;
@ -1069,17 +1119,31 @@ BOOL ExtractISO(const char* src_iso, const char* dest_dir, BOOL scan)
StrArrayCreate(&isolinux_path, 8);
PrintInfo(0, MSG_202);
} else {
uprintf("Extracting files...\n");
uprintf("Extracting files...");
IGNORE_RETVAL(_chdirU(app_data_dir));
if (total_blocks == 0) {
uprintf("Error: ISO has not been properly scanned.\n");
FormatStatus = ERROR_SEVERITY_ERROR|FAC(FACILITY_STORAGE)|APPERR(ERROR_ISO_SCAN);
uprintf("Error: ISO has not been properly scanned.");
ErrorStatus = RUFUS_ERROR(APPERR(ERROR_ISO_SCAN));
goto out;
}
nb_blocks = 0;
last_nb_blocks = 0;
iso_blocking_status = 0;
symlinked_syslinux[0] = 0;
StrArrayCreate(&modified_path, 8);
StrArrayCreate(&modified_files, 8);
if (validate_md5sum) {
md5sum_totalbytes = 0;
// If there isn't an already existing md5sum.txt create one
if (img_report.has_md5sum != 1) {
static_sprintf(path, "%s\\%s", dest_dir, md5sum_name[0]);
fd_md5sum = fopenU(path, "wb");
if (fd_md5sum == NULL)
uprintf("WARNING: Could not create '%s'", md5sum_name[0]);
} else {
md5sum_size = ReadISOFileToBuffer(src_iso, md5sum_name[0], (uint8_t**)&md5sum_data);
md5sum_pos = md5sum_data;
}
}
}
// First try to open as UDF - fallback to ISO if it failed
@ -1183,25 +1247,16 @@ out:
char isolinux_tmp[MAX_PATH];
static_sprintf(isolinux_tmp, "%sisolinux.tmp", temp_dir);
size = (size_t)ExtractISOFile(src_iso, isolinux_path.String[i], isolinux_tmp, FILE_ATTRIBUTE_NORMAL);
if (size == 0) {
if ((size == 0) || (read_file(isolinux_tmp, (uint8_t**)&buf) != size)) {
uprintf(" Could not access %s", isolinux_path.String[i]);
} else {
buf = (char*)calloc(size, 1);
if (buf == NULL) break;
fd = fopen(isolinux_tmp, "rb");
if (fd == NULL) {
free(buf);
continue;
}
fread(buf, 1, size, fd);
fclose(fd);
sl_version = GetSyslinuxVersion(buf, size, &ext);
if (img_report.sl_version == 0) {
static_strcpy(img_report.sl_version_ext, ext);
img_report.sl_version = sl_version;
sl_index = i;
} else if ((img_report.sl_version != sl_version) || (safe_strcmp(img_report.sl_version_ext, ext) != 0)) {
uprintf(" Found conflicting isolinux versions:\n '%s' (%d.%02d%s) vs '%s' (%d.%02d%s)",
uprintf(" Found conflicting isolinux versions:\r\n '%s' (%d.%02d%s) vs '%s' (%d.%02d%s)",
isolinux_path.String[sl_index], SL_MAJOR(img_report.sl_version), SL_MINOR(img_report.sl_version),
img_report.sl_version_ext, isolinux_path.String[i], SL_MAJOR(sl_version), SL_MINOR(sl_version), ext);
// Workaround for Antergos and other ISOs, that have multiple Syslinux versions.
@ -1248,7 +1303,7 @@ out:
if (tmp != NULL) {
for (i = 0; i < strlen(tmp); i++)
tmp[i] = (char)tolower(tmp[i]);
uprintf(" Checking txtsetup.sif:\n OsLoadOptions = %s", tmp);
uprintf(" Checking txtsetup.sif:\r\n OsLoadOptions = %s", tmp);
img_report.uses_minint = (strstr(tmp, "/minint") != NULL);
}
DeleteFileU(tmp_sif);
@ -1265,16 +1320,11 @@ out:
// coverity[swapped_arguments]
if (GetTempFileNameU(temp_dir, APPLICATION_NAME, 0, path) != 0) {
size = (size_t)ExtractISOFile(src_iso, grub_path, path, FILE_ATTRIBUTE_NORMAL);
buf = (char*)calloc(size, 1);
fd = fopen(path, "rb");
if ((size == 0) || (buf == NULL) || (fd == NULL)) {
if ((size == 0) || (read_file(path, (uint8_t**)&buf) != size))
uprintf(" Could not read Grub version from '%s'", grub_path);
} else {
fread(buf, 1, size, fd);
fclose(fd);
else
GetGrubVersion(buf, size);
}
free(buf);
safe_free(buf);
DeleteFileU(path);
}
if (img_report.grub2_version[0] == 0) {
@ -1378,18 +1428,18 @@ out:
uprintf("Could not move %s → %s", path, dst_path, WindowsErrorString());
}
}
update_md5sum();
if (archive_path != NULL) {
uprintf("● Adding files from %s", archive_path);
bled_init(256 * KB, NULL, NULL, NULL, NULL, alt_print_extracted_file, NULL);
bled_uncompress_to_dir(archive_path, dest_dir, BLED_COMPRESSION_ZIP);
bled_exit();
if (fd_md5sum != NULL) {
uprintf("Created: %s\\%s (%s)", dest_dir, md5sum_name[0], SizeToHumanReadable(ftell(fd_md5sum), FALSE, FALSE));
fclose(fd_md5sum);
} else if (md5sum_data != NULL) {
safe_free(md5sum_data);
md5sum_size = 0;
}
}
iso9660_close(p_iso);
udf_close(p_udf);
if ((r != 0) && (FormatStatus == 0))
FormatStatus = ERROR_SEVERITY_ERROR|FAC(FACILITY_STORAGE)|APPERR((scan_only?ERROR_ISO_SCAN:ERROR_ISO_EXTRACT));
if ((r != 0) && (ErrorStatus == 0))
ErrorStatus = RUFUS_ERROR(APPERR(scan_only ? ERROR_ISO_SCAN : ERROR_ISO_EXTRACT));
return (r == 0);
}
@ -1442,8 +1492,8 @@ int64_t ExtractISOFile(const char* iso, const char* iso_file, const char* dest_f
uprintf(" Error writing file %s: %s", dest_file, WindowsErrorString());
goto out;
}
file_length -= read_size;
r += read_size;
file_length -= buf_size;
r += buf_size;
}
goto out;
@ -1475,8 +1525,8 @@ try_iso:
uprintf(" Error writing file %s: %s", dest_file, WindowsErrorString());
goto out;
}
file_length -= ISO_BLOCKSIZE;
r += ISO_BLOCKSIZE;
file_length -= buf_size;
r += buf_size;
}
out:
@ -1491,6 +1541,97 @@ out:
return r;
}
/*
* Extract a file to a buffer. Buffer must be freed by the caller.
*/
uint32_t ReadISOFileToBuffer(const char* iso, const char* iso_file, uint8_t** buf)
{
ssize_t read_size;
int64_t file_length;
uint32_t ret = 0, nblocks;
iso9660_t* p_iso = NULL;
udf_t* p_udf = NULL;
udf_dirent_t *p_udf_root = NULL, *p_udf_file = NULL;
iso9660_stat_t* p_statbuf = NULL;
*buf = NULL;
// First try to open as UDF - fallback to ISO if it failed
p_udf = udf_open(iso);
if (p_udf == NULL)
goto try_iso;
p_udf_root = udf_get_root(p_udf, true, 0);
if (p_udf_root == NULL) {
uprintf("Could not locate UDF root directory");
goto out;
}
p_udf_file = udf_fopen(p_udf_root, iso_file);
if (!p_udf_file) {
uprintf("Could not locate file %s in ISO image", iso_file);
goto out;
}
file_length = udf_get_file_length(p_udf_file);
if (file_length > UINT32_MAX) {
uprintf("Only files smaller than 4 GB are supported");
goto out;
}
nblocks = (uint32_t)((file_length + UDF_BLOCKSIZE - 1) / UDF_BLOCKSIZE);
*buf = malloc(nblocks * UDF_BLOCKSIZE + 1);
if (*buf == NULL) {
uprintf("Could not allocate buffer for file %s", iso_file);
goto out;
}
read_size = udf_read_block(p_udf_file, *buf, nblocks);
if (read_size < 0 || read_size != file_length) {
uprintf("Error reading UDF file %s", iso_file);
goto out;
}
ret = (uint32_t)file_length;
(*buf)[ret] = 0;
goto out;
try_iso:
// Make sure to enable extensions, else we may not match the name of the file we are looking
// for since Rock Ridge may be needed to translate something like 'I386_PC' into 'i386-pc'...
p_iso = iso9660_open_ext(iso, ISO_EXTENSION_MASK);
if (p_iso == NULL) {
uprintf("Unable to open image '%s'", iso);
goto out;
}
p_statbuf = iso9660_ifs_stat_translate(p_iso, iso_file);
if (p_statbuf == NULL) {
uprintf("Could not get ISO-9660 file information for file %s", iso_file);
goto out;
}
file_length = p_statbuf->total_size;
if (file_length > UINT32_MAX) {
uprintf("Only files smaller than 4 GB are supported");
goto out;
}
nblocks = (uint32_t)((file_length + ISO_BLOCKSIZE - 1) / ISO_BLOCKSIZE);
*buf = malloc(nblocks * ISO_BLOCKSIZE + 1);
if (*buf == NULL) {
uprintf("Could not allocate buffer for file %s", iso_file);
goto out;
}
if (iso9660_iso_seek_read(p_iso, *buf, p_statbuf->lsn, nblocks) != nblocks * ISO_BLOCKSIZE) {
uprintf("Error reading ISO file %s", iso_file);
goto out;
}
ret = (uint32_t)file_length;
(*buf)[ret] = 0;
out:
iso9660_stat_free(p_statbuf);
udf_dirent_free(p_udf_root);
udf_dirent_free(p_udf_file);
iso9660_close(p_iso);
udf_close(p_udf);
if (ret == 0)
safe_free(*buf);
return ret;
}
uint32_t GetInstallWimVersion(const char* iso)
{
char *wim_path = NULL, buf[UDF_BLOCKSIZE] = { 0 };
@ -1584,7 +1725,7 @@ int iso9660_readfat(intptr_t pp, void *buf, size_t secsize, libfat_sector_t sec)
if (iso9660_iso_seek_read(p_private->p_iso, p_private->buf,
p_private->lsn + (lsn_t)((p_private->sec_start * secsize) / ISO_BLOCKSIZE), ISO_NB_BLOCKS)
!= ISO_NB_BLOCKS * ISO_BLOCKSIZE) {
uprintf("Error reading ISO-9660 file %s at LSN %lu\n", img_report.efi_img_path,
uprintf("Error reading ISO-9660 file %s at LSN %lu", img_report.efi_img_path,
(long unsigned int)(p_private->lsn + (p_private->sec_start * secsize) / ISO_BLOCKSIZE));
return 0;
}
@ -1618,7 +1759,7 @@ BOOL HasEfiImgBootLoaders(void)
}
p_statbuf = iso9660_ifs_stat_translate(p_iso, img_report.efi_img_path);
if (p_statbuf == NULL) {
uprintf("Could not get ISO-9660 file information for file %s\n", img_report.efi_img_path);
uprintf("Could not get ISO-9660 file information for file %s", img_report.efi_img_path);
goto out;
}
p_private = malloc(sizeof(iso9660_readfat_private));
@ -1629,7 +1770,7 @@ BOOL HasEfiImgBootLoaders(void)
p_private->sec_start = 0;
// Populate our initial buffer
if (iso9660_iso_seek_read(p_private->p_iso, p_private->buf, p_private->lsn, ISO_NB_BLOCKS) != ISO_NB_BLOCKS * ISO_BLOCKSIZE) {
uprintf("Error reading ISO-9660 file %s at LSN %lu\n", img_report.efi_img_path, (long unsigned int)p_private->lsn);
uprintf("Error reading ISO-9660 file %s at LSN %lu", img_report.efi_img_path, (long unsigned int)p_private->lsn);
goto out;
}
lf_fs = libfat_open(iso9660_readfat, (intptr_t)p_private);
@ -1706,7 +1847,7 @@ BOOL DumpFatDir(const char* path, int32_t cluster)
}
p_statbuf = iso9660_ifs_stat_translate(p_iso, img_report.efi_img_path);
if (p_statbuf == NULL) {
uprintf("Could not get ISO-9660 file information for file %s\n", img_report.efi_img_path);
uprintf("Could not get ISO-9660 file information for file %s", img_report.efi_img_path);
goto out;
}
p_private = malloc(sizeof(iso9660_readfat_private));
@ -1717,7 +1858,7 @@ BOOL DumpFatDir(const char* path, int32_t cluster)
p_private->sec_start = 0;
// Populate our initial buffer
if (iso9660_iso_seek_read(p_private->p_iso, p_private->buf, p_private->lsn, ISO_NB_BLOCKS) != ISO_NB_BLOCKS * ISO_BLOCKSIZE) {
uprintf("Error reading ISO-9660 file %s at LSN %lu\n", img_report.efi_img_path, (long unsigned int)p_private->lsn);
uprintf("Error reading ISO-9660 file %s at LSN %lu", img_report.efi_img_path, (long unsigned int)p_private->lsn);
goto out;
}
lf_fs = libfat_open(iso9660_readfat, (intptr_t)p_private);
@ -1742,7 +1883,7 @@ BOOL DumpFatDir(const char* path, int32_t cluster)
if (diritem.attributes & 0x10) {
// Directory => Create directory
if (!CreateDirectoryU(target, 0) && (GetLastError() != ERROR_ALREADY_EXISTS)) {
uprintf("Could not create directory '%s': %s\n", target, WindowsErrorString());
uprintf("Could not create directory '%s': %s", target, WindowsErrorString());
continue;
}
if (!DumpFatDir(target, dirpos.cluster))
@ -1766,8 +1907,8 @@ BOOL DumpFatDir(const char* path, int32_t cluster)
while ((s != 0) && (s < 0xFFFFFFFFULL) && (written < diritem.size)) {
buf = libfat_get_sector(lf_fs, s);
if (buf == NULL)
FormatStatus = ERROR_SEVERITY_ERROR | FAC(FACILITY_STORAGE) | ERROR_SECTOR_NOT_FOUND;
if (IS_ERROR(FormatStatus))
ErrorStatus = RUFUS_ERROR(ERROR_SECTOR_NOT_FOUND);
if (IS_ERROR(ErrorStatus))
goto out;
size = MIN(LIBFAT_SECTOR_SIZE, diritem.size - written);
if (!WriteFileWithRetry(handle, buf, size, &size, WRITE_RETRIES) ||
@ -1826,7 +1967,7 @@ static DWORD WINAPI IsoSaveImageThread(void* param)
hPhysicalDrive = CreateFileA(img_save->DevicePath, GENERIC_READ, FILE_SHARE_READ,
NULL, OPEN_EXISTING, FILE_FLAG_SEQUENTIAL_SCAN, NULL);
if (hPhysicalDrive == INVALID_HANDLE_VALUE) {
FormatStatus = ERROR_SEVERITY_ERROR | FAC(FACILITY_STORAGE) | ERROR_OPEN_FAILED;
ErrorStatus = RUFUS_ERROR(ERROR_OPEN_FAILED);
goto out;
}
@ -1838,13 +1979,13 @@ static DWORD WINAPI IsoSaveImageThread(void* param)
CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
if (hDestImage == INVALID_HANDLE_VALUE) {
uprintf("Could not open image '%s': %s", img_save->ImagePath, WindowsErrorString());
FormatStatus = ERROR_SEVERITY_ERROR | FAC(FACILITY_STORAGE) | ERROR_OPEN_FAILED;
ErrorStatus = RUFUS_ERROR(ERROR_OPEN_FAILED);
goto out;
}
buffer = (uint8_t*)_mm_malloc(img_save->BufSize, 16);
if (buffer == NULL) {
FormatStatus = ERROR_SEVERITY_ERROR | FAC(FACILITY_STORAGE) | ERROR_NOT_ENOUGH_MEMORY;
ErrorStatus = RUFUS_ERROR(ERROR_NOT_ENOUGH_MEMORY);
uprintf("Could not allocate buffer");
goto out;
}
@ -1864,7 +2005,7 @@ static DWORD WINAPI IsoSaveImageThread(void* param)
s = ReadFile(hPhysicalDrive, buffer,
(DWORD)MIN(img_save->BufSize, img_save->DeviceSize - wb), &rSize, NULL);
if (!s) {
FormatStatus = ERROR_SEVERITY_ERROR | FAC(FACILITY_STORAGE) | ERROR_READ_FAULT;
ErrorStatus = RUFUS_ERROR(ERROR_READ_FAULT);
uprintf("Read error: %s", WindowsErrorString());
goto out;
}
@ -1889,7 +2030,7 @@ static DWORD WINAPI IsoSaveImageThread(void* param)
goto out;
}
} else {
FormatStatus = ERROR_SEVERITY_ERROR | FAC(FACILITY_STORAGE) | ERROR_WRITE_FAULT;
ErrorStatus = RUFUS_ERROR(ERROR_WRITE_FAULT);
goto out;
}
Sleep(200);
@ -1900,7 +2041,7 @@ static DWORD WINAPI IsoSaveImageThread(void* param)
if (wb != img_save->DeviceSize) {
uprintf("Error: wrote %s, expected %s", SizeToHumanReadable(wb, FALSE, FALSE),
SizeToHumanReadable(img_save->DeviceSize, FALSE, FALSE));
FormatStatus = ERROR_SEVERITY_ERROR | FAC(FACILITY_STORAGE) | ERROR_WRITE_FAULT;
ErrorStatus = RUFUS_ERROR(ERROR_WRITE_FAULT);
goto out;
}
uprintf("Operation complete (Wrote %s).", SizeToHumanReadable(wb, FALSE, FALSE));
@ -1941,7 +2082,7 @@ void IsoSaveImage(void)
uprintf("ISO media size %s", SizeToHumanReadable(img_save.DeviceSize, FALSE, FALSE));
SendMessage(hMainDialog, UM_PROGRESS_INIT, 0, 0);
FormatStatus = 0;
ErrorStatus = 0;
// Disable all controls except cancel
EnableControls(FALSE, FALSE);
InitProgress(TRUE);
@ -1952,7 +2093,7 @@ void IsoSaveImage(void)
SendMessage(hMainDialog, UM_TIMER_START, 0, 0);
} else {
uprintf("Unable to start ISO save thread");
FormatStatus = ERROR_SEVERITY_ERROR | FAC(FACILITY_STORAGE) | APPERR(ERROR_CANT_START_THREAD);
ErrorStatus = RUFUS_ERROR(APPERR(ERROR_CANT_START_THREAD));
safe_free(img_save.ImagePath);
PostMessage(hMainDialog, UM_FORMAT_COMPLETED, (WPARAM)FALSE, 0);
}

View File

@ -1,5 +1,5 @@
/*
Copyright (C) 2003-2008, 2012-2013, 2017
Copyright (C) 2003-2008, 2012-2013, 2017, 2023-2024
Rocky Bernstein <rocky@gnu.org>
Copyright (C) 2000 Herbert Valerio Riedel <hvr@gnu.org>
@ -27,7 +27,7 @@
* filesystem library; applications include this.
*
* See also the ISO-9660 specification. The freely available European
* equivalant standard is called ECMA-119.
* equivalent standard is called ECMA-119.
*/
@ -78,7 +78,7 @@ typedef char dchar_t; /*! See section 7.4.1 */
program; things are done this way so that in a debugger one can to
refer to the enumeration value names such as in a debugger
expression and get something. With the more common a \#define
mechanism, the name/value assocation is lost at run time.
mechanism, the name/value association is lost at run time.
*/
extern enum iso_enum1_s {
ISO_PVD_SECTOR = 16, /**< Sector of Primary Volume Descriptor. */
@ -93,8 +93,9 @@ extern enum iso_enum1_s {
preparer id. */
MAX_ISOPATHNAME = 255, /**< Maximum number of characters in the
entire ISO 9660 filename. */
ISO_BLOCKSIZE = 2048 /**< Number of bytes in an ISO 9660 block. */
ISO_BLOCKSIZE = 2048, /**< Number of bytes in an ISO 9660 block. */
VIRTUAL_SECTORSIZE = 512 /**< Number of bytes in an El Torito virtual
image sector */
} iso_enums1;
/*! An enumeration for some of the ISO_* \#defines below. This isn't
@ -396,7 +397,7 @@ typedef struct iso9660_pvd_s iso9660_pvd_t;
/*!
\brief ISO-9660 Supplementary Volume Descriptor.
This is used for Joliet Extentions and is almost the same as the
This is used for Joliet Extensions and is almost the same as the
the primary descriptor but two unused fields, "unused1" and "unused3
become "flags and "escape_sequences" respectively.
*/
@ -531,7 +532,7 @@ struct iso9660_br_s {
uint16_t load_seg; /**< Load segment for x86 */
uint8_t system_type; /**< System type - 0 for x86 */
uint8_t unused1;
uint16_t num_sectors; /**< Sector count of the image */
uint16_t num_sectors; /**< Virtual sectors count of the image */
uint32_t image_lsn; /**< Start address of the image */
uint8_t unused2[20];
} GNUC_PACKED;
@ -582,7 +583,7 @@ struct iso9660_stat_s { /* big endian!! */
/* Multi-extent aware size, in bytes.
It is guaranteed that the bytes are stored as gapless string in a
continguous sequence of blocks. I.e. they can be read sequentially
contiguous sequence of blocks. I.e. they can be read sequentially
starting at iso9660_stat_s.lsn.
Data files which do not fulfil this promise cause a warning message
and are not represented by this type of struct.
@ -671,7 +672,7 @@ typedef struct _iso9660_s iso9660_t;
contained in a file format that libiso9660 doesn't know natively
(or knows imperfectly.)
Some tolerence allowed for positioning the ISO 9660 image. We scan
Some tolerance allowed for positioning the ISO 9660 image. We scan
for STANDARD_ID and use that to set the eventual offset to adjust
by (as long as that is <= i_fuzz).
@ -683,7 +684,7 @@ typedef struct _iso9660_s iso9660_t;
uint16_t i_fuzz);
/*!
Open an ISO 9660 image for reading with some tolerence for positioning
Open an ISO 9660 image for reading with some tolerance for positioning
of the ISO9660 image. We scan for ISO_STANDARD_ID and use that to set
the eventual offset to adjust by (as long as that is <= i_fuzz).
@ -799,7 +800,7 @@ typedef struct _iso9660_s iso9660_t;
tm will reported in GMT.
*/
bool iso9660_get_dtime (const iso9660_dtime_t *idr_date, bool b_localtime,
/*out*/ struct tm *tm);
/*out*/ struct tm *p_tm);
/*!
@ -890,7 +891,7 @@ typedef struct _iso9660_s iso9660_t;
/*!
Take psz_path and a version number and turn that into a ISO-9660
pathname. (That's just the pathname followd by ";" and the version
pathname. (That's just the pathname followed by ";" and the version
number. For example, mydir/file.ext -> MYDIR/FILE.EXT;1 for version
1. The resulting ISO-9660 pathname is returned.
*/
@ -1235,7 +1236,7 @@ lsn_t iso9660_get_dir_extent(const iso9660_dir_t *p_idr);
@param p_iso the ISO-9660 file image to get data from
@param u_file_limit the maximimum number of (non-rock-ridge) files
@param u_file_limit the maximum number of (non-rock-ridge) files
to consider before giving up and returning "dunno".
"dunno" can also be returned if there was some error encountered
@ -1311,7 +1312,7 @@ lsn_t iso9660_get_dir_extent(const iso9660_dir_t *p_idr);
void iso9660_set_evd (void *pd);
/*!
Return true if ISO 9660 image has extended attrributes (XA).
Return true if ISO 9660 image has extended attributes (XA).
*/
bool iso9660_ifs_is_xa (const iso9660_t * p_iso);

View File

@ -105,6 +105,12 @@ _cdio_memdup (const void *mem, size_t count);
char *
_cdio_strdup_upper (const char str[]);
int
_cdio_stricmp(const char str1[], const char str2[]);
int
_cdio_strnicmp(const char str1[], const char str2[], size_t count);
/*! Duplicate path and make it platform compliant. Typically needed for
MinGW/MSYS where a "/c/..." path must be translated to "c:/..." for
use with fopen(), etc. Returned string must be freed by the caller

View File

@ -142,6 +142,35 @@ _cdio_strdup_upper (const char str[])
return new_str;
}
int
_cdio_stricmp (const char str1[], const char str2[])
{
if (str1 && str2) {
int c1, c2;
do {
c1 = tolower((unsigned char)*str1++);
c2 = tolower((unsigned char)*str2++);
} while (c1 == c2 && c1 != '\0');
return c1 - c2;
} else return (str1 != str2);
}
int
_cdio_strnicmp(const char str1[], const char str2[], size_t count)
{
if (str1 && str2) {
int c1 = 0, c2 = 0;
size_t i;
for (i = 0; i < count; i++) {
c1 = tolower((unsigned char)*str1++);
c2 = tolower((unsigned char)*str2++);
if (c1 != c2 || c1 == '\0')
break;
}
return c1 - c2;
} else return (str1 != str2);
}
/* Convert MinGW/MSYS paths that start in "/c/..." to "c:/..."
so that they can be used with fopen(), stat(), etc.
Returned string must be freed by the caller using cdio_free().*/

View File

@ -1,6 +1,7 @@
/*
Copyright (C) 2003-2008, 2011-2015, 2017 Rocky Bernstein <rocky@gnu.org>
Copyright (C) 2018, 2020 Pete Batard <pete@akeo.ie>
Copyright (C) 2003-2008, 2011-2015, 2017, 2024
Rocky Bernstein <rocky@gnu.org>
Copyright (C) 2018, 2020, 2024 Pete Batard <pete@akeo.ie>
Copyright (C) 2018 Thomas Schmitt <scdbackup@gmx.net>
Copyright (C) 2001 Herbert Valerio Riedel <hvr@gnu.org>
@ -59,6 +60,7 @@
#include "_cdio_stdio.h"
#include "cdio_private.h"
/* Maximum number of El-Torito boot images we keep an index for */
#define MAX_BOOT_IMAGES 8
/** Implementation of iso9660_t type */
@ -87,7 +89,8 @@ struct _iso9660_s {
*/
struct {
uint32_t lsn; /**< Start LSN of an El-Torito bootable image */
uint32_t num_sectors; /**< Number of sectors of a bootable image */
uint32_t num_sectors; /**< Number of virtual sectors occupied by the
bootable image */
} boot_img[MAX_BOOT_IMAGES];
int i_fuzzy_offset; /**< Adjustment in bytes to make ISO_STANDARD_ID
("CD001") come out as ISO_PVD_SECTOR
@ -527,15 +530,41 @@ iso9660_ifs_read_superblock (iso9660_t *p_iso,
/* Check for an El-Torito boot volume descriptor */
if (ISO_VD_BOOT_RECORD == from_711(p_svd.type) &&
(memcmp(p_brvd->system_id, EL_TORITO_ID, ISO_MAX_SYSTEM_ID) == 0)) {
/* Perform very basic parsing of boot entries to fill an image table */
/* Perform basic parsing of boot entries to fill an image table */
iso9660_br_t br[ISO_BLOCKSIZE / sizeof(iso9660_br_t)];
if (iso9660_iso_seek_read(p_iso, &br, p_brvd->boot_catalog_sector, 1) == ISO_BLOCKSIZE) {
if (iso9660_iso_seek_read(p_iso, &br, p_brvd->boot_catalog_sector, 1) ==
ISO_BLOCKSIZE) {
for (j = 0, k = 0;
j < (ISO_BLOCKSIZE / sizeof(iso9660_br_t)) && k < MAX_BOOT_IMAGES;
j++) {
if (br[j].boot_id == 0x88 && br[j].media_type == 0) {
p_iso->boot_img[k].lsn = br[j].image_lsn;
p_iso->boot_img[k++].num_sectors = br[j].num_sectors;
p_iso->boot_img[k].lsn = uint32_from_le(br[j].image_lsn);
p_iso->boot_img[k++].num_sectors = uint16_from_le(br[j].num_sectors);
}
}
/* Special case for non specs-compliant images that do follow the UEFI */
/* specs and that use size 0 or 1 for images larger than 0xffff virtual */
/* sectors, in which case the image runs to the end of the volume (per */
/* UEFI specs) or to the next LSN (as seen with some software). */
cdio_assert(ISO_BLOCKSIZE / VIRTUAL_SECTORSIZE == 4);
for (j = 0; j < MAX_BOOT_IMAGES; j++) {
uint32_t next_lsn = from_733(p_iso->pvd.volume_space_size);
if (p_iso->boot_img[j].lsn == 0)
continue;
/* Find the closest LSN after the one from this image */
cdio_assert(p_iso->boot_img[j].lsn <= next_lsn);
for (k = 0; k < MAX_BOOT_IMAGES; k++) {
if (p_iso->boot_img[k].lsn > p_iso->boot_img[j].lsn &&
p_iso->boot_img[k].lsn < next_lsn)
next_lsn = p_iso->boot_img[k].lsn;
}
/* If the image has a sector size of 0 or 1 and theres' more than */
/* 0xffff sectors to the next LSN, assume it needs expansion. */
if (p_iso->boot_img[j].num_sectors <= 1 &&
(next_lsn - p_iso->boot_img[j].lsn) >= 0x4000) {
p_iso->boot_img[j].num_sectors =
(next_lsn - p_iso->boot_img[j].lsn) * 4;
cdio_warn("Auto-expanding the size of %d-Boot-NoEmul.img", j);
}
}
}
@ -823,7 +852,7 @@ _iso9660_is_rock_ridge_enabled(void* p_image)
/*!
Convert a directory record name to a 0-terminated string.
One of parameters alloc_result and cpy_result should be non-NULL to take
the result.
the result.
*/
static bool
_iso9660_recname_to_cstring(const char *src, size_t src_len,
@ -836,8 +865,11 @@ _iso9660_recname_to_cstring(const char *src, size_t src_len,
cdio_utf8_t *p_psz_out = NULL;
if (cdio_charset_to_utf8(src, i_inlen, &p_psz_out, "UCS-2BE")) {
if (cpy_result != NULL)
strcpy(cpy_result, p_psz_out);
if (cpy_result != NULL) {
strncpy(cpy_result, p_psz_out, i_inlen);
if (strlen(p_psz_out) > i_inlen)
cdio_warn("file name '%s' will be truncated", p_psz_out);
}
if (alloc_result != NULL)
*alloc_result = p_psz_out;
else
@ -1261,7 +1293,7 @@ _fs_iso_stat_traverse (iso9660_t *p_iso, const iso9660_stat_t *_root,
{
unsigned offset = 0;
uint8_t *_dirbuf = NULL;
uint32_t blocks;
uint32_t blocks;
int ret, cmp;
iso9660_stat_t *p_stat = NULL;
iso9660_dir_t *p_iso9660_dir = NULL;
@ -1466,26 +1498,32 @@ iso9660_fs_stat_translate (CdIo_t *p_cdio, const char psz_path[])
iso9660_stat_t *
iso9660_ifs_stat_translate (iso9660_t *p_iso, const char psz_path[])
{
/* Special case for virtual El-Torito boot images ('[BOOT]/#.img') */
if (psz_path && (strncmp(psz_path, "[BOOT]/", 7) == 0)) {
int index = psz_path[7] - '0';
iso9660_stat_t* p_stat;
if (strlen(psz_path) < 8)
return NULL;
if ((psz_path[7] < '0') || (psz_path[7] > '0' + MAX_BOOT_IMAGES - 1))
return NULL;
if (p_iso->boot_img[index].lsn == 0 || p_iso->boot_img[index].num_sectors == 0)
return NULL;
p_stat = calloc(1, sizeof(iso9660_stat_t) + strlen(psz_path));
if (!p_stat) {
cdio_warn("Couldn't calloc(1, %d)", (int)sizeof(iso9660_stat_t));
return NULL;
/* Special case for virtual El-Torito boot images ('/[BOOT]/#-Boot-NoEmul.img') */
if (psz_path && p_iso && p_iso->boot_img[0].lsn != 0) {
/* Work on a path without leading slash */
const char* path = (psz_path[0] == '/') ? &psz_path[1] : psz_path;
if ((_cdio_strnicmp(path, "[BOOT]/", 7) == 0) &&
(_cdio_stricmp(&path[8], "-Boot-NoEmul.img") == 0)) {
int index = path[7] - '0';
iso9660_stat_t* p_stat;
if (strlen(path) < 24)
return NULL;
cdio_assert(MAX_BOOT_IMAGES <= 10);
if ((path[7] < '0') || (path[7] > '0' + MAX_BOOT_IMAGES - 1))
return NULL;
if (p_iso->boot_img[index].lsn == 0 || p_iso->boot_img[index].num_sectors == 0)
return NULL;
p_stat = calloc(1, sizeof(iso9660_stat_t) + strlen(path));
if (!p_stat) {
cdio_warn("Couldn't calloc(1, %d)", (int)sizeof(iso9660_stat_t));
return NULL;
}
p_stat->lsn = p_iso->boot_img[index].lsn;
p_stat->total_size = p_iso->boot_img[index].num_sectors * VIRTUAL_SECTORSIZE;
p_stat->type = _STAT_FILE;
strcpy(p_stat->filename, path);
return p_stat;
}
p_stat->lsn = p_iso->boot_img[index].lsn;
p_stat->total_size = p_iso->boot_img[index].num_sectors * ISO_BLOCKSIZE;
p_stat->type = _STAT_FILE;
strcpy(p_stat->filename, psz_path);
return p_stat;
}
return fs_stat_translate(p_iso, (stat_root_t *) _ifs_stat_root,
@ -1623,6 +1661,7 @@ iso9660_fs_readdir (CdIo_t *p_cdio, const char psz_path[])
CdioISO9660FileList_t *
iso9660_ifs_readdir (iso9660_t *p_iso, const char psz_path[])
{
int i;
iso9660_dir_t *p_iso9660_dir;
iso9660_stat_t *p_iso9660_stat = NULL;
iso9660_stat_t *p_stat;
@ -1630,6 +1669,30 @@ iso9660_ifs_readdir (iso9660_t *p_iso, const char psz_path[])
if (!p_iso) return NULL;
if (!psz_path) return NULL;
/* List the virtual El-Torito images */
if (p_iso->boot_img[0].lsn != 0) {
const char* path = (psz_path[0] == '/') ? &psz_path[1] : psz_path;
if (_cdio_strnicmp(path, "[BOOT]", 6) == 0 && (path[6] == '\0' || path[6] == '/')) {
CdioList_t* retval = _cdio_list_new();
for (i = 0; i < MAX_BOOT_IMAGES && p_iso->boot_img[i].lsn != 0; i++) {
p_iso9660_stat = calloc(1, sizeof(iso9660_stat_t) + 18);
if (!p_iso9660_stat) {
cdio_warn("Couldn't calloc(1, %d)", (int)sizeof(iso9660_stat_t) + 18);
break;
}
strcpy(p_iso9660_stat->filename, "#-Boot-NoEmul.img");
p_iso9660_stat->filename[0] = '0' + i;
p_iso9660_stat->type = _STAT_FILE;
p_iso9660_stat->lsn = p_iso->boot_img[i].lsn;
p_iso9660_stat->total_size = p_iso->boot_img[i].num_sectors * VIRTUAL_SECTORSIZE;
iso9660_get_ltime(&p_iso->pvd.creation_date, &p_iso9660_stat->tm);
_cdio_list_append(retval, p_iso9660_stat);
p_iso9660_stat = NULL;
}
return retval;
}
}
p_stat = iso9660_ifs_stat (p_iso, psz_path);
if (!p_stat) return NULL;
@ -1647,6 +1710,21 @@ iso9660_ifs_readdir (iso9660_t *p_iso, const char psz_path[])
const size_t dirbuf_len = blocks * ISO_BLOCKSIZE;
bool skip_following_extents = false;
/* Add the virtual El-Torito "[BOOT]" directory to root */
if (p_iso->boot_img[0].lsn != 0) {
if (psz_path[0] == '\0' || (psz_path[0] == '/' && psz_path[1] == '\0')) {
p_iso9660_stat = calloc(1, sizeof(iso9660_stat_t) + 7);
if (p_iso9660_stat) {
strcpy(p_iso9660_stat->filename, "[BOOT]");
p_iso9660_stat->type = _STAT_DIR;
p_iso9660_stat->lsn = ISO_PVD_SECTOR + 1;
iso9660_get_ltime(&p_iso->pvd.creation_date, &p_iso9660_stat->tm);
_cdio_list_append(retval, p_iso9660_stat);
p_iso9660_stat = NULL;
}
}
}
if (!dirbuf_len)
{
cdio_warn("Invalid directory buffer sector size %u", blocks);

View File

@ -73,7 +73,7 @@ const char* additional_copyrights =
"https://svn.reactos.org/reactos/trunk\\line\n"
"GNU General Public License (GPL) v2 or later\\line\n"
"\\line\n"
"Bad blocks testing and ext2/ext3 formatting from e2fsprogs by Theodore T'so et al.:\\line\n"
"Bad blocks testing and ext2/ext3 formatting from e2fsprogs by Theodore Ts'o et al.:\\line\n"
"http://e2fsprogs.sourceforge.net/\\line\n"
"GNU General Public License (GPL) v3 compatible\\line\n"
"\\line\n"

View File

@ -1,7 +1,7 @@
/*
* Rufus: The Reliable USB Formatting Utility
* Localization tables - autogenerated from resource.h
* Copyright © 2013-2021 Pete Batard <pete@akeo.ie>
* Copyright © 2013-2024 Pete Batard <pete@akeo.ie>
*
* 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
@ -52,11 +52,10 @@ const loc_control_id control_id[] = {
LOC_CTRL(IDC_TEST),
LOC_CTRL(IDC_SELECT),
LOC_CTRL(IDC_EXTENDED_LABEL),
LOC_CTRL(IDC_RUFUS_MBR),
LOC_CTRL(IDC_UEFI_MEDIA_VALIDATION),
LOC_CTRL(IDC_TARGET_SYSTEM),
LOC_CTRL(IDC_PERSISTENCE_SIZE),
LOC_CTRL(IDC_PERSISTENCE_UNITS),
LOC_CTRL(IDC_DISK_ID),
LOC_CTRL(IDC_OLD_BIOS_FIXES),
LOC_CTRL(IDC_LIST_USB_HDD),
LOC_CTRL(IDC_STATUS_TOOLBAR),
@ -510,6 +509,55 @@ const loc_control_id control_id[] = {
LOC_CTRL(MSG_348),
LOC_CTRL(MSG_349),
LOC_CTRL(MSG_350),
LOC_CTRL(MSG_351),
LOC_CTRL(MSG_352),
LOC_CTRL(MSG_353),
LOC_CTRL(MSG_354),
LOC_CTRL(MSG_355),
LOC_CTRL(MSG_356),
LOC_CTRL(MSG_357),
LOC_CTRL(MSG_358),
LOC_CTRL(MSG_359),
LOC_CTRL(MSG_360),
LOC_CTRL(MSG_361),
LOC_CTRL(MSG_362),
LOC_CTRL(MSG_363),
LOC_CTRL(MSG_364),
LOC_CTRL(MSG_365),
LOC_CTRL(MSG_366),
LOC_CTRL(MSG_367),
LOC_CTRL(MSG_368),
LOC_CTRL(MSG_369),
LOC_CTRL(MSG_370),
LOC_CTRL(MSG_371),
LOC_CTRL(MSG_372),
LOC_CTRL(MSG_373),
LOC_CTRL(MSG_374),
LOC_CTRL(MSG_375),
LOC_CTRL(MSG_376),
LOC_CTRL(MSG_377),
LOC_CTRL(MSG_378),
LOC_CTRL(MSG_379),
LOC_CTRL(MSG_380),
LOC_CTRL(MSG_381),
LOC_CTRL(MSG_382),
LOC_CTRL(MSG_383),
LOC_CTRL(MSG_384),
LOC_CTRL(MSG_385),
LOC_CTRL(MSG_386),
LOC_CTRL(MSG_387),
LOC_CTRL(MSG_388),
LOC_CTRL(MSG_389),
LOC_CTRL(MSG_390),
LOC_CTRL(MSG_391),
LOC_CTRL(MSG_392),
LOC_CTRL(MSG_393),
LOC_CTRL(MSG_394),
LOC_CTRL(MSG_395),
LOC_CTRL(MSG_396),
LOC_CTRL(MSG_397),
LOC_CTRL(MSG_398),
LOC_CTRL(MSG_399),
LOC_CTRL(MSG_MAX),
LOC_CTRL(IDOK),
LOC_CTRL(IDCANCEL),

View File

@ -1,7 +1,7 @@
/*
* Rufus: The Reliable USB Formatting Utility
* Constants and defines missing from various toolchains
* Copyright © 2016-2022 Pete Batard <pete@akeo.ie>
* Copyright © 2016-2024 Pete Batard <pete@akeo.ie>
*
* 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
@ -21,22 +21,19 @@
#pragma once
/* Convenient to have around */
#define KB 1024LL
#define MB 1048576LL
#define GB 1073741824LL
#define TB 1099511627776LL
#ifndef MIN
#define MIN(a,b) (((a) < (b)) ? (a) : (b))
#endif
#if defined(__GNUC__)
#define ALIGNED(m) __attribute__ ((__aligned__(m)))
#elif defined(_MSC_VER)
#define ALIGNED(m) __declspec(align(m))
#ifndef MAX
#define MAX(a,b) (((a) > (b)) ? (a) : (b))
#endif
#define LO_ALIGN_X_TO_Y(x, y) (((x) / (y)) * (y))
#define HI_ALIGN_X_TO_Y(x, y) ((((x) + (y) - 1) / (y)) * (y))
#define IS_HEXASCII(c) (((c) >= '0' && (c) <= '9') || ((c) >= 'A' && (c) <= 'F') || ((c) >= 'a' && (c) <= 'f'))
/*
* Prefetch 64 bytes at address m, for read-only operation
* We account for these built-in calls doing nothing if the

View File

@ -50,7 +50,7 @@ int64_t write_sectors(HANDLE hDrive, uint64_t SectorSize,
LastWriteError = 0;
if(!WriteFileWithRetry(hDrive, pBuf, Size, &Size, WRITE_RETRIES))
{
LastWriteError = ERROR_SEVERITY_ERROR|FAC(FACILITY_STORAGE)|GetLastError();
LastWriteError = RUFUS_ERROR(GetLastError());
uprintf("write_sectors: Write error %s\n", WindowsErrorString());
uprintf(" StartSector: 0x%08" PRIx64 ", nSectors: 0x%" PRIx64 ", SectorSize: 0x%" PRIx64 "\n", StartSector, nSectors, SectorSize);
return -1;
@ -63,7 +63,7 @@ int64_t write_sectors(HANDLE hDrive, uint64_t SectorSize,
return 0;
}
uprintf("write_sectors: Write error\n");
LastWriteError = ERROR_SEVERITY_ERROR|FAC(FACILITY_STORAGE)|ERROR_WRITE_FAULT;
LastWriteError = RUFUS_ERROR(ERROR_WRITE_FAULT);
uprintf(" Wrote: %d, Expected: %" PRIu64 "\n", Size, nSectors*SectorSize);
uprintf(" StartSector: 0x%08" PRIx64 ", nSectors: 0x%" PRIx64 ", SectorSize: 0x%" PRIx64 "\n", StartSector, nSectors, SectorSize);
return -1;

View File

@ -1146,6 +1146,13 @@ static __inline const char* _filenameU(const char* path)
return path;
}
static __inline uint64_t _filesizeU(const char* path)
{
struct __stat64 stat64 = { 0 };
_stat64U(path, &stat64);
return stat64.st_size;
}
// returned UTF-8 string must be freed
static __inline char* getenvU(const char* varname)
{

View File

@ -1,7 +1,7 @@
/*
* Rufus: The Reliable USB Formatting Utility
* Networking functionality (web file download, check for update, etc.)
* Copyright © 2012-2023 Pete Batard <pete@akeo.ie>
* Copyright © 2012-2024 Pete Batard <pete@akeo.ie>
*
* 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
@ -204,7 +204,7 @@ uint64_t DownloadToFileOrBufferEx(const char* url, const char* file, const char*
PF_INIT_OR_OUT(HttpSendRequestA, WinInet);
PF_INIT_OR_OUT(HttpQueryInfoA, WinInet);
FormatStatus = 0;
ErrorStatus = 0;
DownloadStatus = 404;
if (hProgressDialog != NULL)
UpdateProgressWithInfoInit(hProgressDialog, FALSE);
@ -258,7 +258,7 @@ uint64_t DownloadToFileOrBufferEx(const char* url, const char* file, const char*
pfHttpQueryInfoA(hRequest, HTTP_QUERY_STATUS_CODE|HTTP_QUERY_FLAG_NUMBER, (LPVOID)&DownloadStatus, &dwSize, NULL);
if (DownloadStatus != 200) {
error_code = ERROR_INTERNET_ITEM_NOT_FOUND;
SetLastError(ERROR_SEVERITY_ERROR | FAC(FACILITY_HTTP) | error_code);
SetLastError(RUFUS_ERROR(error_code));
uprintf("%s: %d", (DownloadStatus == 404) ? "File not found" : "Unable to access file", DownloadStatus);
goto out;
}
@ -300,7 +300,7 @@ uint64_t DownloadToFileOrBufferEx(const char* url, const char* file, const char*
// Keep checking for data until there is nothing left.
while (1) {
// User may have cancelled the download
if (IS_ERROR(FormatStatus))
if (IS_ERROR(ErrorStatus))
goto out;
if (!pfInternetReadFile(hRequest, buf, sizeof(buf), &dwDownloaded) || (dwDownloaded == 0))
break;
@ -322,7 +322,7 @@ uint64_t DownloadToFileOrBufferEx(const char* url, const char* file, const char*
if (size != total_size) {
uprintf("Could not download complete file - read: %lld bytes, expected: %lld bytes", size, total_size);
FormatStatus = ERROR_SEVERITY_ERROR|FAC(FACILITY_STORAGE)|ERROR_WRITE_FAULT;
ErrorStatus = RUFUS_ERROR(ERROR_WRITE_FAULT);
goto out;
} else {
DownloadStatus = 200;
@ -383,7 +383,7 @@ DWORD DownloadSignedFile(const char* url, const char* file, HWND hProgressDialog
if ((sig_len != RSA_SIGNATURE_SIZE) || (!ValidateOpensslSignature(buf, buf_len, sig, sig_len))) {
uprintf("FATAL: Download signature is invalid ✗");
DownloadStatus = 403; // Forbidden
FormatStatus = ERROR_SEVERITY_ERROR | FAC(FACILITY_STORAGE) | APPERR(ERROR_BAD_SIGNATURE);
ErrorStatus = RUFUS_ERROR(APPERR(ERROR_BAD_SIGNATURE));
SendMessage(GetDlgItem(hProgressDialog, IDC_PROGRESS), PBM_SETSTATE, (WPARAM)PBST_ERROR, 0);
SetTaskbarProgressState(TASKBAR_ERROR);
goto out;
@ -413,7 +413,7 @@ out:
if ((bPromptOnError) && (DownloadStatus != 200)) {
PrintInfo(0, MSG_242);
SetLastError(error_code);
MessageBoxExU(hMainDialog, IS_ERROR(FormatStatus) ? StrError(FormatStatus, FALSE) : WindowsErrorString(),
MessageBoxExU(hMainDialog, IS_ERROR(ErrorStatus) ? StrError(ErrorStatus, FALSE) : WindowsErrorString(),
lmprintf(MSG_044), MB_OK | MB_ICONERROR | MB_IS_RTL, selected_langid);
}
safe_closehandle(hFile);
@ -768,7 +768,7 @@ static DWORD WINAPI DownloadISOThread(LPVOID param)
dwSize = (DWORD)DownloadToFileOrBuffer(sig_url, NULL, &sig, NULL, FALSE);
if ((dwSize != RSA_SIGNATURE_SIZE) || (!ValidateOpensslSignature(compressed, dwCompressedSize, sig, dwSize))) {
uprintf("FATAL: Download signature is invalid ✗");
FormatStatus = ERROR_SEVERITY_ERROR | FAC(FACILITY_STORAGE) | APPERR(ERROR_BAD_SIGNATURE);
ErrorStatus = RUFUS_ERROR(APPERR(ERROR_BAD_SIGNATURE));
SendMessage(hProgress, PBM_SETSTATE, (WPARAM)PBST_ERROR, 0);
SetTaskbarProgressState(TASKBAR_ERROR);
safe_free(compressed);
@ -778,7 +778,7 @@ static DWORD WINAPI DownloadISOThread(LPVOID param)
free(sig);
uprintf("Download signature is valid ✓");
uncompressed_size = *((uint64_t*)&compressed[5]);
if ((uncompressed_size < 1 * MB) && (bled_init(0, uprintf, NULL, NULL, NULL, NULL, &FormatStatus) >= 0)) {
if ((uncompressed_size < 1 * MB) && (bled_init(0, uprintf, NULL, NULL, NULL, NULL, &ErrorStatus) >= 0)) {
fido_script = malloc((size_t)uncompressed_size);
size = bled_uncompress_from_buffer_to_buffer(compressed, dwCompressedSize, fido_script, (size_t)uncompressed_size, BLED_COMPRESSION_LZMA);
bled_exit();
@ -787,7 +787,7 @@ static DWORD WINAPI DownloadISOThread(LPVOID param)
if (size != uncompressed_size) {
uprintf("FATAL: Could not uncompressed download script");
safe_free(fido_script);
FormatStatus = ERROR_SEVERITY_ERROR | FAC(FACILITY_STORAGE) | ERROR_INVALID_DATA;
ErrorStatus = RUFUS_ERROR(ERROR_INVALID_DATA);
SendMessage(hProgress, PBM_SETSTATE, (WPARAM)PBST_ERROR, 0);
SetTaskbarProgressState(TASKBAR_ERROR);
goto out;
@ -840,7 +840,7 @@ static DWORD WINAPI DownloadISOThread(LPVOID param)
// signed, we also validate the Authenticode signature of the local script.
if (ValidateSignature(INVALID_HANDLE_VALUE, script_path) != NO_ERROR) {
uprintf("FATAL: Script signature is invalid ✗");
FormatStatus = ERROR_SEVERITY_ERROR | FAC(FACILITY_STORAGE) | APPERR(ERROR_BAD_SIGNATURE);
ErrorStatus = RUFUS_ERROR(APPERR(ERROR_BAD_SIGNATURE));
SendMessage(hProgress, PBM_SETSTATE, (WPARAM)PBST_ERROR, 0);
SetTaskbarProgressState(TASKBAR_ERROR);
goto out;
@ -848,6 +848,7 @@ static DWORD WINAPI DownloadISOThread(LPVOID param)
uprintf("Script signature is valid ✓");
#endif
ErrorStatus = 0;
dwExitCode = RunCommand(cmdline, app_data_dir, TRUE);
uprintf("Exited download script with code: %d", dwExitCode);
if ((dwExitCode == 0) && PeekNamedPipe(hPipe, NULL, dwPipeSize, NULL, &dwAvail, NULL) && (dwAvail != 0)) {
@ -875,11 +876,11 @@ static DWORD WINAPI DownloadISOThread(LPVOID param)
}
// Download the ISO and report errors if any
SendMessage(hMainDialog, UM_PROGRESS_INIT, 0, 0);
FormatStatus = 0;
ErrorStatus = 0;
SendMessage(hMainDialog, UM_TIMER_START, 0, 0);
if (DownloadToFileOrBuffer(url, img_save.ImagePath, NULL, hMainDialog, TRUE) == 0) {
SendMessage(hMainDialog, UM_PROGRESS_EXIT, 0, 0);
if (SCODE_CODE(FormatStatus) == ERROR_CANCELLED) {
if (SCODE_CODE(ErrorStatus) == ERROR_CANCELLED) {
uprintf("Download cancelled by user");
Notification(MSG_INFO, NULL, NULL, lmprintf(MSG_211), lmprintf(MSG_041));
PrintInfo(0, MSG_211);
@ -916,7 +917,7 @@ BOOL DownloadISO()
{
if (CreateThread(NULL, 0, DownloadISOThread, NULL, 0, NULL) == NULL) {
uprintf("Unable to start Windows ISO download thread");
FormatStatus = ERROR_SEVERITY_ERROR | FAC(FACILITY_STORAGE) | APPERR(ERROR_CANT_START_THREAD);
ErrorStatus = RUFUS_ERROR(APPERR(ERROR_CANT_START_THREAD));
SendMessage(hMainDialog, UM_ENABLE_CONTROLS, 0, 0);
return FALSE;
}
@ -948,7 +949,7 @@ BOOL IsDownloadable(const char* url)
if (url == NULL)
return FALSE;
FormatStatus = 0;
ErrorStatus = 0;
DownloadStatus = 404;
if ((!pfInternetCrackUrlA(url, (DWORD)safe_strlen(url), 0, &UrlParts))

View File

@ -1,7 +1,7 @@
/*
* Rufus: The Reliable USB Formatting Utility
* Elementary Unicode compliant find/replace parser
* Copyright © 2012-2023 Pete Batard <pete@akeo.ie>
* Copyright © 2012-2024 Pete Batard <pete@akeo.ie>
*
* 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
@ -91,7 +91,7 @@ static loc_cmd* get_loc_cmd(char c, char* line) {
// locate ending quote
while ((line[i] != 0) && ((line[i] != '"') || ((line[i] == '"') && (line[i-1] == '\\')))) {
if ((line[i] == '"') && (line[i-1] == '\\')) {
strcpy(&line[i-1], &line[i]);
memmove(&line[i-1], &line[i], strlen(&line[i]) + 1);
} else {
i++;
}
@ -1514,7 +1514,7 @@ int sanitize_label(char* label)
// Remove all leading '-'
for (i = 0; i < len && label[i] == '-'; i++);
if (i != 0)
memcpy(label, &label[i], len - i);
memmove(label, &label[i], len - i);
len = strlen(label);
if (len <= 1)
return -1;
@ -1529,7 +1529,7 @@ int sanitize_label(char* label)
// Remove all duplicate '-' (non-optimized!)
for (i = 0; len >= 2 && i < len - 2; i++) {
if (label[i] == '-' && label[i + 1] == '-') {
memcpy(&label[i + 1], &label[i + 2], len - i - 1);
memmove(&label[i + 1], &label[i + 2], len - i - 1);
len--;
i--;
}

View File

@ -1,7 +1,7 @@
/*
* Rufus: The Reliable USB Formatting Utility
* PKI functions (code signing, etc.)
* Copyright © 2015-2023 Pete Batard <pete@akeo.ie>
* Copyright © 2015-2024 Pete Batard <pete@akeo.ie>
*
* 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
@ -652,7 +652,7 @@ LONG ValidateSignature(HWND hDlg, const char* path)
trust_file.pcwszFilePath = utf8_to_wchar(path);
if (trust_file.pcwszFilePath == NULL) {
uprintf("PKI: Unable to convert '%s' to UTF16", path);
return ERROR_SEVERITY_ERROR | FAC(FACILITY_CERT) | ERROR_NOT_ENOUGH_MEMORY;
return RUFUS_ERROR(ERROR_NOT_ENOUGH_MEMORY);
}
trust_data.cbStruct = sizeof(trust_data);

View File

@ -499,8 +499,8 @@ static DWORD WINAPI SearchProcessThread(LPVOID param)
goto out;
}
if (wHandleName != NULL) {
for (i = 0; i < nHandles; i++)
free(wHandleName[i]);
for (j = 0; j < nHandles; j++)
free(wHandleName[j]);
free(wHandleName);
}
safe_free(wHandleNameLen);
@ -515,10 +515,10 @@ static DWORD WINAPI SearchProcessThread(LPVOID param)
ReleaseMutex(hLock);
goto out;
}
for (i = 0; i < nHandles; i++) {
wHandleName[i] = wcsdup(blocking_process.wHandleName[i]);
wHandleNameLen[i] = (USHORT)wcslen(blocking_process.wHandleName[i]);
if (wHandleName[i] == NULL) {
for (j = 0; j < nHandles; j++) {
wHandleName[j] = wcsdup(blocking_process.wHandleName[j]);
wHandleNameLen[j] = (USHORT)wcslen(blocking_process.wHandleName[j]);
if (wHandleName[j] == NULL) {
ReleaseMutex(hLock);
goto out;
}
@ -556,7 +556,11 @@ static DWORD WINAPI SearchProcessThread(LPVOID param)
);
if ((dupHandle != NULL) && (processHandle != NtCurrentProcess())) {
pfNtClose(dupHandle);
TRY_AND_HANDLE(
EXCEPTION_ACCESS_VIOLATION,
{ pfNtClose(dupHandle); },
{ continue; }
);
dupHandle = NULL;
}
@ -741,8 +745,8 @@ out:
uprintf("Warning: Could not start process handle enumerator!");
if (wHandleName != NULL) {
for (i = 0; i < nHandles; i++)
free(wHandleName[i]);
for (j = 0; j < nHandles; j++)
free(wHandleName[j]);
free(wHandleName);
}
safe_free(wHandleNameLen);

View File

@ -69,6 +69,13 @@
#define IDR_LC_RUFUS_LOC 500
#define IDR_XT_HOGGER 501
#define IDR_UEFI_NTFS 502
// The following should match the ArchType array values + 600
#define IDR_MD5_BOOT 600
#define IDR_MD5_BOOTIA32 601
#define IDR_MD5_BOOTX64 602
#define IDR_MD5_BOOTARM 603
#define IDR_MD5_BOOTAA64 604
#define IDR_MD5_BOOTRISCV64 607
#define IDM_SELECT 901
#define IDM_DOWNLOAD 902
#define IDC_DEVICE 1001
@ -86,12 +93,11 @@
#define IDC_TEST 1013
#define IDC_SELECT 1014
#define IDC_EXTENDED_LABEL 1015
#define IDC_RUFUS_MBR 1016
#define IDC_TARGET_SYSTEM 1017
#define IDC_PERSISTENCE_SIZE 1018
#define IDC_PERSISTENCE_UNITS 1019
#define IDC_DISK_ID 1020
#define IDC_OLD_BIOS_FIXES 1021
#define IDC_OLD_BIOS_FIXES 1020
#define IDC_UEFI_MEDIA_VALIDATION 1021
#define IDC_LIST_USB_HDD 1022
#define IDC_STATUS_TOOLBAR 1023
#define IDC_SAVE 1024
@ -545,7 +551,56 @@
#define MSG_348 3348
#define MSG_349 3349
#define MSG_350 3350
#define MSG_MAX 3351
#define MSG_351 3351
#define MSG_352 3352
#define MSG_353 3353
#define MSG_354 3354
#define MSG_355 3355
#define MSG_356 3356
#define MSG_357 3357
#define MSG_358 3358
#define MSG_359 3359
#define MSG_360 3360
#define MSG_361 3361
#define MSG_362 3362
#define MSG_363 3363
#define MSG_364 3364
#define MSG_365 3365
#define MSG_366 3366
#define MSG_367 3367
#define MSG_368 3368
#define MSG_369 3369
#define MSG_370 3370
#define MSG_371 3371
#define MSG_372 3372
#define MSG_373 3373
#define MSG_374 3374
#define MSG_375 3375
#define MSG_376 3376
#define MSG_377 3377
#define MSG_378 3378
#define MSG_379 3379
#define MSG_380 3380
#define MSG_381 3381
#define MSG_382 3382
#define MSG_383 3383
#define MSG_384 3384
#define MSG_385 3385
#define MSG_386 3386
#define MSG_387 3387
#define MSG_388 3388
#define MSG_389 3389
#define MSG_390 3390
#define MSG_391 3391
#define MSG_392 3392
#define MSG_393 3393
#define MSG_394 3394
#define MSG_395 3395
#define MSG_396 3396
#define MSG_397 3397
#define MSG_398 3398
#define MSG_399 3399
#define MSG_MAX 3400
// Next default values for new objects
//

View File

@ -1,6 +1,6 @@
/*
* Rufus: The Reliable USB Formatting Utility
* Copyright © 2011-2023 Pete Batard <pete@akeo.ie>
* Copyright © 2011-2024 Pete Batard <pete@akeo.ie>
*
* 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
@ -86,7 +86,6 @@ static int64_t last_iso_blocking_status;
static int selected_pt = -1, selected_fs = FS_UNKNOWN, preselected_fs = FS_UNKNOWN;
static int image_index = 0, select_index = 0;
static RECT relaunch_rc = { -65536, -65536, 0, 0};
static UINT uMBRChecked = BST_UNCHECKED;
static HWND hSelectImage = NULL, hStart = NULL;
static char szTimer[12] = "00:00:00";
static unsigned int timer;
@ -94,6 +93,7 @@ static char uppercase_select[2][64], uppercase_start[64], uppercase_close[64], u
extern HANDLE update_check_thread, wim_thread;
extern BOOL enable_iso, enable_joliet, enable_rockridge, enable_extra_hashes, is_bootloader_revoked;
extern BOOL validate_md5sum;
extern BYTE* fido_script;
extern HWND hFidoDlg;
extern uint8_t* grub2_buf;
@ -119,7 +119,7 @@ loc_cmd* selected_locale = NULL;
WORD selected_langid = MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT);
DWORD MainThreadId;
HWND hDeviceList, hPartitionScheme, hTargetSystem, hFileSystem, hClusterSize, hLabel, hBootType, hNBPasses, hLog = NULL;
HWND hImageOption, hLogDialog = NULL, hProgress = NULL, hDiskID;
HWND hImageOption, hLogDialog = NULL, hProgress = NULL;
HANDLE dialog_handle = NULL, format_thread = NULL;
BOOL is_x86_64, use_own_c32[NB_OLD_C32] = { FALSE, FALSE }, mbr_selected_by_user = FALSE, lock_drive = TRUE;
BOOL op_in_progress = TRUE, right_to_left_mode = FALSE, has_uefi_csm = FALSE, its_a_me_mario = FALSE;
@ -129,7 +129,7 @@ BOOL usb_debug, use_fake_units, preserve_timestamps = FALSE, fast_zeroing = FALS
BOOL zero_drive = FALSE, list_non_usb_removable_drives = FALSE, enable_file_indexing, large_drive = FALSE;
BOOL write_as_image = FALSE, write_as_esp = FALSE, use_vds = FALSE, ignore_boot_marker = FALSE;
BOOL appstore_version = FALSE, is_vds_available = TRUE, persistent_log = FALSE, has_ffu_support = FALSE;
BOOL expert_mode = FALSE;
BOOL expert_mode = FALSE, use_rufus_mbr = TRUE;
float fScale = 1.0f;
int dialog_showing = 0, selection_default = BT_IMAGE, persistence_unit_selection = -1, imop_win_sel = 0;
int default_fs, fs_type, boot_type, partition_type, target_type;
@ -213,11 +213,6 @@ static void SetAllowedFileSystems(void)
allowed_filesystem[FS_EXFAT] = TRUE;
break;
}
// Reset disk ID to 0x80 if Rufus MBR is used
if (selection_default != BT_IMAGE) {
IGNORE_RETVAL(ComboBox_SetCurSel(hDiskID, 0));
}
}
// Populate the Boot selection dropdown
@ -245,10 +240,8 @@ static void SetBootOptions(void)
"Grub4DOS " GRUB4DOS_VERSION), BT_GRUB4DOS));
IGNORE_RETVAL(ComboBox_SetItemData(hBootType, ComboBox_AddStringU(hBootType, "UEFI:NTFS"), BT_UEFI_NTFS));
}
if ((!advanced_mode_device) && (selection_default >= BT_SYSLINUX_V4)) {
if ((!advanced_mode_device) && (selection_default >= BT_SYSLINUX_V4))
selection_default = BT_IMAGE;
CheckDlgButton(hMainDialog, IDC_DISK_ID, BST_UNCHECKED);
}
SetComboEntry(hBootType, selection_default);
}
@ -385,7 +378,7 @@ static BOOL SetClusterSizes(int FSType)
return FALSE;
}
for (i = 0, j = 0x100, k = 0; j<0x10000000; i++, j <<= 1) {
for (i = 0, j = 0x100, k = 0; j < 0x10000000; i++, j <<= 1) {
if (j & SelectedDrive.ClusterSize[FSType].Allowed) {
if (j == SelectedDrive.ClusterSize[FSType].Default) {
szClustSize = lmprintf(MSG_030, ClusterSizeLabel[i]);
@ -483,11 +476,11 @@ static BOOL SetFileSystemAndClusterSize(char* fs_name)
*/
// FAT 16
if (SelectedDrive.DiskSize < 4*GB) {
if (SelectedDrive.DiskSize < 4 * GB) {
SelectedDrive.ClusterSize[FS_FAT16].Allowed = 0x00001E00;
for (i = 32; i <= 4096; i <<= 1) { // 8 MB -> 4 GB
if (SelectedDrive.DiskSize < i*MB) {
SelectedDrive.ClusterSize[FS_FAT16].Default = 16*(ULONG)i;
if (SelectedDrive.DiskSize < i * MB) {
SelectedDrive.ClusterSize[FS_FAT16].Default = 16 * (ULONG)i;
break;
}
SelectedDrive.ClusterSize[FS_FAT16].Allowed <<= 1;
@ -497,12 +490,12 @@ static BOOL SetFileSystemAndClusterSize(char* fs_name)
// FAT 32
// > 32GB FAT32 is not supported by MS and FormatEx but is achieved using fat32format
// See: http://www.ridgecrop.demon.co.uk/index.htm?fat32format.htm
// See: http://ridgecrop.co.uk/index.htm?fat32format.htm
// < 32 MB FAT32 is not allowed by FormatEx, so we don't bother
if ((SelectedDrive.DiskSize >= 32*MB) && (1.0f*SelectedDrive.DiskSize < 1.0f*MAX_FAT32_SIZE*TB)) {
if ((SelectedDrive.DiskSize >= 32 * MB) && (SelectedDrive.DiskSize < MAX_FAT32_SIZE)) {
SelectedDrive.ClusterSize[FS_FAT32].Allowed = 0x000001F8;
for (i=32; i<=(32*1024); i<<=1) { // 32 MB -> 32 GB
if (SelectedDrive.DiskSize*1.0f < i*MB*FAT32_CLUSTER_THRESHOLD) { // MS
for (i = 32; i <= (32 * 1024); i <<= 1) { // 32 MB -> 32 GB
if (SelectedDrive.DiskSize*1.0f < i * MB * FAT32_CLUSTER_THRESHOLD) { // MS
SelectedDrive.ClusterSize[FS_FAT32].Default = 8*(ULONG)i;
break;
}
@ -511,39 +504,39 @@ static BOOL SetFileSystemAndClusterSize(char* fs_name)
SelectedDrive.ClusterSize[FS_FAT32].Allowed &= 0x0001FE00;
// Default cluster sizes in the 256MB to 32 GB range do not follow the rule above
if ((SelectedDrive.DiskSize >= 256*MB) && (SelectedDrive.DiskSize < 32*GB)) {
for (i=8; i<=32; i<<=1) { // 256 MB -> 32 GB
if (SelectedDrive.DiskSize*1.0f < i*GB*FAT32_CLUSTER_THRESHOLD) {
SelectedDrive.ClusterSize[FS_FAT32].Default = ((ULONG)i/2)*KB;
if ((SelectedDrive.DiskSize >= 256 * MB) && (SelectedDrive.DiskSize < 32 * GB)) {
for (i = 8; i <= 32; i <<= 1) { // 256 MB -> 32 GB
if (SelectedDrive.DiskSize * 1.0f < i * GB * FAT32_CLUSTER_THRESHOLD) {
SelectedDrive.ClusterSize[FS_FAT32].Default = ((ULONG)i / 2) * KB;
break;
}
}
}
// More adjustments for large drives
if (SelectedDrive.DiskSize >= 32*GB) {
if (SelectedDrive.DiskSize >= 32 * GB) {
SelectedDrive.ClusterSize[FS_FAT32].Allowed &= 0x0001C000;
SelectedDrive.ClusterSize[FS_FAT32].Default = 0x00008000;
}
}
if (SelectedDrive.DiskSize < 256*TB) {
if (SelectedDrive.DiskSize < 256 * TB) {
// NTFS
SelectedDrive.ClusterSize[FS_NTFS].Allowed = 0x0001FE00;
for (i=16; i<=256; i<<=1) { // 7 MB -> 256 TB
if (SelectedDrive.DiskSize < i*TB) {
SelectedDrive.ClusterSize[FS_NTFS].Default = ((ULONG)i/4)*KB;
for (i = 16; i <= 256; i <<= 1) { // 7 MB -> 256 TB
if (SelectedDrive.DiskSize < i * TB) {
SelectedDrive.ClusterSize[FS_NTFS].Default = ((ULONG)i / 4) * KB;
break;
}
}
// exFAT
SelectedDrive.ClusterSize[FS_EXFAT].Allowed = 0x03FFFE00;
if (SelectedDrive.DiskSize < 256*MB) // < 256 MB
SelectedDrive.ClusterSize[FS_EXFAT].Default = 4*KB;
else if (SelectedDrive.DiskSize < 32*GB) // < 32 GB
SelectedDrive.ClusterSize[FS_EXFAT].Default = 32*KB;
if (SelectedDrive.DiskSize < 256 * MB) // < 256 MB
SelectedDrive.ClusterSize[FS_EXFAT].Default = 4 * KB;
else if (SelectedDrive.DiskSize < 32 * GB) // < 32 GB
SelectedDrive.ClusterSize[FS_EXFAT].Default = 32 * KB;
else
SelectedDrive.ClusterSize[FS_EXFAT].Default = 128*KB;
SelectedDrive.ClusterSize[FS_EXFAT].Default = 128 * KB;
// UDF
SelectedDrive.ClusterSize[FS_UDF].Allowed = SINGLE_CLUSTERSIZE_DEFAULT;
@ -680,24 +673,6 @@ static void SetFSFromISO(void)
ComboBox_GetCurSel(hFileSystem));
}
static void SetMBRProps(void)
{
BOOL needs_masquerading = HAS_WINPE(img_report) && (!img_report.uses_minint);
fs_type = (int)ComboBox_GetCurItemData(hFileSystem);
if ((!mbr_selected_by_user) && ((image_path == NULL) || (boot_type != BT_IMAGE) || (fs_type != FS_NTFS) || HAS_GRUB(img_report) ||
((image_options & IMOP_WINTOGO) && (ComboBox_GetCurItemData(hImageOption) == IMOP_WIN_TO_GO)) )) {
CheckDlgButton(hMainDialog, IDC_RUFUS_MBR, BST_UNCHECKED);
IGNORE_RETVAL(ComboBox_SetCurSel(hDiskID, 0));
return;
}
uMBRChecked = (needs_masquerading || HAS_BOOTMGR(img_report) || mbr_selected_by_user)?BST_CHECKED:BST_UNCHECKED;
if (IsWindowEnabled(GetDlgItem(hMainDialog, IDC_RUFUS_MBR)))
CheckDlgButton(hMainDialog, IDC_RUFUS_MBR, uMBRChecked);
IGNORE_RETVAL(ComboBox_SetCurSel(hDiskID, needs_masquerading?1:0));
}
static void SetProposedLabel(int ComboIndex)
{
const char no_label[] = STR_NO_LABEL, empty[] = "";
@ -729,45 +704,49 @@ static void SetProposedLabel(int ComboIndex)
}
}
// This handles the enabling/disabling of the "Add fixes for old BIOSes" and "Use Rufus MBR" controls
static void EnableMBRBootOptions(BOOL enable, BOOL remove_checkboxes)
static void EnableOldBiosFixes(BOOL enable, BOOL remove_checkboxes)
{
BOOL actual_enable_mbr = (boot_type > BT_IMAGE) ? FALSE: enable;
BOOL actual_enable_fix = enable;
static UINT uXPartChecked = BST_UNCHECKED;
static UINT checked, state = 0;
HWND hCtrl = GetDlgItem(hMainDialog, IDC_OLD_BIOS_FIXES);
// The fix for old BIOSes option cannot apply if we aren't targetting BIOS, or are using an image that isn't BIOS bootable
if ((partition_type != PARTITION_STYLE_MBR) || (target_type != TT_BIOS) || (boot_type == BT_NON_BOOTABLE) ||
((boot_type == BT_IMAGE) && (!IS_BIOS_BOOTABLE(img_report) || IS_DD_ONLY(img_report)))) {
// These options cannot apply if we aren't using MBR+BIOS, or are using an image that isn't BIOS bootable
actual_enable_mbr = FALSE;
actual_enable_fix = FALSE;
} else {
// If we are using an image, the Rufus MBR only applies if it's for Windows
if ((boot_type == BT_IMAGE) && !HAS_WINPE(img_report) && !HAS_BOOTMGR(img_report)) {
actual_enable_mbr = FALSE;
mbr_selected_by_user = FALSE;
}
enable = FALSE;
}
if (remove_checkboxes) {
// Store/Restore the checkbox states
if (IsWindowEnabled(GetDlgItem(hMainDialog, IDC_RUFUS_MBR)) && !actual_enable_mbr) {
uMBRChecked = IsChecked(IDC_RUFUS_MBR);
CheckDlgButton(hMainDialog, IDC_RUFUS_MBR, BST_UNCHECKED);
} else if (!IsWindowEnabled(GetDlgItem(hMainDialog, IDC_RUFUS_MBR)) && actual_enable_mbr) {
CheckDlgButton(hMainDialog, IDC_RUFUS_MBR, uMBRChecked);
}
if (IsWindowEnabled(GetDlgItem(hMainDialog, IDC_OLD_BIOS_FIXES)) && !actual_enable_fix) {
uXPartChecked = IsChecked(IDC_OLD_BIOS_FIXES);
if (!enable && (state != 1)) {
checked = IsChecked(IDC_OLD_BIOS_FIXES);
CheckDlgButton(hMainDialog, IDC_OLD_BIOS_FIXES, BST_UNCHECKED);
} else if (!IsWindowEnabled(GetDlgItem(hMainDialog, IDC_OLD_BIOS_FIXES)) && actual_enable_fix) {
CheckDlgButton(hMainDialog, IDC_OLD_BIOS_FIXES, uXPartChecked);
state = 1;
} else if (enable && !IsWindowEnabled(hCtrl) && (state != 2)) {
if (state != 0)
CheckDlgButton(hMainDialog, IDC_OLD_BIOS_FIXES, checked);
state = 2;
}
}
EnableWindow(hCtrl, enable);
}
EnableWindow(GetDlgItem(hMainDialog, IDC_OLD_BIOS_FIXES), actual_enable_fix);
EnableWindow(GetDlgItem(hMainDialog, IDC_RUFUS_MBR), actual_enable_mbr);
EnableWindow(hDiskID, actual_enable_mbr);
static void EnableUefiValidation(BOOL enable, BOOL remove_checkboxes)
{
UINT checked = validate_md5sum ? BST_CHECKED : BST_UNCHECKED;
HWND hCtrl = GetDlgItem(hMainDialog, IDC_UEFI_MEDIA_VALIDATION);
// The UEFI validation bootloader cannot apply if we don't write an ISO, or if the ISO is not UEFI bootable
// or if it's a Windows To Go installation or if DD or BIOS/CSM only are enforced.
if ((boot_type != BT_IMAGE) || (!IS_EFI_BOOTABLE(img_report)) || IS_DD_ONLY(img_report) ||
((image_options & IMOP_WINTOGO) && (ComboBox_GetCurItemData(hImageOption) == IMOP_WIN_TO_GO)) ||
((target_type == TT_BIOS) && HAS_WINDOWS(img_report) && (!allow_dual_uefi_bios))) {
enable = FALSE;
}
if (!enable && remove_checkboxes)
CheckDlgButton(hMainDialog, IDC_UEFI_MEDIA_VALIDATION, BST_UNCHECKED);
else
CheckDlgButton(hMainDialog, IDC_UEFI_MEDIA_VALIDATION, checked);
EnableWindow(hCtrl, enable);
}
static void EnableExtendedLabel(BOOL enable, BOOL remove_checkboxes)
@ -846,7 +825,8 @@ static void EnableBootOptions(BOOL enable, BOOL remove_checkboxes)
SetPersistenceSize();
EnableWindow(GetDlgItem(hMainDialog, IDC_PERSISTENCE_SIZE), (persistence_size != 0) && actual_enable);
EnableWindow(GetDlgItem(hMainDialog, IDC_PERSISTENCE_UNITS), (persistence_size != 0) && actual_enable);
EnableMBRBootOptions(actual_enable, remove_checkboxes);
EnableOldBiosFixes(actual_enable, remove_checkboxes);
EnableUefiValidation(actual_enable, remove_checkboxes);
EnableWindow(GetDlgItem(hMainDialog, IDC_LABEL), actual_enable);
if (boot_type == BT_IMAGE) {
@ -1261,7 +1241,8 @@ DWORD WINAPI ImageScanThread(LPVOID param)
const char* redhat8_derivative[] = {
"^AlmaLinux-[8-9].*", // AlmaLinux 8.x and 9.x
"^Fedora.*-3[3-9].*", // Fedora 33-39
"^CentOS.*-[8-9].*", // CentOS and CentOS Stream 8.and 9.x
"^CentOS.*-[8-9].*", // CentOS and CentOS Stream 8.x and 9.x
"^Circle.*-[8-9].*", // Circle Linux 8.x.and 9.x
"^OL-[8-9].*", // Oracle Linux 8.x and 9.x
"^RHEL-[8-9].*", // Red Hat 8.x and 9.x
"^Rocky-[8-9].*", // Rocky Linux 8.x and 9.x
@ -1288,8 +1269,7 @@ DWORD WINAPI ImageScanThread(LPVOID param)
ComboBox_ResetContent(hImageOption);
imop_win_sel = 0;
if ((FormatStatus == (ERROR_SEVERITY_ERROR | FAC(FACILITY_STORAGE) | ERROR_CANCELLED)) ||
(img_report.image_size == 0) ||
if ((ErrorStatus == RUFUS_ERROR(ERROR_CANCELLED)) || (img_report.image_size == 0) ||
(!img_report.is_iso && (img_report.is_bootable_img <= 0) && !img_report.is_windows_img)) {
// Failed to scan image
if (img_report.is_bootable_img < 0)
@ -1301,7 +1281,6 @@ DWORD WINAPI ImageScanThread(LPVOID param)
safe_free(image_path);
SendMessage(hMainDialog, UM_PROGRESS_EXIT, 0, 0);
UpdateImage(FALSE);
SetMBRProps();
PopulateProperties();
PrintInfoDebug(0, MSG_203);
PrintStatus(0, MSG_203);
@ -1375,7 +1354,6 @@ DWORD WINAPI ImageScanThread(LPVOID param)
MessageBoxExU(hMainDialog, lmprintf(MSG_082), lmprintf(MSG_081), MB_OK | MB_ICONINFORMATION | MB_IS_RTL, selected_langid);
PrintStatus(0, MSG_086);
EnableControls(TRUE, FALSE);
SetMBRProps();
} else {
if (!dont_display_image_name) {
for (i = (int)safe_strlen(image_path); (i > 0) && (image_path[i] != '\\'); i--);
@ -1394,7 +1372,6 @@ DWORD WINAPI ImageScanThread(LPVOID param)
SetPartitionSchemeAndTargetSystem(FALSE);
SetFileSystemAndClusterSize(NULL);
SetFSFromISO();
SetMBRProps();
user_changed_label = FALSE;
SetProposedLabel(ComboBox_GetCurSel(hDeviceList));
} else {
@ -1470,7 +1447,7 @@ static DWORD WINAPI BootCheckThread(LPVOID param)
char* iso_image = lmprintf(MSG_036);
char* dd_image = lmprintf(MSG_095);
// If the ISO is small enough to be written as an ESP and we are using GPT add the ISO → ESP option
if ((img_report.projected_size < MAX_ISO_TO_ESP_SIZE * MB) && HAS_REGULAR_EFI(img_report) &&
if ((img_report.projected_size < MAX_ISO_TO_ESP_SIZE) && HAS_REGULAR_EFI(img_report) &&
(partition_type == PARTITION_STYLE_GPT) && IS_FAT(fs_type)) {
char* choices[3] = { lmprintf(MSG_276, iso_image), lmprintf(MSG_277, "ISO → ESP"), lmprintf(MSG_277, dd_image) };
i = SelectionDialog(lmprintf(MSG_274, "ISOHybrid"), lmprintf(MSG_275, iso_image, dd_image, iso_image, dd_image), choices, 3);
@ -1585,58 +1562,51 @@ static DWORD WINAPI BootCheckThread(LPVOID param)
goto out;
}
if ((WindowsVersion.Version >= WINDOWS_8) && IS_WINDOWS_1X(img_report) && (!is_windows_to_go)) {
StrArray options;
int arch = _log2(img_report.has_efi >> 1);
uint16_t map[16] = { 0 }, b = 1;
StrArrayCreate(&options, 10);
if (IS_WINDOWS_11(img_report)) {
StrArrayAdd(&options, lmprintf(MSG_329), TRUE);
MAP_BIT(UNATTEND_SECUREBOOT_TPM_MINRAM);
if (img_report.has_panther_unattend) {
uprintf("NOTICE: A '/sources/$OEM$/$$/Panther/unattend.xml' was detected on the ISO.");
uprintf("As a result, the 'Windows User Experience dialog' will not be displayed.");
} else {
StrArray options;
int arch = _log2(img_report.has_efi >> 1);
uint16_t map[16] = { 0 }, b = 1;
StrArrayCreate(&options, 10);
if (IS_WINDOWS_11(img_report)) {
StrArrayAdd(&options, lmprintf(MSG_329), TRUE);
MAP_BIT(UNATTEND_SECUREBOOT_TPM_MINRAM);
}
if (img_report.win_version.build >= 22500) {
StrArrayAdd(&options, lmprintf(MSG_330), TRUE);
MAP_BIT(UNATTEND_NO_ONLINE_ACCOUNT);
}
StrArrayAdd(&options, lmprintf(MSG_333), TRUE);
username_index = _log2(b);
MAP_BIT(UNATTEND_SET_USER);
StrArrayAdd(&options, lmprintf(MSG_334), TRUE);
MAP_BIT(UNATTEND_DUPLICATE_LOCALE);
StrArrayAdd(&options, lmprintf(MSG_331), TRUE);
MAP_BIT(UNATTEND_NO_DATA_COLLECTION);
StrArrayAdd(&options, lmprintf(MSG_335), TRUE);
MAP_BIT(UNATTEND_DISABLE_BITLOCKER);
if (expert_mode) {
StrArrayAdd(&options, lmprintf(MSG_346), TRUE);
MAP_BIT(UNATTEND_FORCE_S_MODE);
}
i = CustomSelectionDialog(BS_AUTOCHECKBOX, lmprintf(MSG_327), lmprintf(MSG_328),
options.String, options.Index, remap16(unattend_xml_mask, map, FALSE), username_index);
StrArrayDestroy(&options);
if (i < 0)
goto out;
i = remap16(i, map, TRUE);
unattend_xml_path = CreateUnattendXml(arch, i);
// Remember the user preferences for the current session.
unattend_xml_mask &= ~(remap16(0x1ff, map, TRUE));
unattend_xml_mask |= i;
WriteSetting32(SETTING_WUE_OPTIONS, (UNATTEND_DEFAULT_MASK << 16) | unattend_xml_mask);
}
if (img_report.win_version.build >= 22500) {
StrArrayAdd(&options, lmprintf(MSG_330), TRUE);
MAP_BIT(UNATTEND_NO_ONLINE_ACCOUNT);
}
StrArrayAdd(&options, lmprintf(MSG_333), TRUE);
username_index = _log2(b);
MAP_BIT(UNATTEND_SET_USER);
StrArrayAdd(&options, lmprintf(MSG_334), TRUE);
MAP_BIT(UNATTEND_DUPLICATE_LOCALE);
StrArrayAdd(&options, lmprintf(MSG_331), TRUE);
MAP_BIT(UNATTEND_NO_DATA_COLLECTION);
StrArrayAdd(&options, lmprintf(MSG_335), TRUE);
MAP_BIT(UNATTEND_DISABLE_BITLOCKER);
if (expert_mode) {
StrArrayAdd(&options, lmprintf(MSG_346), TRUE);
MAP_BIT(UNATTEND_FORCE_S_MODE);
}
i = CustomSelectionDialog(BS_AUTOCHECKBOX, lmprintf(MSG_327), lmprintf(MSG_328),
options.String, options.Index, remap16(unattend_xml_mask, map, FALSE), username_index);
StrArrayDestroy(&options);
if (i < 0)
goto out;
i = remap16(i, map, TRUE);
unattend_xml_path = CreateUnattendXml(arch, i);
// Remember the user preferences for the current session.
unattend_xml_mask &= ~(remap16(0x1ff, map, TRUE));
unattend_xml_mask |= i;
WriteSetting32(SETTING_WUE_OPTIONS, (UNATTEND_DEFAULT_MASK << 16) | unattend_xml_mask);
}
if ((img_report.projected_size < MAX_ISO_TO_ESP_SIZE * MB) && HAS_REGULAR_EFI(img_report) &&
(partition_type == PARTITION_STYLE_GPT) && IS_FAT(fs_type) && !esp_already_asked) {
// The ISO is small enough to be written as an ESP and we are using GPT
// so ask the users if they want to write it as an ESP.
char* iso_image = lmprintf(MSG_036);
char* choices[2] = { lmprintf(MSG_276, iso_image), lmprintf(MSG_277, "ISO → ESP") };
i = SelectionDialog(lmprintf(MSG_274, "ESP"), lmprintf(MSG_310), choices, 2);
if (i < 0) // Cancel
goto out;
write_as_esp = (i & 2);
}
// Check UEFI bootloaders for revocation
if (target_type == TT_UEFI) {
if (IS_EFI_BOOTABLE(img_report)) {
// coverity[swapped_arguments]
if (GetTempFileNameU(temp_dir, APPLICATION_NAME, 0, tmp) != 0) {
// ExtractISOFile() is case sensitive, so we must use
@ -1660,6 +1630,18 @@ static DWORD WINAPI BootCheckThread(LPVOID param)
}
}
if ((img_report.projected_size < MAX_ISO_TO_ESP_SIZE) && HAS_REGULAR_EFI(img_report) &&
(partition_type == PARTITION_STYLE_GPT) && IS_FAT(fs_type) && !esp_already_asked) {
// The ISO is small enough to be written as an ESP and we are using GPT
// so ask the users if they want to write it as an ESP.
char* iso_image = lmprintf(MSG_036);
char* choices[2] = { lmprintf(MSG_276, iso_image), lmprintf(MSG_277, "ISO → ESP") };
i = SelectionDialog(lmprintf(MSG_274, "ESP"), lmprintf(MSG_310), choices, 2);
if (i < 0) // Cancel
goto out;
write_as_esp = (i & 2);
}
// If the selected target doesn't include BIOS, skip file downloads for GRUB/Syslinux
if (target_type != TT_BIOS)
goto uefi_target;
@ -1731,7 +1713,7 @@ static DWORD WINAPI BootCheckThread(LPVOID param)
if ((partition_type == PARTITION_STYLE_MBR) && HAS_SYSLINUX(img_report)) {
if (SL_MAJOR(img_report.sl_version) < 5) {
IGNORE_RETVAL(_chdirU(app_data_dir));
for (i=0; i<NB_OLD_C32; i++) {
for (i = 0; i<NB_OLD_C32; i++) {
if (img_report.has_old_c32[i]) {
if (!in_files_dir) {
IGNORE_RETVAL(_mkdir(FILES_DIR));
@ -1975,7 +1957,6 @@ static void InitDialog(HWND hDlg)
hImageOption = GetDlgItem(hDlg, IDC_IMAGE_OPTION);
hSelectImage = GetDlgItem(hDlg, IDC_SELECT);
hNBPasses = GetDlgItem(hDlg, IDC_NB_PASSES);
hDiskID = GetDlgItem(hDlg, IDC_DISK_ID);
hStart = GetDlgItem(hDlg, IDC_START);
// Convert the main button labels to uppercase
@ -2004,7 +1985,6 @@ static void InitDialog(HWND hDlg)
// Set some missing labels
SetAccessibleName(hNBPasses, lmprintf(MSG_316));
SetAccessibleName(hDiskID, lmprintf(MSG_317));
// Create the font and brush for the progress messages
hInfoFont = CreateFontA(lfHeight, 0, 0, 0, FW_NORMAL, FALSE, FALSE, FALSE, DEFAULT_CHARSET,
@ -2057,7 +2037,7 @@ static void InitDialog(HWND hDlg)
len = 0;
buf = (char*)GetResource(hMainInstance, resource[i], _RT_RCDATA, "ldlinux_sys", &len, TRUE);
if (buf == NULL) {
uprintf("Warning: could not read embedded Syslinux v%d version", i+4);
uprintf("Warning: could not read embedded Syslinux v%d version", i + 4);
} else {
embedded_sl_version[i] = GetSyslinuxVersion(buf, len, &ext);
static_sprintf(embedded_sl_version_str[i], "%d.%02d", SL_MAJOR(embedded_sl_version[i]), SL_MINOR(embedded_sl_version[i]));
@ -2102,13 +2082,6 @@ static void InitDialog(HWND hDlg)
// Fill up the boot options dropdown
SetBootOptions();
// Fill up the MBR masqueraded disk IDs ("8 disks should be enough for anybody")
IGNORE_RETVAL(ComboBox_SetItemData(hDiskID, ComboBox_AddStringU(hDiskID, lmprintf(MSG_030, LEFT_TO_RIGHT_EMBEDDING "0x80" POP_DIRECTIONAL_FORMATTING)), 0x80));
for (i=1; i<=7; i++) {
IGNORE_RETVAL(ComboBox_SetItemData(hDiskID, ComboBox_AddStringU(hDiskID, lmprintf(MSG_109, 0x80+i, i+1)), 0x80+i));
}
IGNORE_RETVAL(ComboBox_SetCurSel(hDiskID, 0));
// Create the string arrays
StrArrayCreate(&BlockingProcessList, 16);
StrArrayCreate(&ImageList, 16);
@ -2138,8 +2111,7 @@ static void InitDialog(HWND hDlg)
CreateTooltip(hBootType, lmprintf(MSG_164), -1);
CreateTooltip(hSelectImage, lmprintf(MSG_165), -1);
CreateTooltip(GetDlgItem(hDlg, IDC_EXTENDED_LABEL), lmprintf(MSG_166), 10000);
CreateTooltip(GetDlgItem(hDlg, IDC_RUFUS_MBR), lmprintf(MSG_167), 10000);
CreateTooltip(hDiskID, lmprintf(MSG_168), 10000);
CreateTooltip(GetDlgItem(hDlg, IDC_UEFI_MEDIA_VALIDATION), lmprintf(MSG_167), 10000);
CreateTooltip(GetDlgItem(hDlg, IDC_OLD_BIOS_FIXES), lmprintf(MSG_169), -1);
CreateTooltip(GetDlgItem(hDlg, IDC_LIST_USB_HDD), lmprintf(MSG_170), -1);
CreateTooltip(hStart, lmprintf(MSG_171), -1);
@ -2240,7 +2212,7 @@ static INT_PTR CALLBACK MainCallback(HWND hDlg, UINT message, WPARAM wParam, LPA
MB_YESNO|MB_ICONWARNING|MB_IS_RTL, selected_langid) == IDYES)) {
// Operation may have completed in the meantime
if (format_thread != NULL) {
FormatStatus = ERROR_SEVERITY_ERROR|FAC(FACILITY_STORAGE)|ERROR_CANCELLED;
ErrorStatus = RUFUS_ERROR(ERROR_CANCELLED);
PrintInfo(0, MSG_201);
uprintf("Cancelling");
// Start a timer to detect blocking operations during ISO file extraction
@ -2256,7 +2228,7 @@ static INT_PTR CALLBACK MainCallback(HWND hDlg, UINT message, WPARAM wParam, LPA
return (INT_PTR)TRUE;
} else if (op_in_progress) {
// User might be trying to cancel during preliminary checks
FormatStatus = ERROR_SEVERITY_ERROR|FAC(FACILITY_STORAGE)|ERROR_CANCELLED;
ErrorStatus = RUFUS_ERROR(ERROR_CANCELLED);
PrintInfo(0, MSG_201);
EnableWindow(GetDlgItem(hDlg, IDCANCEL), TRUE);
return (INT_PTR)TRUE;
@ -2393,6 +2365,7 @@ static INT_PTR CALLBACK MainCallback(HWND hDlg, UINT message, WPARAM wParam, LPA
break;
SetFileSystemAndClusterSize(NULL);
imop_win_sel = ComboBox_GetCurSel(hImageOption);
EnableUefiValidation((imop_win_sel == 0), TRUE);
break;
case IDC_PERSISTENCE_SIZE:
if (HIWORD(wParam) == EN_CHANGE) {
@ -2462,6 +2435,7 @@ static INT_PTR CALLBACK MainCallback(HWND hDlg, UINT message, WPARAM wParam, LPA
target_type = (int)ComboBox_GetCurItemData(hTargetSystem);
SendMessage(hMainDialog, UM_UPDATE_CSM_TOOLTIP, 0, 0);
SetFileSystemAndClusterSize(NULL);
EnableUefiValidation(TRUE, TRUE);
break;
case IDC_PARTITION_TYPE:
if (HIWORD(wParam) != CBN_SELCHANGE)
@ -2469,8 +2443,8 @@ static INT_PTR CALLBACK MainCallback(HWND hDlg, UINT message, WPARAM wParam, LPA
partition_type = (int)ComboBox_GetCurItemData(hPartitionScheme);
SetPartitionSchemeAndTargetSystem(TRUE);
SetFileSystemAndClusterSize(NULL);
SetMBRProps();
EnableMBRBootOptions(TRUE, TRUE);
EnableOldBiosFixes(TRUE, TRUE);
EnableUefiValidation(TRUE, TRUE);
selected_pt = partition_type;
break;
case IDC_FILE_SYSTEM:
@ -2483,8 +2457,7 @@ static INT_PTR CALLBACK MainCallback(HWND hDlg, UINT message, WPARAM wParam, LPA
selected_fs = fs_type;
// Some FS's (such as ReFS or Large FAT32) only have QuickFormat so make sure we reflect that
EnableQuickFormat(TRUE, TRUE);
EnableMBRBootOptions(TRUE, TRUE);
SetMBRProps();
EnableOldBiosFixes(TRUE, TRUE);
EnableExtendedLabel(TRUE, TRUE);
break;
case IDC_BOOT_SELECTION:
@ -2511,17 +2484,10 @@ static INT_PTR CALLBACK MainCallback(HWND hDlg, UINT message, WPARAM wParam, LPA
// For now only zip archives are supported.
if (GetKeyState(VK_CONTROL) & 0x8000) {
EXT_DECL(arch_ext, NULL, __VA_GROUP__("*.zip"), __VA_GROUP__(lmprintf(MSG_309)));
if (image_path == NULL)
break;
archive_path = FileDialog(FALSE, NULL, &arch_ext, NULL);
if (archive_path != NULL) {
struct __stat64 stat64 = { 0 };
_stat64U(archive_path, &stat64);
img_report.projected_size -= img_report.archive_size;
img_report.archive_size = stat64.st_size;
img_report.projected_size += img_report.archive_size;
uprintf("Using archive: %s (%s)", _filenameU(archive_path),
SizeToHumanReadable(img_report.archive_size, FALSE, FALSE));
SizeToHumanReadable(_filesizeU(archive_path), FALSE, FALSE));
}
break;
}
@ -2555,16 +2521,18 @@ static INT_PTR CALLBACK MainCallback(HWND hDlg, UINT message, WPARAM wParam, LPA
free(old_image_path);
}
}
FormatStatus = 0;
ErrorStatus = 0;
if (CreateThread(NULL, 0, ImageScanThread, NULL, 0, NULL) == NULL) {
uprintf("Unable to start ISO scanning thread");
FormatStatus = ERROR_SEVERITY_ERROR | FAC(FACILITY_STORAGE) | APPERR(ERROR_CANT_START_THREAD);
ErrorStatus = RUFUS_ERROR(APPERR(ERROR_CANT_START_THREAD));
}
}
break;
case IDC_RUFUS_MBR:
if ((HIWORD(wParam)) == BN_CLICKED)
mbr_selected_by_user = IsChecked(IDC_RUFUS_MBR);
case IDC_UEFI_MEDIA_VALIDATION:
if ((HIWORD(wParam)) == BN_CLICKED) {
validate_md5sum = IsChecked(IDC_UEFI_MEDIA_VALIDATION);
WriteSettingBool(SETTING_ENABLE_RUNTIME_VALIDATION, validate_md5sum);
}
break;
case IDC_LIST_USB_HDD:
if ((HIWORD(wParam)) == BN_CLICKED) {
@ -2586,7 +2554,7 @@ static INT_PTR CALLBACK MainCallback(HWND hDlg, UINT message, WPARAM wParam, LPA
unattend_xml_flags = 0;
// Disable all controls except Cancel
EnableControls(FALSE, FALSE);
FormatStatus = 0;
ErrorStatus = 0;
LastWriteError = 0;
StrArrayClear(&BlockingProcessList);
no_confirmation_on_cancel = FALSE;
@ -2596,7 +2564,7 @@ static INT_PTR CALLBACK MainCallback(HWND hDlg, UINT message, WPARAM wParam, LPA
// On exit, this thread sends message UM_FORMAT_START back to this dialog.
if (CreateThread(NULL, 0, BootCheckThread, NULL, 0, NULL) == NULL) {
uprintf("Unable to start boot check thread");
FormatStatus = ERROR_SEVERITY_ERROR | FAC(FACILITY_STORAGE) | APPERR(ERROR_CANT_START_THREAD);
ErrorStatus = RUFUS_ERROR(APPERR(ERROR_CANT_START_THREAD));
PostMessage(hMainDialog, UM_FORMAT_COMPLETED, (WPARAM)FALSE, 0);
}
break;
@ -2613,7 +2581,7 @@ static INT_PTR CALLBACK MainCallback(HWND hDlg, UINT message, WPARAM wParam, LPA
case IDC_HASH:
// TODO: Move this as a fn call in hash.c?
if ((format_thread == NULL) && (image_path != NULL)) {
FormatStatus = 0;
ErrorStatus = 0;
no_confirmation_on_cancel = TRUE;
SendMessage(hMainDialog, UM_PROGRESS_INIT, 0, 0);
// Disable all controls except cancel
@ -2627,7 +2595,7 @@ static INT_PTR CALLBACK MainCallback(HWND hDlg, UINT message, WPARAM wParam, LPA
SendMessage(hMainDialog, UM_TIMER_START, 0, 0);
} else {
uprintf("Unable to start hash thread");
FormatStatus = ERROR_SEVERITY_ERROR | FAC(FACILITY_STORAGE) | APPERR(ERROR_CANT_START_THREAD);
ErrorStatus = RUFUS_ERROR(APPERR(ERROR_CANT_START_THREAD));
PostMessage(hMainDialog, UM_FORMAT_COMPLETED, (WPARAM)FALSE, 0);
}
}
@ -2651,9 +2619,9 @@ static INT_PTR CALLBACK MainCallback(HWND hDlg, UINT message, WPARAM wParam, LPA
break;
case UM_ENABLE_CONTROLS:
KillTimer(hMainDialog, TID_APP_TIMER);
if (!IS_ERROR(FormatStatus))
if (!IS_ERROR(ErrorStatus))
PrintInfo(0, MSG_210);
else switch (SCODE_CODE(FormatStatus)) {
else switch (SCODE_CODE(ErrorStatus)) {
case ERROR_CANCELLED:
PrintInfo(0, MSG_211);
break;
@ -2936,9 +2904,9 @@ static INT_PTR CALLBACK MainCallback(HWND hDlg, UINT message, WPARAM wParam, LPA
if (isMarquee) {
SendMessage(hProgress, PBM_SETMARQUEE, FALSE, 0);
SetTaskbarProgressValue(0, MAX_PROGRESS);
} else if (!IS_ERROR(FormatStatus)) {
} else if (!IS_ERROR(ErrorStatus)) {
SetTaskbarProgressValue(MAX_PROGRESS, MAX_PROGRESS);
} else if (SCODE_CODE(FormatStatus) == ERROR_CANCELLED) {
} else if (SCODE_CODE(ErrorStatus) == ERROR_CANCELLED) {
tb_state = PBST_PAUSED;
tb_flags = TASKBAR_PAUSED;
} else {
@ -2986,6 +2954,7 @@ static INT_PTR CALLBACK MainCallback(HWND hDlg, UINT message, WPARAM wParam, LPA
// Detect processes that have write (0x2) or exec (0x4) permissions against our drive.
// Ideally, exec should be no big deal, but Windows complains on USB ejection if a
// process such as cmd.exe holds exec rights, so we follow suit.
PrintStatus(0, MSG_278);
if (GetProcessSearch(SEARCH_PROCESS_TIMEOUT, 0x06, TRUE)) {
char title[128];
ComboBox_GetTextU(hDeviceList, title, sizeof(title));
@ -3011,7 +2980,7 @@ static INT_PTR CALLBACK MainCallback(HWND hDlg, UINT message, WPARAM wParam, LPA
format_thread = CreateThread(NULL, 0, FormatThread, (LPVOID)(uintptr_t)DeviceNum, 0, NULL);
if (format_thread == NULL) {
uprintf("Unable to start formatting thread");
FormatStatus = ERROR_SEVERITY_ERROR | FAC(FACILITY_STORAGE) | APPERR(ERROR_CANT_START_THREAD);
ErrorStatus = RUFUS_ERROR(APPERR(ERROR_CANT_START_THREAD));
PostMessage(hMainDialog, UM_FORMAT_COMPLETED, (WPARAM)FALSE, 0);
} else {
SetThreadPriority(format_thread, default_thread_priority);
@ -3034,8 +3003,7 @@ static INT_PTR CALLBACK MainCallback(HWND hDlg, UINT message, WPARAM wParam, LPA
EnableControls(TRUE, FALSE);
break;
}
FormatStatus = ERROR_SEVERITY_ERROR | FAC(FACILITY_STORAGE) |
((wParam == BOOTCHECK_DOWNLOAD_ERROR) ? APPERR(ERROR_CANT_DOWNLOAD) : ERROR_GEN_FAILURE);
ErrorStatus = RUFUS_ERROR((wParam == BOOTCHECK_DOWNLOAD_ERROR) ? APPERR(ERROR_CANT_DOWNLOAD) : ERROR_GEN_FAILURE);
// Fall through
case UM_FORMAT_COMPLETED:
@ -3056,13 +3024,13 @@ static INT_PTR CALLBACK MainCallback(HWND hDlg, UINT message, WPARAM wParam, LPA
uprintf("\r\n");
GetDevices(DeviceNum);
}
if (!IS_ERROR(FormatStatus)) {
if (!IS_ERROR(ErrorStatus)) {
SendMessage(hProgress, PBM_SETPOS, MAX_PROGRESS, 0);
SetTaskbarProgressState(TASKBAR_NOPROGRESS);
PrintInfo(0, MSG_210);
MessageBeep(MB_OK);
FlashTaskbar(dialog_handle);
} else if (SCODE_CODE(FormatStatus) == ERROR_CANCELLED) {
} else if (SCODE_CODE(ErrorStatus) == ERROR_CANCELLED) {
SendMessage(hProgress, PBM_SETSTATE, (WPARAM)PBST_PAUSED, 0);
SetTaskbarProgressState(TASKBAR_PAUSED);
PrintInfo(0, MSG_211);
@ -3086,7 +3054,7 @@ static INT_PTR CALLBACK MainCallback(HWND hDlg, UINT message, WPARAM wParam, LPA
"If (Get-Command -Commandtype Function Get-MpPreference -ErrorAction SilentlyContinue) { Exit 1 } Else { Exit 0 }",
// Return 1 if Controlled Folder Access is enabled
"Exit (Get-MpPreference).EnableControlledFolderAccess" };
switch (SCODE_CODE(FormatStatus)) {
switch (SCODE_CODE(ErrorStatus)) {
case ERROR_PARTITION_FAILURE:
case ERROR_WRITE_FAULT:
// Find if PowerShell is available at its expected location
@ -3106,7 +3074,7 @@ static INT_PTR CALLBACK MainCallback(HWND hDlg, UINT message, WPARAM wParam, LPA
break;
}
}
if (SCODE_CODE(FormatStatus) == ERROR_NOT_READY) {
if (SCODE_CODE(ErrorStatus) == ERROR_NOT_READY) {
// A port cycle usually helps with a device not ready
int index = ComboBox_GetCurSel(hDeviceList);
if (index >= 0) {
@ -3114,10 +3082,10 @@ static INT_PTR CALLBACK MainCallback(HWND hDlg, UINT message, WPARAM wParam, LPA
CyclePort(index);
}
}
Notification(MSG_ERROR, NULL, NULL, lmprintf(MSG_042), lmprintf(MSG_043, StrError(FormatStatus, FALSE)));
Notification(MSG_ERROR, NULL, NULL, lmprintf(MSG_042), lmprintf(MSG_043, StrError(ErrorStatus, FALSE)));
}
}
FormatStatus = 0;
ErrorStatus = 0;
LastWriteError = 0;
return (INT_PTR)TRUE;
@ -3291,7 +3259,7 @@ int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine
static_strcpy(cur_dir, ".\\");
} else {
// Need to remove the '\\?\' prefix and reappend the trailing '\'
strcpy(cur_dir, &cur_dir[4]);
static_strcpy(cur_dir, &cur_dir[4]);
static_strcat(cur_dir, "\\");
}
safe_closehandle(hFile);
@ -3316,7 +3284,7 @@ int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine
static_strcpy(temp_dir, cur_dir);
} else {
// Need to remove the '\\?\' prefix or else we'll get issues with the Fido icon
strcpy(temp_dir, &temp_dir[4]);
static_strcpy(temp_dir, &temp_dir[4]);
// And me must re-append the '\' that gets removed by GetFinalPathNameByHandle()
static_strcat(temp_dir, "\\");
}
@ -3525,6 +3493,8 @@ skip_args_processing:
use_vds = ReadSettingBool(SETTING_USE_VDS) && is_vds_available;
usb_debug = ReadSettingBool(SETTING_ENABLE_USB_DEBUG);
cdio_loglevel_default = usb_debug ? CDIO_LOG_DEBUG : CDIO_LOG_WARN;
use_rufus_mbr = !ReadSettingBool(SETTING_DISABLE_RUFUS_MBR);
validate_md5sum = ReadSettingBool(SETTING_ENABLE_RUNTIME_VALIDATION);
detect_fakes = !ReadSettingBool(SETTING_DISABLE_FAKE_DRIVES_CHECK);
allow_dual_uefi_bios = ReadSettingBool(SETTING_ENABLE_WIN_DUAL_EFI_BIOS);
force_large_fat32 = ReadSettingBool(SETTING_FORCE_LARGE_FAT32_FORMAT);
@ -3733,7 +3703,7 @@ relaunch:
while(GetMessage(&msg, NULL, 0, 0)) {
static BOOL ctrl_without_focus = FALSE;
BOOL no_focus = (msg.message == WM_SYSKEYDOWN) && !(msg.lParam & 0x20000000);
// ** ***************************
// ******************************
// .,ABCDEFGHIJKLMNOPQRSTUVWXYZ+-
// Sigh... The things one need to do to detect standalone use of the 'Alt' key.
@ -3825,6 +3795,13 @@ extern int TestHashes(void);
PrintStatusTimeout(lmprintf(MSG_282), lock_drive);
continue;
}
// Alt-A => Toggle use of Rufus MBR for Windows boot
if ((msg.message == WM_SYSKEYDOWN) && (msg.wParam == 'A')) {
use_rufus_mbr = !use_rufus_mbr;
WriteSettingBool(SETTING_DISABLE_RUFUS_MBR, !use_rufus_mbr);
PrintStatusTimeout(lmprintf(MSG_349), use_rufus_mbr);
continue;
}
// Alt-B => Toggle fake drive detection during bad blocks check
// By default, Rufus will check for fake USB flash drives that mistakenly present
// more capacity than they already have by looping over the flash. This check which
@ -3847,7 +3824,7 @@ extern int TestHashes(void);
if ((msg.message == WM_SYSKEYDOWN) && (msg.wParam == 'D')) {
static_sprintf(tmp_path, "%s\\%s", app_data_dir, FILES_DIR);
PrintStatusDebug(STATUS_MSG_TIMEOUT, MSG_264, tmp_path);
SHDeleteDirectoryExU(NULL, tmp_path, FOF_SILENT | FOF_NOERRORUI | FOF_NOCONFIRMATION);
SHDeleteDirectoryExU(NULL, tmp_path, FOF_NO_UI);
user_deleted_rufus_dir = TRUE;
continue;
}

View File

@ -25,10 +25,18 @@
#pragma warning(disable: 6258) // I know what I'm using TerminateThread for
#pragma warning(disable: 26451) // Stop bugging me with casts already!
#pragma warning(disable: 28159) // I'll keep using GetVersionEx(), thank you very much...
// Enable C11's _Static_assert (requires VS2015 or later)
#define _Static_assert static_assert
#endif
#pragma once
/* Convenient to have around */
#define KB 1024LL
#define MB 1048576LL
#define GB 1073741824LL
#define TB 1099511627776LL
/*
* Features not ready for prime time and that may *DESTROY* your data - USE AT YOUR OWN RISKS!
*/
@ -60,9 +68,9 @@
#define DRIVE_ACCESS_RETRIES 150 // How many times we should retry
#define DRIVE_INDEX_MIN 0x00000080
#define DRIVE_INDEX_MAX 0x000000C0
#define MIN_DRIVE_SIZE 8 // Minimum size a drive must have, to be formattable (in MB)
#define MIN_EXTRA_PART_SIZE (1024*1024) // Minimum size of the extra partition, in bytes
#define MIN_EXT_SIZE (256*1024*1024) // Minimum size we allow for ext formatting
#define MIN_DRIVE_SIZE (8 * MB) // Minimum size a drive must have, to be formattable
#define MIN_EXTRA_PART_SIZE (1 * MB) // Minimum size of the extra partition, in bytes
#define MIN_EXT_SIZE (256 * MB) // Minimum size we allow for ext formatting
#define MAX_DRIVES (DRIVE_INDEX_MAX - DRIVE_INDEX_MIN)
#define MAX_TOOLTIPS 128
#define MAX_SIZE_SUFFIXES 6 // bytes, KB, MB, GB, TB, PB
@ -76,8 +84,8 @@
#define MAX_PARTITIONS 16 // Maximum number of partitions we handle
#define MAX_ESP_TOGGLE 8 // Maximum number of entries we record to toggle GPT ESP back and forth
#define MAX_IGNORE_USB 8 // Maximum number of USB drives we want to ignore
#define MAX_ISO_TO_ESP_SIZE 1024 // Maximum size we allow for the ISO → ESP option (in MB)
#define MAX_DEFAULT_LIST_CARD_SIZE 200 // Size above which we don't list a card without enable HDD or Alt-F (in GB)
#define MAX_ISO_TO_ESP_SIZE (1 * GB) // Maximum size we allow for the ISO → ESP option
#define MAX_DEFAULT_LIST_CARD_SIZE (500 * GB) // Size above which we don't list a card without enable HDD or Alt-F
#define MAX_SECTORS_TO_CLEAR 128 // nb sectors to zap when clearing the MBR/GPT (must be >34)
#define MAX_USERNAME_LENGTH 128 // Maximum size we'll accept for a WUE specified username
#define MAX_WININST 4 // Max number of install[.wim|.esd] we can handle on an image
@ -98,14 +106,15 @@
#define BADBLOCK_PATTERN_SLC {0x00, 0xff, 0x55, 0xaa}
#define BADCLOCK_PATTERN_MLC {0x00, 0xff, 0x33, 0xcc}
#define BADBLOCK_PATTERN_TLC {0x00, 0xff, 0x1c71c7, 0xe38e38}
#define BADBLOCK_BLOCK_SIZE (512 * 1024)
#define LARGE_FAT32_SIZE (32 * 1073741824LL) // Size at which we need to use fat32format
#define BADBLOCK_BLOCK_SIZE (512 * KB)
#define LARGE_FAT32_SIZE (32 * GB) // Size at which we need to use fat32format
#define UDF_FORMAT_SPEED 3.1f // Speed estimate at which we expect UDF drives to be formatted (GB/s)
#define UDF_FORMAT_WARN 20 // Duration (in seconds) above which we warn about long UDF formatting times
#define MAX_FAT32_SIZE 2.0f // Threshold above which we disable FAT32 formatting (in TB)
#define MAX_FAT32_SIZE (2 * TB) // Threshold above which we disable FAT32 formatting
#define FAT32_CLUSTER_THRESHOLD 1.011f // For FAT32, cluster size changes don't occur at power of 2 boundaries but slightly above
#define DD_BUFFER_SIZE (32 * 1024 * 1024) // Minimum size of buffer to use for DD operations
#define DD_BUFFER_SIZE (32 * MB) // Minimum size of buffer to use for DD operations
#define UBUFFER_SIZE 4096
#define ISO_BUFFER_SIZE (64 * KB) // Buffer size used for ISO data extraction
#define RSA_SIGNATURE_SIZE 256
#define CBN_SELCHANGE_INTERNAL (CBN_SELCHANGE + 256)
#if defined(RUFUS_TEST)
@ -137,35 +146,36 @@
#define PERCENTAGE(percent, value) ((1ULL * (percent) * (value)) / 100ULL)
#define IsChecked(CheckBox_ID) (IsDlgButtonChecked(hMainDialog, CheckBox_ID) == BST_CHECKED)
#define MB_IS_RTL (right_to_left_mode?MB_RTLREADING|MB_RIGHT:0)
#define CHECK_FOR_USER_CANCEL if (IS_ERROR(FormatStatus) && (SCODE_CODE(FormatStatus) == ERROR_CANCELLED)) goto out
#define CHECK_FOR_USER_CANCEL if (IS_ERROR(ErrorStatus) && (SCODE_CODE(ErrorStatus) == ERROR_CANCELLED)) goto out
// Bit masks used for the display of additional image options in the UI
#define IMOP_WINTOGO 0x01
#define IMOP_PERSISTENCE 0x02
#define ComboBox_GetCurItemData(hCtrl) ComboBox_GetItemData(hCtrl, ComboBox_GetCurSel(hCtrl))
#define safe_free(p) do {free((void*)p); p = NULL;} while(0)
#define safe_mm_free(p) do {_mm_free((void*)p); p = NULL;} while(0)
#define safe_min(a, b) min((size_t)(a), (size_t)(b))
#define safe_strcp(dst, dst_max, src, count) do {memcpy(dst, src, safe_min(count, dst_max)); \
((char*)(dst))[safe_min(count, dst_max)-1] = 0;} while(0)
#define safe_strcpy(dst, dst_max, src) safe_strcp(dst, dst_max, src, safe_strlen(src)+1)
#define safe_free(p) do { free((void*)p); p = NULL; } while(0)
#define safe_mm_free(p) do { _mm_free((void*)p); p = NULL; } while(0)
static __inline void safe_strcp(char* dst, const size_t dst_max, const char* src, const size_t count) {
memmove(dst, src, min(count, dst_max));
dst[min(count, dst_max) - 1] = 0;
}
#define safe_strcpy(dst, dst_max, src) safe_strcp(dst, dst_max, src, safe_strlen(src) + 1)
#define static_strcpy(dst, src) safe_strcpy(dst, sizeof(dst), src)
#define safe_strncat(dst, dst_max, src, count) strncat(dst, src, safe_min(count, (dst_max) - safe_strlen(dst) - 1))
#define safe_strcat(dst, dst_max, src) safe_strncat(dst, dst_max, src, safe_strlen(src)+1)
#define safe_strcat(dst, dst_max, src) strncat_s(dst, dst_max, src, _TRUNCATE)
#define static_strcat(dst, src) safe_strcat(dst, sizeof(dst), src)
#define safe_strcmp(str1, str2) strcmp(((str1==NULL)?"<NULL>":str1), ((str2==NULL)?"<NULL>":str2))
#define safe_strstr(str1, str2) strstr(((str1==NULL)?"<NULL>":str1), ((str2==NULL)?"<NULL>":str2))
#define safe_stricmp(str1, str2) _stricmp(((str1==NULL)?"<NULL>":str1), ((str2==NULL)?"<NULL>":str2))
#define safe_strncmp(str1, str2, count) strncmp(((str1==NULL)?"<NULL>":str1), ((str2==NULL)?"<NULL>":str2), count)
#define safe_strnicmp(str1, str2, count) _strnicmp(((str1==NULL)?"<NULL>":str1), ((str2==NULL)?"<NULL>":str2), count)
#define safe_closehandle(h) do {if ((h != INVALID_HANDLE_VALUE) && (h != NULL)) {CloseHandle(h); h = INVALID_HANDLE_VALUE;}} while(0)
#define safe_release_dc(hDlg, hDC) do {if ((hDC != INVALID_HANDLE_VALUE) && (hDC != NULL)) {ReleaseDC(hDlg, hDC); hDC = NULL;}} while(0)
#define safe_sprintf(dst, count, ...) do {_snprintf(dst, count, __VA_ARGS__); (dst)[(count)-1] = 0; } while(0)
#define safe_strcmp(str1, str2) strcmp(((str1 == NULL) ? "<NULL>" : str1), ((str2 == NULL) ? "<NULL>" : str2))
#define safe_strstr(str1, str2) strstr(((str1 == NULL) ? "<NULL>" : str1), ((str2 == NULL) ? "<NULL>" : str2))
#define safe_stricmp(str1, str2) _stricmp(((str1 == NULL) ? "<NULL>" : str1), ((str2 == NULL) ? "<NULL>" : str2))
#define safe_strncmp(str1, str2, count) strncmp(((str1 == NULL) ? "<NULL>" : str1), ((str2 == NULL) ? "<NULL>" : str2), count)
#define safe_strnicmp(str1, str2, count) _strnicmp(((str1 == NULL) ? "<NULL>" : str1), ((str2 == NULL) ? "<NULL>" : str2), count)
#define safe_closehandle(h) do { if ((h != INVALID_HANDLE_VALUE) && (h != NULL)) { CloseHandle(h); h = INVALID_HANDLE_VALUE; } } while(0)
#define safe_release_dc(hDlg, hDC) do { if ((hDC != INVALID_HANDLE_VALUE) && (hDC != NULL)) { ReleaseDC(hDlg, hDC); hDC = NULL; } } while(0)
#define safe_sprintf(dst, count, ...) do { size_t _count = count; char* _dst = dst; _snprintf_s(_dst, _count, _TRUNCATE, __VA_ARGS__); \
_dst[(_count) - 1] = 0; } while(0)
#define static_sprintf(dst, ...) safe_sprintf(dst, sizeof(dst), __VA_ARGS__)
#define safe_atoi(str) ((((char*)(str))==NULL)?0:atoi(str))
#define safe_strlen(str) ((((char*)(str))==NULL)?0:strlen(str))
#define safe_strdup(str) ((((char*)(str))==NULL)?NULL:_strdup(str))
#define safe_atoi(str) ((((char*)(str))==NULL) ? 0 : atoi(str))
#define safe_strlen(str) ((((char*)(str))==NULL) ? 0 : strlen(str))
#define safe_strdup(str) ((((char*)(str))==NULL) ? NULL : _strdup(str))
#if defined(_MSC_VER)
#define safe_vsnprintf(buf, size, format, arg) _vsnprintf_s(buf, size, _TRUNCATE, format, arg)
#else
@ -260,6 +270,7 @@ enum action_type {
OP_FILE_COPY,
OP_PATCH,
OP_FINALIZE,
OP_EXTRACT_ZIP,
OP_MAX
};
@ -307,14 +318,6 @@ enum image_option_type {
IMOP_MAX
};
enum hash_type {
HASH_MD5 = 0,
HASH_SHA1,
HASH_SHA256,
HASH_SHA512,
HASH_MAX
};
enum file_io_type {
FILE_IO_READ = 0,
FILE_IO_WRITE,
@ -388,7 +391,6 @@ typedef struct {
char efi_boot_path[ARCH_MAX][30]; // paths of detected UEFI bootloaders
char efi_img_path[128]; // path to an efi.img file
uint64_t image_size;
uint64_t archive_size;
uint64_t projected_size;
int64_t mismatch_size;
uint32_t wininst_version;
@ -415,6 +417,7 @@ typedef struct {
BOOLEAN has_grub4dos;
uint8_t has_grub2;
BOOLEAN has_compatresources_dll;
BOOLEAN has_panther_unattend;
BOOLEAN has_kolibrios;
BOOLEAN needs_syslinux_overwrite;
BOOLEAN needs_ntfs;
@ -481,6 +484,51 @@ typedef struct {
uint32_t* address; // 32-bit will do, as we're not dealing with >4GB DLLs...
} dll_resolver_t;
/* Alignment macro */
#if defined(__GNUC__)
#define ALIGNED(m) __attribute__ ((__aligned__(m)))
#elif defined(_MSC_VER)
#define ALIGNED(m) __declspec(align(m))
#endif
/* Hash definitions */
enum hash_type {
HASH_MD5 = 0,
HASH_SHA1,
HASH_SHA256,
HASH_SHA512,
HASH_MAX
};
/* Blocksize for each hash algorithm - Must be a power of 2 */
#define MD5_BLOCKSIZE 64
#define SHA1_BLOCKSIZE 64
#define SHA256_BLOCKSIZE 64
#define SHA512_BLOCKSIZE 128
#define MAX_BLOCKSIZE SHA512_BLOCKSIZE
/* Hashsize for each hash algorithm */
#define MD5_HASHSIZE 16
#define SHA1_HASHSIZE 20
#define SHA256_HASHSIZE 32
#define SHA512_HASHSIZE 64
#define MAX_HASHSIZE SHA512_HASHSIZE
/* Context for the hash algorithms */
typedef struct ALIGNED(64) {
uint8_t buf[MAX_BLOCKSIZE];
uint64_t state[8];
uint64_t bytecount;
} HASH_CONTEXT;
/* Hash functions */
typedef void hash_init_t(HASH_CONTEXT* ctx);
typedef void hash_write_t(HASH_CONTEXT* ctx, const uint8_t* buf, size_t len);
typedef void hash_final_t(HASH_CONTEXT* ctx);
extern hash_init_t* hash_init[HASH_MAX];
extern hash_write_t* hash_write[HASH_MAX];
extern hash_final_t* hash_final[HASH_MAX];
#ifndef __VA_GROUP__
#define __VA_GROUP__(...) __VA_ARGS__
#endif
@ -585,6 +633,35 @@ typedef struct {
#define UNATTEND_OFFLINE_SERVICING_MASK (UNATTEND_OFFLINE_INTERNAL_DRIVES | UNATTEND_FORCE_S_MODE)
#define UNATTEND_DEFAULT_SELECTION_MASK (UNATTEND_SECUREBOOT_TPM_MINRAM | UNATTEND_NO_ONLINE_ACCOUNT | UNATTEND_OFFLINE_INTERNAL_DRIVES)
/* Hash tables */
typedef struct htab_entry {
uint32_t used;
char* str;
void* data;
} htab_entry;
typedef struct htab_table {
htab_entry* table;
uint32_t size;
uint32_t filled;
} htab_table;
#define HTAB_EMPTY {NULL, 0, 0}
extern BOOL htab_create(uint32_t nel, htab_table* htab);
extern void htab_destroy(htab_table* htab);
extern uint32_t htab_hash(char* str, htab_table* htab);
/* Basic String Array */
typedef struct {
char** String;
uint32_t Index; // Current array size
uint32_t Max; // Maximum array size
} StrArray;
extern void StrArrayCreate(StrArray* arr, uint32_t initial_size);
extern int32_t StrArrayAdd(StrArray* arr, const char* str, BOOL);
extern int32_t StrArrayFind(StrArray* arr, const char* str);
extern void StrArrayClear(StrArray* arr);
extern void StrArrayDestroy(StrArray* arr);
#define IsStrArrayEmpty(arr) (arr.Index == 0)
/*
* Globals
*/
@ -593,9 +670,9 @@ extern RUFUS_IMG_REPORT img_report;
extern HINSTANCE hMainInstance;
extern HWND hMainDialog, hLogDialog, hStatus, hDeviceList, hCapacity, hImageOption;
extern HWND hPartitionScheme, hTargetSystem, hFileSystem, hClusterSize, hLabel, hBootType;
extern HWND hNBPasses, hLog, hInfo, hProgress, hDiskID;
extern HWND hNBPasses, hLog, hInfo, hProgress;
extern WORD selected_langid;
extern DWORD FormatStatus, DownloadStatus, MainThreadId, LastWriteError;
extern DWORD ErrorStatus, DownloadStatus, MainThreadId, LastWriteError;
extern BOOL use_own_c32[NB_OLD_C32], detect_fakes, op_in_progress, right_to_left_mode;
extern BOOL allow_dual_uefi_bios, large_drive, usb_debug;
extern uint8_t image_options, *pe256ssp;
@ -658,7 +735,9 @@ extern SIZE GetTextSize(HWND hCtrl, char* txt);
extern BOOL ExtractAppIcon(const char* filename, BOOL bSilent);
extern BOOL ExtractDOS(const char* path);
extern BOOL ExtractISO(const char* src_iso, const char* dest_dir, BOOL scan);
extern BOOL ExtractZip(const char* src_zip, const char* dest_dir);
extern int64_t ExtractISOFile(const char* iso, const char* iso_file, const char* dest_file, DWORD attributes);
extern uint32_t ReadISOFileToBuffer(const char* iso, const char* iso_file, uint8_t** buf);
extern BOOL CopySKUSiPolicy(const char* drive_name);
extern BOOL HasEfiImgBootLoaders(void);
extern BOOL DumpFatDir(const char* path, int32_t cluster);
@ -667,7 +746,7 @@ extern uint16_t GetSyslinuxVersion(char* buf, size_t buf_size, char** ext);
extern BOOL SetAutorun(const char* path);
extern char* FileDialog(BOOL save, char* path, const ext_t* ext, UINT* selected_ext);
extern BOOL FileIO(enum file_io_type io_type, char* path, char** buffer, DWORD* size);
extern unsigned char* GetResource(HMODULE module, char* name, char* type, const char* desc, DWORD* len, BOOL duplicate);
extern uint8_t* GetResource(HMODULE module, char* name, char* type, const char* desc, DWORD* len, BOOL duplicate);
extern DWORD GetResourceSize(HMODULE module, char* name, char* type, const char* desc);
extern DWORD RunCommandWithProgress(const char* cmdline, const char* dir, BOOL log, int msg);
#define RunCommand(cmd, dir, log) RunCommandWithProgress(cmd, dir, log, 0)
@ -717,6 +796,7 @@ extern HANDLE CreateFileWithTimeout(LPCSTR lpFileName, DWORD dwDesiredAccess, DW
extern BOOL SetThreadAffinity(DWORD_PTR* thread_affinity, size_t num_threads);
extern BOOL HashFile(const unsigned type, const char* path, uint8_t* sum);
extern BOOL PE256File(const char* path, uint8_t* hash);
extern void UpdateMD5Sum(const char* dest_dir, const char* md5sum_name);
extern BOOL HashBuffer(const unsigned type, const uint8_t* buf, const size_t len, uint8_t* sum);
extern BOOL IsFileInDB(const char* path);
extern int IsBootloaderRevoked(const char* path);
@ -746,35 +826,6 @@ extern uint32_t ResolveDllAddress(dll_resolver_t* resolver);
DWORD WINAPI HashThread(void* param);
/* Hash tables */
typedef struct htab_entry {
uint32_t used;
char* str;
void* data;
} htab_entry;
typedef struct htab_table {
htab_entry *table;
uint32_t size;
uint32_t filled;
} htab_table;
#define HTAB_EMPTY {NULL, 0, 0}
extern BOOL htab_create(uint32_t nel, htab_table* htab);
extern void htab_destroy(htab_table* htab);
extern uint32_t htab_hash(char* str, htab_table* htab);
/* Basic String Array */
typedef struct {
char** String;
uint32_t Index; // Current array size
uint32_t Max; // Maximum array size
} StrArray;
extern void StrArrayCreate(StrArray* arr, uint32_t initial_size);
extern int32_t StrArrayAdd(StrArray* arr, const char* str, BOOL );
extern int32_t StrArrayFind(StrArray* arr, const char* str);
extern void StrArrayClear(StrArray* arr);
extern void StrArrayDestroy(StrArray* arr);
#define IsStrArrayEmpty(arr) (arr.Index == 0)
/*
* typedefs for the function prototypes. Use the something like:
* PF_DECL(FormatEx);
@ -854,3 +905,5 @@ out:
#define ERROR_CANT_MOUNT_VOLUME 0x120C
#define ERROR_BAD_SIGNATURE 0x120D
#define ERROR_CANT_DOWNLOAD 0x120E
#define RUFUS_ERROR(err) (ERROR_SEVERITY_ERROR | FAC(FACILITY_STORAGE) | (err))

View File

@ -33,7 +33,7 @@ LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL
IDD_DIALOG DIALOGEX 12, 12, 232, 326
STYLE DS_SETFONT | DS_MODALFRAME | DS_CENTER | WS_MINIMIZEBOX | WS_POPUP | WS_CAPTION | WS_SYSMENU
EXSTYLE WS_EX_ACCEPTFILES
CAPTION "Rufus 4.4.2103"
CAPTION "Rufus 4.5.2175"
FONT 9, "Segoe UI Symbol", 400, 0, 0x0
BEGIN
LTEXT "Drive Properties",IDS_DRIVE_PROPERTIES_TXT,8,6,53,12,NOT WS_GROUP
@ -59,8 +59,8 @@ BEGIN
CONTROL "List USB Hard Drives",IDC_LIST_USB_HDD,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,8,119,216,10
CONTROL "Add fixes for old BIOSes (extra partition, align, etc.)",IDC_OLD_BIOS_FIXES,
"Button",BS_AUTOCHECKBOX | WS_TABSTOP,8,129,216,10
CONTROL "Use Rufus MBR with BIOS ID",IDC_RUFUS_MBR,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,8,139,110,10
COMBOBOX IDC_DISK_ID,128,139,96,30,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
CONTROL "Enable runtime UEFI media validation",IDC_UEFI_MEDIA_VALIDATION,
"Button",BS_AUTOCHECKBOX | WS_TABSTOP,8,139,216,10
LTEXT "Format Options",IDS_FORMAT_OPTIONS_TXT,8,152,57,12,NOT WS_GROUP
LTEXT "Volume label",IDS_LABEL_TXT,8,167,216,8
EDITTEXT IDC_LABEL,8,176,216,12,ES_AUTOHSCROLL
@ -305,6 +305,11 @@ BEGIN
"IDR_FD_EGA18_CPX RCDATA ""../res/freedos/EGA18.CPX""\r\n"
"IDR_XT_HOGGER RCDATA ""../res/hogger/hogger.exe""\r\n"
"IDR_UEFI_NTFS RCDATA ""../res/uefi/uefi-ntfs.img""\r\n"
"IDR_MD5_BOOTIA32 RCDATA ""../res/md5/bootia32.efi""\r\n"
"IDR_MD5_BOOTX64 RCDATA ""../res/md5/bootx64.efi""\r\n"
"IDR_MD5_BOOTARM RCDATA ""../res/md5/bootarm.efi""\r\n"
"IDR_MD5_BOOTAA64 RCDATA ""../res/md5/bootaa64.efi""\r\n"
"IDR_MD5_BOOTRISCV64 RCDATA ""../res/md5/bootriscv64.efi""\r\n"
"IDI_LANG_16 RCDATA ""../res/icons/lang-16.png""\r\n"
"IDI_INFO_16 RCDATA ""../res/icons/info-16.png""\r\n"
"IDI_SETTINGS_16 RCDATA ""../res/icons/settings-16.png""\r\n"
@ -392,8 +397,8 @@ END
//
VS_VERSION_INFO VERSIONINFO
FILEVERSION 4,4,2103,0
PRODUCTVERSION 4,4,2103,0
FILEVERSION 4,5,2175,0
PRODUCTVERSION 4,5,2175,0
FILEFLAGSMASK 0x3fL
#ifdef _DEBUG
FILEFLAGS 0x1L
@ -411,13 +416,13 @@ BEGIN
VALUE "Comments", "https://rufus.ie"
VALUE "CompanyName", "Akeo Consulting"
VALUE "FileDescription", "Rufus"
VALUE "FileVersion", "4.4.2103"
VALUE "FileVersion", "4.5.2175"
VALUE "InternalName", "Rufus"
VALUE "LegalCopyright", "© 2011-2024 Pete Batard (GPL v3)"
VALUE "LegalCopyright", "<EFBFBD> 2011-2024 Pete Batard (GPL v3)"
VALUE "LegalTrademarks", "https://www.gnu.org/licenses/gpl-3.0.html"
VALUE "OriginalFilename", "rufus-4.4.exe"
VALUE "OriginalFilename", "rufus-4.5.exe"
VALUE "ProductName", "Rufus"
VALUE "ProductVersion", "4.4.2103"
VALUE "ProductVersion", "4.5.2175"
END
END
BLOCK "VarFileInfo"
@ -485,6 +490,11 @@ IDR_FD_EGA17_CPX RCDATA "../res/freedos/EGA17.CPX"
IDR_FD_EGA18_CPX RCDATA "../res/freedos/EGA18.CPX"
IDR_XT_HOGGER RCDATA "../res/hogger/hogger.exe"
IDR_UEFI_NTFS RCDATA "../res/uefi/uefi-ntfs.img"
IDR_MD5_BOOTIA32 RCDATA "../res/md5/bootia32.efi"
IDR_MD5_BOOTX64 RCDATA "../res/md5/bootx64.efi"
IDR_MD5_BOOTARM RCDATA "../res/md5/bootarm.efi"
IDR_MD5_BOOTAA64 RCDATA "../res/md5/bootaa64.efi"
IDR_MD5_BOOTRISCV64 RCDATA "../res/md5/bootriscv64.efi"
IDI_LANG_16 RCDATA "../res/icons/lang-16.png"
IDI_INFO_16 RCDATA "../res/icons/info-16.png"
IDI_SETTINGS_16 RCDATA "../res/icons/settings-16.png"

View File

@ -1,7 +1,7 @@
/*
* Rufus: The Reliable USB Formatting Utility
* Settings access, through either registry or INI file
* Copyright © 2015-2023 Pete Batard <pete@akeo.ie>
* Copyright © 2015-2024 Pete Batard <pete@akeo.ie>
*
* 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
@ -35,10 +35,12 @@ extern char* ini_file;
#define SETTING_DEFAULT_THREAD_PRIORITY "DefaultThreadPriority"
#define SETTING_DISABLE_FAKE_DRIVES_CHECK "DisableFakeDrivesCheck"
#define SETTING_DISABLE_LGP "DisableLGP"
#define SETTING_DISABLE_RUFUS_MBR "DisableRufusMBR"
#define SETTING_DISABLE_SECURE_BOOT_NOTICE "DisableSecureBootNotice"
#define SETTING_DISABLE_VHDS "DisableVHDs"
#define SETTING_ENABLE_EXTRA_HASHES "EnableExtraHashes"
#define SETTING_ENABLE_FILE_INDEXING "EnableFileIndexing"
#define SETTING_ENABLE_RUNTIME_VALIDATION "EnableRuntimeValidation"
#define SETTING_ENABLE_USB_DEBUG "EnableUsbDebug"
#define SETTING_ENABLE_VMDK_DETECTION "EnableVmdkDetection"
#define SETTING_ENABLE_WIN_DUAL_EFI_BIOS "EnableWindowsDualUefiBiosMode"

View File

@ -80,8 +80,9 @@ BOOL htab_create(uint32_t nel, htab_table* htab)
if (htab == NULL) {
return FALSE;
}
assert(htab->table == NULL);
if (htab->table != NULL) {
uprintf("warning: htab_create() was called with a non empty table");
uprintf("Warning: htab_create() was called with a non empty table");
return FALSE;
}
@ -96,7 +97,7 @@ BOOL htab_create(uint32_t nel, htab_table* htab)
// allocate memory and zero out.
htab->table = (htab_entry*)calloc(htab->size + 1, sizeof(htab_entry));
if (htab->table == NULL) {
uprintf("could not allocate space for hash table\n");
uprintf("Could not allocate space for hash table");
return FALSE;
}
@ -166,7 +167,7 @@ uint32_t htab_hash(char* str, htab_table* htab)
// existing hash
return idx;
}
// uprintf("hash collision ('%s' vs '%s')\n", str, htab->table[idx].str);
// uprintf("Hash collision ('%s' vs '%s')", str, htab->table[idx].str);
// Second hash function, as suggested in [Knuth]
hval2 = 1 + hval % (htab->size - 2);
@ -196,19 +197,20 @@ uint32_t htab_hash(char* str, htab_table* htab)
// Not found => New entry
// If the table is full return an error
assert(htab->filled < htab->size);
if (htab->filled >= htab->size) {
uprintf("hash table is full (%d entries)", htab->size);
uprintf("Hash table is full (%d entries)", htab->size);
return 0;
}
safe_free(htab->table[idx].str);
htab->table[idx].used = hval;
htab->table[idx].str = (char*) malloc(safe_strlen(str)+1);
htab->table[idx].str = (char*) malloc(safe_strlen(str) + 1);
if (htab->table[idx].str == NULL) {
uprintf("could not duplicate string for hash table\n");
uprintf("Could not duplicate string for hash table");
return 0;
}
memcpy(htab->table[idx].str, str, safe_strlen(str)+1);
memcpy(htab->table[idx].str, str, safe_strlen(str) + 1);
++htab->filled;
return idx;
@ -741,12 +743,12 @@ out:
* size is allocated for the resource. Else the buffer is allocate for
* the resource size.
*/
unsigned char* GetResource(HMODULE module, char* name, char* type, const char* desc, DWORD* len, BOOL duplicate)
uint8_t* GetResource(HMODULE module, char* name, char* type, const char* desc, DWORD* len, BOOL duplicate)
{
HGLOBAL res_handle;
HRSRC res;
DWORD res_len;
unsigned char* p = NULL;
uint8_t* p = NULL;
res = FindResourceA(module, name, type);
if (res == NULL) {
@ -763,7 +765,7 @@ unsigned char* GetResource(HMODULE module, char* name, char* type, const char* d
if (duplicate) {
if (*len == 0)
*len = res_len;
p = (unsigned char*)calloc(*len, 1);
p = calloc(*len, 1);
if (p == NULL) {
uprintf("Could not allocate resource '%s'", desc);
goto out;
@ -772,7 +774,7 @@ unsigned char* GetResource(HMODULE module, char* name, char* type, const char* d
if (res_len > *len)
uprintf("WARNING: Resource '%s' was truncated by %d bytes!", desc, res_len - *len);
} else {
p = (unsigned char*)LockResource(res_handle);
p = LockResource(res_handle);
}
*len = res_len;
@ -828,7 +830,7 @@ DWORD RunCommandWithProgress(const char* cmd, const char* dir, BOOL log, int msg
UpdateProgressWithInfoInit(NULL, FALSE);
while (1) {
// Check for user cancel
if (IS_ERROR(FormatStatus) && (SCODE_CODE(FormatStatus) == ERROR_CANCELLED)) {
if (IS_ERROR(ErrorStatus) && (SCODE_CODE(ErrorStatus) == ERROR_CANCELLED)) {
if (!TerminateProcess(pi.hProcess, ERROR_CANCELLED)) {
uprintf("Could not terminate command: %s", WindowsErrorString());
} else switch (WaitForSingleObject(pi.hProcess, 5000)) {

View File

@ -40,6 +40,7 @@
#include "resource.h"
#include "msapi_utf8.h"
#include "localization.h"
#include "bled/bled.h"
#define FACILITY_WIM 322
#define DEFAULT_BASE_ADDRESS 0x100000000ULL
@ -52,6 +53,7 @@ const HANDLE hRufus = (HANDLE)0x0000005275667573ULL; // "\0\0\0Rufus"
HWND hStatus;
size_t ubuffer_pos = 0;
char ubuffer[UBUFFER_SIZE]; // Buffer for ubpushf() messages we don't log right away
static uint64_t archive_size;
#pragma pack(push, 1)
typedef struct {
@ -123,7 +125,8 @@ uint32_t read_file(const char* path, uint8_t** buf)
uint32_t size = (uint32_t)ftell(fd);
fseek(fd, 0L, SEEK_SET);
*buf = malloc(size);
// +1 so we can add an extra NUL
*buf = malloc(size + 1);
if (*buf == NULL) {
uprintf("Error: Can't allocate %d bytes buffer for file '%s'", size, path);
size = 0;
@ -133,6 +136,8 @@ uint32_t read_file(const char* path, uint8_t** buf)
uprintf("Error: Can't read '%s'", path);
size = 0;
}
// Always NUL terminate the file
(*buf)[size] = 0;
out:
fclose(fd);
@ -334,28 +339,28 @@ char* SizeToHumanReadable(uint64_t size, BOOL copy_to_log, BOOL fake_units)
double hr_size = (double)size;
double t;
uint16_t i_size;
char **_msg_table = copy_to_log?default_msg_table:msg_table;
const double divider = fake_units?1000.0:1024.0;
char **_msg_table = copy_to_log ? default_msg_table : msg_table;
const double divider = fake_units ? 1000.0 : 1024.0;
for (suffix=0; suffix<MAX_SIZE_SUFFIXES-1; suffix++) {
for (suffix = 0; suffix < MAX_SIZE_SUFFIXES - 1; suffix++) {
if (hr_size < divider)
break;
hr_size /= divider;
}
if (suffix == 0) {
static_sprintf(str_size, "%s%d%s %s", dir, (int)hr_size, dir, _msg_table[MSG_020-MSG_000]);
static_sprintf(str_size, "%s%d%s %s", dir, (int)hr_size, dir, _msg_table[MSG_020 - MSG_000]);
} else if (fake_units) {
if (hr_size < 8) {
static_sprintf(str_size, (fabs((hr_size*10.0)-(floor(hr_size + 0.5)*10.0)) < 0.5)?"%0.0f%s":"%0.1f%s",
hr_size, _msg_table[MSG_020+suffix-MSG_000]);
static_sprintf(str_size, (fabs((hr_size * 10.0) - (floor(hr_size + 0.5) * 10.0)) < 0.5) ?
"%0.0f%s":"%0.1f%s", hr_size, _msg_table[MSG_020 + suffix - MSG_000]);
} else {
t = (double)upo2((uint16_t)hr_size);
i_size = (uint16_t)((fabs(1.0f-(hr_size / t)) < 0.05f)?t:hr_size);
static_sprintf(str_size, "%s%d%s %s", dir, i_size, dir, _msg_table[MSG_020+suffix-MSG_000]);
i_size = (uint16_t)((fabs(1.0f - (hr_size / t)) < 0.05f) ? t : hr_size);
static_sprintf(str_size, "%s%d%s %s", dir, i_size, dir, _msg_table[MSG_020 + suffix - MSG_000]);
}
} else {
static_sprintf(str_size, (hr_size * 10.0 - (floor(hr_size) * 10.0)) < 0.5?
"%s%0.0f%s %s":"%s%0.1f%s %s", dir, hr_size, dir, _msg_table[MSG_020+suffix-MSG_000]);
"%s%0.0f%s %s":"%s%0.1f%s %s", dir, hr_size, dir, _msg_table[MSG_020 + suffix - MSG_000]);
}
return str_size;
}
@ -564,7 +569,7 @@ BOOL WriteFileWithRetry(HANDLE hFile, LPCVOID lpBuffer, DWORD nNumberOfBytesToWr
uprintf("Wrote %d bytes but requested %d", *lpNumberOfBytesWritten, nNumberOfBytesToWrite);
} else {
uprintf("Write error %s", WindowsErrorString());
LastWriteError = ERROR_SEVERITY_ERROR|FAC(FACILITY_STORAGE)|GetLastError();
LastWriteError = RUFUS_ERROR(GetLastError());
}
// If we can't reposition for the next run, just abort
if (!readFilePointer)
@ -576,7 +581,7 @@ BOOL WriteFileWithRetry(HANDLE hFile, LPCVOID lpBuffer, DWORD nNumberOfBytesToWr
}
}
if (SCODE_CODE(GetLastError()) == ERROR_SUCCESS)
SetLastError(ERROR_SEVERITY_ERROR|FAC(FACILITY_STORAGE)|ERROR_WRITE_FAULT);
SetLastError(RUFUS_ERROR(ERROR_WRITE_FAULT));
return FALSE;
}
@ -882,3 +887,35 @@ out:
pfSymCleanup(hRufus);
return r;
}
static void print_extracted_file(const char* file_path, uint64_t file_length)
{
char str[MAX_PATH];
if (file_path == NULL)
return;
static_sprintf(str, "%s (%s)", file_path, SizeToHumanReadable(file_length, TRUE, FALSE));
uprintf("Extracting: %s", str);
PrintStatus(0, MSG_000, str); // MSG_000 is "%s"
}
static void update_progress(const uint64_t processed_bytes)
{
UpdateProgressWithInfo(OP_EXTRACT_ZIP, MSG_348, processed_bytes, archive_size);
}
// Extract content from a zip archive onto the designated directory or drive
BOOL ExtractZip(const char* src_zip, const char* dest_dir)
{
int64_t extracted_bytes = 0;
if (src_zip == NULL)
return FALSE;
archive_size = _filesizeU(src_zip);
if (bled_init(256 * KB, NULL, NULL, NULL, update_progress, print_extracted_file, &ErrorStatus) != 0)
return FALSE;
uprintf("● Copying files from '%s'", src_zip);
extracted_bytes = bled_uncompress_to_dir(src_zip, dest_dir, BLED_COMPRESSION_ZIP);
bled_exit();
return (extracted_bytes > 0);
}

View File

@ -121,7 +121,7 @@ char* FileDialog(BOOL save, char* path, const ext_t* ext, UINT* selected_ext)
hr = CoCreateInstance(save ? &CLSID_FileSaveDialog : &CLSID_FileOpenDialog, NULL, CLSCTX_INPROC,
&IID_IFileDialog, (LPVOID)&pfd);
if (SUCCEEDED(hr) && (pfd == NULL)) // Never trust Microsoft APIs to do the right thing
hr = ERROR_SEVERITY_ERROR | FAC(FACILITY_WINDOWS) | ERROR_API_UNAVAILABLE;
hr = RUFUS_ERROR(ERROR_API_UNAVAILABLE);
if (FAILED(hr)) {
SetLastError(hr);
@ -1590,7 +1590,7 @@ INT_PTR CALLBACK NewVersionCallback(HWND hDlg, UINT message, WPARAM wParam, LPAR
case IDC_DOWNLOAD: // Also doubles as abort and launch function
switch(download_status) {
case 1: // Abort
FormatStatus = ERROR_SEVERITY_ERROR|FAC(FACILITY_STORAGE)|ERROR_CANCELLED;
ErrorStatus = RUFUS_ERROR(ERROR_CANCELLED);
download_status = 0;
hThread = NULL;
break;
@ -1653,7 +1653,7 @@ INT_PTR CALLBACK NewVersionCallback(HWND hDlg, UINT message, WPARAM wParam, LPAR
case UM_PROGRESS_INIT:
EnableWindow(GetDlgItem(hDlg, IDCANCEL), FALSE);
SetWindowTextU(GetDlgItem(hDlg, IDC_DOWNLOAD), lmprintf(MSG_038));
FormatStatus = 0;
ErrorStatus = 0;
download_status = 1;
return (INT_PTR)TRUE;
case UM_PROGRESS_EXIT:
@ -1665,7 +1665,7 @@ INT_PTR CALLBACK NewVersionCallback(HWND hDlg, UINT message, WPARAM wParam, LPAR
SetWindowTextU(GetDlgItem(hDlg, IDC_DOWNLOAD), lmprintf(MSG_040));
// Disable the download button if we found an invalid signature
EnableWindow(GetDlgItem(hDlg, IDC_DOWNLOAD),
FormatStatus != (ERROR_SEVERITY_ERROR | FAC(FACILITY_STORAGE) | APPERR(ERROR_BAD_SIGNATURE)));
ErrorStatus != RUFUS_ERROR(APPERR(ERROR_BAD_SIGNATURE)));
download_status = 0;
}
return (INT_PTR)TRUE;

View File

@ -2,7 +2,7 @@
*
* Copyright 2003 Lars Munch Christensen - All Rights Reserved
* Copyright 1998-2008 H. Peter Anvin - All Rights Reserved
* Copyright 2012-2023 Pete Batard
* Copyright 2012-2024 Pete Batard
*
* Based on the Linux installer program for SYSLINUX by H. Peter Anvin
*
@ -88,7 +88,7 @@ BOOL InstallSyslinux(DWORD drive_index, char drive_letter, int file_system)
const LARGE_INTEGER liZero = { {0, 0} };
HANDLE f_handle = INVALID_HANDLE_VALUE;
HANDLE d_handle = INVALID_HANDLE_VALUE;
DWORD bytes_read, bytes_written, err;
DWORD bytes_read, err;
S_NTFSSECT_VOLINFO vol_info = { 0 };
LARGE_INTEGER vcn, lba, len;
S_NTFSSECT_EXTENT extent;
@ -208,12 +208,11 @@ BOOL InstallSyslinux(DWORD drive_index, char drive_letter, int file_system)
/* Write ldlinux.sys file */
if (!WriteFileWithRetry(f_handle, (const char _force *)syslinux_ldlinux[0],
syslinux_ldlinux_len[0], &bytes_written, WRITE_RETRIES)) {
syslinux_ldlinux_len[0], NULL, WRITE_RETRIES)) {
uprintf("Could not write '%s': %s", &path[3], WindowsErrorString());
goto out;
}
if (!WriteFileWithRetry(f_handle, syslinux_adv, 2 * ADV_SIZE,
&bytes_written, WRITE_RETRIES)) {
if (!WriteFileWithRetry(f_handle, syslinux_adv, 2 * ADV_SIZE, NULL, WRITE_RETRIES)) {
uprintf("Could not write ADV to '%s': %s", &path[3], WindowsErrorString());
goto out;
}
@ -302,8 +301,7 @@ BOOL InstallSyslinux(DWORD drive_index, char drive_letter, int file_system)
/* Rewrite the file */
if (!SetFilePointerEx(f_handle, liZero, NULL, FILE_BEGIN) ||
!WriteFileWithRetry(f_handle, syslinux_ldlinux[0], syslinux_ldlinux_len[0],
&bytes_written, WRITE_RETRIES)) {
!WriteFileWithRetry(f_handle, syslinux_ldlinux[0], syslinux_ldlinux_len[0], NULL, WRITE_RETRIES)) {
uprintf("Could not rewrite '%s': %s\n", &path[3], WindowsErrorString());
goto out;
}
@ -328,8 +326,7 @@ BOOL InstallSyslinux(DWORD drive_index, char drive_letter, int file_system)
/* Write boot sector back */
if (!SetFilePointerEx(d_handle, liZero, NULL, FILE_BEGIN) ||
!WriteFileWithRetry(d_handle, sectbuf, SECTOR_SIZE,
&bytes_written, WRITE_RETRIES)) {
!WriteFileWithRetry(d_handle, sectbuf, SECTOR_SIZE, NULL, WRITE_RETRIES)) {
uprintf("Could not write Syslinux boot record: %s", WindowsErrorString());
goto out;
}
@ -368,8 +365,7 @@ BOOL InstallSyslinux(DWORD drive_index, char drive_letter, int file_system)
uprintf("Unable to create '%s'\n", path);
goto out;
}
if (!WriteFileWithRetry(f_handle, syslinux_mboot, syslinux_mboot_len,
&bytes_written, WRITE_RETRIES)) {
if (!WriteFileWithRetry(f_handle, syslinux_mboot, syslinux_mboot_len, NULL, WRITE_RETRIES)) {
uprintf("Could not write '%s'", path);
goto out;
}
@ -415,28 +411,30 @@ uint16_t GetSyslinuxVersion(char* buf, size_t buf_size, char** ext)
return 0;
// Start at 64 to avoid the short incomplete version at the beginning of ldlinux.sys
for (i=64; i<buf_size-64; i++) {
for (i = 64; i < buf_size - 64; i++) {
if (memcmp(&buf[i], LINUX, sizeof(LINUX)) == 0) {
// Check for ISO or SYS prefix
if (!( ((buf[i-3] == 'I') && (buf[i-2] == 'S') && (buf[i-1] == 'O'))
|| ((buf[i-3] == 'S') && (buf[i-2] == 'Y') && (buf[i-1] == 'S')) ))
if (!( ((buf[i - 3] == 'I') && (buf[i - 2] == 'S') && (buf[i - 1] == 'O'))
|| ((buf[i - 3] == 'S') && (buf[i - 2] == 'Y') && (buf[i - 1] == 'S')) ))
continue;
i += sizeof(LINUX);
version = (((uint8_t)strtoul(&buf[i], &p, 10))<<8) + (uint8_t)strtoul(&p[1], &p, 10);
version = (((uint8_t)strtoul(&buf[i], &p, 10)) << 8) + (uint8_t)strtoul(&p[1], &p, 10);
// Our buffer is either from our internal legit syslinux (i.e. with a NUL terminated
// version string) or from a buffer that has been NUL-terminated through read_file(),
// so the string we work with in p is always NUL terminated at this stage.
if (version == 0)
continue;
p[safe_strlen(p)] = 0;
// Ensure that our extra version string starts with a slash
*p = '/';
// Remove the x.yz- duplicate if present
for (j=0; (buf[i+j] == p[1+j]) && (buf[i+j] != ' '); j++);
if (p[j+1] == '-')
for (j = 0; (buf[i + j] == p[1 + j]) && (buf[i + j] != ' '); j++);
if (p[j + 1] == '-')
j++;
if (j >= 4) {
p[j] = '/';
p = &p[j];
}
for (j=safe_strlen(p)-1; j>0; j--) {
for (j = safe_strlen(p) - 1; j > 0; j--) {
// Arch Linux affixes a star for their version - who knows what else is out there...
if ((p[j] == ' ') || (p[j] == '*'))
p[j] = 0;
@ -444,15 +442,15 @@ uint16_t GetSyslinuxVersion(char* buf, size_t buf_size, char** ext)
break;
}
// Sanitize the string
for (j=1; j<safe_strlen(p); j++) {
for (j = 1; j < safe_strlen(p); j++) {
// Some people are bound to have invalid chars in their date strings
for (k=0; k<sizeof(unauthorized); k++) {
for (k = 0; k < sizeof(unauthorized); k++) {
if (p[j] == unauthorized[k])
p[j] = '_';
}
}
// If all we have is a slash, return the empty string for the extra version
*ext = (p[1] == 0)?nullstr:p;
*ext = (p[1] == 0) ? nullstr : p;
return version;
}
}

View File

@ -1,7 +1,7 @@
/*
* Rufus: The Reliable USB Formatting Utility
* UI-related function calls
* Copyright © 2018-2023 Pete Batard <pete@akeo.ie>
* Copyright © 2018-2024 Pete Batard <pete@akeo.ie>
*
* 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
@ -46,7 +46,7 @@ UINT_PTR UM_LANGUAGE_MENU_MAX = UM_LANGUAGE_MENU;
HIMAGELIST hUpImageList, hDownImageList;
extern BOOL use_vds, appstore_version;
extern int imop_win_sel;
extern char* unattend_xml_path;
extern char *unattend_xml_path, *archive_path;
int update_progress_type = UPT_PERCENT;
int advanced_device_section_height, advanced_format_section_height;
// (empty) check box width, (empty) drop down width, button height (for and without dropdown match)
@ -223,9 +223,8 @@ void GetHalfDropwdownWidth(HWND hDlg)
hw = max(hw, GetTextSize(GetDlgItem(hDlg, IDC_TARGET_SYSTEM), msg).cx);
}
// Finally, we must ensure that we'll have enough space for the 2 checkbox controls
// Finally, we must ensure that we'll have enough space for the checkbox controls
// that end up with a half dropdown
hw = max(hw, GetTextWidth(hDlg, IDC_RUFUS_MBR) - sw);
hw = max(hw, GetTextWidth(hDlg, IDC_BAD_BLOCKS) - sw);
// Add the width of a blank dropdown
@ -351,7 +350,7 @@ void PositionMainControls(HWND hDlg)
GetWindowRect(hCtrl, &rc);
MapWindowPoints(NULL, hDlg, (POINT*)&rc, 2);
advanced_device_section_height = rc.top;
hCtrl = GetDlgItem(hDlg, IDC_RUFUS_MBR);
hCtrl = GetDlgItem(hDlg, IDC_UEFI_MEDIA_VALIDATION);
GetWindowRect(hCtrl, &rc);
MapWindowPoints(NULL, hDlg, (POINT*)&rc, 2);
advanced_device_section_height = rc.bottom - advanced_device_section_height;
@ -474,10 +473,10 @@ void PositionMainControls(HWND hDlg)
hCtrl = GetDlgItem(hDlg, half_width_ids[i]);
GetWindowRect(hCtrl, &rc);
MapWindowPoints(NULL, hDlg, (POINT*)&rc, 2);
// First 5 controls are on the left handside
// First 4 controls are on the left handside
// First 2 controls may overflow into separator
hPrevCtrl = GetNextWindow(hCtrl, GW_HWNDPREV);
SetWindowPos(hCtrl, hPrevCtrl, (i < 5) ? rc.left : mw + hw + sw, rc.top,
SetWindowPos(hCtrl, hPrevCtrl, (i < 4) ? rc.left : mw + hw + sw, rc.top,
(i <2) ? hw + sw : hw, rc.bottom - rc.top, 0);
}
@ -1205,6 +1204,9 @@ void InitProgress(BOOL bOnlyFormat)
nb_slots[OP_FINALIZE] = ((selection_default == BT_IMAGE) && (fs_type == FS_NTFS)) ? 3 : 2;
}
}
if (archive_path != NULL) {
nb_slots[OP_EXTRACT_ZIP] = -1;
}
for (i = 0; i < OP_MAX; i++) {
if (nb_slots[i] > 0) {

View File

@ -1,7 +1,7 @@
/*
* Rufus: The Reliable USB Formatting Utility
* UI element lists
* Copyright © 2018-2020 Pete Batard <pete@akeo.ie>
* Copyright © 2018-2024 Pete Batard <pete@akeo.ie>
*
* 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
@ -49,8 +49,7 @@ static int image_option_move_ids[] = {
IDC_ADVANCED_DEVICE_TOOLBAR,
IDC_LIST_USB_HDD,
IDC_OLD_BIOS_FIXES,
IDC_RUFUS_MBR,
IDC_DISK_ID,
IDC_UEFI_MEDIA_VALIDATION,
IDS_FORMAT_OPTIONS_TXT,
IDS_LABEL_TXT,
IDC_LABEL,
@ -86,7 +85,7 @@ static int image_option_toggle_ids[][2] = {
static int advanced_device_move_ids[] = {
IDC_LIST_USB_HDD,
IDC_OLD_BIOS_FIXES,
IDC_RUFUS_MBR,
IDC_UEFI_MEDIA_VALIDATION,
IDS_FORMAT_OPTIONS_TXT,
IDS_LABEL_TXT,
IDC_LABEL,
@ -115,8 +114,7 @@ static int advanced_device_toggle_ids[] = {
IDC_SAVE_TOOLBAR,
IDC_LIST_USB_HDD,
IDC_OLD_BIOS_FIXES,
IDC_RUFUS_MBR,
IDC_DISK_ID,
IDC_UEFI_MEDIA_VALIDATION,
};
static int advanced_format_move_ids[] = {
@ -155,6 +153,7 @@ static int full_width_controls[] = {
IDC_ADVANCED_DRIVE_PROPERTIES,
IDC_LIST_USB_HDD,
IDC_OLD_BIOS_FIXES,
IDC_UEFI_MEDIA_VALIDATION,
IDC_ADVANCED_FORMAT_OPTIONS,
IDC_QUICK_FORMAT,
IDC_EXTENDED_LABEL,
@ -164,19 +163,18 @@ static int full_width_controls[] = {
static int full_width_checkboxes[] = {
IDC_LIST_USB_HDD,
IDC_OLD_BIOS_FIXES,
IDC_UEFI_MEDIA_VALIDATION,
IDC_QUICK_FORMAT,
IDC_EXTENDED_LABEL,
};
static int half_width_ids[] = {
IDC_BAD_BLOCKS,
IDC_RUFUS_MBR,
IDS_PARTITION_TYPE_TXT,
IDC_PARTITION_TYPE,
IDC_FILE_SYSTEM,
IDS_TARGET_SYSTEM_TXT,
IDC_TARGET_SYSTEM,
IDC_DISK_ID,
IDS_CLUSTER_SIZE_TXT,
IDC_CLUSTER_SIZE,
IDC_NB_PASSES,
@ -190,7 +188,7 @@ static int adjust_dpi_ids[][5] = {
{ IDC_ADVANCED_DEVICE_TOOLBAR, 0, 0, 0, 0 },
{ IDC_LIST_USB_HDD, 0, 0, 0, 0 },
{ IDC_OLD_BIOS_FIXES, 0, 0, 0, 0 },
{ IDC_RUFUS_MBR, IDC_DISK_ID, 0, 0, 0 },
{ IDC_UEFI_MEDIA_VALIDATION, 0, 0, 0, 0 },
{ IDS_FORMAT_OPTIONS_TXT, 0, 0, 0, 0 },
{ IDS_LABEL_TXT, IDC_LABEL, 0, 0, 0 },
{ IDS_FILE_SYSTEM_TXT, IDC_FILE_SYSTEM, IDS_CLUSTER_SIZE_TXT, IDC_CLUSTER_SIZE, 0 },

View File

@ -1,7 +1,7 @@
/*
* Rufus: The Reliable USB Formatting Utility
* Virtual Disk Handling functions
* Copyright © 2013-2023 Pete Batard <pete@akeo.ie>
* Copyright © 2013-2024 Pete Batard <pete@akeo.ie>
*
* 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
@ -120,9 +120,9 @@ static int8_t IsCompressedBootableImage(const char* path)
buf = malloc(MBR_SIZE);
if (buf == NULL)
return 0;
FormatStatus = 0;
ErrorStatus = 0;
if (img_report.compression_type < BLED_COMPRESSION_MAX) {
bled_init(0, uprintf, NULL, NULL, NULL, NULL, &FormatStatus);
bled_init(0, uprintf, NULL, NULL, NULL, NULL, &ErrorStatus);
dc = bled_uncompress_to_buffer(path, (char*)buf, MBR_SIZE, file_assoc[i].type);
bled_exit();
} else if (img_report.compression_type == BLED_COMPRESSION_MAX) {
@ -258,7 +258,7 @@ DWORD WINAPI WimProgressCallback(DWORD dwMsgId, WPARAM wParam, LPARAM lParam, PV
UpdateProgressWithInfo(progress_op, progress_msg, wim_proc_files, wim_nb_files);
}
// Halt on error
if (IS_ERROR(FormatStatus)) {
if (IS_ERROR(ErrorStatus)) {
pbCancel = (PBOOL)lParam;
*pbCancel = TRUE;
break;
@ -291,7 +291,7 @@ DWORD WINAPI WimProgressCallback(DWORD dwMsgId, WPARAM wParam, LPARAM lParam, PV
break;
}
return IS_ERROR(FormatStatus) ? WIM_MSG_ABORT_IMAGE : WIM_MSG_SUCCESS;
return IS_ERROR(ErrorStatus) ? WIM_MSG_ABORT_IMAGE : WIM_MSG_SUCCESS;
}
// Find out if we have any way to extract/apply WIM files on this platform
@ -908,18 +908,19 @@ PF_TYPE_DECL(WINAPI, DWORD, AttachVirtualDisk, (HANDLE, PSECURITY_DESCRIPTOR,
ATTACH_VIRTUAL_DISK_FLAG, ULONG, PATTACH_VIRTUAL_DISK_PARAMETERS, LPOVERLAPPED));
PF_TYPE_DECL(WINAPI, DWORD, DetachVirtualDisk, (HANDLE, DETACH_VIRTUAL_DISK_FLAG, ULONG));
PF_TYPE_DECL(WINAPI, DWORD, GetVirtualDiskPhysicalPath, (HANDLE, PULONG, PWSTR));
PF_TYPE_DECL(WINAPI, DWORD, GetVirtualDiskOperationProgress, (HANDLE, LPOVERLAPPED,
PVIRTUAL_DISK_PROGRESS));
PF_TYPE_DECL(WINAPI, DWORD, GetVirtualDiskOperationProgress, (HANDLE, LPOVERLAPPED, PVIRTUAL_DISK_PROGRESS));
PF_TYPE_DECL(WINAPI, DWORD, GetVirtualDiskInformation, (HANDLE, PULONG, PGET_VIRTUAL_DISK_INFO, PULONG));
static char physical_path[128] = "";
static HANDLE mounted_handle = INVALID_HANDLE_VALUE;
// Mount an ISO or a VHD/VHDX image
// Mount an ISO or a VHD/VHDX image and provide its size
// Returns the physical path of the mounted image or NULL on error.
char* VhdMountImage(const char* path)
char* VhdMountImageAndGetSize(const char* path, uint64_t* disk_size)
{
VIRTUAL_STORAGE_TYPE vtype = { VIRTUAL_STORAGE_TYPE_DEVICE_ISO, VIRTUAL_STORAGE_TYPE_VENDOR_MICROSOFT };
ATTACH_VIRTUAL_DISK_PARAMETERS vparams = { 0 };
GET_VIRTUAL_DISK_INFO disk_info = { 0 };
DWORD r;
wchar_t wtmp[128];
ULONG size = ARRAYSIZE(wtmp);
@ -929,6 +930,8 @@ char* VhdMountImage(const char* path)
PF_INIT_OR_OUT(OpenVirtualDisk, VirtDisk);
PF_INIT_OR_OUT(AttachVirtualDisk, VirtDisk);
PF_INIT_OR_OUT(GetVirtualDiskPhysicalPath, VirtDisk);
if (disk_size != NULL)
PF_INIT_OR_OUT(GetVirtualDiskInformation, VirtDisk);
if (wpath == NULL)
return NULL;
@ -967,6 +970,20 @@ char* VhdMountImage(const char* path)
goto out;
}
wchar_to_utf8_no_alloc(wtmp, physical_path, sizeof(physical_path));
if (disk_size != NULL) {
*disk_size = 0;
disk_info.Version = GET_VIRTUAL_DISK_INFO_SIZE;
size = sizeof(disk_info);
r = pfGetVirtualDiskInformation(mounted_handle, &size, &disk_info, NULL);
if (r != ERROR_SUCCESS) {
SetLastError(r);
uprintf("Could not obtain virtual size of mounted image '%s': %s", path, WindowsErrorString());
goto out;
}
*disk_size = disk_info.Size.VirtualSize;
}
ret = physical_path;
out:
@ -1045,7 +1062,7 @@ static DWORD WINAPI VhdSaveImageThread(void* param)
if (r == ERROR_IO_PENDING) {
while ((r = WaitForSingleObject(overlapped.hEvent, 100)) == WAIT_TIMEOUT) {
if (IS_ERROR(FormatStatus) && (SCODE_CODE(FormatStatus) == ERROR_CANCELLED)) {
if (IS_ERROR(ErrorStatus) && (SCODE_CODE(ErrorStatus) == ERROR_CANCELLED)) {
CancelIoEx(handle, &overlapped);
goto out;
}
@ -1093,10 +1110,10 @@ static DWORD WINAPI FfuSaveImageThread(void* param)
img_save->DevicePath, img_save->ImagePath, label, APPLICATION_NAME, RUFUS_URL);
uprintf("Running command: '%s", cmd);
r = RunCommandWithProgress(cmd, sysnative_dir, TRUE, MSG_261);
if (r != 0 && !IS_ERROR(FormatStatus)) {
if (r != 0 && !IS_ERROR(ErrorStatus)) {
SetLastError(r);
uprintf("Failed to capture FFU image: %s", WindowsErrorString());
FormatStatus = ERROR_SEVERITY_ERROR | FAC(FACILITY_WINDOWS) | SCODE_CODE(r);
ErrorStatus = RUFUS_ERROR(SCODE_CODE(r));
}
safe_free(img_save->DevicePath);
safe_free(img_save->ImagePath);
@ -1111,6 +1128,7 @@ void VhdSaveImage(void)
char filename[128];
char path[MAX_PATH];
int DriveIndex = ComboBox_GetCurSel(hDeviceList);
enum { image_type_vhd = 1, image_type_vhdx = 2, image_type_ffu = 3 };
static EXT_DECL(img_ext, filename, __VA_GROUP__("*.vhd", "*.vhdx", "*.ffu"),
__VA_GROUP__(lmprintf(MSG_343), lmprintf(MSG_342), lmprintf(MSG_344)));
ULARGE_INTEGER free_space;
@ -1123,20 +1141,27 @@ void VhdSaveImage(void)
img_save.DeviceNum = (DWORD)ComboBox_GetItemData(hDeviceList, DriveIndex);
img_save.DevicePath = GetPhysicalName(img_save.DeviceNum);
// FFU support requires GPT
if (!has_ffu_support || SelectedDrive.PartitionStyle != PARTITION_STYLE_GPT)
img_ext.count = 2;
for (i = 1; i <= (UINT)img_ext.count && (safe_strcmp(&_img_ext_x[i - 1][2], save_image_type) != 0); i++);
img_ext.count = (!has_ffu_support || SelectedDrive.PartitionStyle != PARTITION_STYLE_GPT) ? 2 : 3;
for (i = 1; i <= (UINT)img_ext.count && (safe_strcmp(save_image_type , &_img_ext_x[i - 1][2]) != 0); i++);
if (i > (UINT)img_ext.count)
i = 2;
i = image_type_vhdx;
img_save.ImagePath = FileDialog(TRUE, NULL, &img_ext, &i);
assert(i > 0 && i <= (UINT)img_ext.count);
save_image_type = (char*) &_img_ext_x[i - 1][2];
WriteSettingStr(SETTING_PREFERRED_SAVE_IMAGE_TYPE, save_image_type);
if (img_save.ImagePath == NULL)
goto out;
// Start from the end of our extension array, since '.vhd' would match for '.vhdx' otherwise
for (i = (UINT)img_ext.count; (i > 0) && (strstr(img_save.ImagePath, &_img_ext_x[i - 1][1]) == NULL); i--);
if (i == 0) {
uprintf("Warning: Can not determine image type from extension - Saving to uncompressed VHD.");
i = image_type_vhd;
} else {
save_image_type = (char*)&_img_ext_x[i - 1][2];
WriteSettingStr(SETTING_PREFERRED_SAVE_IMAGE_TYPE, save_image_type);
}
switch (i) {
case 1:
case image_type_vhd:
img_save.Type = VIRTUAL_STORAGE_TYPE_DEVICE_VHD;
break;
case 3:
case image_type_ffu:
img_save.Type = VIRTUAL_STORAGE_TYPE_DEVICE_FFU;
break;
default:
@ -1148,21 +1173,21 @@ void VhdSaveImage(void)
if (img_save.DevicePath != NULL && img_save.ImagePath != NULL) {
// Reset all progress bars
SendMessage(hMainDialog, UM_PROGRESS_INIT, 0, 0);
FormatStatus = 0;
ErrorStatus = 0;
if (img_save.Type == VIRTUAL_STORAGE_TYPE_DEVICE_VHD) {
free_space.QuadPart = 0;
if ((GetVolumePathNameA(img_save.ImagePath, path, sizeof(path)))
&& (GetDiskFreeSpaceExA(path, &free_space, NULL, NULL))
&& ((LONGLONG)free_space.QuadPart < (SelectedDrive.DiskSize + 512))) {
uprintf("The VHD size is too large for the target drive");
FormatStatus = ERROR_SEVERITY_ERROR | FAC(FACILITY_STORAGE) | ERROR_FILE_TOO_LARGE;
ErrorStatus = RUFUS_ERROR(ERROR_FILE_TOO_LARGE);
PostMessage(hMainDialog, UM_FORMAT_COMPLETED, (WPARAM)FALSE, 0);
goto out;
}
}
// Disable all controls except Cancel
EnableControls(FALSE, FALSE);
FormatStatus = 0;
ErrorStatus = 0;
InitProgress(TRUE);
format_thread = CreateThread(NULL, 0, img_save.Type == VIRTUAL_STORAGE_TYPE_DEVICE_FFU ?
FfuSaveImageThread : VhdSaveImageThread, &img_save, 0, NULL);
@ -1172,7 +1197,7 @@ void VhdSaveImage(void)
SendMessage(hMainDialog, UM_TIMER_START, 0, 0);
} else {
uprintf("Unable to start VHD save thread");
FormatStatus = ERROR_SEVERITY_ERROR | FAC(FACILITY_STORAGE) | APPERR(ERROR_CANT_START_THREAD);
ErrorStatus = RUFUS_ERROR(APPERR(ERROR_CANT_START_THREAD));
PostMessage(hMainDialog, UM_FORMAT_COMPLETED, (WPARAM)FALSE, 0);
}
}

View File

@ -1,7 +1,7 @@
/*
* Rufus: The Reliable USB Formatting Utility
* Virtual Disk Handling definitions and prototypes
* Copyright © 2022 Pete Batard <pete@akeo.ie>
* Copyright © 2022-2024 Pete Batard <pete@akeo.ie>
*
* 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
@ -135,7 +135,8 @@ extern BOOL WimUnmountImage(const char* image, int index, BOOL commit);
extern char* WimGetExistingMountPoint(const char* image, int index);
extern BOOL WimIsValidIndex(const char* image, int index);
extern int8_t IsBootableImage(const char* path);
extern char* VhdMountImage(const char* path);
extern char* VhdMountImageAndGetSize(const char* path, uint64_t* disksize);
#define VhdMountImage(path) VhdMountImageAndGetSize(path, NULL)
extern void VhdUnmountImage(void);
extern void VhdSaveImage(void);
extern void IsoSaveImage(void);

View File

@ -2,7 +2,7 @@
* Rufus: The Reliable USB Formatting Utility
* Windows I/O redefinitions, that would be totally unnecessary had
* Microsoft done a proper job with their asynchronous APIs.
* Copyright © 2021 Pete Batard <pete@akeo.ie>
* Copyright © 2021-2024 Pete Batard <pete@akeo.ie>
*
* 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
@ -165,10 +165,10 @@ static __inline BOOL GetSizeAsync(HANDLE h, LPDWORD lpNumberOfBytes)
SetLastError(ERROR_NO_MORE_ITEMS);
return FALSE;
}
// TODO: Use a timeout and call GetOverlappedResultEx() on Windows 8 and later
if (!GetOverlappedResult(fd->hFile, (OVERLAPPED*)&fd->Overlapped,
lpNumberOfBytes, (fd->iStatus < 0)))
return (GetLastError() == ERROR_HANDLE_EOF);
if (!GetOverlappedResultEx(fd->hFile, (OVERLAPPED*)&fd->Overlapped,
lpNumberOfBytes, WRITE_TIMEOUT, (fd->iStatus < 0)))
// When reading from VHD/VHDX we get SECTOR_NOT_FOUND rather than EOF for the end of the drive
return (GetLastError() == ERROR_HANDLE_EOF || GetLastError() == ERROR_SECTOR_NOT_FOUND);
fd->Overlapped.Offset += *lpNumberOfBytes;
fd->Overlapped.bOffsetUpdated = TRUE;
return TRUE;

View File

@ -1,7 +1,7 @@
/*
* Rufus: The Reliable USB Formatting Utility
* Windows User Experience
* Copyright © 2022-2023 Pete Batard <pete@akeo.ie>
* Copyright © 2022-2024 Pete Batard <pete@akeo.ie>
*
* 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
@ -47,6 +47,9 @@ char *unattend_xml_path = NULL, unattend_username[MAX_USERNAME_LENGTH];
BOOL is_bootloader_revoked = FALSE;
extern uint32_t wim_nb_files, wim_proc_files, wim_extra_files;
extern BOOL validate_md5sum;
extern uint64_t md5sum_totalbytes;
extern StrArray modified_files;
/// <summary>
/// Create an installation answer file containing the sections specified by the flags.
@ -255,12 +258,12 @@ BOOL SetupWinPE(char drive_letter)
const char* patch_str_org[2] = { "\\minint\\txtsetup.sif", "\\minint\\system32\\" };
const char* patch_str_rep[2][2] = { { "\\i386\\txtsetup.sif", "\\i386\\system32\\" } ,
{ "\\amd64\\txtsetup.sif", "\\amd64\\system32\\" } };
const char* setupsrcdev = "SetupSourceDevice = \"\\device\\harddisk1\\partition1\"";
const char* win_nt_bt_org = "$win_nt$.~bt";
const char* rdisk_zero = "rdisk(0)";
const LARGE_INTEGER liZero = { {0, 0} };
char setupsrcdev[64];
HANDLE handle = INVALID_HANDLE_VALUE;
DWORD i, j, size, rw_size, index = 0;
DWORD i, j, size, read_size, index = 0;
BOOL r = FALSE;
char* buffer = NULL;
@ -268,9 +271,6 @@ BOOL SetupWinPE(char drive_letter)
index = 1;
else if ((img_report.winpe & WINPE_MININT) == WINPE_MININT)
index = 2;
// Allow other values than harddisk 1, as per user choice for disk ID
static_sprintf(setupsrcdev, "SetupSourceDevice = \"\\device\\harddisk%d\\partition1\"",
ComboBox_GetCurSel(hDiskID));
// Copy of ntdetect.com in root
static_sprintf(src, "%c:\\%s\\ntdetect.com", toupper(drive_letter), basedir[2 * (index / 2)]);
static_sprintf(dst, "%c:\\ntdetect.com", toupper(drive_letter));
@ -322,7 +322,7 @@ BOOL SetupWinPE(char drive_letter)
buffer = (char*)malloc(size);
if (buffer == NULL)
goto out;
if ((!ReadFile(handle, buffer, size, &rw_size, NULL)) || (size != rw_size)) {
if ((!ReadFile(handle, buffer, size, &read_size, NULL)) || (size != read_size)) {
uprintf("Could not read file %s: %s\n", dst, WindowsErrorString());
goto out;
}
@ -356,7 +356,7 @@ BOOL SetupWinPE(char drive_letter)
// rdisk(0) -> rdisk(#) disk masquerading
// NB: only the first one seems to be needed
if (safe_strnicmp(&buffer[i], rdisk_zero, strlen(rdisk_zero) - 1) == 0) {
buffer[i + 6] = 0x30 + ComboBox_GetCurSel(hDiskID);
buffer[i + 6] = 0x31;
uprintf(" 0x%08X: '%s' -> 'rdisk(%c)'\n", i, rdisk_zero, buffer[i + 6]);
}
// $WIN_NT$_~BT -> i386/amd64
@ -370,7 +370,7 @@ BOOL SetupWinPE(char drive_letter)
}
}
if (!WriteFileWithRetry(handle, buffer, size, &rw_size, WRITE_RETRIES)) {
if (!WriteFileWithRetry(handle, buffer, size, NULL, WRITE_RETRIES)) {
uprintf("Could not write patched file: %s\n", WindowsErrorString());
goto out;
}
@ -647,7 +647,7 @@ BOOL SetupWinToGo(DWORD DriveIndex, const char* drive_name, BOOL use_esp)
uprintf("Windows To Go mode selected");
// Additional sanity checks
if ((use_esp) && (SelectedDrive.MediaType != FixedMedia) && (WindowsVersion.BuildNumber < 15000)) {
FormatStatus = ERROR_SEVERITY_ERROR | FAC(FACILITY_STORAGE) | ERROR_NOT_SUPPORTED;
ErrorStatus = RUFUS_ERROR(ERROR_NOT_SUPPORTED);
return FALSE;
}
@ -655,7 +655,7 @@ BOOL SetupWinToGo(DWORD DriveIndex, const char* drive_name, BOOL use_esp)
mounted_iso = VhdMountImage(image_path);
if (mounted_iso == NULL) {
uprintf("Could not mount ISO for Windows To Go installation");
FormatStatus = ERROR_SEVERITY_ERROR | FAC(FACILITY_STORAGE) | APPERR(ERROR_ISO_EXTRACT);
ErrorStatus = RUFUS_ERROR(APPERR(ERROR_ISO_EXTRACT));
return FALSE;
}
static_sprintf(mounted_image_path, "%s%s", mounted_iso, &img_report.wininst_path[wininst_index][2]);
@ -665,8 +665,8 @@ BOOL SetupWinToGo(DWORD DriveIndex, const char* drive_name, BOOL use_esp)
// Now we use the WIM API to apply that image
if (!WimApplyImage(img_report.is_windows_img ? image_path : mounted_image_path, wintogo_index, drive_name)) {
uprintf("Failed to apply Windows To Go image");
if (!IS_ERROR(FormatStatus))
FormatStatus = ERROR_SEVERITY_ERROR | FAC(FACILITY_STORAGE) | APPERR(ERROR_ISO_EXTRACT);
if (!IS_ERROR(ErrorStatus))
ErrorStatus = RUFUS_ERROR(APPERR(ERROR_ISO_EXTRACT));
if (!img_report.is_windows_img)
VhdUnmountImage();
return FALSE;
@ -690,16 +690,16 @@ BOOL SetupWinToGo(DWORD DriveIndex, const char* drive_name, BOOL use_esp)
// VDS cannot list ESP volumes (talk about allegedly improving on the old disk and volume APIs, only to
// completely neuter it) and IVdsDiskPartitionMF::FormatPartitionEx(), which is what you are supposed to
// use for ESPs, explicitly states: "This method cannot be used to format removable media."
if (!FormatPartition(DriveIndex, partition_offset[PI_ESP], cluster_size, FS_FAT32, "",
if (!FormatPartition(DriveIndex, SelectedDrive.Partition[partition_index[PI_ESP]].Offset, cluster_size, FS_FAT32, "",
FP_QUICK | FP_FORCE | FP_LARGE_FAT32 | FP_NO_BOOT)) {
uprintf("Could not format EFI System Partition");
return FALSE;
}
Sleep(200);
// Need to have the ESP mounted to invoke bcdboot
ms_efi = AltMountVolume(DriveIndex, partition_offset[PI_ESP], FALSE);
ms_efi = AltMountVolume(DriveIndex, SelectedDrive.Partition[partition_index[PI_ESP]].Offset, FALSE);
if (ms_efi == NULL) {
FormatStatus = ERROR_SEVERITY_ERROR | FAC(FACILITY_STORAGE) | APPERR(ERROR_CANT_ASSIGN_LETTER);
ErrorStatus = RUFUS_ERROR(APPERR(ERROR_CANT_ASSIGN_LETTER));
return FALSE;
}
}
@ -719,7 +719,7 @@ BOOL SetupWinToGo(DWORD DriveIndex, const char* drive_name, BOOL use_esp)
if (RunCommand(cmd, sysnative_dir, usb_debug) != 0) {
// Try to continue... but report a failure
uprintf("Failed to enable boot");
FormatStatus = ERROR_SEVERITY_ERROR | FAC(FACILITY_STORAGE) | APPERR(ERROR_ISO_EXTRACT);
ErrorStatus = RUFUS_ERROR(APPERR(ERROR_ISO_EXTRACT));
}
CopySKUSiPolicy((use_esp) ? ms_efi : drive_name);
@ -808,6 +808,10 @@ BOOL ApplyWindowsCustomization(char drive_letter, int flags)
CloseHandle(CreateFileU(appraiserres_dll_src, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ,
NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL));
uprintf("Created '%s' placeholder", appraiserres_dll_src);
if (validate_md5sum) {
md5sum_totalbytes -= _filesizeU(appraiserres_dll_dst);
StrArrayAdd(&modified_files, appraiserres_dll_src, TRUE);
}
}
}
@ -815,6 +819,8 @@ BOOL ApplyWindowsCustomization(char drive_letter, int flags)
// We only need to mount boot.wim if we have windowsPE data to deal with. If
// not, we can just copy our unattend.xml in \sources\$OEM$\$$\Panther\.
if (flags & UNATTEND_WINPE_SETUP_MASK) {
if (validate_md5sum)
md5sum_totalbytes -= _filesizeU(boot_wim_path);
uprintf("Mounting '%s[%d]'...", boot_wim_path, wim_index);
// Some "unofficial" ISOs have a modified boot.wim that doesn't have Windows Setup at index 2...
if (!WimIsValidIndex(boot_wim_path, wim_index)) {
@ -929,6 +935,10 @@ out:
if (mount_path) {
uprintf("Unmounting '%s[%d]'...", boot_wim_path, wim_index);
WimUnmountImage(boot_wim_path, wim_index, TRUE);
if (validate_md5sum) {
md5sum_totalbytes += _filesizeU(boot_wim_path);
StrArrayAdd(&modified_files, boot_wim_path, TRUE);
}
UpdateProgressWithInfo(OP_PATCH, MSG_325, PATCH_PROGRESS_TOTAL, PATCH_PROGRESS_TOTAL);
}
free(mount_path);