diff --git a/dll/win32/shell32/stubs.cpp b/dll/win32/shell32/stubs.cpp index 70918f6f18a..8967dd49ab8 100644 --- a/dll/win32/shell32/stubs.cpp +++ b/dll/win32/shell32/stubs.cpp @@ -30,21 +30,6 @@ SHGetUnreadMailCountW(HKEY hKeyUser, return E_FAIL; } -/* - * Unimplemented - */ -EXTERN_C HRESULT -WINAPI -SHEnumerateUnreadMailAccountsW(HKEY user, - DWORD idx, - LPWSTR mailaddress, - INT mailaddresslen) -{ - FIXME("SHEnumerateUnreadMailAccountsW(%p %d %p %d) stub\n", - user, idx, mailaddress, mailaddresslen); - return E_NOTIMPL; -} - /* * Unimplemented */ diff --git a/dll/win32/shell32/utils.cpp b/dll/win32/shell32/utils.cpp index 391acbd8461..1f4ff07a88e 100644 --- a/dll/win32/shell32/utils.cpp +++ b/dll/win32/shell32/utils.cpp @@ -901,6 +901,39 @@ SheRemoveQuotesW(LPWSTR psz) return psz; } +/************************************************************************* + * SHEnumerateUnreadMailAccountsW [SHELL32.287] + * + * @see https://learn.microsoft.com/en-us/windows/win32/api/shellapi/nf-shellapi-shenumerateunreadmailaccountsw + */ +EXTERN_C +HRESULT WINAPI +SHEnumerateUnreadMailAccountsW( + _In_opt_ HKEY hKeyUser, + _In_ DWORD dwIndex, + _Out_writes_(cchMailAddress) PWSTR pszMailAddress, + _In_ INT cchMailAddress) +{ + if (!hKeyUser) + hKeyUser = HKEY_CURRENT_USER; + + HKEY hKey; + LSTATUS error = RegOpenKeyExW(hKeyUser, + L"Software\\Microsoft\\Windows\\CurrentVersion\\UnreadMail", + 0, KEY_ENUMERATE_SUB_KEYS, &hKey); + if (error) + return HRESULT_FROM_WIN32(error); + + FILETIME FileTime; + error = RegEnumKeyExW(hKey, dwIndex, pszMailAddress, (PDWORD)&cchMailAddress, NULL, NULL, + NULL, &FileTime); + if (error) + *pszMailAddress = UNICODE_NULL; + + RegCloseKey(hKey); + return error ? HRESULT_FROM_WIN32(error) : S_OK; +} + /************************************************************************* * SHFindComputer [SHELL32.91] * diff --git a/modules/rostests/apitests/shell32/CMakeLists.txt b/modules/rostests/apitests/shell32/CMakeLists.txt index 7a7b523a68d..aff71a65c90 100644 --- a/modules/rostests/apitests/shell32/CMakeLists.txt +++ b/modules/rostests/apitests/shell32/CMakeLists.txt @@ -34,6 +34,7 @@ list(APPEND SOURCE SHParseDisplayName.cpp SHRestricted.cpp SHShouldShowWizards.cpp + SHEnumerateUnreadMailAccountsW.cpp She.cpp ShellExec_RunDLL.cpp ShellExecCmdLine.cpp diff --git a/modules/rostests/apitests/shell32/SHEnumerateUnreadMailAccountsW.cpp b/modules/rostests/apitests/shell32/SHEnumerateUnreadMailAccountsW.cpp new file mode 100644 index 00000000000..5abc2df9a44 --- /dev/null +++ b/modules/rostests/apitests/shell32/SHEnumerateUnreadMailAccountsW.cpp @@ -0,0 +1,33 @@ +/* + * PROJECT: ReactOS API tests + * LICENSE: GPL-2.0+ (https://spdx.org/licenses/GPL-2.0+) + * PURPOSE: Test for SHEnumerateUnreadMailAccountsW + * COPYRIGHT: Copyright 2025 Katayama Hirofumi MZ (katayama.hirofumi.mz@gmail.com) + */ + +#include "shelltest.h" + +START_TEST(SHEnumerateUnreadMailAccountsW) +{ + HRESULT hr; + WCHAR szMailAddress[MAX_PATH]; + HKEY hKey; + LSTATUS error; + DWORD dwDisposition; + + error = RegCreateKeyExW(HKEY_CURRENT_USER, + L"Software\\Microsoft\\Windows\\CurrentVersion\\UnreadMail\\example.com", + 0, NULL, 0, KEY_WRITE, NULL, &hKey, &dwDisposition); + ok_long(error, ERROR_SUCCESS); + + szMailAddress[0] = UNICODE_NULL; + hr = SHEnumerateUnreadMailAccountsW(NULL, 0, szMailAddress, _countof(szMailAddress)); + ok_hex(hr, S_OK); + ok(szMailAddress[0] != UNICODE_NULL, "szMailAddress was empty\n"); + + if (dwDisposition == REG_CREATED_NEW_KEY) + { + RegDeleteKeyW(HKEY_CURRENT_USER, + L"Software\\Microsoft\\Windows\\CurrentVersion\\UnreadMail\\example.com"); + } +} diff --git a/modules/rostests/apitests/shell32/testlist.c b/modules/rostests/apitests/shell32/testlist.c index d98d529c6fb..daa699a8e32 100644 --- a/modules/rostests/apitests/shell32/testlist.c +++ b/modules/rostests/apitests/shell32/testlist.c @@ -34,6 +34,7 @@ extern void func_SHChangeNotify(void); extern void func_SHCreateDataObject(void); extern void func_SHCreateFileDataObject(void); extern void func_SHCreateFileExtractIconW(void); +extern void func_SHEnumerateUnreadMailAccountsW(void); extern void func_She(void); extern void func_ShellExec_RunDLL(void); extern void func_ShellExecCmdLine(void); @@ -84,6 +85,7 @@ const struct test winetest_testlist[] = { "SHCreateDataObject", func_SHCreateDataObject }, { "SHCreateFileDataObject", func_SHCreateFileDataObject }, { "SHCreateFileExtractIconW", func_SHCreateFileExtractIconW }, + { "SHEnumerateUnreadMailAccountsW", func_SHEnumerateUnreadMailAccountsW }, { "She", func_She }, { "ShellExec_RunDLL", func_ShellExec_RunDLL }, { "ShellExecCmdLine", func_ShellExecCmdLine }, diff --git a/sdk/include/psdk/shellapi.h b/sdk/include/psdk/shellapi.h index eeda59cfcfb..b707d6d41df 100644 --- a/sdk/include/psdk/shellapi.h +++ b/sdk/include/psdk/shellapi.h @@ -652,6 +652,13 @@ SHTestTokenMembership( _In_ ULONG ulRID); #endif +HRESULT WINAPI +SHEnumerateUnreadMailAccountsW( + _In_opt_ HKEY hKeyUser, + _In_ DWORD dwIndex, + _Out_writes_(cchMailAddress) PWSTR pszMailAddress, + _In_ INT cchMailAddress); + #ifdef UNICODE #define NOTIFYICONDATA_V1_SIZE NOTIFYICONDATAW_V1_SIZE #define NOTIFYICONDATA_V2_SIZE NOTIFYICONDATAW_V2_SIZE