 
            On Tue Oct 14 03:12:51 2025 +0000, Zhiyi Zhang wrote:
For example, after moving CreateUri(), CreateUriWithFragment(), and CreateIUriBuilder() to iertutil, we would need to move CoInternetParseIUri() and CoInternetCombineIUri() (to PrivateCoInternetParseIUri(), etc, in iertutil) because they also use the parser. To move CoInternetParseIUri(), we would need to move get_protocol_info() to iertutil as well. get_protocol_info() uses the name_space_list, which is initialized inside urlmon, and it's also used by find_name_space() -> get_protocol_handler() -> BindProtocol_StartEx(). So I am not sure how to move get_protocol_info() to iertutil in a clean way. Dynamically loading get_protocol_info() from urlmon in iertutil may work. But it seems too hacky.
Maybe we could partially move CoInternetCombineIUri(). And keep the following in urlmon. ``` info = get_protocol_info(base->canon_uri); if(info) { WCHAR result[INTERNET_MAX_URL_LENGTH+1]; DWORD result_len = 0;
hr = IInternetProtocolInfo_CombineUrl(info, base->canon_uri, relative->canon_uri, dwCombineFlags, result, INTERNET_MAX_URL_LENGTH+1, &result_len, 0); IInternetProtocolInfo_Release(info); if(SUCCEEDED(hr)) { hr = CreateUri(result, Uri_CREATE_ALLOW_RELATIVE, 0, ppCombinedUri); if(SUCCEEDED(hr)) return hr; } } ```
And then do something like ``` info = get_protocol_info(base->canon_uri); /* get the canon_uri via a function? */ if(info) { ... }
return PrivateCoInternetCombineIUri(); ```
Anyway, it still feels a bit weird to take such an approach.