https://git.reactos.org/?p=reactos.git;a=commitdiff;h=3fe3f9acc78e75547fa6bdda8e7cf8a9bf64c1b5

commit 3fe3f9acc78e75547fa6bdda8e7cf8a9bf64c1b5
Author:     Eric Kohl <[email protected]>
AuthorDate: Sun Dec 8 10:52:37 2019 +0100
Commit:     Eric Kohl <[email protected]>
CommitDate: Sun Dec 8 10:52:37 2019 +0100

    [NETAPI32] Add RPC binding code to functions that require explicit binding
---
 dll/win32/netapi32/wksta_new.c | 136 ++++++++++++++++++++++++++++++++++-------
 1 file changed, 113 insertions(+), 23 deletions(-)

diff --git a/dll/win32/netapi32/wksta_new.c b/dll/win32/netapi32/wksta_new.c
index 8cb6157d949..f3516e9f5e5 100644
--- a/dll/win32/netapi32/wksta_new.c
+++ b/dll/win32/netapi32/wksta_new.c
@@ -138,6 +138,70 @@ WKSSVC_IMPERSONATE_HANDLE_unbind(WKSSVC_IMPERSONATE_HANDLE 
pszSystemName,
 }
 
 
+NET_API_STATUS
+NetpBind(
+    LPCWSTR pszServerName,
+    handle_t *pBindingHandle)
+{
+    handle_t hBinding = NULL;
+    LPWSTR pszStringBinding;
+    RPC_STATUS status;
+
+    FIXME("NetpBind(%S)\n", pszServerName);
+
+    *pBindingHandle = NULL;
+
+    status = RpcStringBindingComposeW(NULL,
+                                      L"ncacn_np",
+                                      (LPWSTR)pszServerName,
+                                      L"\\pipe\\wkssvc",
+                                      NULL,
+                                      &pszStringBinding);
+    if (status)
+    {
+        FIXME("RpcStringBindingCompose returned 0x%x\n", status);
+        return NetpNtStatusToApiStatus(status);
+    }
+
+    /* Set the binding handle that will be used to bind to the server. */
+    status = RpcBindingFromStringBindingW(pszStringBinding,
+                                          &hBinding);
+    if (status)
+    {
+        FIXME("RpcBindingFromStringBinding returned 0x%x\n", status);
+    }
+
+    status = RpcStringFreeW(&pszStringBinding);
+    if (status)
+    {
+        FIXME("RpcStringFree returned 0x%x\n", status);
+    }
+
+    *pBindingHandle = hBinding;
+
+    return NetpNtStatusToApiStatus(status);
+}
+
+
+NET_API_STATUS
+NetpUnbind(
+    handle_t BindingHandle)
+{
+    RPC_STATUS status;
+
+    FIXME("NetpUnbind(%p)\n", BindingHandle);
+
+    status = RpcBindingFree(&hBinding);
+    if (status)
+    {
+        TRACE("RpcBindingFree returned 0x%x\n", status);
+        return NetpNtStatusToApiStatus(status);
+    }
+
+    return NERR_Success;
+}
+
+
 NET_API_STATUS
 WINAPI
 NetAddAlternateComputerName(
@@ -318,24 +382,30 @@ NetGetJoinableOUs(
 NET_API_STATUS
 WINAPI
 NetJoinDomain(
-    _In_ LPCWSTR lpServer,
+    _In_opt_ LPCWSTR lpServer,
     _In_ LPCWSTR lpDomain,
-    _In_ LPCWSTR lpAccountOU,
-    _In_ LPCWSTR lpAccount,
-    _In_ LPCWSTR lpPassword,
+    _In_opt_ LPCWSTR lpAccountOU,
+    _In_opt_ LPCWSTR lpAccount,
+    _In_opt_ LPCWSTR lpPassword,
     _In_ DWORD fJoinOptions)
 {
-    PJOINPR_ENCRYPTED_USER_PASSWORD EncryptedPassword;
-    handle_t BindingHandle;
+    PJOINPR_ENCRYPTED_USER_PASSWORD EncryptedPassword = NULL;
+    handle_t BindingHandle = NULL;
     NET_API_STATUS status;
 
-    TRACE("NetJoinDomain(%s %s %s %s 0x%lx)\n",
+    FIXME("NetJoinDomain(%s %s %s %s 0x%lx)\n",
           debugstr_w(lpServer), debugstr_w(lpDomain), debugstr_w(lpAccountOU),
           debugstr_w(lpAccount), debugstr_w(lpPassword), fJoinOptions);
 
     /* FIXME */
-    BindingHandle = NULL;
-    EncryptedPassword = NULL;
+
+    status = NetpBind(lpServer,
+                      &BindingHandle);
+    if (status != NERR_Success)
+    {
+        ERR("NetpBind() failed (status 0x%lx)\n", status);
+        return status;
+    }
 
     RpcTryExcept
     {
@@ -349,10 +419,14 @@ NetJoinDomain(
     }
     RpcExcept(EXCEPTION_EXECUTE_HANDLER)
     {
-        status = I_RpcMapWin32Status(RpcExceptionCode());
+        RPC_STATUS rpcStatus = RpcExceptionCode();
+        FIXME("Exception 0x%lx\n", rpcStatus);
+        status = I_RpcMapWin32Status(rpcStatus);
     }
     RpcEndExcept;
 
+    NetpUnbind(BindingHandle);
+
     return status;
 }
 
@@ -481,12 +555,12 @@ NET_API_STATUS
 WINAPI
 NetUnjoinDomain(
     _In_ LPCWSTR lpServer,
-    _In_ LPCWSTR lpAccount,
-    _In_ LPCWSTR lpPassword,
+    _In_opt_ LPCWSTR lpAccount,
+    _In_opt_ LPCWSTR lpPassword,
     _In_ DWORD fUnjoinOptions)
 {
-    PJOINPR_ENCRYPTED_USER_PASSWORD EncryptedPassword;
-    handle_t BindingHandle;
+    PJOINPR_ENCRYPTED_USER_PASSWORD EncryptedPassword = NULL;
+    handle_t BindingHandle = NULL;
     NET_API_STATUS status;
 
     TRACE("NetUnjoinDomain(%s %s %s %s 0x%lx)\n",
@@ -494,8 +568,14 @@ NetUnjoinDomain(
           debugstr_w(lpPassword), fUnjoinOptions);
 
     /* FIXME */
-    BindingHandle = NULL;
-    EncryptedPassword = NULL;
+
+    status = NetpBind(lpServer,
+                      &BindingHandle);
+    if (status != NERR_Success)
+    {
+        ERR("NetpBind() failed (status 0x%lx)\n", status);
+        return status;
+    }
 
     RpcTryExcept
     {
@@ -511,6 +591,8 @@ NetUnjoinDomain(
     }
     RpcEndExcept;
 
+    NetpUnbind(BindingHandle);
+
     return status;
 }
 
@@ -691,14 +773,14 @@ NetUseGetInfo(
 NET_API_STATUS
 WINAPI
 NetValidateName(
-    _In_ LPCWSTR lpServer,
+    _In_opt_ LPCWSTR lpServer,
     _In_ LPCWSTR lpName,
-    _In_ LPCWSTR lpAccount,
-    _In_ LPCWSTR lpPassword,
+    _In_opt_ LPCWSTR lpAccount,
+    _In_opt_ LPCWSTR lpPassword,
     _In_ NETSETUP_NAME_TYPE NameType)
 {
-    PJOINPR_ENCRYPTED_USER_PASSWORD EncryptedPassword;
-    handle_t BindingHandle;
+    PJOINPR_ENCRYPTED_USER_PASSWORD EncryptedPassword = NULL;
+    handle_t BindingHandle = NULL;
     NET_API_STATUS status;
 
     TRACE("NetValidateName(%s %s %s %s %u)\n",
@@ -706,8 +788,14 @@ NetValidateName(
           debugstr_w(lpPassword), NameType);
 
     /* FIXME */
-    BindingHandle = NULL;
-    EncryptedPassword = NULL;
+
+    status = NetpBind(lpServer,
+                      &BindingHandle);
+    if (status != NERR_Success)
+    {
+        ERR("NetpBind() failed (status 0x%lx)\n", status);
+        return status;
+    }
 
     RpcTryExcept
     {
@@ -724,6 +812,8 @@ NetValidateName(
     }
     RpcEndExcept;
 
+    NetpUnbind(BindingHandle);
+
     return status;
 }
 

Reply via email to