Commit Graph

12914 Commits

Author SHA1 Message Date
David Korth
b19f128903 [librptexture] ICOPrivate::~ICOPrivate(): Use dir.is_res instead of isResource().
Some checks failed
Codecov / run (push) Has been cancelled
CodeQL / Analyze (cpp) (push) Has been cancelled
Removed isResource().
2025-06-13 18:35:18 -04:00
David Korth
73eb28c4ee [librptexture] ICO: Show the icon directory with all the icon variants.
For standalone Win3.x icons and cursors only.

Color depth and format are shown, including if it's PNG format.

ICOPrivate::loadImage(): Remove caching stuff, since it's handled
by ICO::loadInternalImage().
2025-06-13 18:30:09 -04:00
David Korth
e5c512ca92 [rp-download] SetFileOriginInfo_win32.cpp: Load NTDLL.DLL function pointers using GetProcAddress().
AppVeyor's MSVC 2015 image doesn't have ntdll.lib for some reason.
2025-06-13 18:14:49 -04:00
David Korth
1da1c39c18 [librptexture] ICO: Remove pIconHeader.
Use dir.bestIcon_idx as an index into d->iconBitmapHeaders[] instead.
2025-06-13 18:13:16 -04:00
David Korth
da852e5d50 [librptexture] ICOPrivate::loadIconDirectory_Win3(): Missed an le32_to_cpu(). 2025-06-13 18:08:02 -04:00
David Korth
f157be4a97 [rp-download] SetFileOriginInfo_win32.cpp: Use NTDLL to write the Alternate Data Stream with just the file handle.
Some checks are pending
Codecov / run (push) Waiting to run
CodeQL / Analyze (cpp) (push) Waiting to run
Note that we have to use NtWriteFile(). Using WriteFile() results in
ERROR_BAD_COMMAND.

If the ADS write fails, it will be deleted with NtDeleteFile().

NOTE: Unicode only! ANSI builds won't write the ADS anymore.
ANSI builds (if they even work at all) should only be used on
Win9x, which doesn't support ADS anyway.

TODO: Convert NTSTATUS to POSIX error codes?
2025-06-12 23:33:56 -04:00
David Korth
a19815f744 [librptexture] ICO: Remove imageResType() in favor of dir.rt and dir.is_res.
This simplifies the code a bit more and removes some function calls.

dir.rt is the individual bitmap resource type: RT_ICON, RT_CURSOR
dir.is_res is true for .exe/.dll resources, and false for .ico/.cur files.
2025-06-12 22:00:05 -04:00
David Korth
a5554fd244 [librptexture] ICO: Remove pBestIcon from the icodir structs. Use an index instead.
This simplifies things a bit.
2025-06-12 21:42:18 -04:00
David Korth
0c512deed6 [librptexture] ICO: Rework the private loadImage_*() functions (except Win1) to take a bitmap image index.
This will allow us to show a list of all the bitmaps in a given icon.

NOTE: loadInternalImage() ensures that d->img_icon is set to the "best"
icon; that is, icon index "-1". The loadImage_*() functions won't use
d->img_icon themselves, so if the "best" icon is manually selected
using positive indexes, it won't be cached.
2025-06-12 21:31:09 -04:00
David Korth
704a5eead5 [librptexture] ICOPrivate::loadImage_WinVista_PNG(): Use res.pBestIcon->nID instead of res.id.
res.id may have accidentally worked because it was set to -1, but it's
the ID of the RT_GROUP_ICON, not the RT_ICON.
2025-06-12 21:11:41 -04:00
David Korth
783d384b04 [libromdata] EXE: Add .mui and .mun to the file extensions list.
.mui is a resource DLL used for localization.

.mun is used in Windows 10 1903+ (or possibly slightly earlier) for
icons in C:\Windows\SystemResources\ , instead of storing icons in
e.g. notepad.exe.
2025-06-12 21:07:21 -04:00
David Korth
9ca7daf9c8 [libromdata] EXE: No application icon if it's not NE/PE or not an executable.
Also, add d->file.reset() to more error paths in the constructor.
2025-06-12 21:06:01 -04:00
David Korth
c31919826b [libromdata] IsoPartitionPrivate::getDirectory(): Fix an inverted comment. 2025-06-12 20:58:57 -04:00
David Korth
bf2d3af7c3 [gettext.win32] Updated to gettext-0.25.
Some checks are pending
Codecov / run (push) Waiting to run
CodeQL / Analyze (cpp) (push) Waiting to run
Compiled with:
- i386:  gcc-15.1.0, MinGW-w64 12.0.0
- amd64: gcc-15.1.0, MinGW-w64 12.0.0

