ReactOS.org
Sign In
Sign Up
Sign In
Sign Up
Manage this list
×
Keyboard Shortcuts
Thread View
j
: Next unread message
k
: Previous unread message
j a
: Jump to all threads
j l
: Jump to MailingList overview
2025
March
February
January
2024
December
November
October
September
August
July
June
May
April
March
February
January
2023
December
November
October
September
August
July
June
May
April
March
February
January
2022
December
November
October
September
August
July
June
May
April
March
February
January
2021
December
November
October
September
August
July
June
May
April
March
February
January
2020
December
November
October
September
August
July
June
May
April
March
February
January
2019
December
November
October
September
August
July
June
May
April
March
February
January
2018
December
November
October
September
August
July
June
May
April
March
February
January
2017
December
November
October
September
August
July
June
May
April
March
February
January
2016
December
November
October
September
August
July
June
May
April
March
February
January
2015
December
November
October
September
August
July
June
May
April
March
February
January
2014
December
November
October
September
August
July
June
May
April
March
February
January
2013
December
November
October
September
August
July
June
May
April
March
February
January
2012
December
November
October
September
August
July
June
May
April
March
February
January
2011
December
November
October
September
August
July
June
May
April
March
February
January
2010
December
November
October
September
August
July
June
May
April
March
February
January
2009
December
November
October
September
August
July
June
May
April
March
February
January
2008
December
November
October
September
August
July
June
May
April
March
February
January
2007
December
November
October
September
August
July
June
May
April
March
February
January
2006
December
November
October
September
August
July
June
May
April
March
February
January
2005
December
November
October
September
August
July
June
May
April
March
February
January
2004
December
November
October
September
August
July
June
May
April
March
February
List overview
Download
Ros-diffs
February 2025
----- 2025 -----
March 2025
February 2025
January 2025
----- 2024 -----
December 2024
November 2024
October 2024
September 2024
August 2024
July 2024
June 2024
May 2024
April 2024
March 2024
February 2024
January 2024
----- 2023 -----
December 2023
November 2023
October 2023
September 2023
August 2023
July 2023
June 2023
May 2023
April 2023
March 2023
February 2023
January 2023
----- 2022 -----
December 2022
November 2022
October 2022
September 2022
August 2022
July 2022
June 2022
May 2022
April 2022
March 2022
February 2022
January 2022
----- 2021 -----
December 2021
November 2021
October 2021
September 2021
August 2021
July 2021
June 2021
May 2021
April 2021
March 2021
February 2021
January 2021
----- 2020 -----
December 2020
November 2020
October 2020
September 2020
August 2020
July 2020
June 2020
May 2020
April 2020
March 2020
February 2020
January 2020
----- 2019 -----
December 2019
November 2019
October 2019
September 2019
August 2019
July 2019
June 2019
May 2019
April 2019
March 2019
February 2019
January 2019
----- 2018 -----
December 2018
November 2018
October 2018
September 2018
August 2018
July 2018
June 2018
May 2018
April 2018
March 2018
February 2018
January 2018
----- 2017 -----
December 2017
November 2017
October 2017
September 2017
August 2017
July 2017
June 2017
May 2017
April 2017
March 2017
February 2017
January 2017
----- 2016 -----
December 2016
November 2016
October 2016
September 2016
August 2016
July 2016
June 2016
May 2016
April 2016
March 2016
February 2016
January 2016
----- 2015 -----
December 2015
November 2015
October 2015
September 2015
August 2015
July 2015
June 2015
May 2015
April 2015
March 2015
February 2015
January 2015
----- 2014 -----
December 2014
November 2014
October 2014
September 2014
August 2014
July 2014
June 2014
May 2014
April 2014
March 2014
February 2014
January 2014
----- 2013 -----
December 2013
November 2013
October 2013
September 2013
August 2013
July 2013
June 2013
May 2013
April 2013
March 2013
February 2013
January 2013
----- 2012 -----
December 2012
November 2012
October 2012
September 2012
August 2012
July 2012
June 2012
May 2012
April 2012
March 2012
February 2012
January 2012
----- 2011 -----
December 2011
November 2011
October 2011
September 2011
August 2011
July 2011
June 2011
May 2011
April 2011
March 2011
February 2011
January 2011
----- 2010 -----
December 2010
November 2010
October 2010
September 2010
August 2010
July 2010
June 2010
May 2010
April 2010
March 2010
February 2010
January 2010
----- 2009 -----
December 2009
November 2009
October 2009
September 2009
August 2009
July 2009
June 2009
May 2009
April 2009
March 2009
February 2009
January 2009
----- 2008 -----
December 2008
November 2008
October 2008
September 2008
August 2008
July 2008
June 2008
May 2008
April 2008
March 2008
February 2008
January 2008
----- 2007 -----
December 2007
November 2007
October 2007
September 2007
August 2007
July 2007
June 2007
May 2007
April 2007
March 2007
February 2007
January 2007
----- 2006 -----
December 2006
November 2006
October 2006
September 2006
August 2006
July 2006
June 2006
May 2006
April 2006
March 2006
February 2006
January 2006
----- 2005 -----
December 2005
November 2005
October 2005
September 2005
August 2005
July 2005
June 2005
May 2005
April 2005
March 2005
February 2005
January 2005
----- 2004 -----
December 2004
November 2004
October 2004
September 2004
August 2004
July 2004
June 2004
May 2004
April 2004
March 2004
February 2004
ros-diffs@reactos.org
17 participants
79 discussions
Start a n
N
ew thread
[reactos] 01/01: Revert "[USER32][LIBPNG] Support PNG/Vista icons (#7704)"
by Hermès Bélusca-Maïto
https://git.reactos.org/?p=reactos.git;a=commitdiff;h=468a9787d1e39c2034189…
commit 468a9787d1e39c2034189f4fdc4ca9a9ec5aa7bd Author: Hermès Bélusca-Maïto <hermes.belusca-maito(a)reactos.org> AuthorDate: Fri Feb 7 15:20:05 2025 +0100 Commit: Hermès Bélusca-Maïto <hermes.belusca-maito(a)reactos.org> CommitDate: Fri Feb 7 15:20:05 2025 +0100 Revert "[USER32][LIBPNG] Support PNG/Vista icons (#7704)" This reverts commit 7f4708479dd73dad32838b2329bb7215ea897433. - PR was still in review; - Doug has commit access himself. --- dll/3rdparty/libpng/CMakeLists.txt | 5 +- dll/3rdparty/libpng/libpng.spec | 246 --------------------- win32ss/user/user32/CMakeLists.txt | 7 +- win32ss/user/user32/windows/cursoricon.c | 367 +++++-------------------------- 4 files changed, 60 insertions(+), 565 deletions(-) diff --git a/dll/3rdparty/libpng/CMakeLists.txt b/dll/3rdparty/libpng/CMakeLists.txt index 1c304b7b446..e7599539562 100644 --- a/dll/3rdparty/libpng/CMakeLists.txt +++ b/dll/3rdparty/libpng/CMakeLists.txt @@ -27,10 +27,7 @@ list(APPEND SOURCE pngwutil.c pngpriv.h) -spec2def(libpng.dll libpng.spec ADD_IMPORTLIB) - -add_library(libpng MODULE ${SOURCE} ${CMAKE_CURRENT_BINARY_DIR}/libpng.def) - +add_library(libpng MODULE ${SOURCE}) set_module_type(libpng win32dll) target_link_libraries(libpng zlib) add_importlibs(libpng msvcrt kernel32 ntdll) diff --git a/dll/3rdparty/libpng/libpng.spec b/dll/3rdparty/libpng/libpng.spec deleted file mode 100644 index f35705c3e9f..00000000000 --- a/dll/3rdparty/libpng/libpng.spec +++ /dev/null @@ -1,246 +0,0 @@ -@ cdecl png_access_version_number() -@ cdecl png_benign_error(ptr str) -@ cdecl png_build_grayscale_palette(ptr ptr) -@ cdecl png_calloc(ptr long) -@ cdecl png_chunk_benign_error(ptr str) -@ cdecl png_chunk_error(ptr str) -@ cdecl png_chunk_warning(ptr str) -@ cdecl png_convert_from_struct_tm(ptr ptr) -@ cdecl png_convert_from_time_t(ptr long) -@ cdecl png_convert_to_rfc1123(ptr ptr) -@ cdecl png_convert_to_rfc1123_buffer(ptr ptr) -@ cdecl png_create_info_struct(ptr) -@ cdecl png_create_read_struct(ptr ptr ptr ptr) -@ cdecl png_create_read_struct_2(ptr ptr ptr ptr ptr ptr ptr) -@ cdecl png_create_write_struct(ptr ptr ptr ptr) -@ cdecl png_create_write_struct_2(ptr ptr ptr ptr ptr ptr ptr) -@ cdecl png_data_freer(ptr ptr long long) -@ cdecl png_destroy_info_struct(ptr ptr) -@ cdecl png_destroy_read_struct(ptr ptr ptr) -@ cdecl png_destroy_write_struct(ptr ptr ptr) -@ cdecl png_error(ptr str) -@ cdecl png_free(ptr ptr) -@ cdecl png_free_data(ptr ptr long long) -@ cdecl png_free_default(ptr ptr) -@ cdecl png_get_IHDR(ptr ptr ptr ptr ptr ptr ptr ptr ptr) -@ cdecl png_get_PLTE(ptr ptr ptr ptr) -@ cdecl png_get_bKGD(ptr ptr ptr) -@ cdecl png_get_bit_depth(ptr ptr) -@ cdecl png_get_cHRM(ptr ptr ptr ptr ptr ptr ptr ptr ptr ptr) -@ cdecl png_get_cHRM_XYZ(ptr ptr ptr ptr ptr ptr ptr ptr ptr ptr ptr) -@ cdecl png_get_cHRM_XYZ_fixed(ptr ptr ptr ptr ptr ptr ptr ptr ptr ptr ptr) -@ cdecl png_get_cHRM_fixed(ptr ptr ptr ptr ptr ptr ptr ptr ptr ptr ptr) -@ cdecl png_get_channels(ptr ptr) -@ cdecl png_get_chunk_cache_max(ptr) -@ cdecl png_get_chunk_malloc_max(ptr) -@ cdecl png_get_color_type(ptr ptr) -@ cdecl png_get_compression_buffer_size(ptr) -@ cdecl png_get_compression_type(ptr ptr) -@ cdecl png_get_copyright(ptr) -@ cdecl png_get_current_pass_number(ptr) -@ cdecl png_get_current_row_number(ptr) -@ cdecl png_get_eXIf(ptr ptr ptr) -@ cdecl png_get_eXIf_1(ptr ptr ptr ptr) -@ cdecl png_get_error_ptr(ptr) -@ cdecl png_get_filter_type(ptr ptr) -@ cdecl png_get_gAMA(ptr ptr ptr) -@ cdecl png_get_gAMA_fixed(ptr ptr ptr) -@ cdecl png_get_hIST(ptr ptr ptr) -@ cdecl png_get_header_ver(ptr) -@ cdecl png_get_header_version(ptr) -@ cdecl png_get_iCCP(ptr ptr ptr ptr ptr ptr) -@ cdecl png_get_image_height(ptr ptr) -@ cdecl png_get_image_width(ptr ptr) -@ cdecl png_get_int_32(ptr) -@ cdecl png_get_interlace_type(ptr ptr) -@ cdecl png_get_io_chunk_type(ptr) -@ cdecl png_get_io_ptr(ptr) -@ cdecl png_get_io_state(ptr) -@ cdecl png_get_libpng_ver(ptr) -@ cdecl png_get_mem_ptr(ptr) -@ cdecl png_get_oFFs(ptr ptr ptr ptr ptr) -@ cdecl png_get_pCAL(ptr ptr ptr ptr ptr ptr ptr ptr ptr) -@ cdecl png_get_pHYs(ptr ptr ptr ptr ptr) -@ cdecl png_get_pHYs_dpi(ptr ptr ptr ptr ptr) -@ cdecl png_get_palette_max(ptr ptr) -@ cdecl png_get_pixel_aspect_ratio(ptr ptr) -@ cdecl png_get_pixel_aspect_ratio_fixed(ptr ptr) -@ cdecl png_get_pixels_per_inch(ptr ptr) -@ cdecl png_get_pixels_per_meter(ptr ptr) -@ cdecl png_get_progressive_ptr(ptr) -@ cdecl png_get_rgb_to_gray_status(ptr) -@ cdecl png_get_rowbytes(ptr ptr) -@ cdecl png_get_rows(ptr ptr) -@ cdecl png_get_sBIT(ptr ptr ptr) -@ cdecl png_get_sCAL(ptr ptr ptr ptr ptr) -@ cdecl png_get_sCAL_fixed(ptr ptr ptr ptr ptr) -@ cdecl png_get_sCAL_s(ptr ptr ptr ptr ptr) -@ cdecl png_get_sPLT(ptr ptr ptr) -@ cdecl png_get_sRGB(ptr ptr ptr) -@ cdecl png_get_signature(ptr ptr) -@ cdecl png_get_tIME(ptr ptr ptr) -@ cdecl png_get_tRNS(ptr ptr ptr ptr ptr) -@ cdecl png_get_text(ptr ptr ptr ptr) -@ cdecl png_get_uint_16(ptr) -@ cdecl png_get_uint_31(ptr ptr) -@ cdecl png_get_uint_32(ptr) -@ cdecl png_get_unknown_chunks(ptr ptr ptr) -@ cdecl png_get_user_chunk_ptr(ptr) -@ cdecl png_get_user_height_max(ptr) -@ cdecl png_get_user_transform_ptr(ptr) -@ cdecl png_get_user_width_max(ptr) -@ cdecl png_get_valid(ptr ptr long) -@ cdecl png_get_x_offset_inches(ptr ptr) -@ cdecl png_get_x_offset_inches_fixed(ptr ptr ptr ptr ptr) -@ cdecl png_get_x_offset_microns(ptr ptr) -@ cdecl png_get_x_offset_pixels(ptr ptr) -@ cdecl png_get_x_pixels_per_inch(ptr ptr) -@ cdecl png_get_x_pixels_per_meter(ptr ptr) -@ cdecl png_get_y_offset_inches(ptr ptr) -@ cdecl png_get_y_offset_inches_fixed(ptr ptr) -@ cdecl png_get_y_offset_microns(ptr ptr) -@ cdecl png_get_y_offset_pixels(ptr ptr) -@ cdecl png_get_y_pixels_per_inch(ptr ptr) -@ cdecl png_get_y_pixels_per_meter(ptr ptr) -@ cdecl png_handle_as_unknown(ptr str) -@ cdecl png_image_begin_read_from_file(ptr str) -@ cdecl png_image_begin_read_from_memory(ptr ptr long) -@ cdecl png_image_begin_read_from_stdio(ptr ptr) -@ cdecl png_image_finish_read(ptr ptr ptr long ptr) -@ cdecl png_image_free(ptr) -@ cdecl png_image_write_to_file(ptr str long ptr long ptr) -@ cdecl png_image_write_to_memory(ptr ptr ptr long ptr long ptr) -@ cdecl png_image_write_to_stdio(ptr ptr long ptr long ptr) -@ cdecl png_info_init_3(ptr long) -@ cdecl png_init_io(ptr ptr) -@ cdecl png_longjmp(ptr long) -@ cdecl png_malloc(ptr long) -@ cdecl png_malloc_default(ptr long) -@ cdecl png_malloc_warn(ptr long) -@ cdecl png_permit_mng_features(ptr long) -@ cdecl png_process_data(ptr ptr ptr long) -@ cdecl png_process_data_pause(ptr long) -@ cdecl png_process_data_skip(ptr) -@ cdecl png_progressive_combine_row(ptr ptr ptr) -@ cdecl png_read_end(ptr ptr) -@ cdecl png_read_image(ptr ptr) -@ cdecl png_read_info(ptr ptr) -@ cdecl png_read_png(ptr ptr ptr ptr) -@ cdecl png_read_row(ptr ptr ptr) -@ cdecl png_read_rows(ptr ptr ptr long) -@ cdecl png_read_update_info(ptr ptr) -@ cdecl png_reset_zstream(ptr) -@ cdecl png_save_int_32(ptr long) -@ cdecl png_save_uint_16(ptr long) -@ cdecl png_save_uint_32(ptr long) -@ cdecl png_set_IHDR(ptr ptr long long long long long long long) -@ cdecl png_set_PLTE(ptr ptr ptr long) -@ cdecl png_set_add_alpha(ptr long long) -@ cdecl png_set_alpha_mode(ptr long double) -@ cdecl png_set_alpha_mode_fixed(ptr long long) -@ cdecl png_set_bKGD(ptr ptr ptr) -@ cdecl png_set_background(ptr ptr long long double) -@ cdecl png_set_background_fixed(ptr ptr long long long) -@ cdecl png_set_benign_errors(ptr long) -@ cdecl png_set_bgr(ptr) -@ cdecl png_set_cHRM(ptr ptr double double double double double double double double) -@ cdecl png_set_cHRM_XYZ(ptr ptr double double double double double double double double double double) -@ cdecl png_set_cHRM_XYZ_fixed(ptr ptr long long long long long long long long long) -@ cdecl png_set_cHRM_fixed(ptr ptr long long long long long long long long) -@ cdecl png_set_check_for_invalid_index(ptr long) -@ cdecl png_set_chunk_cache_max(ptr long) -@ cdecl png_set_chunk_malloc_max(ptr long) -@ cdecl png_set_compression_buffer_size(ptr long) -@ cdecl png_set_compression_level(ptr long) -@ cdecl png_set_compression_mem_level(ptr long) -@ cdecl png_set_compression_method(ptr long) -@ cdecl png_set_compression_strategy(ptr long) -@ cdecl png_set_compression_window_bits(ptr long) -@ cdecl png_set_crc_action(ptr long long) -@ cdecl png_set_eXIf(ptr ptr ptr) -@ cdecl png_set_eXIf_1(ptr ptr long ptr) -@ cdecl png_set_error_fn(ptr ptr ptr ptr) -@ cdecl png_set_expand(ptr) -@ cdecl png_set_expand_16(ptr) -@ cdecl png_set_expand_gray_1_2_4_to_8(ptr) -@ cdecl png_set_filler(ptr long long) -@ cdecl png_set_filter(ptr long long) -@ cdecl png_set_filter_heuristics(ptr long long ptr ptr) -@ cdecl png_set_filter_heuristics_fixed(ptr long long ptr ptr) -@ cdecl png_set_flush(ptr long) -@ cdecl png_set_gAMA(ptr ptr double) -@ cdecl png_set_gAMA_fixed(ptr ptr long) -@ cdecl png_set_gamma(ptr long long) -@ cdecl png_set_gamma_fixed(ptr long long) -@ cdecl png_set_gray_to_rgb(ptr) -@ cdecl png_set_hIST(ptr ptr ptr) -@ cdecl png_set_iCCP(ptr ptr str long ptr long) -@ cdecl png_set_interlace_handling(ptr) -@ cdecl png_set_invalid(ptr ptr long) -@ cdecl png_set_invert_alpha(ptr) -@ cdecl png_set_invert_mono(ptr) -@ cdecl png_set_keep_unknown_chunks(ptr long str long) -@ cdecl png_set_longjmp_fn(ptr ptr long) -@ cdecl png_set_mem_fn(ptr ptr ptr ptr) -@ cdecl png_set_oFFs(ptr ptr long long long) -@ cdecl png_set_option(ptr long long) -@ cdecl png_set_pCAL(ptr ptr str long long long long str ptr) -@ cdecl png_set_pHYs(ptr ptr long long long) -@ cdecl png_set_packing(ptr) -@ cdecl png_set_packswap(ptr) -@ cdecl png_set_palette_to_rgb(ptr) -@ cdecl png_set_progressive_read_fn(ptr ptr ptr ptr ptr) -@ cdecl png_set_quantize(ptr ptr long long ptr long) -@ cdecl png_set_read_fn(ptr ptr ptr) -@ cdecl png_set_read_status_fn(ptr ptr) -@ cdecl png_set_read_user_chunk_fn(ptr ptr ptr) -@ cdecl png_set_read_user_transform_fn(ptr ptr) -@ cdecl png_set_rgb_to_gray(ptr long double double) -@ cdecl png_set_rgb_to_gray_fixed(ptr long long long) -@ cdecl png_set_rows(ptr ptr ptr) -@ cdecl png_set_sBIT(ptr ptr ptr) -@ cdecl png_set_sCAL(ptr ptr long double double) -@ cdecl png_set_sCAL_fixed(ptr ptr long long long) -@ cdecl png_set_sCAL_s(ptr ptr long str str) -@ cdecl png_set_sPLT(ptr ptr ptr long) -@ cdecl png_set_sRGB(ptr ptr long) -@ cdecl png_set_sRGB_gAMA_and_cHRM(ptr ptr long) -@ cdecl png_set_scale_16(ptr) -@ cdecl png_set_shift(ptr ptr) -@ cdecl png_set_sig_bytes(ptr long) -@ cdecl png_set_strip_16(ptr) -@ cdecl png_set_strip_alpha(ptr) -@ cdecl png_set_swap(ptr) -@ cdecl png_set_swap_alpha(ptr) -@ cdecl png_set_tIME(ptr ptr ptr) -@ cdecl png_set_tRNS(ptr ptr str long ptr) -@ cdecl png_set_tRNS_to_alpha(ptr) -@ cdecl png_set_text(ptr ptr ptr long) -@ cdecl png_set_text_compression_level(ptr long) -@ cdecl png_set_text_compression_mem_level(ptr long) -@ cdecl png_set_text_compression_method(ptr long) -@ cdecl png_set_text_compression_strategy(ptr long) -@ cdecl png_set_text_compression_window_bits(ptr long) -@ cdecl png_set_unknown_chunk_location(ptr ptr long long) -@ cdecl png_set_unknown_chunks(ptr ptr ptr long) -@ cdecl png_set_user_limits(ptr long long) -@ cdecl png_set_user_transform_info(ptr ptr long long) -@ cdecl png_set_write_fn(ptr ptr ptr ptr) -@ cdecl png_set_write_status_fn(ptr ptr) -@ cdecl png_set_write_user_transform_fn(ptr ptr) -@ cdecl png_sig_cmp(ptr long long) -@ cdecl png_start_read_image(ptr) -@ cdecl png_warning(ptr str) -@ cdecl png_write_chunk(ptr ptr ptr long) -@ cdecl png_write_chunk_data(ptr ptr long) -@ cdecl png_write_chunk_end(ptr) -@ cdecl png_write_chunk_start(ptr ptr long) -@ cdecl png_write_end(ptr ptr) -@ cdecl png_write_flush(ptr) -@ cdecl png_write_image(ptr ptr) -@ cdecl png_write_info(ptr ptr) -@ cdecl png_write_info_before_PLTE(ptr ptr) -@ cdecl png_write_png(ptr ptr ptr ptr) -@ cdecl png_write_row(ptr ptr) -@ cdecl png_write_rows(ptr ptr long) -@ cdecl png_write_sig(ptr) diff --git a/win32ss/user/user32/CMakeLists.txt b/win32ss/user/user32/CMakeLists.txt index b7cdfe3aa4d..ca2f2a143e2 100644 --- a/win32ss/user/user32/CMakeLists.txt +++ b/win32ss/user/user32/CMakeLists.txt @@ -5,8 +5,7 @@ include_directories( ${REACTOS_SOURCE_DIR}/sdk/include/reactos/subsys include ${REACTOS_SOURCE_DIR}/sdk/include/reactos/wine - ${REACTOS_SOURCE_DIR}/win32ss/include - ${REACTOS_SOURCE_DIR}/sdk/include/reactos/libs/libpng) + ${REACTOS_SOURCE_DIR}/win32ss/include) list(APPEND SOURCE controls/appswitch.c @@ -89,7 +88,7 @@ if(MSVC AND (ARCH STREQUAL "i386")) target_sources(user32 PRIVATE $<TARGET_OBJECTS:ftol2_sse>) endif() -add_delay_importlibs(user32 usp10 libpng) -add_importlibs(user32 gdi32 advapi32 msvcrt kernel32 ntdll) +add_delay_importlibs(user32 usp10) +add_importlibs(user32 gdi32 advapi32 kernel32 ntdll) add_pch(user32 include/user32.h SOURCE) add_cd_file(TARGET user32 DESTINATION reactos/system32 FOR all) diff --git a/win32ss/user/user32/windows/cursoricon.c b/win32ss/user/user32/windows/cursoricon.c index f06a1b9d540..b1d8bc7e69a 100644 --- a/win32ss/user/user32/windows/cursoricon.c +++ b/win32ss/user/user32/windows/cursoricon.c @@ -1,244 +1,17 @@ /* - * PROJECT: ReactOS user32.dll - * LICENSE: GPL-2.0-or-later (
https://spdx.org/licenses/GPL-2.0-or-later
) - * PURPOSE: cursor and icons implementation - * COPYRIGHT: Copyright Jérôme Gardou (jerome.gardou(a)reactos.org) - * Copyright 2022-2025 Doug Lyons (douglyons(a)douglyons.com) - * Copyright 2025 Katayama Hirofumi MZ (katayama.hirofumi.mz(a)gmail.com) + * PROJECT: ReactOS user32.dll + * COPYRIGHT: GPL - See COPYING in the top level directory + * FILE: win32ss/user/user32/windows/cursoricon.c + * PURPOSE: cursor and icons implementation + * PROGRAMMER: Jérôme Gardou (jerome.gardou(a)reactos.org) */ #include <user32.h> -#include "png.h" WINE_DEFAULT_DEBUG_CHANNEL(cursor); WINE_DECLARE_DEBUG_CHANNEL(icon); //WINE_DECLARE_DEBUG_CHANNEL(resource); -#include <pshpack1.h> -typedef struct { - BYTE bWidth; - BYTE bHeight; - BYTE bColorCount; - BYTE bReserved; - union - { - WORD wPlanes; /* For icons */ - WORD xHotspot; /* For cursors */ - }; - union - { - WORD wBitCount; /* For icons */ - WORD yHotspot; /* For cursors */ - }; - DWORD dwDIBSize; - DWORD dwDIBOffset; -} CURSORICONFILEDIRENTRY; - -typedef struct -{ - WORD idReserved; - WORD idType; - WORD idCount; - CURSORICONFILEDIRENTRY idEntries[1]; -} CURSORICONFILEDIR; -#include <poppack.h> - -#define PNG_CHECK_SIG_SIZE 8 /* Check signature size */ - -/* libpng helpers */ -typedef struct { - png_bytep buffer; - size_t bufSize; - size_t currentPos; -} PNG_READER_STATE; - -/* This function will be used for reading png data from memory */ -static VOID -ReadMemoryPng( - _Inout_ png_structp png_ptr, - _Out_ png_bytep data, - _In_ size_t length) -{ - PNG_READER_STATE *state = png_get_io_ptr(png_ptr); - if ((state->currentPos + length) > state->bufSize) - { - ERR("png read error\n"); - png_error(png_ptr, "read error in ReadMemoryPng"); - return; - } - RtlCopyMemory(data, state->buffer + state->currentPos, length); - state->currentPos += length; -} - -static int get_dib_image_size(int width, int height, int depth); - -/* Convert PNG raw data to BMP icon data */ -static LPBYTE -CURSORICON_ConvertPngToBmpIcon( - _In_ LPBYTE pngBits, - _In_ DWORD fileSize, - _Out_ PDWORD pBmpIconSize) -{ - if (!pngBits || fileSize < PNG_CHECK_SIG_SIZE || !png_check_sig(pngBits, PNG_CHECK_SIG_SIZE)) - return NULL; - - TRACE("pngBits %p fileSize %d\n", pngBits, fileSize); - - png_structp png_ptr = png_create_read_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL); - if (!png_ptr) - { - ERR("png_create_read_struct error\n"); - return NULL; - } - - png_infop info_ptr = png_create_info_struct(png_ptr); - if (!info_ptr) - { - ERR("png_create_info_struct error\n"); - png_destroy_read_struct(&png_ptr, NULL, NULL); - return NULL; - } - - /* Set our own read_function */ - PNG_READER_STATE readerState = { pngBits, fileSize, PNG_CHECK_SIG_SIZE }; - png_set_read_fn(png_ptr, &readerState, ReadMemoryPng); - png_set_sig_bytes(png_ptr, PNG_CHECK_SIG_SIZE); - - /* Read png info */ - png_read_info(png_ptr, info_ptr); - - /* Add translation of some PNG formats and update info */ - int colorType = png_get_color_type(png_ptr, info_ptr); - if (colorType == PNG_COLOR_TYPE_PALETTE) - png_set_palette_to_rgb(png_ptr); - else if (colorType == PNG_COLOR_TYPE_GRAY || colorType == PNG_COLOR_TYPE_GRAY_ALPHA) - png_set_gray_to_rgb(png_ptr); - png_set_scale_16(png_ptr); /* Convert 16-bit channels to 8-bit */ - png_read_update_info(png_ptr, info_ptr); - - /* Get updated png info */ - png_uint_32 width, height; - int bitDepth; - png_get_IHDR(png_ptr, info_ptr, &width, &height, &bitDepth, &colorType, NULL, NULL, NULL); - TRACE("width %d, height %d, bitDepth %d, colorType %d\n", - width, height, bitDepth, colorType); - - int channels = png_get_channels(png_ptr, info_ptr); - int rowbytes = png_get_rowbytes(png_ptr, info_ptr); - int imageSize = height * rowbytes; - TRACE("rowbytes %d, channels %d, imageSize %d\n", rowbytes, channels, imageSize); - - /* Allocate rows data */ - png_bytepp rows = png_malloc(png_ptr, sizeof(png_bytep) * height); - if (!rows) - { - ERR("png_malloc failed\n"); - png_destroy_read_struct(&png_ptr, &info_ptr, NULL); - return NULL; - } - - for (int i = 0; i < (int)height; i++) - { - rows[i] = png_malloc(png_ptr, rowbytes); - if (!rows[i]) - { - ERR("png_malloc failed\n"); - - /* Clean up */ - while (--i >= 0) - png_free(png_ptr, rows[i]); - png_free(png_ptr, rows); - png_destroy_read_struct(&png_ptr, &info_ptr, NULL); - - return NULL; - } - } - - /* Read png image data */ - png_set_rows(png_ptr, info_ptr, rows); - png_read_image(png_ptr, rows); - png_read_end(png_ptr, info_ptr); - - /* After reading the image, you can deal with row pointers */ - LPBYTE imageBytes = HeapAlloc(GetProcessHeap(), 0, imageSize); - if (imageBytes) - { - LPBYTE pb = imageBytes; - for (int i = height - 1; i >= 0; i--) - { - png_bytep row = rows[i]; - for (int j = 0; j < channels * width; j += channels) - { - *pb++ = row[j + 2]; /* Red */ - *pb++ = row[j + 1]; /* Green */ - *pb++ = row[j + 0]; /* Blue */ - if (channels == 4) - *pb++ = row[j + 3]; /* Alpha */ - } - pb += (channels * width) % 4; - } - } - - /* Clean up */ - for (int i = 0; i < (int)height; i++) - png_free(png_ptr, rows[i]); - png_free(png_ptr, rows); - png_destroy_read_struct(&png_ptr, &info_ptr, NULL); - - if (!imageBytes) - { - ERR("HeapAlloc failed\n"); - return NULL; - } - - /* BPP (Bits Per Pixel) */ - WORD bpp = (WORD)(bitDepth * channels); - - /* The byte size of mask bits */ - DWORD maskSize = get_dib_image_size(width, height, 1); - - /* Build BITMAPINFOHEADER */ - BITMAPINFOHEADER info = { sizeof(info) }; - info.biWidth = width; - info.biHeight = 2 * height; - info.biPlanes = 1; - info.biBitCount = bpp; - info.biCompression = BI_RGB; - - /* Build CURSORICONFILEDIR */ - CURSORICONFILEDIR cifd = { 0, 1, 1 }; - cifd.idEntries[0].bWidth = (BYTE)width; - cifd.idEntries[0].bHeight = (BYTE)height; - cifd.idEntries[0].bColorCount = 0; /* No color pallete */ - cifd.idEntries[0].wPlanes = 1; /* Must be 1 */ - cifd.idEntries[0].wBitCount = bpp; - cifd.idEntries[0].dwDIBSize = (DWORD)(sizeof(info) + imageSize + maskSize); - cifd.idEntries[0].dwDIBOffset = (DWORD)sizeof(cifd); - - /* Allocate BMP icon data */ - *pBmpIconSize = (DWORD)(sizeof(cifd) + sizeof(info) + imageSize + maskSize); - LPBYTE pbBmpIcon = HeapAlloc(GetProcessHeap(), 0, *pBmpIconSize); - if (!pbBmpIcon) - { - ERR("HeapAlloc failed\n"); - HeapFree(GetProcessHeap(), 0, imageBytes); - return NULL; - } - - /* Store data to pbBmpIcon */ - LPBYTE pb = pbBmpIcon; - RtlCopyMemory(pb, &cifd, sizeof(cifd)); - pb += sizeof(cifd); - RtlCopyMemory(pb, &info, sizeof(info)); - pb += sizeof(info); - RtlCopyMemory(pb, imageBytes, imageSize); - pb += imageSize; - RtlFillMemory(pb, maskSize, 0xFF); /* Mask bits for AND operation */ - - HeapFree(GetProcessHeap(), 0, imageBytes); - return pbBmpIcon; -} - /* We only use Wide string functions */ #undef MAKEINTRESOURCE #define MAKEINTRESOURCE MAKEINTRESOURCEW @@ -448,7 +221,7 @@ static int DIB_GetBitmapInfo( const BITMAPINFOHEADER *header, LONG *width, } if (memcmp(&header->biSize, png_sig_pattern, sizeof(png_sig_pattern)) == 0) { - TRACE("We have a PNG icon\n"); + ERR("Cannot yet display PNG icons\n"); /* for PNG format details see
https://en.wikipedia.org/wiki/PNG
*/ } else @@ -696,6 +469,29 @@ done: return alpha; } +#include "pshpack1.h" + +typedef struct { + BYTE bWidth; + BYTE bHeight; + BYTE bColorCount; + BYTE bReserved; + WORD xHotspot; + WORD yHotspot; + DWORD dwDIBSize; + DWORD dwDIBOffset; +} CURSORICONFILEDIRENTRY; + +typedef struct +{ + WORD idReserved; + WORD idType; + WORD idCount; + CURSORICONFILEDIRENTRY idEntries[1]; +} CURSORICONFILEDIR; + +#include "poppack.h" + const CURSORICONFILEDIRENTRY* get_best_icon_file_entry( _In_ const CURSORICONFILEDIR* dir, @@ -1359,14 +1155,6 @@ BITMAP_LoadImageW( ResSize = SizeofResource(hinst, hrsrc); } - if (pbmi->bmiHeader.biCompression == BI_BITFIELDS && pbmi->bmiHeader.biBitCount == 32) - { - SIZE_T totalSize = pbmi->bmiHeader.biSize + (3 * sizeof(DWORD)) + - pbmi->bmiHeader.biSizeImage; - if (pbmi->bmiHeader.biSizeImage != 0 && totalSize != ResSize) - WARN("Possibly bad resource size provided\n"); - } - /* Fix up values */ if(DIB_GetBitmapInfo(&pbmi->bmiHeader, &width, &height, &bpp, &compr) == -1) goto end; @@ -1597,8 +1385,8 @@ CURSORICON_LoadFromFileW( { const CURSORICONFILEDIRENTRY *entry; const CURSORICONFILEDIR *dir; - DWORD filesize = 0, BmpIconSize; - LPBYTE bits, pbBmpIcon = NULL; + DWORD filesize = 0; + LPBYTE bits; HANDLE hCurIcon = NULL; CURSORDATA cursorData; @@ -1630,37 +1418,15 @@ CURSORICON_LoadFromFileW( cursorData.xHotspot = entry->xHotspot; cursorData.yHotspot = entry->yHotspot; } - cursorData.rt = LOWORD(bIcon ? RT_ICON : RT_CURSOR); - - /* Try to load BMP icon */ - DWORD dwOffset = entry->dwDIBOffset; - if (!CURSORICON_GetCursorDataFromBMI(&cursorData, (BITMAPINFO *)(&bits[dwOffset]))) - { - /* Convert PNG raw data to BMP icon if the icon was PNG icon */ - LPBYTE pngBits = &bits[entry->dwDIBOffset]; - pbBmpIcon = CURSORICON_ConvertPngToBmpIcon(pngBits, filesize, &BmpIconSize); - if (!pbBmpIcon) - goto end; /* Not PNG icon or failed */ - - /* Find icon entry from BMP icon */ - dir = (CURSORICONFILEDIR *)pbBmpIcon; - entry = &dir->idEntries[0]; /* Only one entry */ - - /* A bit of preparation */ - RtlZeroMemory(&cursorData, sizeof(cursorData)); - cursorData.rt = LOWORD(bIcon ? RT_ICON : RT_CURSOR); + cursorData.rt = (USHORT)((ULONG_PTR)(bIcon ? RT_ICON : RT_CURSOR)); - /* Can we load this BMP icon? */ - dwOffset = entry->dwDIBOffset; - if (!CURSORICON_GetCursorDataFromBMI(&cursorData, (BITMAPINFO *)(&pbBmpIcon[dwOffset]))) + /* Do the dance */ + if(!CURSORICON_GetCursorDataFromBMI(&cursorData, (BITMAPINFO*)(&bits[entry->dwDIBOffset]))) { - ERR("Failing file: '%S'.\n", lpszName); + ERR("Failing File is \n '%S'.\n", lpszName); goto end; } - TRACE("Processing PNG/Vista icon: '%S'\n", lpszName); - } - hCurIcon = NtUserxCreateEmptyCurObject(FALSE); if(!hCurIcon) goto end; @@ -1669,16 +1435,21 @@ CURSORICON_LoadFromFileW( if(!NtUserSetCursorIconData(hCurIcon, NULL, NULL, &cursorData)) { NtUserDestroyCursor(hCurIcon, TRUE); - hCurIcon = NULL; - if (cursorData.hbmMask) DeleteObject(cursorData.hbmMask); - if (cursorData.hbmColor) DeleteObject(cursorData.hbmColor); - if (cursorData.hbmAlpha) DeleteObject(cursorData.hbmAlpha); + goto end_error; } end: UnmapViewOfFile(bits); - HeapFree(GetProcessHeap(), 0, pbBmpIcon); return hCurIcon; + + /* Clean up */ +end_error: + DeleteObject(cursorData.hbmMask); + if(cursorData.hbmColor) DeleteObject(cursorData.hbmColor); + if(cursorData.hbmAlpha) DeleteObject(cursorData.hbmAlpha); + UnmapViewOfFile(bits); + + return NULL; } static @@ -1743,7 +1514,7 @@ CURSORICON_LoadImageW( SetLastError(ERROR_NOT_ENOUGH_MEMORY); return NULL; } - ustrModule.Length = (USHORT)wsprintfW(ustrModule.Buffer, fakeNameFmt, hinst) * sizeof(WCHAR); + ustrModule.Length = wsprintfW(ustrModule.Buffer, fakeNameFmt, hinst) * sizeof(WCHAR); } else if(hinst) { @@ -1774,8 +1545,8 @@ CURSORICON_LoadImageW( } ustrModule.Buffer[ret] = UNICODE_NULL; - ustrModule.Length = (USHORT)(ret * sizeof(WCHAR)); - ustrModule.MaximumLength = (USHORT)(size * sizeof(WCHAR)); + ustrModule.Length = ret * sizeof(WCHAR); + ustrModule.MaximumLength = size * sizeof(WCHAR); break; } } @@ -2768,17 +2539,9 @@ HICON WINAPI CreateIconFromResourceEx( CURSORDATA cursorData; HICON hIcon; BOOL isAnimated; - LPBYTE pbBmpIcon = NULL; - DWORD BmpIconSize; TRACE("%p, %lu, %lu, %lu, %i, %i, %lu.\n", pbIconBits, cbIconBits, fIcon, dwVersion, cxDesired, cyDesired, uFlags); - if (!pbIconBits || cbIconBits < 2 * sizeof(DWORD)) - { - ERR("Sanity check failed\n"); - return NULL; - } - if(uFlags & LR_DEFAULTSIZE) { if(!cxDesired) cxDesired = GetSystemMetrics(fIcon ? SM_CXICON : SM_CXCURSOR); @@ -2788,7 +2551,7 @@ HICON WINAPI CreateIconFromResourceEx( ZeroMemory(&cursorData, sizeof(cursorData)); cursorData.cx = cxDesired; cursorData.cy = cyDesired; - cursorData.rt = LOWORD(fIcon ? RT_ICON : RT_CURSOR); + cursorData.rt = (USHORT)((ULONG_PTR)(fIcon ? RT_ICON : RT_CURSOR)); /* Convert to win32k-ready data */ if(!memcmp(pbIconBits, "RIFF", 4)) @@ -2859,30 +2622,15 @@ HICON WINAPI CreateIconFromResourceEx( pbIconBits = (PBYTE)pt; } - /* Try to load BMP icon */ - if (!CURSORICON_GetCursorDataFromBMI(&cursorData, (BITMAPINFO *)pbIconBits)) + if (!CURSORICON_GetCursorDataFromBMI(&cursorData, (BITMAPINFO*)pbIconBits)) { - /* Convert PNG raw data to BMP icon if the icon was PNG icon */ - pbBmpIcon = CURSORICON_ConvertPngToBmpIcon(pbIconBits, cbIconBits, &BmpIconSize); - if (!pbBmpIcon) - goto end; /* Not PNG icon or failed */ - - /* Find icon entry from BMP icon */ - CURSORICONFILEDIR *dir = (CURSORICONFILEDIR *)pbBmpIcon; - CURSORICONFILEDIRENTRY *entry = &dir->idEntries[0]; /* Only one entry */ - - /* A bit of preparation */ - RtlZeroMemory(&cursorData, sizeof(cursorData)); - cursorData.rt = LOWORD(fIcon ? RT_ICON : RT_CURSOR); - - /* Can we load this BMP icon? */ - DWORD dwOffset = entry->dwDIBOffset; - if (!CURSORICON_GetCursorDataFromBMI(&cursorData, (BITMAPINFO *)&pbBmpIcon[dwOffset])) - { - ERR("Couldn't get cursor/icon data\n"); - goto end; - } + ERR("Couldn't fill the CURSORDATA structure.\n"); + if (ResHandle) + FreeResource(ResHandle); + return NULL; } + if (ResHandle) + FreeResource(ResHandle); isAnimated = FALSE; } @@ -2903,13 +2651,10 @@ HICON WINAPI CreateIconFromResourceEx( if(isAnimated) HeapFree(GetProcessHeap(), 0, cursorData.aspcur); -end: - HeapFree(GetProcessHeap(), 0, pbBmpIcon); return hIcon; /* Clean up */ end_error: - HeapFree(GetProcessHeap(), 0, pbBmpIcon); if(isAnimated) HeapFree(GetProcessHeap(), 0, cursorData.aspcur); DeleteObject(cursorData.hbmMask);
3 weeks, 3 days
1
0
0
0
[reactos] 01/01: [USER32][LIBPNG] Support PNG/Vista icons (#7704)
by Doug Lyons
https://git.reactos.org/?p=reactos.git;a=commitdiff;h=7f4708479dd73dad32838…
commit 7f4708479dd73dad32838b2329bb7215ea897433 Author: Doug Lyons <douglyons(a)douglyons.com> AuthorDate: Fri Feb 7 08:12:32 2025 -0600 Commit: GitHub <noreply(a)github.com> CommitDate: Fri Feb 7 23:12:32 2025 +0900 [USER32][LIBPNG] Support PNG/Vista icons (#7704) Add PNG (NT6/Vista+) support. JIRA issue: CORE-18385 - Change libpng to add IMPORTLIB libpng.spec to allow linking to it in USER32. - Add code into mostly cursoricon.c to support PNG icons. --- dll/3rdparty/libpng/CMakeLists.txt | 5 +- dll/3rdparty/libpng/libpng.spec | 246 +++++++++++++++++++++ win32ss/user/user32/CMakeLists.txt | 7 +- win32ss/user/user32/windows/cursoricon.c | 367 ++++++++++++++++++++++++++----- 4 files changed, 565 insertions(+), 60 deletions(-) diff --git a/dll/3rdparty/libpng/CMakeLists.txt b/dll/3rdparty/libpng/CMakeLists.txt index e7599539562..1c304b7b446 100644 --- a/dll/3rdparty/libpng/CMakeLists.txt +++ b/dll/3rdparty/libpng/CMakeLists.txt @@ -27,7 +27,10 @@ list(APPEND SOURCE pngwutil.c pngpriv.h) -add_library(libpng MODULE ${SOURCE}) +spec2def(libpng.dll libpng.spec ADD_IMPORTLIB) + +add_library(libpng MODULE ${SOURCE} ${CMAKE_CURRENT_BINARY_DIR}/libpng.def) + set_module_type(libpng win32dll) target_link_libraries(libpng zlib) add_importlibs(libpng msvcrt kernel32 ntdll) diff --git a/dll/3rdparty/libpng/libpng.spec b/dll/3rdparty/libpng/libpng.spec new file mode 100644 index 00000000000..f35705c3e9f --- /dev/null +++ b/dll/3rdparty/libpng/libpng.spec @@ -0,0 +1,246 @@ +@ cdecl png_access_version_number() +@ cdecl png_benign_error(ptr str) +@ cdecl png_build_grayscale_palette(ptr ptr) +@ cdecl png_calloc(ptr long) +@ cdecl png_chunk_benign_error(ptr str) +@ cdecl png_chunk_error(ptr str) +@ cdecl png_chunk_warning(ptr str) +@ cdecl png_convert_from_struct_tm(ptr ptr) +@ cdecl png_convert_from_time_t(ptr long) +@ cdecl png_convert_to_rfc1123(ptr ptr) +@ cdecl png_convert_to_rfc1123_buffer(ptr ptr) +@ cdecl png_create_info_struct(ptr) +@ cdecl png_create_read_struct(ptr ptr ptr ptr) +@ cdecl png_create_read_struct_2(ptr ptr ptr ptr ptr ptr ptr) +@ cdecl png_create_write_struct(ptr ptr ptr ptr) +@ cdecl png_create_write_struct_2(ptr ptr ptr ptr ptr ptr ptr) +@ cdecl png_data_freer(ptr ptr long long) +@ cdecl png_destroy_info_struct(ptr ptr) +@ cdecl png_destroy_read_struct(ptr ptr ptr) +@ cdecl png_destroy_write_struct(ptr ptr ptr) +@ cdecl png_error(ptr str) +@ cdecl png_free(ptr ptr) +@ cdecl png_free_data(ptr ptr long long) +@ cdecl png_free_default(ptr ptr) +@ cdecl png_get_IHDR(ptr ptr ptr ptr ptr ptr ptr ptr ptr) +@ cdecl png_get_PLTE(ptr ptr ptr ptr) +@ cdecl png_get_bKGD(ptr ptr ptr) +@ cdecl png_get_bit_depth(ptr ptr) +@ cdecl png_get_cHRM(ptr ptr ptr ptr ptr ptr ptr ptr ptr ptr) +@ cdecl png_get_cHRM_XYZ(ptr ptr ptr ptr ptr ptr ptr ptr ptr ptr ptr) +@ cdecl png_get_cHRM_XYZ_fixed(ptr ptr ptr ptr ptr ptr ptr ptr ptr ptr ptr) +@ cdecl png_get_cHRM_fixed(ptr ptr ptr ptr ptr ptr ptr ptr ptr ptr ptr) +@ cdecl png_get_channels(ptr ptr) +@ cdecl png_get_chunk_cache_max(ptr) +@ cdecl png_get_chunk_malloc_max(ptr) +@ cdecl png_get_color_type(ptr ptr) +@ cdecl png_get_compression_buffer_size(ptr) +@ cdecl png_get_compression_type(ptr ptr) +@ cdecl png_get_copyright(ptr) +@ cdecl png_get_current_pass_number(ptr) +@ cdecl png_get_current_row_number(ptr) +@ cdecl png_get_eXIf(ptr ptr ptr) +@ cdecl png_get_eXIf_1(ptr ptr ptr ptr) +@ cdecl png_get_error_ptr(ptr) +@ cdecl png_get_filter_type(ptr ptr) +@ cdecl png_get_gAMA(ptr ptr ptr) +@ cdecl png_get_gAMA_fixed(ptr ptr ptr) +@ cdecl png_get_hIST(ptr ptr ptr) +@ cdecl png_get_header_ver(ptr) +@ cdecl png_get_header_version(ptr) +@ cdecl png_get_iCCP(ptr ptr ptr ptr ptr ptr) +@ cdecl png_get_image_height(ptr ptr) +@ cdecl png_get_image_width(ptr ptr) +@ cdecl png_get_int_32(ptr) +@ cdecl png_get_interlace_type(ptr ptr) +@ cdecl png_get_io_chunk_type(ptr) +@ cdecl png_get_io_ptr(ptr) +@ cdecl png_get_io_state(ptr) +@ cdecl png_get_libpng_ver(ptr) +@ cdecl png_get_mem_ptr(ptr) +@ cdecl png_get_oFFs(ptr ptr ptr ptr ptr) +@ cdecl png_get_pCAL(ptr ptr ptr ptr ptr ptr ptr ptr ptr) +@ cdecl png_get_pHYs(ptr ptr ptr ptr ptr) +@ cdecl png_get_pHYs_dpi(ptr ptr ptr ptr ptr) +@ cdecl png_get_palette_max(ptr ptr) +@ cdecl png_get_pixel_aspect_ratio(ptr ptr) +@ cdecl png_get_pixel_aspect_ratio_fixed(ptr ptr) +@ cdecl png_get_pixels_per_inch(ptr ptr) +@ cdecl png_get_pixels_per_meter(ptr ptr) +@ cdecl png_get_progressive_ptr(ptr) +@ cdecl png_get_rgb_to_gray_status(ptr) +@ cdecl png_get_rowbytes(ptr ptr) +@ cdecl png_get_rows(ptr ptr) +@ cdecl png_get_sBIT(ptr ptr ptr) +@ cdecl png_get_sCAL(ptr ptr ptr ptr ptr) +@ cdecl png_get_sCAL_fixed(ptr ptr ptr ptr ptr) +@ cdecl png_get_sCAL_s(ptr ptr ptr ptr ptr) +@ cdecl png_get_sPLT(ptr ptr ptr) +@ cdecl png_get_sRGB(ptr ptr ptr) +@ cdecl png_get_signature(ptr ptr) +@ cdecl png_get_tIME(ptr ptr ptr) +@ cdecl png_get_tRNS(ptr ptr ptr ptr ptr) +@ cdecl png_get_text(ptr ptr ptr ptr) +@ cdecl png_get_uint_16(ptr) +@ cdecl png_get_uint_31(ptr ptr) +@ cdecl png_get_uint_32(ptr) +@ cdecl png_get_unknown_chunks(ptr ptr ptr) +@ cdecl png_get_user_chunk_ptr(ptr) +@ cdecl png_get_user_height_max(ptr) +@ cdecl png_get_user_transform_ptr(ptr) +@ cdecl png_get_user_width_max(ptr) +@ cdecl png_get_valid(ptr ptr long) +@ cdecl png_get_x_offset_inches(ptr ptr) +@ cdecl png_get_x_offset_inches_fixed(ptr ptr ptr ptr ptr) +@ cdecl png_get_x_offset_microns(ptr ptr) +@ cdecl png_get_x_offset_pixels(ptr ptr) +@ cdecl png_get_x_pixels_per_inch(ptr ptr) +@ cdecl png_get_x_pixels_per_meter(ptr ptr) +@ cdecl png_get_y_offset_inches(ptr ptr) +@ cdecl png_get_y_offset_inches_fixed(ptr ptr) +@ cdecl png_get_y_offset_microns(ptr ptr) +@ cdecl png_get_y_offset_pixels(ptr ptr) +@ cdecl png_get_y_pixels_per_inch(ptr ptr) +@ cdecl png_get_y_pixels_per_meter(ptr ptr) +@ cdecl png_handle_as_unknown(ptr str) +@ cdecl png_image_begin_read_from_file(ptr str) +@ cdecl png_image_begin_read_from_memory(ptr ptr long) +@ cdecl png_image_begin_read_from_stdio(ptr ptr) +@ cdecl png_image_finish_read(ptr ptr ptr long ptr) +@ cdecl png_image_free(ptr) +@ cdecl png_image_write_to_file(ptr str long ptr long ptr) +@ cdecl png_image_write_to_memory(ptr ptr ptr long ptr long ptr) +@ cdecl png_image_write_to_stdio(ptr ptr long ptr long ptr) +@ cdecl png_info_init_3(ptr long) +@ cdecl png_init_io(ptr ptr) +@ cdecl png_longjmp(ptr long) +@ cdecl png_malloc(ptr long) +@ cdecl png_malloc_default(ptr long) +@ cdecl png_malloc_warn(ptr long) +@ cdecl png_permit_mng_features(ptr long) +@ cdecl png_process_data(ptr ptr ptr long) +@ cdecl png_process_data_pause(ptr long) +@ cdecl png_process_data_skip(ptr) +@ cdecl png_progressive_combine_row(ptr ptr ptr) +@ cdecl png_read_end(ptr ptr) +@ cdecl png_read_image(ptr ptr) +@ cdecl png_read_info(ptr ptr) +@ cdecl png_read_png(ptr ptr ptr ptr) +@ cdecl png_read_row(ptr ptr ptr) +@ cdecl png_read_rows(ptr ptr ptr long) +@ cdecl png_read_update_info(ptr ptr) +@ cdecl png_reset_zstream(ptr) +@ cdecl png_save_int_32(ptr long) +@ cdecl png_save_uint_16(ptr long) +@ cdecl png_save_uint_32(ptr long) +@ cdecl png_set_IHDR(ptr ptr long long long long long long long) +@ cdecl png_set_PLTE(ptr ptr ptr long) +@ cdecl png_set_add_alpha(ptr long long) +@ cdecl png_set_alpha_mode(ptr long double) +@ cdecl png_set_alpha_mode_fixed(ptr long long) +@ cdecl png_set_bKGD(ptr ptr ptr) +@ cdecl png_set_background(ptr ptr long long double) +@ cdecl png_set_background_fixed(ptr ptr long long long) +@ cdecl png_set_benign_errors(ptr long) +@ cdecl png_set_bgr(ptr) +@ cdecl png_set_cHRM(ptr ptr double double double double double double double double) +@ cdecl png_set_cHRM_XYZ(ptr ptr double double double double double double double double double double) +@ cdecl png_set_cHRM_XYZ_fixed(ptr ptr long long long long long long long long long) +@ cdecl png_set_cHRM_fixed(ptr ptr long long long long long long long long) +@ cdecl png_set_check_for_invalid_index(ptr long) +@ cdecl png_set_chunk_cache_max(ptr long) +@ cdecl png_set_chunk_malloc_max(ptr long) +@ cdecl png_set_compression_buffer_size(ptr long) +@ cdecl png_set_compression_level(ptr long) +@ cdecl png_set_compression_mem_level(ptr long) +@ cdecl png_set_compression_method(ptr long) +@ cdecl png_set_compression_strategy(ptr long) +@ cdecl png_set_compression_window_bits(ptr long) +@ cdecl png_set_crc_action(ptr long long) +@ cdecl png_set_eXIf(ptr ptr ptr) +@ cdecl png_set_eXIf_1(ptr ptr long ptr) +@ cdecl png_set_error_fn(ptr ptr ptr ptr) +@ cdecl png_set_expand(ptr) +@ cdecl png_set_expand_16(ptr) +@ cdecl png_set_expand_gray_1_2_4_to_8(ptr) +@ cdecl png_set_filler(ptr long long) +@ cdecl png_set_filter(ptr long long) +@ cdecl png_set_filter_heuristics(ptr long long ptr ptr) +@ cdecl png_set_filter_heuristics_fixed(ptr long long ptr ptr) +@ cdecl png_set_flush(ptr long) +@ cdecl png_set_gAMA(ptr ptr double) +@ cdecl png_set_gAMA_fixed(ptr ptr long) +@ cdecl png_set_gamma(ptr long long) +@ cdecl png_set_gamma_fixed(ptr long long) +@ cdecl png_set_gray_to_rgb(ptr) +@ cdecl png_set_hIST(ptr ptr ptr) +@ cdecl png_set_iCCP(ptr ptr str long ptr long) +@ cdecl png_set_interlace_handling(ptr) +@ cdecl png_set_invalid(ptr ptr long) +@ cdecl png_set_invert_alpha(ptr) +@ cdecl png_set_invert_mono(ptr) +@ cdecl png_set_keep_unknown_chunks(ptr long str long) +@ cdecl png_set_longjmp_fn(ptr ptr long) +@ cdecl png_set_mem_fn(ptr ptr ptr ptr) +@ cdecl png_set_oFFs(ptr ptr long long long) +@ cdecl png_set_option(ptr long long) +@ cdecl png_set_pCAL(ptr ptr str long long long long str ptr) +@ cdecl png_set_pHYs(ptr ptr long long long) +@ cdecl png_set_packing(ptr) +@ cdecl png_set_packswap(ptr) +@ cdecl png_set_palette_to_rgb(ptr) +@ cdecl png_set_progressive_read_fn(ptr ptr ptr ptr ptr) +@ cdecl png_set_quantize(ptr ptr long long ptr long) +@ cdecl png_set_read_fn(ptr ptr ptr) +@ cdecl png_set_read_status_fn(ptr ptr) +@ cdecl png_set_read_user_chunk_fn(ptr ptr ptr) +@ cdecl png_set_read_user_transform_fn(ptr ptr) +@ cdecl png_set_rgb_to_gray(ptr long double double) +@ cdecl png_set_rgb_to_gray_fixed(ptr long long long) +@ cdecl png_set_rows(ptr ptr ptr) +@ cdecl png_set_sBIT(ptr ptr ptr) +@ cdecl png_set_sCAL(ptr ptr long double double) +@ cdecl png_set_sCAL_fixed(ptr ptr long long long) +@ cdecl png_set_sCAL_s(ptr ptr long str str) +@ cdecl png_set_sPLT(ptr ptr ptr long) +@ cdecl png_set_sRGB(ptr ptr long) +@ cdecl png_set_sRGB_gAMA_and_cHRM(ptr ptr long) +@ cdecl png_set_scale_16(ptr) +@ cdecl png_set_shift(ptr ptr) +@ cdecl png_set_sig_bytes(ptr long) +@ cdecl png_set_strip_16(ptr) +@ cdecl png_set_strip_alpha(ptr) +@ cdecl png_set_swap(ptr) +@ cdecl png_set_swap_alpha(ptr) +@ cdecl png_set_tIME(ptr ptr ptr) +@ cdecl png_set_tRNS(ptr ptr str long ptr) +@ cdecl png_set_tRNS_to_alpha(ptr) +@ cdecl png_set_text(ptr ptr ptr long) +@ cdecl png_set_text_compression_level(ptr long) +@ cdecl png_set_text_compression_mem_level(ptr long) +@ cdecl png_set_text_compression_method(ptr long) +@ cdecl png_set_text_compression_strategy(ptr long) +@ cdecl png_set_text_compression_window_bits(ptr long) +@ cdecl png_set_unknown_chunk_location(ptr ptr long long) +@ cdecl png_set_unknown_chunks(ptr ptr ptr long) +@ cdecl png_set_user_limits(ptr long long) +@ cdecl png_set_user_transform_info(ptr ptr long long) +@ cdecl png_set_write_fn(ptr ptr ptr ptr) +@ cdecl png_set_write_status_fn(ptr ptr) +@ cdecl png_set_write_user_transform_fn(ptr ptr) +@ cdecl png_sig_cmp(ptr long long) +@ cdecl png_start_read_image(ptr) +@ cdecl png_warning(ptr str) +@ cdecl png_write_chunk(ptr ptr ptr long) +@ cdecl png_write_chunk_data(ptr ptr long) +@ cdecl png_write_chunk_end(ptr) +@ cdecl png_write_chunk_start(ptr ptr long) +@ cdecl png_write_end(ptr ptr) +@ cdecl png_write_flush(ptr) +@ cdecl png_write_image(ptr ptr) +@ cdecl png_write_info(ptr ptr) +@ cdecl png_write_info_before_PLTE(ptr ptr) +@ cdecl png_write_png(ptr ptr ptr ptr) +@ cdecl png_write_row(ptr ptr) +@ cdecl png_write_rows(ptr ptr long) +@ cdecl png_write_sig(ptr) diff --git a/win32ss/user/user32/CMakeLists.txt b/win32ss/user/user32/CMakeLists.txt index ca2f2a143e2..b7cdfe3aa4d 100644 --- a/win32ss/user/user32/CMakeLists.txt +++ b/win32ss/user/user32/CMakeLists.txt @@ -5,7 +5,8 @@ include_directories( ${REACTOS_SOURCE_DIR}/sdk/include/reactos/subsys include ${REACTOS_SOURCE_DIR}/sdk/include/reactos/wine - ${REACTOS_SOURCE_DIR}/win32ss/include) + ${REACTOS_SOURCE_DIR}/win32ss/include + ${REACTOS_SOURCE_DIR}/sdk/include/reactos/libs/libpng) list(APPEND SOURCE controls/appswitch.c @@ -88,7 +89,7 @@ if(MSVC AND (ARCH STREQUAL "i386")) target_sources(user32 PRIVATE $<TARGET_OBJECTS:ftol2_sse>) endif() -add_delay_importlibs(user32 usp10) -add_importlibs(user32 gdi32 advapi32 kernel32 ntdll) +add_delay_importlibs(user32 usp10 libpng) +add_importlibs(user32 gdi32 advapi32 msvcrt kernel32 ntdll) add_pch(user32 include/user32.h SOURCE) add_cd_file(TARGET user32 DESTINATION reactos/system32 FOR all) diff --git a/win32ss/user/user32/windows/cursoricon.c b/win32ss/user/user32/windows/cursoricon.c index b1d8bc7e69a..f06a1b9d540 100644 --- a/win32ss/user/user32/windows/cursoricon.c +++ b/win32ss/user/user32/windows/cursoricon.c @@ -1,17 +1,244 @@ /* - * PROJECT: ReactOS user32.dll - * COPYRIGHT: GPL - See COPYING in the top level directory - * FILE: win32ss/user/user32/windows/cursoricon.c - * PURPOSE: cursor and icons implementation - * PROGRAMMER: Jérôme Gardou (jerome.gardou(a)reactos.org) + * PROJECT: ReactOS user32.dll + * LICENSE: GPL-2.0-or-later (
https://spdx.org/licenses/GPL-2.0-or-later
) + * PURPOSE: cursor and icons implementation + * COPYRIGHT: Copyright Jérôme Gardou (jerome.gardou(a)reactos.org) + * Copyright 2022-2025 Doug Lyons (douglyons(a)douglyons.com) + * Copyright 2025 Katayama Hirofumi MZ (katayama.hirofumi.mz(a)gmail.com) */ #include <user32.h> +#include "png.h" WINE_DEFAULT_DEBUG_CHANNEL(cursor); WINE_DECLARE_DEBUG_CHANNEL(icon); //WINE_DECLARE_DEBUG_CHANNEL(resource); +#include <pshpack1.h> +typedef struct { + BYTE bWidth; + BYTE bHeight; + BYTE bColorCount; + BYTE bReserved; + union + { + WORD wPlanes; /* For icons */ + WORD xHotspot; /* For cursors */ + }; + union + { + WORD wBitCount; /* For icons */ + WORD yHotspot; /* For cursors */ + }; + DWORD dwDIBSize; + DWORD dwDIBOffset; +} CURSORICONFILEDIRENTRY; + +typedef struct +{ + WORD idReserved; + WORD idType; + WORD idCount; + CURSORICONFILEDIRENTRY idEntries[1]; +} CURSORICONFILEDIR; +#include <poppack.h> + +#define PNG_CHECK_SIG_SIZE 8 /* Check signature size */ + +/* libpng helpers */ +typedef struct { + png_bytep buffer; + size_t bufSize; + size_t currentPos; +} PNG_READER_STATE; + +/* This function will be used for reading png data from memory */ +static VOID +ReadMemoryPng( + _Inout_ png_structp png_ptr, + _Out_ png_bytep data, + _In_ size_t length) +{ + PNG_READER_STATE *state = png_get_io_ptr(png_ptr); + if ((state->currentPos + length) > state->bufSize) + { + ERR("png read error\n"); + png_error(png_ptr, "read error in ReadMemoryPng"); + return; + } + RtlCopyMemory(data, state->buffer + state->currentPos, length); + state->currentPos += length; +} + +static int get_dib_image_size(int width, int height, int depth); + +/* Convert PNG raw data to BMP icon data */ +static LPBYTE +CURSORICON_ConvertPngToBmpIcon( + _In_ LPBYTE pngBits, + _In_ DWORD fileSize, + _Out_ PDWORD pBmpIconSize) +{ + if (!pngBits || fileSize < PNG_CHECK_SIG_SIZE || !png_check_sig(pngBits, PNG_CHECK_SIG_SIZE)) + return NULL; + + TRACE("pngBits %p fileSize %d\n", pngBits, fileSize); + + png_structp png_ptr = png_create_read_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL); + if (!png_ptr) + { + ERR("png_create_read_struct error\n"); + return NULL; + } + + png_infop info_ptr = png_create_info_struct(png_ptr); + if (!info_ptr) + { + ERR("png_create_info_struct error\n"); + png_destroy_read_struct(&png_ptr, NULL, NULL); + return NULL; + } + + /* Set our own read_function */ + PNG_READER_STATE readerState = { pngBits, fileSize, PNG_CHECK_SIG_SIZE }; + png_set_read_fn(png_ptr, &readerState, ReadMemoryPng); + png_set_sig_bytes(png_ptr, PNG_CHECK_SIG_SIZE); + + /* Read png info */ + png_read_info(png_ptr, info_ptr); + + /* Add translation of some PNG formats and update info */ + int colorType = png_get_color_type(png_ptr, info_ptr); + if (colorType == PNG_COLOR_TYPE_PALETTE) + png_set_palette_to_rgb(png_ptr); + else if (colorType == PNG_COLOR_TYPE_GRAY || colorType == PNG_COLOR_TYPE_GRAY_ALPHA) + png_set_gray_to_rgb(png_ptr); + png_set_scale_16(png_ptr); /* Convert 16-bit channels to 8-bit */ + png_read_update_info(png_ptr, info_ptr); + + /* Get updated png info */ + png_uint_32 width, height; + int bitDepth; + png_get_IHDR(png_ptr, info_ptr, &width, &height, &bitDepth, &colorType, NULL, NULL, NULL); + TRACE("width %d, height %d, bitDepth %d, colorType %d\n", + width, height, bitDepth, colorType); + + int channels = png_get_channels(png_ptr, info_ptr); + int rowbytes = png_get_rowbytes(png_ptr, info_ptr); + int imageSize = height * rowbytes; + TRACE("rowbytes %d, channels %d, imageSize %d\n", rowbytes, channels, imageSize); + + /* Allocate rows data */ + png_bytepp rows = png_malloc(png_ptr, sizeof(png_bytep) * height); + if (!rows) + { + ERR("png_malloc failed\n"); + png_destroy_read_struct(&png_ptr, &info_ptr, NULL); + return NULL; + } + + for (int i = 0; i < (int)height; i++) + { + rows[i] = png_malloc(png_ptr, rowbytes); + if (!rows[i]) + { + ERR("png_malloc failed\n"); + + /* Clean up */ + while (--i >= 0) + png_free(png_ptr, rows[i]); + png_free(png_ptr, rows); + png_destroy_read_struct(&png_ptr, &info_ptr, NULL); + + return NULL; + } + } + + /* Read png image data */ + png_set_rows(png_ptr, info_ptr, rows); + png_read_image(png_ptr, rows); + png_read_end(png_ptr, info_ptr); + + /* After reading the image, you can deal with row pointers */ + LPBYTE imageBytes = HeapAlloc(GetProcessHeap(), 0, imageSize); + if (imageBytes) + { + LPBYTE pb = imageBytes; + for (int i = height - 1; i >= 0; i--) + { + png_bytep row = rows[i]; + for (int j = 0; j < channels * width; j += channels) + { + *pb++ = row[j + 2]; /* Red */ + *pb++ = row[j + 1]; /* Green */ + *pb++ = row[j + 0]; /* Blue */ + if (channels == 4) + *pb++ = row[j + 3]; /* Alpha */ + } + pb += (channels * width) % 4; + } + } + + /* Clean up */ + for (int i = 0; i < (int)height; i++) + png_free(png_ptr, rows[i]); + png_free(png_ptr, rows); + png_destroy_read_struct(&png_ptr, &info_ptr, NULL); + + if (!imageBytes) + { + ERR("HeapAlloc failed\n"); + return NULL; + } + + /* BPP (Bits Per Pixel) */ + WORD bpp = (WORD)(bitDepth * channels); + + /* The byte size of mask bits */ + DWORD maskSize = get_dib_image_size(width, height, 1); + + /* Build BITMAPINFOHEADER */ + BITMAPINFOHEADER info = { sizeof(info) }; + info.biWidth = width; + info.biHeight = 2 * height; + info.biPlanes = 1; + info.biBitCount = bpp; + info.biCompression = BI_RGB; + + /* Build CURSORICONFILEDIR */ + CURSORICONFILEDIR cifd = { 0, 1, 1 }; + cifd.idEntries[0].bWidth = (BYTE)width; + cifd.idEntries[0].bHeight = (BYTE)height; + cifd.idEntries[0].bColorCount = 0; /* No color pallete */ + cifd.idEntries[0].wPlanes = 1; /* Must be 1 */ + cifd.idEntries[0].wBitCount = bpp; + cifd.idEntries[0].dwDIBSize = (DWORD)(sizeof(info) + imageSize + maskSize); + cifd.idEntries[0].dwDIBOffset = (DWORD)sizeof(cifd); + + /* Allocate BMP icon data */ + *pBmpIconSize = (DWORD)(sizeof(cifd) + sizeof(info) + imageSize + maskSize); + LPBYTE pbBmpIcon = HeapAlloc(GetProcessHeap(), 0, *pBmpIconSize); + if (!pbBmpIcon) + { + ERR("HeapAlloc failed\n"); + HeapFree(GetProcessHeap(), 0, imageBytes); + return NULL; + } + + /* Store data to pbBmpIcon */ + LPBYTE pb = pbBmpIcon; + RtlCopyMemory(pb, &cifd, sizeof(cifd)); + pb += sizeof(cifd); + RtlCopyMemory(pb, &info, sizeof(info)); + pb += sizeof(info); + RtlCopyMemory(pb, imageBytes, imageSize); + pb += imageSize; + RtlFillMemory(pb, maskSize, 0xFF); /* Mask bits for AND operation */ + + HeapFree(GetProcessHeap(), 0, imageBytes); + return pbBmpIcon; +} + /* We only use Wide string functions */ #undef MAKEINTRESOURCE #define MAKEINTRESOURCE MAKEINTRESOURCEW @@ -221,7 +448,7 @@ static int DIB_GetBitmapInfo( const BITMAPINFOHEADER *header, LONG *width, } if (memcmp(&header->biSize, png_sig_pattern, sizeof(png_sig_pattern)) == 0) { - ERR("Cannot yet display PNG icons\n"); + TRACE("We have a PNG icon\n"); /* for PNG format details see
https://en.wikipedia.org/wiki/PNG
*/ } else @@ -469,29 +696,6 @@ done: return alpha; } -#include "pshpack1.h" - -typedef struct { - BYTE bWidth; - BYTE bHeight; - BYTE bColorCount; - BYTE bReserved; - WORD xHotspot; - WORD yHotspot; - DWORD dwDIBSize; - DWORD dwDIBOffset; -} CURSORICONFILEDIRENTRY; - -typedef struct -{ - WORD idReserved; - WORD idType; - WORD idCount; - CURSORICONFILEDIRENTRY idEntries[1]; -} CURSORICONFILEDIR; - -#include "poppack.h" - const CURSORICONFILEDIRENTRY* get_best_icon_file_entry( _In_ const CURSORICONFILEDIR* dir, @@ -1155,6 +1359,14 @@ BITMAP_LoadImageW( ResSize = SizeofResource(hinst, hrsrc); } + if (pbmi->bmiHeader.biCompression == BI_BITFIELDS && pbmi->bmiHeader.biBitCount == 32) + { + SIZE_T totalSize = pbmi->bmiHeader.biSize + (3 * sizeof(DWORD)) + + pbmi->bmiHeader.biSizeImage; + if (pbmi->bmiHeader.biSizeImage != 0 && totalSize != ResSize) + WARN("Possibly bad resource size provided\n"); + } + /* Fix up values */ if(DIB_GetBitmapInfo(&pbmi->bmiHeader, &width, &height, &bpp, &compr) == -1) goto end; @@ -1385,8 +1597,8 @@ CURSORICON_LoadFromFileW( { const CURSORICONFILEDIRENTRY *entry; const CURSORICONFILEDIR *dir; - DWORD filesize = 0; - LPBYTE bits; + DWORD filesize = 0, BmpIconSize; + LPBYTE bits, pbBmpIcon = NULL; HANDLE hCurIcon = NULL; CURSORDATA cursorData; @@ -1418,15 +1630,37 @@ CURSORICON_LoadFromFileW( cursorData.xHotspot = entry->xHotspot; cursorData.yHotspot = entry->yHotspot; } - cursorData.rt = (USHORT)((ULONG_PTR)(bIcon ? RT_ICON : RT_CURSOR)); + cursorData.rt = LOWORD(bIcon ? RT_ICON : RT_CURSOR); + + /* Try to load BMP icon */ + DWORD dwOffset = entry->dwDIBOffset; + if (!CURSORICON_GetCursorDataFromBMI(&cursorData, (BITMAPINFO *)(&bits[dwOffset]))) + { + /* Convert PNG raw data to BMP icon if the icon was PNG icon */ + LPBYTE pngBits = &bits[entry->dwDIBOffset]; + pbBmpIcon = CURSORICON_ConvertPngToBmpIcon(pngBits, filesize, &BmpIconSize); + if (!pbBmpIcon) + goto end; /* Not PNG icon or failed */ + + /* Find icon entry from BMP icon */ + dir = (CURSORICONFILEDIR *)pbBmpIcon; + entry = &dir->idEntries[0]; /* Only one entry */ + + /* A bit of preparation */ + RtlZeroMemory(&cursorData, sizeof(cursorData)); + cursorData.rt = LOWORD(bIcon ? RT_ICON : RT_CURSOR); - /* Do the dance */ - if(!CURSORICON_GetCursorDataFromBMI(&cursorData, (BITMAPINFO*)(&bits[entry->dwDIBOffset]))) + /* Can we load this BMP icon? */ + dwOffset = entry->dwDIBOffset; + if (!CURSORICON_GetCursorDataFromBMI(&cursorData, (BITMAPINFO *)(&pbBmpIcon[dwOffset]))) { - ERR("Failing File is \n '%S'.\n", lpszName); + ERR("Failing file: '%S'.\n", lpszName); goto end; } + TRACE("Processing PNG/Vista icon: '%S'\n", lpszName); + } + hCurIcon = NtUserxCreateEmptyCurObject(FALSE); if(!hCurIcon) goto end; @@ -1435,21 +1669,16 @@ CURSORICON_LoadFromFileW( if(!NtUserSetCursorIconData(hCurIcon, NULL, NULL, &cursorData)) { NtUserDestroyCursor(hCurIcon, TRUE); - goto end_error; + hCurIcon = NULL; + if (cursorData.hbmMask) DeleteObject(cursorData.hbmMask); + if (cursorData.hbmColor) DeleteObject(cursorData.hbmColor); + if (cursorData.hbmAlpha) DeleteObject(cursorData.hbmAlpha); } end: UnmapViewOfFile(bits); + HeapFree(GetProcessHeap(), 0, pbBmpIcon); return hCurIcon; - - /* Clean up */ -end_error: - DeleteObject(cursorData.hbmMask); - if(cursorData.hbmColor) DeleteObject(cursorData.hbmColor); - if(cursorData.hbmAlpha) DeleteObject(cursorData.hbmAlpha); - UnmapViewOfFile(bits); - - return NULL; } static @@ -1514,7 +1743,7 @@ CURSORICON_LoadImageW( SetLastError(ERROR_NOT_ENOUGH_MEMORY); return NULL; } - ustrModule.Length = wsprintfW(ustrModule.Buffer, fakeNameFmt, hinst) * sizeof(WCHAR); + ustrModule.Length = (USHORT)wsprintfW(ustrModule.Buffer, fakeNameFmt, hinst) * sizeof(WCHAR); } else if(hinst) { @@ -1545,8 +1774,8 @@ CURSORICON_LoadImageW( } ustrModule.Buffer[ret] = UNICODE_NULL; - ustrModule.Length = ret * sizeof(WCHAR); - ustrModule.MaximumLength = size * sizeof(WCHAR); + ustrModule.Length = (USHORT)(ret * sizeof(WCHAR)); + ustrModule.MaximumLength = (USHORT)(size * sizeof(WCHAR)); break; } } @@ -2539,9 +2768,17 @@ HICON WINAPI CreateIconFromResourceEx( CURSORDATA cursorData; HICON hIcon; BOOL isAnimated; + LPBYTE pbBmpIcon = NULL; + DWORD BmpIconSize; TRACE("%p, %lu, %lu, %lu, %i, %i, %lu.\n", pbIconBits, cbIconBits, fIcon, dwVersion, cxDesired, cyDesired, uFlags); + if (!pbIconBits || cbIconBits < 2 * sizeof(DWORD)) + { + ERR("Sanity check failed\n"); + return NULL; + } + if(uFlags & LR_DEFAULTSIZE) { if(!cxDesired) cxDesired = GetSystemMetrics(fIcon ? SM_CXICON : SM_CXCURSOR); @@ -2551,7 +2788,7 @@ HICON WINAPI CreateIconFromResourceEx( ZeroMemory(&cursorData, sizeof(cursorData)); cursorData.cx = cxDesired; cursorData.cy = cyDesired; - cursorData.rt = (USHORT)((ULONG_PTR)(fIcon ? RT_ICON : RT_CURSOR)); + cursorData.rt = LOWORD(fIcon ? RT_ICON : RT_CURSOR); /* Convert to win32k-ready data */ if(!memcmp(pbIconBits, "RIFF", 4)) @@ -2622,15 +2859,30 @@ HICON WINAPI CreateIconFromResourceEx( pbIconBits = (PBYTE)pt; } - if (!CURSORICON_GetCursorDataFromBMI(&cursorData, (BITMAPINFO*)pbIconBits)) + /* Try to load BMP icon */ + if (!CURSORICON_GetCursorDataFromBMI(&cursorData, (BITMAPINFO *)pbIconBits)) { - ERR("Couldn't fill the CURSORDATA structure.\n"); - if (ResHandle) - FreeResource(ResHandle); - return NULL; + /* Convert PNG raw data to BMP icon if the icon was PNG icon */ + pbBmpIcon = CURSORICON_ConvertPngToBmpIcon(pbIconBits, cbIconBits, &BmpIconSize); + if (!pbBmpIcon) + goto end; /* Not PNG icon or failed */ + + /* Find icon entry from BMP icon */ + CURSORICONFILEDIR *dir = (CURSORICONFILEDIR *)pbBmpIcon; + CURSORICONFILEDIRENTRY *entry = &dir->idEntries[0]; /* Only one entry */ + + /* A bit of preparation */ + RtlZeroMemory(&cursorData, sizeof(cursorData)); + cursorData.rt = LOWORD(fIcon ? RT_ICON : RT_CURSOR); + + /* Can we load this BMP icon? */ + DWORD dwOffset = entry->dwDIBOffset; + if (!CURSORICON_GetCursorDataFromBMI(&cursorData, (BITMAPINFO *)&pbBmpIcon[dwOffset])) + { + ERR("Couldn't get cursor/icon data\n"); + goto end; + } } - if (ResHandle) - FreeResource(ResHandle); isAnimated = FALSE; } @@ -2651,10 +2903,13 @@ HICON WINAPI CreateIconFromResourceEx( if(isAnimated) HeapFree(GetProcessHeap(), 0, cursorData.aspcur); +end: + HeapFree(GetProcessHeap(), 0, pbBmpIcon); return hIcon; /* Clean up */ end_error: + HeapFree(GetProcessHeap(), 0, pbBmpIcon); if(isAnimated) HeapFree(GetProcessHeap(), 0, cursorData.aspcur); DeleteObject(cursorData.hbmMask);
3 weeks, 3 days
1
0
0
0
[reactos] 01/01: [NTUSER][USER32] Support GetWindow.GW_ENABLEDPOPUP (#7700)
by Katayama Hirofumi MZ
https://git.reactos.org/?p=reactos.git;a=commitdiff;h=22577aed85f91b33a25c8…
commit 22577aed85f91b33a25c89ad857951ddb8e1a988 Author: Katayama Hirofumi MZ <katayama.hirofumi.mz(a)gmail.com> AuthorDate: Fri Feb 7 07:31:08 2025 +0900 Commit: GitHub <noreply(a)github.com> CommitDate: Fri Feb 7 07:31:08 2025 +0900 [NTUSER][USER32] Support GetWindow.GW_ENABLEDPOPUP (#7700) JIRA issue: CORE-6920 - Make the return value of NtUserCallHwnd a DWORD_PTR. - Add DWP_GetEnabledPopup helper function in win32ss/user/ntuser/defwnd.c. - Add code to NtUserCallHwnd for HWND_ROUTINE_DWP_GETENABLEDPOPUP. - Add code to GetWindow for GW_ENABLEDPOPUP. - Set last error in GetWindow and IntGetWindow. --- win32ss/include/ntuser.h | 2 +- win32ss/user/ntuser/defwnd.c | 52 +++++++++++++++++++++++++++++++++ win32ss/user/ntuser/simplecall.c | 13 ++++++++- win32ss/user/ntuser/userfuncs.h | 1 + win32ss/user/ntuser/window.c | 2 +- win32ss/user/user32/include/ntwrapper.h | 8 ++--- win32ss/user/user32/windows/window.c | 12 +++++++- 7 files changed, 82 insertions(+), 8 deletions(-) diff --git a/win32ss/include/ntuser.h b/win32ss/include/ntuser.h index 7e09af4896f..783d4e0c32a 100644 --- a/win32ss/include/ntuser.h +++ b/win32ss/include/ntuser.h @@ -1670,7 +1670,7 @@ enum SimpleCallRoutines TWOPARAM_ROUTINE_WOWCLEANUP }; -DWORD +DWORD_PTR NTAPI NtUserCallHwnd( HWND hWnd, diff --git a/win32ss/user/ntuser/defwnd.c b/win32ss/user/ntuser/defwnd.c index 368105afc42..dba5c7b567b 100644 --- a/win32ss/user/ntuser/defwnd.c +++ b/win32ss/user/ntuser/defwnd.c @@ -495,6 +495,58 @@ DefWndGetIcon(PWND pWnd, WPARAM wParam, LPARAM lParam) return (LRESULT)hIconRet; } +PWND FASTCALL +DWP_GetEnabledPopup(PWND pWnd) +{ + PWND pwndNode1; + PTHREADINFO pti = pWnd->head.pti, ptiNode; + BOOL bFoundNullNode = FALSE; + + for (pwndNode1 = pWnd->spwndNext; pwndNode1 != pWnd; ) + { + if (!pwndNode1) /* NULL detected? */ + { + if (bFoundNullNode) + return NULL; + bFoundNullNode = TRUE; + /* Retry with parent's first child (once only) */ + pwndNode1 = pWnd->spwndParent->spwndChild; + continue; + } + + /* + * 1. We want to detect the window that owns the same input target of pWnd. + * 2. For non-16-bit apps, we need to check the two threads' input queues to + * see whether they are the same, while for 16-bit apps it's sufficient to + * only check the thread info pointers themselves (ptiNode and pti). + * See also: + *
https://devblogs.microsoft.com/oldnewthing/20060221-09/?p=32203
+ *
https://github.com/reactos/reactos/pull/7700#discussion_r1939435931
+ */ + ptiNode = pwndNode1->head.pti; + if ((!(pti->TIF_flags & TIF_16BIT) && ptiNode->MessageQueue == pti->MessageQueue) || + ((pti->TIF_flags & TIF_16BIT) && ptiNode == pti)) + { + DWORD style = pwndNode1->style; + if ((style & WS_VISIBLE) && !(style & WS_DISABLED)) /* Visible and enabled? */ + { + /* Does pwndNode1 have a pWnd as an ancestor? */ + PWND pwndNode2; + for (pwndNode2 = pwndNode1->spwndOwner; pwndNode2; + pwndNode2 = pwndNode2->spwndOwner) + { + if (pwndNode2 == pWnd) + return pwndNode1; + } + } + } + + pwndNode1 = pwndNode1->spwndNext; + } + + return NULL; +} + VOID FASTCALL DefWndScreenshot(PWND pWnd) { diff --git a/win32ss/user/ntuser/simplecall.c b/win32ss/user/ntuser/simplecall.c index fa7ee28d857..6a433ed7120 100644 --- a/win32ss/user/ntuser/simplecall.c +++ b/win32ss/user/ntuser/simplecall.c @@ -706,7 +706,7 @@ NtUserCallHwndOpt( return hWnd; } -DWORD +DWORD_PTR APIENTRY NtUserCallHwnd( HWND hWnd, @@ -755,6 +755,17 @@ NtUserCallHwnd( UserLeave(); return FALSE; } + + case HWND_ROUTINE_DWP_GETENABLEDPOPUP: + { + PWND pWnd; + UserEnterShared(); + pWnd = UserGetWindowObject(hWnd); + if (pWnd) + pWnd = DWP_GetEnabledPopup(pWnd); + UserLeave(); + return (DWORD_PTR)pWnd; + } } STUB; diff --git a/win32ss/user/ntuser/userfuncs.h b/win32ss/user/ntuser/userfuncs.h index 740607530a4..f282344ab56 100644 --- a/win32ss/user/ntuser/userfuncs.h +++ b/win32ss/user/ntuser/userfuncs.h @@ -161,6 +161,7 @@ LRESULT NC_HandleNCRButtonDown( PWND wnd, WPARAM wParam, LPARAM lParam ); HBRUSH FASTCALL DefWndControlColor(HDC hDC,UINT ctlType); BOOL UserDrawSysMenuButton(PWND pWnd, HDC hDC, LPRECT Rect, BOOL Down); BOOL UserPaintCaption(PWND pWnd, INT Flags); +PWND FASTCALL DWP_GetEnabledPopup(PWND pWnd); /************** LAYERED **************/ diff --git a/win32ss/user/ntuser/window.c b/win32ss/user/ntuser/window.c index 55df7d52b4c..9f8d669e3e8 100644 --- a/win32ss/user/ntuser/window.c +++ b/win32ss/user/ntuser/window.c @@ -428,7 +428,7 @@ IntGetWindow(HWND hWnd, break; default: - Wnd = NULL; + EngSetLastError(ERROR_INVALID_GW_COMMAND); break; } diff --git a/win32ss/user/user32/include/ntwrapper.h b/win32ss/user/user32/include/ntwrapper.h index 67b67de6ed9..067077890ed 100644 --- a/win32ss/user/user32/include/ntwrapper.h +++ b/win32ss/user/user32/include/ntwrapper.h @@ -725,22 +725,22 @@ EXTINLINE VOID NtUserxNotifyWinEvent(HWND hWnd, PVOID ne) EXTINLINE DWORD NtUserxGetWindowContextHelpId(HWND hwnd) { - return NtUserCallHwnd(hwnd, HWND_ROUTINE_GETWNDCONTEXTHLPID); + return (DWORD)NtUserCallHwnd(hwnd, HWND_ROUTINE_GETWNDCONTEXTHLPID); } EXTINLINE BOOL NtUserxDeregisterShellHookWindow(HWND hWnd) { - return NtUserCallHwnd(hWnd, HWND_ROUTINE_DEREGISTERSHELLHOOKWINDOW); + return (BOOL)NtUserCallHwnd(hWnd, HWND_ROUTINE_DEREGISTERSHELLHOOKWINDOW); } EXTINLINE BOOL NtUserxRegisterShellHookWindow(HWND hWnd) { - return NtUserCallHwnd(hWnd, HWND_ROUTINE_REGISTERSHELLHOOKWINDOW); + return (BOOL)NtUserCallHwnd(hWnd, HWND_ROUTINE_REGISTERSHELLHOOKWINDOW); } EXTINLINE BOOL NtUserxSetMessageBox(HWND hWnd) { - return NtUserCallHwnd(hWnd, HWND_ROUTINE_SETMSGBOX); + return (BOOL)NtUserCallHwnd(hWnd, HWND_ROUTINE_SETMSGBOX); } EXTINLINE VOID NtUserxClearWindowState(PWND pWnd, UINT Flag) diff --git a/win32ss/user/user32/windows/window.c b/win32ss/user/user32/windows/window.c index dfe06a349c5..e7468f8a91c 100644 --- a/win32ss/user/user32/windows/window.c +++ b/win32ss/user/user32/windows/window.c @@ -1141,9 +1141,19 @@ GetWindow(HWND hWnd, FoundWnd = DesktopPtrToUser(FoundWnd->spwndNext); break; + case GW_ENABLEDPOPUP: + { + PWND pwndPopup = (PWND)NtUserCallHwnd(hWnd, HWND_ROUTINE_DWP_GETENABLEDPOPUP); + if (pwndPopup) + FoundWnd = DesktopPtrToUser(pwndPopup); + break; + } + default: - Wnd = NULL; + { + UserSetLastError(ERROR_INVALID_GW_COMMAND); break; + } } if (FoundWnd != NULL)
3 weeks, 4 days
1
0
0
0
[reactos] 01/01: [SYSSETUP] Add the type library registration to the Register Components task on the process page
by Eric Kohl
https://git.reactos.org/?p=reactos.git;a=commitdiff;h=2d8a2944baad1078aa980…
commit 2d8a2944baad1078aa98097b38d86fb3b72dee01 Author: Eric Kohl <eric.kohl(a)reactos.org> AuthorDate: Thu Feb 6 23:14:28 2025 +0100 Commit: Eric Kohl <eric.kohl(a)reactos.org> CommitDate: Thu Feb 6 23:14:28 2025 +0100 [SYSSETUP] Add the type library registration to the Register Components task on the process page --- dll/win32/syssetup/globals.h | 9 +++- dll/win32/syssetup/install.c | 25 +++++++++-- dll/win32/syssetup/wizard.c | 104 ++++++++++++++++++++++++++++++------------- 3 files changed, 102 insertions(+), 36 deletions(-) diff --git a/dll/win32/syssetup/globals.h b/dll/win32/syssetup/globals.h index 85b3f8dea3a..8112102a0b7 100644 --- a/dll/win32/syssetup/globals.h +++ b/dll/win32/syssetup/globals.h @@ -68,10 +68,15 @@ extern HINSTANCE hDllInstance; extern HINF hSysSetupInf; extern ADMIN_INFO AdminInfo; -BOOL RegisterTypeLibraries (HINF hinf, LPCWSTR szSection); - /* install */ +BOOL +RegisterTypeLibraries( + _In_ PITEMSDATA pItemsData, + _In_ PREGISTRATIONNOTIFY pNotify, + _In_ HINF hinf, + _In_ LPCWSTR szSection); + VOID InstallStartMenuItems( _In_ PITEMSDATA pItemsData); diff --git a/dll/win32/syssetup/install.c b/dll/win32/syssetup/install.c index 61d5da1bc33..4d964fab68c 100644 --- a/dll/win32/syssetup/install.c +++ b/dll/win32/syssetup/install.c @@ -336,11 +336,9 @@ InstallStartMenuItems( INF_STYLE_WIN4, NULL); -// Steps = SetupGetLineCountW(hShortcutsInf1, L"ShortcutFolders"); Steps = CountShortcuts(hShortcutsInf1, L"ShortcutFolders"); if (hShortcutsInf2 != INVALID_HANDLE_VALUE) Steps += CountShortcuts(hShortcutsInf2, L"ShortcutFolders"); -// Steps += SetupGetLineCountW(hShortcutsInf2, L"ShortcutFolders"); SendMessage(pItemsData->hwndDlg, PM_ITEM_START, 1, (LPARAM)Steps); @@ -538,7 +536,11 @@ InstallSysSetupInfComponents(VOID) BOOL -RegisterTypeLibraries(HINF hinf, LPCWSTR szSection) +RegisterTypeLibraries( + _In_ PITEMSDATA pItemsData, + _In_ PREGISTRATIONNOTIFY pNotify, + _In_ HINF hinf, + _In_ LPCWSTR szSection) { INFCONTEXT InfContext; BOOL res; @@ -575,6 +577,15 @@ RegisterTypeLibraries(HINF hinf, LPCWSTR szSection) p = PathAddBackslash(szPath); wcscpy(p, szName); + if (pItemsData && pNotify) + { + pNotify->Progress++; + pNotify->CurrentItem = szName; + + DPRINT("RegisterTypeLibraries: Start step %ld\n", pNotify->Progress); + SendMessage(pItemsData->hwndDlg, PM_STEP_START, 0, (LPARAM)pNotify); + } + hmod = LoadLibraryW(szPath); if (hmod == NULL) { @@ -584,6 +595,12 @@ RegisterTypeLibraries(HINF hinf, LPCWSTR szSection) __wine_register_resources(hmod); + if (pItemsData && pNotify) + { + DPRINT("RegisterTypeLibraries: End step %ld\n", pNotify->Progress); + SendMessage(pItemsData->hwndDlg, PM_STEP_END, 0, (LPARAM)pNotify); + } + } while (SetupFindNextLine(&InfContext, &InfContext)); return TRUE; @@ -1073,7 +1090,7 @@ InstallLiveCD(VOID) DPRINT1("SetupInstallFromInfSectionW failed!\n"); } - RegisterTypeLibraries(hSysSetupInf, L"TypeLibraries"); + RegisterTypeLibraries(NULL, NULL, hSysSetupInf, L"TypeLibraries"); } _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) { diff --git a/dll/win32/syssetup/wizard.c b/dll/win32/syssetup/wizard.c index 4675ff904a9..0345ed14f40 100644 --- a/dll/win32/syssetup/wizard.c +++ b/dll/win32/syssetup/wizard.c @@ -33,6 +33,7 @@ typedef struct _REGISTRATIONDATA ULONG DllCount; ULONG Registered; PVOID DefaultContext; + PREGISTRATIONNOTIFY pNotify; } REGISTRATIONDATA, *PREGISTRATIONDATA; typedef struct _TIMEZONE_ENTRY @@ -1991,7 +1992,6 @@ RegistrationNotificationProc(PVOID Context, UINT_PTR Param2) { PREGISTRATIONDATA RegistrationData; - REGISTRATIONNOTIFY RegistrationNotify; PSP_REGISTER_CONTROL_STATUSW StatusInfo; UINT MessageID; @@ -2001,23 +2001,24 @@ RegistrationNotificationProc(PVOID Context, Notification == SPFILENOTIFY_ENDREGISTRATION) { StatusInfo = (PSP_REGISTER_CONTROL_STATUSW) Param1; - RegistrationNotify.CurrentItem = wcsrchr(StatusInfo->FileName, L'\\'); - if (RegistrationNotify.CurrentItem == NULL) + RegistrationData->pNotify->CurrentItem = wcsrchr(StatusInfo->FileName, L'\\'); + if (RegistrationData->pNotify->CurrentItem == NULL) { - RegistrationNotify.CurrentItem = StatusInfo->FileName; + RegistrationData->pNotify->CurrentItem = StatusInfo->FileName; } else { - RegistrationNotify.CurrentItem++; + RegistrationData->pNotify->CurrentItem++; } if (Notification == SPFILENOTIFY_STARTREGISTRATION) { DPRINT("Received SPFILENOTIFY_STARTREGISTRATION notification for %S\n", StatusInfo->FileName); -// RegistrationNotify.ErrorMessage = NULL; - RegistrationNotify.Progress = RegistrationData->Registered; - SendMessage(RegistrationData->hwndDlg, PM_STEP_START, 0, (LPARAM)&RegistrationNotify); + RegistrationData->pNotify->Progress = RegistrationData->Registered; + + DPRINT("RegisterDll: Start step %ld\n", RegistrationData->pNotify->Progress); + SendMessage(RegistrationData->hwndDlg, PM_STEP_START, 0, (LPARAM)RegistrationData->pNotify); } else { @@ -2049,13 +2050,13 @@ RegistrationNotificationProc(PVOID Context, break; } - RegistrationNotify.MessageID = MessageID; - RegistrationNotify.LastError = StatusInfo->Win32Error; + RegistrationData->pNotify->MessageID = MessageID; + RegistrationData->pNotify->LastError = StatusInfo->Win32Error; } else { - RegistrationNotify.MessageID = 0; - RegistrationNotify.LastError = ERROR_SUCCESS; + RegistrationData->pNotify->MessageID = 0; + RegistrationData->pNotify->LastError = ERROR_SUCCESS; } if (RegistrationData->Registered < RegistrationData->DllCount) @@ -2063,8 +2064,9 @@ RegistrationNotificationProc(PVOID Context, RegistrationData->Registered++; } - RegistrationNotify.Progress = RegistrationData->Registered; - SendMessage(RegistrationData->hwndDlg, PM_STEP_END, 0, (LPARAM)&RegistrationNotify); + RegistrationData->pNotify->Progress = RegistrationData->Registered; + DPRINT("RegisterDll: End step %ld\n", RegistrationData->pNotify->Progress); + SendMessage(RegistrationData->hwndDlg, PM_STEP_END, 0, (LPARAM)RegistrationData->pNotify); } return FILEOP_DOIT; @@ -2081,13 +2083,14 @@ RegistrationNotificationProc(PVOID Context, static DWORD RegisterDlls( - PITEMSDATA pItemsData) + _In_ PITEMSDATA pItemsData, + _In_ PREGISTRATIONNOTIFY pNotify) { REGISTRATIONDATA RegistrationData; WCHAR SectionName[512]; INFCONTEXT Context; LONG DllCount = 0; - DWORD LastError = NO_ERROR; + DWORD Error = NO_ERROR; ZeroMemory(&RegistrationData, sizeof(REGISTRATIONDATA)); RegistrationData.hwndDlg = pItemsData->hwndDlg; @@ -2097,7 +2100,7 @@ RegisterDlls( L"RegisterDlls", &Context)) { DPRINT1("No RegistrationPhase2 section found\n"); - return FALSE; + return GetLastError(); } if (!SetupGetStringFieldW(&Context, 1, SectionName, @@ -2105,21 +2108,19 @@ RegisterDlls( NULL)) { DPRINT1("Unable to retrieve section name\n"); - return FALSE; + return GetLastError(); } DllCount = SetupGetLineCountW(hSysSetupInf, SectionName); - DPRINT1("SectionName %S DllCount %ld\n", SectionName, DllCount); + DPRINT("SectionName %S DllCount %ld\n", SectionName, DllCount); if (DllCount < 0) { - SetLastError(STATUS_NOT_FOUND); - return FALSE; + return STATUS_NOT_FOUND; } RegistrationData.DllCount = (ULONG)DllCount; RegistrationData.DefaultContext = SetupInitDefaultQueueCallback(RegistrationData.hwndDlg); - - SendMessage(pItemsData->hwndDlg, PM_ITEM_START, 0, (LPARAM)RegistrationData.DllCount); + RegistrationData.pNotify = pNotify; _SEH2_TRY { @@ -2135,21 +2136,66 @@ RegisterDlls( NULL, NULL)) { - LastError = GetLastError(); + Error = GetLastError(); } } _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) { DPRINT("Catching exception\n"); - LastError = RtlNtStatusToDosError(_SEH2_GetExceptionCode()); + Error = RtlNtStatusToDosError(_SEH2_GetExceptionCode()); } _SEH2_END; SetupTermDefaultQueueCallback(RegistrationData.DefaultContext); - SendMessage(pItemsData->hwndDlg, PM_ITEM_END, 0, LastError); + return Error; +} - return 0; +static +VOID +RegisterComponents( + PITEMSDATA pItemsData) +{ + WCHAR SectionName[512]; + INFCONTEXT Context; + LONG Steps = 0; + DWORD Error = NO_ERROR; + REGISTRATIONNOTIFY Notify; + + ZeroMemory(&Notify, sizeof(Notify)); + + /* Count the 'RegisterDlls' steps */ + if (!SetupFindFirstLineW(hSysSetupInf, L"RegistrationPhase2", + L"RegisterDlls", &Context)) + { + DPRINT1("No RegistrationPhase2 section found\n"); + return; + } + + if (!SetupGetStringFieldW(&Context, 1, SectionName, + ARRAYSIZE(SectionName), + NULL)) + { + DPRINT1("Unable to retrieve section name\n"); + return; + } + + Steps += SetupGetLineCountW(hSysSetupInf, SectionName); + + /* Count the 'TypeLibratries' steps */ + Steps += SetupGetLineCountW(hSysSetupInf, L"TypeLibraries"); + + /* Start the item */ + DPRINT("Register Components: %ld Steps\n", Steps); + SendMessage(pItemsData->hwndDlg, PM_ITEM_START, 0, (LPARAM)Steps); + + Error = RegisterDlls(pItemsData, &Notify); + if (Error == ERROR_SUCCESS) + RegisterTypeLibraries(pItemsData, &Notify, hSysSetupInf, L"TypeLibraries"); + + /* End the item */ + DPRINT("Register Components: done\n"); + SendMessage(pItemsData->hwndDlg, PM_ITEM_END, 0, Error); } @@ -2166,9 +2212,7 @@ ItemCompletionThread( hwndDlg = pItemsData->hwndDlg; /* Step 0 - Registering components */ - RegisterDlls(pItemsData); - - RegisterTypeLibraries(hSysSetupInf, L"TypeLibraries"); + RegisterComponents(pItemsData); /* Step 1 - Installing start menu items */ InstallStartMenuItems(pItemsData);
3 weeks, 4 days
1
0
0
0
[reactos] 01/01: [SHDOCVW_APITEST] Add WinList testcase (#7702)
by Katayama Hirofumi MZ
https://git.reactos.org/?p=reactos.git;a=commitdiff;h=d969be0fb4a4ac34eed2e…
commit d969be0fb4a4ac34eed2e710a4b29cc14c11f7c8 Author: Katayama Hirofumi MZ <katayama.hirofumi.mz(a)gmail.com> AuthorDate: Thu Feb 6 22:07:56 2025 +0900 Commit: GitHub <noreply(a)github.com> CommitDate: Thu Feb 6 22:07:56 2025 +0900 [SHDOCVW_APITEST] Add WinList testcase (#7702) JIRA issue: CORE-9368 - Add WinList testcase for CLSID_ShellWindows class and shdocvw!WinList_* functions. --- modules/rostests/apitests/shdocvw/CMakeLists.txt | 1 + modules/rostests/apitests/shdocvw/WinList.cpp | 157 +++++++++++++++++++++++ modules/rostests/apitests/shdocvw/testlist.c | 2 + 3 files changed, 160 insertions(+) diff --git a/modules/rostests/apitests/shdocvw/CMakeLists.txt b/modules/rostests/apitests/shdocvw/CMakeLists.txt index 3f4c6324b57..69531225073 100644 --- a/modules/rostests/apitests/shdocvw/CMakeLists.txt +++ b/modules/rostests/apitests/shdocvw/CMakeLists.txt @@ -1,6 +1,7 @@ list(APPEND SOURCE MRUList.cpp + WinList.cpp testlist.c) add_executable(shdocvw_apitest ${SOURCE}) diff --git a/modules/rostests/apitests/shdocvw/WinList.cpp b/modules/rostests/apitests/shdocvw/WinList.cpp new file mode 100644 index 00000000000..e8a9eeb69ca --- /dev/null +++ b/modules/rostests/apitests/shdocvw/WinList.cpp @@ -0,0 +1,157 @@ +/* + * PROJECT: ReactOS api tests + * LICENSE: LGPL-2.1-or-later (
https://spdx.org/licenses/LGPL-2.1-or-later
) + * PURPOSE: Tests for shdocvw!WinList_* functions + * COPYRIGHT: Copyright 2025 Katayama Hirofumi MZ <katayama.hirofumi.mz(a)gmail.com> + */ + +#include <apitest.h> +#include <shlobj.h> + +typedef BOOL (WINAPI *FN_WinList_Init)(VOID); +typedef VOID (WINAPI *FN_WinList_Terminate)(VOID); +typedef IShellWindows* (WINAPI *FN_WinList_GetShellWindows)(BOOL); + +static FN_WinList_Init g_pWinList_Init = NULL; +static FN_WinList_Terminate g_pWinList_Terminate = NULL; +static FN_WinList_GetShellWindows g_pWinList_GetShellWindows = NULL; + +static VOID +TEST_WinList_GetShellWindows(VOID) +{ + BOOL bInited = g_pWinList_Init && g_pWinList_Init(); + ok_int(bInited, FALSE); // WinList_Init should fail because this process is not explorer.exe + + IShellWindows *pShellWindows1 = g_pWinList_GetShellWindows(FALSE); + trace("%p\n", pShellWindows1); + ok(pShellWindows1 != NULL, "pShellWindows1 was null\n"); + + IShellWindows *pShellWindows2 = g_pWinList_GetShellWindows(FALSE); + trace("%p\n", pShellWindows2); + ok(pShellWindows2 != NULL, "pShellWindows2 was null\n"); + + IShellWindows *pShellWindows3 = g_pWinList_GetShellWindows(TRUE); + trace("%p\n", pShellWindows3); + ok(pShellWindows3 != NULL, "pShellWindows3 was null\n"); + + ok_ptr(pShellWindows1, pShellWindows2); + ok_ptr(pShellWindows2, pShellWindows3); + + if (pShellWindows1) + { + LONG nCount = -1; + HRESULT hr = pShellWindows1->get_Count(&nCount); + ok_hex(hr, S_OK); + ok(nCount >= 0, "nCount was %ld\n", nCount); + trace("%ld\n", nCount); + + pShellWindows1->Release(); + } + else + { + ok_int(TRUE, FALSE); + ok_int(TRUE, FALSE); + } + + if (pShellWindows2) + pShellWindows2->Release(); + + if (pShellWindows3) + pShellWindows3->Release(); + + if (bInited && g_pWinList_Terminate) + g_pWinList_Terminate(); +} + +static VOID +TEST_WinList_Mix(VOID) +{ + IShellWindows *pShellWindows1 = g_pWinList_GetShellWindows(FALSE); + trace("%p\n", pShellWindows1); + ok(pShellWindows1 != NULL, "pShellWindows1 was null\n"); + + IShellWindows *pShellWindows2 = NULL; + CoCreateInstance(CLSID_ShellWindows, NULL, CLSCTX_INPROC_SERVER | CLSCTX_LOCAL_SERVER, + IID_IShellWindows, (LPVOID *)&pShellWindows2); + ok(pShellWindows2 != NULL, "pShellWindows2 was null\n"); + + ok_ptr(pShellWindows1, pShellWindows2); + + if (pShellWindows1) + pShellWindows1->Release(); + if (pShellWindows2) + pShellWindows2->Release(); +} + +static VOID +TEST_SHDOCVW_WinList(VOID) +{ + HINSTANCE hSHDOCVW = LoadLibraryW(L"shdocvw.dll"); + if (!hSHDOCVW) + { + skip("shdocvw.dll not loaded\n"); + return; + } + + g_pWinList_Init = (FN_WinList_Init)GetProcAddress(hSHDOCVW, MAKEINTRESOURCEA(110)); + g_pWinList_Terminate = (FN_WinList_Terminate)GetProcAddress(hSHDOCVW, MAKEINTRESOURCEA(111)); + g_pWinList_GetShellWindows = (FN_WinList_GetShellWindows)GetProcAddress(hSHDOCVW, MAKEINTRESOURCEA(179)); + if (!g_pWinList_Init || !g_pWinList_Terminate || !g_pWinList_GetShellWindows) + { + skip("Some WinList_* functions not found: %p %p %p\n", + g_pWinList_Init, g_pWinList_Terminate, g_pWinList_GetShellWindows); + } + else + { + TEST_WinList_GetShellWindows(); + TEST_WinList_Mix(); + } + + FreeLibrary(hSHDOCVW); +} + +static VOID +TEST_CLSID_ShellWindows(VOID) +{ + IShellWindows *pShellWindows1 = NULL; + CoCreateInstance(CLSID_ShellWindows, NULL, CLSCTX_INPROC_SERVER | CLSCTX_LOCAL_SERVER, + IID_IShellWindows, (LPVOID *)&pShellWindows1); + ok(pShellWindows1 != NULL, "pShellWindows1 was null\n"); + + IShellWindows *pShellWindows2 = NULL; + CoCreateInstance(CLSID_ShellWindows, NULL, CLSCTX_INPROC_SERVER | CLSCTX_LOCAL_SERVER, + IID_IShellWindows, (LPVOID *)&pShellWindows2); + ok(pShellWindows2 != NULL, "pShellWindows2 was null\n"); + + ok_ptr(pShellWindows1, pShellWindows2); + + if (pShellWindows1) + { + LONG nCount = -1; + HRESULT hr = pShellWindows1->get_Count(&nCount); + ok_hex(hr, S_OK); + ok(nCount >= 0, "nCount was %ld\n", nCount); + trace("%ld\n", nCount); + + pShellWindows1->Release(); + } + else + { + ok_int(TRUE, FALSE); + ok_int(TRUE, FALSE); + } + + if (pShellWindows2) + pShellWindows2->Release(); +} + +START_TEST(WinList) +{ + HRESULT hrCoInit = CoInitialize(NULL); + + TEST_SHDOCVW_WinList(); + TEST_CLSID_ShellWindows(); + + if (SUCCEEDED(hrCoInit)) + CoUninitialize(); +} diff --git a/modules/rostests/apitests/shdocvw/testlist.c b/modules/rostests/apitests/shdocvw/testlist.c index 1a34744c0df..725ec086153 100644 --- a/modules/rostests/apitests/shdocvw/testlist.c +++ b/modules/rostests/apitests/shdocvw/testlist.c @@ -2,9 +2,11 @@ #include <apitest.h> extern void func_MRUList(void); +extern void func_WinList(void); const struct test winetest_testlist[] = { { "MRUList", func_MRUList }, + { "WinList", func_WinList }, { 0, 0 } };
3 weeks, 4 days
1
0
0
0
[reactos] 06/06: [VCRUNTIME] Add initialization / cleanup of wine code
by Timo Kreuzer
https://git.reactos.org/?p=reactos.git;a=commitdiff;h=92d479a54b1960acf420a…
commit 92d479a54b1960acf420a981fc6f4c7c87d7a09b Author: Timo Kreuzer <timo.kreuzer(a)reactos.org> AuthorDate: Wed Jan 29 13:15:16 2025 +0200 Commit: Timo Kreuzer <timo.kreuzer(a)reactos.org> CommitDate: Thu Feb 6 09:17:37 2025 +0200 [VCRUNTIME] Add initialization / cleanup of wine code --- sdk/lib/vcruntime/CMakeLists.txt | 3 +- sdk/lib/vcruntime/__vcrt_init.c | 47 +++++++++++++++++++--- .../{__vcrt_init.c => __vcrt_init_stubs.c} | 4 +- 3 files changed, 45 insertions(+), 9 deletions(-) diff --git a/sdk/lib/vcruntime/CMakeLists.txt b/sdk/lib/vcruntime/CMakeLists.txt index 633a1b7a466..405dc705bd9 100644 --- a/sdk/lib/vcruntime/CMakeLists.txt +++ b/sdk/lib/vcruntime/CMakeLists.txt @@ -20,7 +20,6 @@ list(APPEND VCRT_COMMON_SOURCES __report_gsfailure.c __report_rangecheckfailure.c __security_init_cookie.c - __vcrt_init.c _fltused.c initializers.cpp isa_available.cpp @@ -29,11 +28,13 @@ list(APPEND VCRT_COMMON_SOURCES list(APPEND VCRT_RUNTIME_SOURCES __std_terminate.c + __vcrt_init.c ) list(APPEND VCRT_STARTUP_SOURCES __acrt_initialize_stub.cpp __scrt_uninitialize_crt.cpp + __vcrt_init_stubs.c mainCRTStartup.cpp wmainCRTStartup.cpp ) diff --git a/sdk/lib/vcruntime/__vcrt_init.c b/sdk/lib/vcruntime/__vcrt_init.c index 45cce866e92..839c24de7e8 100644 --- a/sdk/lib/vcruntime/__vcrt_init.c +++ b/sdk/lib/vcruntime/__vcrt_init.c @@ -8,29 +8,64 @@ // SPDX-License-Identifier: MIT // -#include <vcruntime_startup.h> +#include <internal_shared.h> + +void msvcrt_init_exception(HINSTANCE hinstDLL); +BOOL msvcrt_init_tls(void); +void msvcrt_free_tls_mem(void); +BOOL msvcrt_free_tls(void); __vcrt_bool __cdecl __vcrt_initialize(void) { - return 1; + msvcrt_init_exception(GetModuleHandle(NULL)); + + if (!msvcrt_init_tls()) + return FALSE; + + return TRUE; } __vcrt_bool __cdecl __vcrt_uninitialize(_In_ __vcrt_bool _Terminating) { - return 1; + if (!msvcrt_free_tls()) + return FALSE; + + return TRUE; } __vcrt_bool __cdecl __vcrt_uninitialize_critical(void) { - return 1; + return TRUE; } __vcrt_bool __cdecl __vcrt_thread_attach(void) { - return 1; + // Not called by UCRT + return TRUE; } __vcrt_bool __cdecl __vcrt_thread_detach(void) { - return 1; + // Not called by UCRT + return TRUE; } + +// UCRT doesn't have a thread detach callback for the vcruntime TLS, because +// the native vcruntime uses FlsAlloc and provides a cleanup callback there. +// Since we don't have that, we use TLS callbacks. +const IMAGE_TLS_DIRECTORY* __p_tls_used = &_tls_used; + +static +VOID +WINAPI +wine_tls_cleanup_callback(PVOID hinstDLL, DWORD fdwReason, LPVOID lpvReserved) +{ + // For the last thread, only DLL_PROCESS_DETACH is called + if ((fdwReason == DLL_THREAD_DETACH) || + (fdwReason == DLL_PROCESS_DETACH)) + { + msvcrt_free_tls_mem(); + } +} + +_CRTALLOC(".CRT$XLD") PIMAGE_TLS_CALLBACK wine_tls_cleanup_ptr = wine_tls_cleanup_callback; diff --git a/sdk/lib/vcruntime/__vcrt_init.c b/sdk/lib/vcruntime/__vcrt_init_stubs.c similarity index 84% copy from sdk/lib/vcruntime/__vcrt_init.c copy to sdk/lib/vcruntime/__vcrt_init_stubs.c index 45cce866e92..3b01a3f119b 100644 --- a/sdk/lib/vcruntime/__vcrt_init.c +++ b/sdk/lib/vcruntime/__vcrt_init_stubs.c @@ -1,9 +1,9 @@ // -// __vcrt_init.c +// __vcrt_init_stubs.c // // Copyright (c) 2024 Timo Kreuzer // -// Implementation of vcruntime initialization and termination functions. +// Stubs for vcruntime initialization and termination in vcstartup. // // SPDX-License-Identifier: MIT //
3 weeks, 4 days
1
0
0
0
[reactos] 05/06: [VCRUNTIME] Add TLS callback support
by Timo Kreuzer
https://git.reactos.org/?p=reactos.git;a=commitdiff;h=32c349d30ed6b08f9c277…
commit 32c349d30ed6b08f9c277ca22593479361791494 Author: Timo Kreuzer <timo.kreuzer(a)reactos.org> AuthorDate: Thu Jan 30 10:11:38 2025 +0200 Commit: Timo Kreuzer <timo.kreuzer(a)reactos.org> CommitDate: Thu Feb 6 09:17:37 2025 +0200 [VCRUNTIME] Add TLS callback support --- sdk/lib/vcruntime/CMakeLists.txt | 1 + sdk/lib/vcruntime/inc/internal_shared.h | 16 ++++++++++++++ sdk/lib/vcruntime/tlssup.c | 38 +++++++++++++++++++++++++++++++++ 3 files changed, 55 insertions(+) diff --git a/sdk/lib/vcruntime/CMakeLists.txt b/sdk/lib/vcruntime/CMakeLists.txt index 21630765497..633a1b7a466 100644 --- a/sdk/lib/vcruntime/CMakeLists.txt +++ b/sdk/lib/vcruntime/CMakeLists.txt @@ -24,6 +24,7 @@ list(APPEND VCRT_COMMON_SOURCES _fltused.c initializers.cpp isa_available.cpp + tlssup.c ) list(APPEND VCRT_RUNTIME_SOURCES diff --git a/sdk/lib/vcruntime/inc/internal_shared.h b/sdk/lib/vcruntime/inc/internal_shared.h index 892799639fc..968f5ecb498 100644 --- a/sdk/lib/vcruntime/inc/internal_shared.h +++ b/sdk/lib/vcruntime/inc/internal_shared.h @@ -38,6 +38,20 @@ extern "C" { #pragma section(".CRT$XPZ", long, read) #pragma section(".CRT$XTA", long, read) #pragma section(".CRT$XTZ", long, read) + + +#pragma section(".CRT$XDA",long,read) +#pragma section(".CRT$XDC",long,read) +#pragma section(".CRT$XDZ",long,read) + +#pragma section(".CRT$XLA",long,read) // TLS callback start +#pragma section(".CRT$XLC",long,read) // TLS constructors +#pragma section(".CRT$XLD",long,read) // TLS destructors +#pragma section(".CRT$XLZ",long,read) // TLS callback end + +#pragma section(".tls",long,read,write) +#pragma section(".tls$AAA",long,read,write) +#pragma section(".tls$ZZZ",long,read,write) #endif extern _PIFV __xi_a[]; @@ -51,6 +65,8 @@ extern _PVFV __xt_z[]; extern char __ImageBase; +extern const IMAGE_TLS_DIRECTORY _tls_used; + #define CRT_WARNING_DISABLE_PUSH(wn, message) \ __pragma(warning(push)) \ __pragma(warning(disable: wn)) diff --git a/sdk/lib/vcruntime/tlssup.c b/sdk/lib/vcruntime/tlssup.c new file mode 100644 index 00000000000..ba3f97ba1ce --- /dev/null +++ b/sdk/lib/vcruntime/tlssup.c @@ -0,0 +1,38 @@ +// +// tlssup.c +// +// Copyright (c) 2025 Timo Kreuzer +// +// TLS callback support +// +// SPDX-License-Identifier: MIT +// + +#include <internal_shared.h> + +// Dummy TLS undex +unsigned int _tls_index; + +// The TLS data +_CRTALLOC(".tls") char *_tls_start = NULL; +_CRTALLOC(".tls$ZZZ") char *_tls_end = NULL; + +// Describes the range of TLS callbacks. +_CRTALLOC(".CRT$XLA") PIMAGE_TLS_CALLBACK __xl_a = 0; +_CRTALLOC(".CRT$XLZ") PIMAGE_TLS_CALLBACK __xl_z = 0; + +// +// The TLS directory. +// The linker will point the executables TLS data directory entry to this. +// Must be force-included with "#pragma comment(linker, "/INCLUDE:_tls_used")" +// or by referencing it from another compilation unit. +// +const IMAGE_TLS_DIRECTORY _tls_used = +{ + (ULONG_PTR)&_tls_start, + (ULONG_PTR)&_tls_end, + (ULONG_PTR)&_tls_index, + (ULONG_PTR)(&__xl_a + 1), + (ULONG)0, + (ULONG)0 +};
3 weeks, 4 days
1
0
0
0
[reactos] 04/06: [VCRUNTIME] Improve includes in internal_shared.h
by Timo Kreuzer
https://git.reactos.org/?p=reactos.git;a=commitdiff;h=7f050e0a6dee285efc805…
commit 7f050e0a6dee285efc805d86842ce8088b9ad5ee Author: Timo Kreuzer <timo.kreuzer(a)reactos.org> AuthorDate: Tue Jan 28 09:26:58 2025 +0200 Commit: Timo Kreuzer <timo.kreuzer(a)reactos.org> CommitDate: Thu Feb 6 09:17:37 2025 +0200 [VCRUNTIME] Improve includes in internal_shared.h --- sdk/lib/vcruntime/inc/internal_shared.h | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/sdk/lib/vcruntime/inc/internal_shared.h b/sdk/lib/vcruntime/inc/internal_shared.h index 340407bed96..892799639fc 100644 --- a/sdk/lib/vcruntime/inc/internal_shared.h +++ b/sdk/lib/vcruntime/inc/internal_shared.h @@ -10,12 +10,10 @@ #pragma once -#include <suppress.h> -#include <intrin.h> #include <corecrt_startup.h> #include <crtdbg.h> -#include <windows.h> // for HMODULE -#include <malloc.h> +#include <windef.h> +#include <winbase.h> #ifdef __cplusplus extern "C" {
3 weeks, 4 days
1
0
0
0
[reactos] 03/06: [VCSTARTUP] Implement (w)mainCRTStartup
by Timo Kreuzer
https://git.reactos.org/?p=reactos.git;a=commitdiff;h=a978879ddb43ada0d6978…
commit a978879ddb43ada0d697892b68f9a2a7a34ca713 Author: Timo Kreuzer <timo.kreuzer(a)reactos.org> AuthorDate: Tue Jan 28 21:56:12 2025 +0200 Commit: Timo Kreuzer <timo.kreuzer(a)reactos.org> CommitDate: Thu Feb 6 09:17:37 2025 +0200 [VCSTARTUP] Implement (w)mainCRTStartup __acrt_initialize is here as a stub to later support linking ucrt statically. When it is statically linked the real function should be called, but when the executable links to ucrtdll, the initialization happens when the DLL is loaded, so we call a stub here. --- sdk/lib/vcruntime/CMakeLists.txt | 3 + sdk/lib/vcruntime/__acrt_initialize_stub.cpp | 8 +++ sdk/lib/vcruntime/commonCRTStartup.hpp | 89 ++++++++++++++++++++++++++++ sdk/lib/vcruntime/mainCRTStartup.cpp | 18 ++++++ sdk/lib/vcruntime/wmainCRTStartup.cpp | 18 ++++++ 5 files changed, 136 insertions(+) diff --git a/sdk/lib/vcruntime/CMakeLists.txt b/sdk/lib/vcruntime/CMakeLists.txt index b534b1b620d..21630765497 100644 --- a/sdk/lib/vcruntime/CMakeLists.txt +++ b/sdk/lib/vcruntime/CMakeLists.txt @@ -31,7 +31,10 @@ list(APPEND VCRT_RUNTIME_SOURCES ) list(APPEND VCRT_STARTUP_SOURCES + __acrt_initialize_stub.cpp __scrt_uninitialize_crt.cpp + mainCRTStartup.cpp + wmainCRTStartup.cpp ) if(${ARCH} STREQUAL "i386") diff --git a/sdk/lib/vcruntime/__acrt_initialize_stub.cpp b/sdk/lib/vcruntime/__acrt_initialize_stub.cpp new file mode 100644 index 00000000000..cbf566e9756 --- /dev/null +++ b/sdk/lib/vcruntime/__acrt_initialize_stub.cpp @@ -0,0 +1,8 @@ + +#include <internal_shared.h> + +extern "C" +__crt_bool __cdecl __acrt_initialize() +{ + return true; +} diff --git a/sdk/lib/vcruntime/commonCRTStartup.hpp b/sdk/lib/vcruntime/commonCRTStartup.hpp new file mode 100644 index 00000000000..5bb560dcfa8 --- /dev/null +++ b/sdk/lib/vcruntime/commonCRTStartup.hpp @@ -0,0 +1,89 @@ +// +// commonCRTStartup.c +// +// Copyright (c) 2024 Timo Kreuzer +// +// Implementation of common executable startup code. +// +// SPDX-License-Identifier: MIT +// + +#include <corecrt_startup.h> +#include <internal_shared.h> +#include <excpt.h> +#include <stdlib.h> +#include <intrin.h> +#include <pseh/pseh2.h> + +// Defined in winnt.h +#define FAST_FAIL_FATAL_APP_EXIT 7 + +extern "C" int __cdecl main(int, char**, char**); +extern "C" int __cdecl wmain(int, wchar_t**, wchar_t**); + +template<typename Tmain> +static int call_main(); + +template<> +int call_main<decltype(main)>() +{ + _configure_narrow_argv(_crt_argv_unexpanded_arguments); + + return main(*__p___argc(), *__p___argv(), _get_initial_narrow_environment()); +} + +template<> +int call_main<decltype(wmain)>() +{ + _configure_wide_argv(_crt_argv_unexpanded_arguments); + + return wmain(*__p___argc(), *__p___wargv(), _get_initial_wide_environment()); +} + +static bool __scrt_initialize() +{ + __isa_available_init(); + + if (!__vcrt_initialize()) + { + return false; + } + + if (!__acrt_initialize()) + { + __vcrt_uninitialize(false); + return false; + } + + if (_initterm_e(__xi_a, __xi_z) != 0) + { + return false; + } + + _initterm(__xc_a, __xc_z); + + return true; +} + +template<typename Tmain> +static __declspec(noinline) int __cdecl __commonCRTStartup() +{ + int exitCode; + + if (!__scrt_initialize()) + { + __fastfail(FAST_FAIL_FATAL_APP_EXIT); + } + + __try + { + exitCode = call_main<Tmain>(); + } + __except(EXCEPTION_EXECUTE_HANDLER) + { + exitCode = GetExceptionCode(); + } + __endtry + + exit(exitCode); +} diff --git a/sdk/lib/vcruntime/mainCRTStartup.cpp b/sdk/lib/vcruntime/mainCRTStartup.cpp new file mode 100644 index 00000000000..8fada5e065f --- /dev/null +++ b/sdk/lib/vcruntime/mainCRTStartup.cpp @@ -0,0 +1,18 @@ +// +// mainCRTStartup.c +// +// Copyright (c) 2024 Timo Kreuzer +// +// Implementation of ANSI executable entry point. +// +// SPDX-License-Identifier: MIT +// + +#include "commonCRTStartup.hpp" + +extern "C" unsigned long mainCRTStartup(void*) +{ + __security_init_cookie(); + + return __commonCRTStartup<decltype(main)>(); +} diff --git a/sdk/lib/vcruntime/wmainCRTStartup.cpp b/sdk/lib/vcruntime/wmainCRTStartup.cpp new file mode 100644 index 00000000000..364cff2a0d4 --- /dev/null +++ b/sdk/lib/vcruntime/wmainCRTStartup.cpp @@ -0,0 +1,18 @@ +// +// wmainCRTStartup.c +// +// Copyright (c) 2024 Timo Kreuzer +// +// Implementation of unicode executable entry point. +// +// SPDX-License-Identifier: MIT +// + +#include "commonCRTStartup.hpp" + +extern "C" unsigned long wmainCRTStartup(void*) +{ + __security_init_cookie(); + + return __commonCRTStartup<decltype(wmain)>(); +}
3 weeks, 4 days
1
0
0
0
[reactos] 02/06: [VCRUNTIME] Implement __std_terminate()
by Timo Kreuzer
https://git.reactos.org/?p=reactos.git;a=commitdiff;h=d243b6cdf366ddf6b1010…
commit d243b6cdf366ddf6b10109811c64c09078e32dd6 Author: Timo Kreuzer <timo.kreuzer(a)reactos.org> AuthorDate: Tue Jan 28 21:57:55 2025 +0200 Commit: Timo Kreuzer <timo.kreuzer(a)reactos.org> CommitDate: Thu Feb 6 09:17:37 2025 +0200 [VCRUNTIME] Implement __std_terminate() --- sdk/lib/vcruntime/CMakeLists.txt | 2 +- sdk/lib/vcruntime/__std_terminate.c | 19 +++++++++++++++++++ 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/sdk/lib/vcruntime/CMakeLists.txt b/sdk/lib/vcruntime/CMakeLists.txt index 3c7076acafd..b534b1b620d 100644 --- a/sdk/lib/vcruntime/CMakeLists.txt +++ b/sdk/lib/vcruntime/CMakeLists.txt @@ -27,7 +27,7 @@ list(APPEND VCRT_COMMON_SOURCES ) list(APPEND VCRT_RUNTIME_SOURCES - # TBD + __std_terminate.c ) list(APPEND VCRT_STARTUP_SOURCES diff --git a/sdk/lib/vcruntime/__std_terminate.c b/sdk/lib/vcruntime/__std_terminate.c new file mode 100644 index 00000000000..84239d4980e --- /dev/null +++ b/sdk/lib/vcruntime/__std_terminate.c @@ -0,0 +1,19 @@ +// +// __std_terminate.c +// +// Copyright (c) 2024 Timo Kreuzer +// +// Implementation of __std_terminate. +// +// SPDX-License-Identifier: MIT +// + +#include <process.h> + +__declspec(noreturn) void __cdecl terminate(); + +__declspec(noreturn) +void __std_terminate(void) +{ + terminate(); +}
3 weeks, 4 days
1
0
0
0
← Newer
1
2
3
4
5
6
7
8
Older →
Jump to page:
1
2
3
4
5
6
7
8
Results per page:
10
25
50
100
200