From: ugursss cckhmck@gmail.com
Implement NetValidatePasswordPolicy and NetValidatePasswordPolicyFree as stubs returning NERR_Success. This prevents crashes in some apps that probe password policy support. --- dlls/netapi32/netapi32.c | 50 +++++++++++++++++++++++++++++++++++++ dlls/netapi32/netapi32.spec | 2 ++ include/lmaccess.h | 23 +++++++++++++++++ 3 files changed, 75 insertions(+)
diff --git a/dlls/netapi32/netapi32.c b/dlls/netapi32/netapi32.c index f0873cce59b..a93607c4e95 100644 --- a/dlls/netapi32/netapi32.c +++ b/dlls/netapi32/netapi32.c @@ -2572,6 +2572,56 @@ NET_API_STATUS NET_API_FUNCTION NetRemoteTOD( return ERROR_NO_BROWSER_SERVERS_FOUND; }
+ +/************************************************************ + * NetValidatePasswordPolicy (NETAPI32.@) + */ +NET_API_STATUS WINAPI NetValidatePasswordPolicy( + LPCWSTR servername, + LPVOID qualifier, + DWORD validation_type, + LPVOID input_arg, + LPVOID *output_arg) +{ + NET_API_STATUS status; + NET_VALIDATE_OUTPUT_ARG *out = NULL; + + FIXME("(%s, %p, %lu, %p, %p) stub!\n", + debugstr_w(servername), qualifier, validation_type, input_arg, output_arg); + + if (!output_arg) + return ERROR_INVALID_PARAMETER; + + *output_arg = NULL; + + status = NetApiBufferAllocate(sizeof(*out), (LPVOID *)&out); + if (status != NERR_Success) + return status; + + /* Zero all fields; report success so most probes pass */ + memset(out, 0, sizeof(*out)); + out->ValidationStatus = NERR_Success; + + *output_arg = out; + return NERR_Success; +} + +/************************************************************ + * NetValidatePasswordPolicyFree (NETAPI32.@) + */ +NET_API_STATUS WINAPI NetValidatePasswordPolicyFree(LPVOID *output_arg) +{ + TRACE("(%p)\n", output_arg); + + if (!output_arg) return ERROR_INVALID_PARAMETER; + if (*output_arg) + { + NetApiBufferFree(*output_arg); + *output_arg = NULL; + } + return NERR_Success; +} + /************************************************************ * DavGetHTTPFromUNCPath (NETAPI32.@) */ diff --git a/dlls/netapi32/netapi32.spec b/dlls/netapi32/netapi32.spec index cfe5aff09e2..757c9867d6f 100644 --- a/dlls/netapi32/netapi32.spec +++ b/dlls/netapi32/netapi32.spec @@ -296,3 +296,5 @@ @ stub RxNetServerEnum @ stub RxNetUserPasswordSet @ stub RxRemoteApi +@ stdcall NetValidatePasswordPolicy(wstr ptr long ptr ptr) +@ stdcall NetValidatePasswordPolicyFree(ptr) diff --git a/include/lmaccess.h b/include/lmaccess.h index 796eacc2eb6..88212889b2a 100644 --- a/include/lmaccess.h +++ b/include/lmaccess.h @@ -443,6 +443,26 @@ typedef struct _LOCALGROUP_USERS_INFO_0 { LPWSTR lgrui0_name; } LOCALGROUP_USERS_INFO_0, *PLOCALGROUP_USERS_INFO_0, *LPLOCALGROUP_USERS_INFO_0;
+typedef struct _NET_VALIDATE_PASSWORD_HASH { + ULONG Length; + LPBYTE Hash; +} NET_VALIDATE_PASSWORD_HASH, *PNET_VALIDATE_PASSWORD_HASH; + +typedef struct _NET_VALIDATE_PERSISTED_FIELDS { + ULONG PresentFields; + FILETIME PasswordLastSet; + FILETIME BadPasswordTime; + FILETIME LockoutTime; + ULONG BadPasswordCount; + ULONG PasswordHistoryLength; + PNET_VALIDATE_PASSWORD_HASH PasswordHistory; +} NET_VALIDATE_PERSISTED_FIELDS, *PNET_VALIDATE_PERSISTED_FIELDS; + +typedef struct _NET_VALIDATE_OUTPUT_ARG { + NET_VALIDATE_PERSISTED_FIELDS ChangedPersistedFields; + DWORD ValidationStatus; +} NET_VALIDATE_OUTPUT_ARG, *PNET_VALIDATE_OUTPUT_ARG; + #define USER_PRIV_GUEST 0 #define USER_PRIV_USER 1 #define USER_PRIV_ADMIN 2 @@ -473,6 +493,9 @@ NET_API_STATUS WINAPI NetUserGetInfo(LPCWSTR,LPCWSTR,DWORD,LPBYTE*); NET_API_STATUS WINAPI NetUserGetGroups(LPCWSTR,LPCWSTR,DWORD,LPBYTE*,DWORD,LPDWORD,LPDWORD); NET_API_STATUS WINAPI NetUserGetLocalGroups(LPCWSTR,LPCWSTR,DWORD,DWORD,LPBYTE*,DWORD,LPDWORD,LPDWORD); NET_API_STATUS WINAPI NetUserModalsGet(LPCWSTR,DWORD,LPBYTE*); +NET_API_STATUS WINAPI NetValidatePasswordPolicy(LPCWSTR, LPVOID, DWORD, LPVOID, LPVOID*); +NET_API_STATUS WINAPI NetValidatePasswordPolicyFree(LPVOID*); +
#ifdef __cplusplus }