The file sizes have grown a bit. In particular, xgettext.exe grew from
1,529,344 bytes to 8,492,544 bytes. This might be related to various
gnulib updates, since libgnuintl-8.dll has a bunch of new exports
compared to 0.24.
2025-06-11 22:30:05 -04:00
David Korth
e2eede76f7 Merge branch 'feature/IsoPartition-readdir'
Some checks failed
Codecov / run (push) Has been cancelled
CodeQL / Analyze (cpp) (push) Has been cancelled
Includes:
- IsoPartition::readdir()
- ISO-9660 Joliet support
- ICO parser (for Win1.x and Win3.x)
- EXE thumbnailing (for Win1.x, Win3.x, and Win32/Win64)
- ISO thumbnailing via AUTORUN.INF
2025-06-09 23:48:08 -04:00
David Korth
e12bb51b47 [librptexture] ICOPrivate::loadImage_Win3(): Move the bitmap size check up a bit.
Some checks failed
Codecov / run (push) Has been cancelled
2025-06-09 21:05:24 -04:00
David Korth
417825cd6f [librptexture] ICO: Handle Win3.x 1bpp (monochrome) icons.
Tested by converting Win2.x BANG.ICO to Win3.x format.

ICOPrivate::loadImage_Win1():
- Note that the mask is *before* the icon.

ImageDecoder::fromLinearMono_WinIcon():
- Take separate pointers for the icon and mask data. Win3.x icons are
  typically stored upside-down, so this lets us handle that outside
  of the decoder function. This also means the image data size does
  not have to be 2x. Note that `img_siz == mask_siz` must be true.
2025-06-09 20:21:25 -04:00
David Korth
da94256a37 [xdg] mime.no-thumbnail.types: Add Windows icon/cursor MIME types.
FIXME: KDE isn't showing the ROM Properties tab on .ico files,
but Thunar and Nautilus show it just fine...
2025-06-09 20:00:09 -04:00
David Korth
222f2456fd [librptexture] ICOPrivate::loadImage_Win3(): Minor adjustment to the assertion message. 2025-06-09 19:45:04 -04:00
David Korth
11da731ef7 [librptexture] ICOPrivate::loadImage_Win3(): Add assertions for unsupported icon formats.
TODO: Need a test icon for Win3.x monochrome icons.
2025-06-09 19:43:51 -04:00
David Korth
a4efadbc56 NEWS.md: Mention issues #170 and #232. 2025-06-09 19:28:52 -04:00
David Korth
0e1a5ce237 [libromdata] ISO::loadFieldData(): Show the AUTORUN.INF fields in a new tab.
The fields are displayed as-is.

Changed autorun_inf from unordered_map<> to map<> for alphabetical sorting.
TODO: Preserve the original sort order?

