[PATCH v6 0/2] MR3784: nsiproxy.sys: Implement ipv6_forward_enumerate_all.
-- v6: nsiproxy.sys: Implement ipv6_forward_enumerate_all. wldp: Add WldpQueryWindowsLockdownMode stub. https://gitlab.winehq.org/wine/wine/-/merge_requests/3784
From: Helix Graziani <helix.graziani(a)hotmail.com> --- dlls/wldp/wldp.c | 11 +++++++++++ dlls/wldp/wldp.spec | 2 +- include/wldp.h | 8 ++++++++ 3 files changed, 20 insertions(+), 1 deletion(-) diff --git a/dlls/wldp/wldp.c b/dlls/wldp/wldp.c index ffd9b6084c7..0c2fd0c4b70 100644 --- a/dlls/wldp/wldp.c +++ b/dlls/wldp/wldp.c @@ -49,3 +49,14 @@ HRESULT WINAPI WldpGetLockdownPolicy(WLDP_HOST_INFORMATION *info, DWORD *state, *state = 0; return S_OK; } + +/*********************************************************************** + * WldpQueryWindowsLockdownMode (wldp.@) + */ +HRESULT WINAPI WldpQueryWindowsLockdownMode(WLDP_WINDOWS_LOCKDOWN_MODE *lockdown_mode) +{ + FIXME("%p\n", lockdown_mode); + + *lockdown_mode = WLDP_WINDOWS_LOCKDOWN_MODE_UNLOCKED; + return S_OK; +} diff --git a/dlls/wldp/wldp.spec b/dlls/wldp/wldp.spec index 7e5de1d372d..5e18c267d6c 100644 --- a/dlls/wldp/wldp.spec +++ b/dlls/wldp/wldp.spec @@ -4,7 +4,7 @@ @ stub WldpQueryPolicySettingEnabled2 @ stub WldpQueryPolicySettingEnabled @ stub WldpQueryPolicySettingEnabledInternal -@ stub WldpQueryWindowsLockdownMode +@ stdcall WldpQueryWindowsLockdownMode(ptr) @ stub WldpQueryWindowsLockdownRestriction @ stub WldpResetProductionConfiguration @ stub WldpResetWcosProductionConfiguration diff --git a/include/wldp.h b/include/wldp.h index c70e5feb8f8..eff626f277c 100644 --- a/include/wldp.h +++ b/include/wldp.h @@ -32,6 +32,14 @@ typedef enum WLDP_HOST_ID WLDP_HOST_ID_MAX } WLDP_HOST_ID; +typedef enum _WLDP_WINDOWS_LOCKDOWN_MODE +{ + WLDP_WINDOWS_LOCKDOWN_MODE_UNLOCKED, + WLDP_WINDOWS_LOCKDOWN_MODE_TRIAL, + WLDP_WINDOWS_LOCKDOWN_MODE_LOCKED, + WLDP_WINDOWS_LOCKDOWN_MODE_MAX +} WLDP_WINDOWS_LOCKDOWN_MODE; + typedef struct WLDP_HOST_INFORMATION { DWORD dwRevision; -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/3784
From: Helix Graziani <helix.graziani(a)hotmail.com> --- dlls/nsiproxy.sys/ip.c | 136 ++++++++++++++++++++++++++++++++++++++++- 1 file changed, 134 insertions(+), 2 deletions(-) diff --git a/dlls/nsiproxy.sys/ip.c b/dlls/nsiproxy.sys/ip.c index dbe3a0b46b7..fd187e3863e 100644 --- a/dlls/nsiproxy.sys/ip.c +++ b/dlls/nsiproxy.sys/ip.c @@ -1482,13 +1482,145 @@ static NTSTATUS ipv4_forward_enumerate_all( void *key_data, UINT key_size, void return status; } +struct ipv6_route_data +{ + NET_LUID luid; + UINT if_index; + struct in6_addr prefix; + UINT prefix_len; + struct in6_addr next_hop; + UINT metric; + UINT protocol; + BYTE loopback; +}; + +static void ipv6_forward_fill_entry( struct ipv6_route_data *entry, struct nsi_ipv6_forward_key *key, + struct nsi_ip_forward_rw *rw, struct nsi_ipv6_forward_dynamic *dyn, + struct nsi_ip_forward_static *stat ) +{ + if (key) + { + key->unk = 0; + memcpy( key->prefix.u.Byte, entry->prefix.s6_addr, 16 ); + key->prefix_len = entry->prefix_len; + memset( key->unk2, 0, sizeof(key->unk2) ); + memset( key->unk3, 0, sizeof(key->unk3) ); + key->luid = entry->luid; + key->luid2 = entry->luid; + memcpy( key->next_hop.u.Byte, entry->next_hop.s6_addr, 16 ); + key->pad = 0; + } + + if (rw) + { + rw->site_prefix_len = 0; + rw->valid_lifetime = ~0u; + rw->preferred_lifetime = ~0u; + rw->metric = entry->metric; + rw->protocol = entry->protocol; + rw->loopback = entry->loopback; + rw->autoconf = 1; + rw->publish = 0; + rw->immortal = 1; + memset( rw->unk, 0, sizeof(rw->unk) ); + rw->unk2 = 0; + } + + if (dyn) + { + memset( dyn, 0, sizeof(*dyn) ); + } + + if (stat) + { + stat->origin = NlroManual; + stat->if_index = entry->if_index; + } +} + +struct in6_addr str_to_in6_addr(char *nptr, char **endptr) +{ + struct in6_addr ret; + + for (int i = 0; i < 16; i++) + { + if (!isalnum( *nptr ) || !isalnum( *nptr+1 )) + { + /* invalid hex string */ + if (endptr) *endptr = nptr; + return ret; + } + + sscanf( nptr, "%2hhx", &ret.s6_addr[i] ); + nptr += 2; + } + + if (endptr) *endptr = nptr; + + return ret; +} + static NTSTATUS ipv6_forward_enumerate_all( void *key_data, UINT key_size, void *rw_data, UINT rw_size, void *dynamic_data, UINT dynamic_size, void *static_data, UINT static_size, UINT_PTR *count ) { + UINT num = 0; + NTSTATUS status = STATUS_SUCCESS; + BOOL want_data = key_size || rw_size || dynamic_size || static_size; + struct ipv6_route_data entry; + + TRACE( "%p %d %p %d %p %d %p %d %p" , key_data, key_size, rw_data, rw_size, + dynamic_data, dynamic_size, static_data, static_size, count ); + +#ifdef __linux__ + { + char buf[512], *ptr; + UINT rtf_flags; + FILE *fp; + + if (!(fp = fopen( "/proc/net/ipv6_route", "r" ))) return STATUS_NOT_SUPPORTED; + + while ((ptr = fgets( buf, sizeof(buf), fp ))) + { + while (!isspace( *ptr )) ptr++; + *ptr++ = '\0'; + + entry.prefix = str_to_in6_addr( ptr, &ptr ); + entry.prefix_len = strtoul( ptr + 1, &ptr, 16 ); + str_to_in6_addr( ptr + 1, &ptr ); /* source network, skip */ + strtoul( ptr + 1, &ptr, 16 ); /* source prefix length, skip */ + entry.next_hop = str_to_in6_addr( ptr + 1, &ptr ); + entry.metric = strtoul( ptr + 1, &ptr, 16 ); + strtoul( ptr + 1, &ptr, 16 ); /* refcount, skip */ + strtoul( ptr + 1, &ptr, 16 ); /* use, skip */ + rtf_flags = strtoul( ptr + 1, &ptr, 16); + entry.protocol = (rtf_flags & RTF_GATEWAY) ? MIB_IPPROTO_NETMGMT : MIB_IPPROTO_LOCAL; + entry.loopback = entry.protocol == MIB_IPPROTO_LOCAL && entry.prefix_len == 32; + + if (!convert_unix_name_to_luid( ptr, &entry.luid )) continue; + if (!convert_luid_to_index( &entry.luid, &entry.if_index )) continue; + + if (num < *count) + { + ipv6_forward_fill_entry( &entry, key_data, rw_data, dynamic_data, static_data ); + key_data = (BYTE *)key_data + key_size; + rw_data = (BYTE *)rw_data + rw_size; + dynamic_data = (BYTE *)dynamic_data + dynamic_size; + static_data = (BYTE *)static_data + static_size; + } + num++; + } + fclose(fp); + } +#else FIXME( "not implemented\n" ); - *count = 0; - return STATUS_SUCCESS; + return STATUS_NOT_IMPLEMENTED; +#endif + + if (!want_data || num <= *count) *count = num; + else status = STATUS_BUFFER_OVERFLOW; + + return status; } static struct module_table ipv4_tables[] = -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/3784
Hi, It looks like your patch introduced the new failures shown below. Please investigate and fix them before resubmitting your patch. If they are not new, fixing them anyway would help a lot. Otherwise please ask for the known failures list to be updated. The full results can be found at: https://testbot.winehq.org/JobDetails.pl?Key=137762 Your paranoid android. === debian11 (build log) === error: patch failed: dlls/wldp/wldp.c:49 error: patch failed: dlls/wldp/wldp.spec:4 error: patch failed: include/wldp.h:32 Task: Patch failed to apply === debian11b (build log) === error: patch failed: dlls/wldp/wldp.c:49 error: patch failed: dlls/wldp/wldp.spec:4 error: patch failed: include/wldp.h:32 Task: Patch failed to apply
participants (3)
-
Helix Graziani -
Helix Graziani (@TornadoCookie) -
Marvin