TODO: Store the original key case?
2025-06-09 19:26:40 -04:00
David Korth
d557b607c2 [[libromdata] ISO: Only load the "[autorun]" section for now.
TODO: Read more sections later.
2025-06-09 19:21:47 -04:00
David Korth
1897ac198f [libromdata] ISO: Load the entire AUTORUN.INF for display purposes.
It's not displayed yet, but it's loaded.

The section names are concatenated with the key names, e.g.:
"autorun|icon"

IsoPartition::open(): Set m_lastError = ENOENT if the file isn't found.
2025-06-09 19:18:31 -04:00
David Korth
5083161c23 [librptexture] ICO: Fix regression that broke Win3.x icons; remove unneeded assert().
ICOPrivate::loadIconDirectory_Win3():
- rt == res.type *only* for Win1.x. For Win3.x, res.type is RT_GROUP_ICON
  or RT_GROUP_CURSOR. For Win1.x, it's RT_ICON or RT_CURSOR.

This fixes a regression from commit 22da0c2e21.
([libromdata] EXE: Load icons from Windows 1.x/2.x executables.)
2025-06-09 18:50:44 -04:00
David Korth
22da0c2e21 [libromdata] EXE: Load icons from Windows 1.x/2.x executables.
Windows 1.x/2.x does not have RT_GROUP_ICON. For NE executables,
check for RT_GROUP_ICON, and use it if found. Otherwise, check for
RT_ICON and use that if found.

IResourceReader: Add a function has_resource_type() to check if the
executable has any resources of the specified type.

[librptexture] ICO: Handle RT_ICON and RT_CURSOR as Windows 1.x/2.x.
TODO: Check the header to verify?
2025-06-09 18:37:47 -04:00
David Korth
8f762b7c78 ICOPrivate::ICOPrivate(): Return if the type is unrecognized.
Otherwise, dir.res will be allocated, with unpredictable results.
2025-06-09 18:30:01 -04:00
David Korth
acdf3544e1 [libromdata] NEResourceReader::lookup_resource_ID(): OR the type with 0x8000.
With Win16, the high bit needs to be set for ordinal resources.
Otherwise, it's a named resource, which we don't support right now.

Thumbnailing still worked because we were using the code path for
the "first" icon using NEResourceReader::open(), which had the
`| 0x8000` bit already.
2025-06-09 18:24:34 -04:00
David Korth
bb2e0b5e87 [kde] AchQtDBus::notifyFunc(): Fix the Qt4 build.
Some checks are pending
Codecov / run (push) Waiting to run
CodeQL / Analyze (cpp) (push) Waiting to run
2025-06-09 18:13:47 -04:00
David Korth
65a3855b98 [libromdata] NEResourceReaderPrivate::loadResTbl(): Fix an off-by-one error that broke reading resources from SkiFree 1.0.
SkiFree doesn't have any named resources, so its resource table ends
immediately after rscEndTypes. The off-by-one prevented us from
recognizing the presence of rscEndTypes.

SKI.EXE can now be thumbnailed.
2025-06-09 18:11:03 -04:00
David Korth
847342306a [libromdata] NEResourceReaderPrivate::loadResTbl(): Allow string names for now.
Some Windows 3.1 programs, e.g. CALC.EXE, have RT_GROUP_ICONs that use
string names. We need to allow this in order to thumbnail CALC.EXE.
2025-06-09 18:08:50 -04:00
David Korth
3fdd98929d [libromdata] IsoPartition: Update the "\x00" and "\x01" comments. 2025-06-08 16:10:11 -04:00
David Korth
41765be492 NEWS.md: Mention the ISO and Windows icon changes. 2025-06-08 15:53:24 -04:00
David Korth
4342ce8a1b [libromdata] ISO, IsoPartition: Simplify the Joliet escape sequence parser a bit. 2025-06-08 15:29:25 -04:00
David Korth
6e7d57282f [libromdata] ISO: Show the Joliet level.
Some checks are pending
Codecov / run (push) Waiting to run
I was considering exporting this from IsoPartition, but the IsoPartition
isn't accessible at this point. We're reading all of the volume
descriptors in checkVolumeDescriptors() anyway, so that sets a local
version of jolietSVDType, which is then checked in loadFieldData().
2025-06-08 15:00:39 -04:00
David Korth
3f1f92b18a [libromdata] IsoPartition: Add basic support for Joliet directories.
If a Supplementary Volume Descriptor is present, check for the Joliet
UCS-2 escape sequences. If found, use the SVD root directory.

Filenames in the SVD root directory are encoded in UCS-2 (big-endian).
The filename length is in bytes, not code points.

NOTE: Currently using a very cheap hack to convert UCS-2 to cp1252,
or more accurately, ISO-8859-1. It's good enough for our purposes
for now. (specifically, getting the icon from AUTORUN.INF.)

TODO: Better character set conversion.
2025-06-08 14:46:56 -04:00
David Korth
a5d22511e0 [libromdata] IsoPartition::readdir(): If there's no more non-zero bytes, return nullptr.
Otherwise, an empty IFst::DirEnt is returned.
2025-06-08 14:44:49 -04:00
David Korth
618c7c6a8d [librptexture] ICO: Fix an implicit cast warning on 64-bit MSVC.
Some checks are pending
Codecov / run (push) Waiting to run
src\librptexture\fileformat\ICO.cpp(642,11): warning C4267: '+=':
	conversion from 'size_t' to 'unsigned int', possible loss of data
2025-06-08 13:07:55 -04:00
David Korth
9a4ab48ccb [libromdata] RomDataFactory: s/exe/ext/
This fixes a Windows build regression from commit 9994c2df94.
([libromdata] RomDataFactory: Explicitly prevent ".ico" and ".cur" from being thumbnailed on Windows.)
2025-06-08 13:05:31 -04:00
David Korth
64fe76a285 [librpbase] exe_res_structs.h: Don't re-define version resource stuff if winver.h is already included.
This should fix the Windows build.
2025-06-08 13:04:12 -04:00
David Korth
993e52084d [librpbase] IResourceReader: New function lookup_resource_ID().
This function takes a zero-based index and returns a resource ID for
the given resource type if it's within range. Otherwise, it returns
a negative POSIX error code.

[libromdata] PEResourceReader, NEResourceReader: Implement it.

[libromdata] EXE: Use lookup_resource_ID for positive icon indexes.

This fixes thumbnailing for discs whose AUTORUN.INF specify a
positive, non-zero icon index.

TODO: Older discs may have truncated ISO-9660 filenames. Need to
parse Joliet file systems, maybe...
2025-06-08 12:44:35 -04:00
David Korth
55cad0ad98 [libromdata] ISO: Parse the icon index for EXE/DLL autorun icons.
The icon index can be:
- 0: First icon
- >0: Zero-based icon index
- <0: Resource ID

EXE: New function loadSpecificIcon() to load an icon given an index.
For iconindex == 0, the icon is cached in d->img_icon.

TODO: Implement a function in IResourceReader to look up a resource ID
from the zero-based index.
2025-06-08 12:23:37 -04:00
David Korth
93e78417e0 [libromdata] ISO: Load AUTORUN.INF icons from EXEs and/or DLLs.
TODO: Handle the icon index.
2025-06-08 11:54:45 -04:00
David Korth
453461e8fb [librptexture] ICOPrivate::loadImage_Win3(): Need to skip the BITMAPINFOHEADER when parsing resource icons.
This fixes the corrupted 128x128 VBoxGuestAdditions.exe icon.
2025-06-08 11:54:34 -04:00
David Korth
f5be3c81a4 [libromdata] EXE: Add icon thumbnailing using librptexture's ICO class.
Uses the first icon in the first available language.

New function loadResourceReader() which ensures rsrcReader is loaded.

[librptexture] ICO: Fix resource loading issues:

- Use the correct resource file pointer, not this->file.
- Add IconRes_Win3 and CursorRes_Win3 cases where appropriate.
- Ensure d->iconType doesn't get overwritten after it's set by the
  ICOPrivate constructor for resources.

FIXME: VBoxWindowsAdditions.exe's PNG icon loads fine, but the 128x128
"regular" icon is corrupted.
2025-06-08 11:40:59 -04:00
David Korth
9994c2df94 [libromdata] RomDataFactory: Explicitly prevent ".ico" and ".cur" from being thumbnailed on Windows.
Also add a note saying EXE shouldn't be registered for thumbnailing,
either.

This will still allow using `rpcli`, and for subclasses to use
EXE to thumbnail e.g. ISO images.
2025-06-08 11:12:06 -04:00
David Korth
6026b40df5 [libromdata] PlayStationDiscPrivate::loadSystemCnf(): Use a constant for the SYSTEM.CNF maximum size. 2025-06-08 02:33:38 -04:00
David Korth
409915591d [libromdata] ISOPrivate::loadIcon(): f_file.reset() isn't needed here. 2025-06-08 02:31:45 -04:00
David Korth
8c5888e9e5 [librptexture] ICO: Rework to support loading from Windows resources.
Some checks are pending
Codecov / run (push) Waiting to run
NOT TESTED; need to add it to the EXE class to test it.
(.ico files still work as they did before.)

Added a constructor that takes an IResourceReaderPtr and the
type/id/lang of the icon. Type should be RT_GROUP_ICON or
RT_GROUP_CURSOR. These are all saved in icodir_res.

The dir union is now initialized in the ICOPrivate constructors,
and is only reset in the ICOPrivate destructor.

loadImage_Win3(): Use a new IRpFilePtr for the icon data.
- For .ico, it's a copy of this->file.
- For Windows executables, it's opened from the IResourceReader.
- Starting address is the icon bitmap address for .ico and
  0 for IResourceReader.
2025-06-08 00:14:28 -04:00
David Korth
d0fb8dc73e [libromdata] ISO::imgpf(): Remove unused RP_D() for now, and an extra 'break;' statement.
In file included from src/libromdata/stdafx.h:63,
                 from src/libromdata/Media/ISO.cpp:10:
src/libromdata/Media/ISO.cpp: In member function ‘virtual uint32_t LibRomData::ISO::imgpf(LibRpBase::RomData::ImageType) const’:
src/libromdata/../common.h:93:45: warning: unused variable ‘d’ [-Wunused-variable]
   93 | #  define RP_D(klass) klass##Private *const d = static_cast<klass##Private*>(d_ptr)
      |                                             ^
src/libromdata/Media/ISO.cpp:984:9: note: in expansion of macro ‘RP_D’
  984 |         RP_D(const ISO);
      |         ^~~~
2025-06-07 23:30:31 -04:00