[NETAPI32]
[reactos.git] / reactos / dll / win32 / netapi32 / misc.c
index 0a46d55..c864e17 100644 (file)
@@ -9,35 +9,19 @@
 
 /* INCLUDES ******************************************************************/
 
-#include <stdarg.h>
-
-#include "ntstatus.h"
-#define WIN32_NO_STATUS
-#include "windef.h"
-#include "winbase.h"
-#include "winerror.h"
-#include "lmcons.h"
-#include "ntsecapi.h"
-#include "wine/debug.h"
-
-#define NTOS_MODE_USER
-#include <ndk/rtlfuncs.h>
-#include "ntsam.h"
 #include "netapi32.h"
 
-
 WINE_DEFAULT_DEBUG_CHANNEL(netapi32);
 
-
 /* GLOBALS *******************************************************************/
 
 static SID_IDENTIFIER_AUTHORITY NtAuthority = {SECURITY_NT_AUTHORITY};
 
-
 /* FUNCTIONS *****************************************************************/
 
 NTSTATUS
-GetAccountDomainSid(PSID *AccountDomainSid)
+GetAccountDomainSid(IN PUNICODE_STRING ServerName,
+                    OUT PSID *AccountDomainSid)
 {
     PPOLICY_ACCOUNT_DOMAIN_INFO AccountDomainInfo = NULL;
     LSA_OBJECT_ATTRIBUTES ObjectAttributes;
@@ -47,7 +31,7 @@ GetAccountDomainSid(PSID *AccountDomainSid)
 
     memset(&ObjectAttributes, 0, sizeof(LSA_OBJECT_ATTRIBUTES));
 
-    Status = LsaOpenPolicy(NULL,
+    Status = LsaOpenPolicy(ServerName,
                            &ObjectAttributes,
                            POLICY_VIEW_LOCAL_INFORMATION,
                            &PolicyHandle);
@@ -89,7 +73,7 @@ done:
 
 
 NTSTATUS
-GetBuiltinDomainSid(PSID *BuiltinDomainSid)
+GetBuiltinDomainSid(OUT PSID *BuiltinDomainSid)
 {
     PSID Sid = NULL;
     PULONG Ptr;
@@ -124,4 +108,111 @@ done:
     return Status;
 }
 
+
+NTSTATUS
+OpenAccountDomain(IN SAM_HANDLE ServerHandle,
+                  IN PUNICODE_STRING ServerName,
+                  IN ULONG DesiredAccess,
+                  OUT PSAM_HANDLE DomainHandle)
+{
+    PSID DomainSid = NULL;
+    NTSTATUS Status;
+
+    Status = GetAccountDomainSid(ServerName,
+                                 &DomainSid);
+    if (!NT_SUCCESS(Status))
+    {
+        ERR("GetAccountDomainSid failed (Status %08lx)\n", Status);
+        return Status;
+    }
+
+    Status = SamOpenDomain(ServerHandle,
+                           DesiredAccess,
+                           DomainSid,
+                           DomainHandle);
+
+    RtlFreeHeap(RtlGetProcessHeap(), 0, DomainSid);
+
+    if (!NT_SUCCESS(Status))
+    {
+        ERR("SamOpenDomain failed (Status %08lx)\n", Status);
+    }
+
+    return Status;
+}
+
+
+NTSTATUS
+OpenBuiltinDomain(IN SAM_HANDLE ServerHandle,
+                  IN ULONG DesiredAccess,
+                  OUT PSAM_HANDLE DomainHandle)
+{
+    PSID DomainSid = NULL;
+    NTSTATUS Status;
+
+    Status = GetBuiltinDomainSid(&DomainSid);
+    if (!NT_SUCCESS(Status))
+    {
+        ERR("GetBuiltinDomainSid failed (Status %08lx)\n", Status);
+        return Status;
+    }
+
+    Status = SamOpenDomain(ServerHandle,
+                           DesiredAccess,
+                           DomainSid,
+                           DomainHandle);
+
+    RtlFreeHeap(RtlGetProcessHeap(), 0, DomainSid);
+
+    if (!NT_SUCCESS(Status))
+    {
+        ERR("SamOpenDomain failed (Status %08lx)\n", Status);
+    }
+
+    return Status;
+}
+
+
+NET_API_STATUS
+BuildSidFromSidAndRid(IN PSID SrcSid,
+                      IN ULONG RelativeId,
+                      OUT PSID *DestSid)
+{
+    UCHAR RidCount;
+    PSID DstSid;
+    ULONG i;
+    ULONG DstSidSize;
+    PULONG p, q;
+    NET_API_STATUS ApiStatus = NERR_Success;
+
+    RidCount = *RtlSubAuthorityCountSid(SrcSid);
+    if (RidCount >= 8)
+        return ERROR_INVALID_PARAMETER;
+
+    DstSidSize = RtlLengthRequiredSid(RidCount + 1);
+
+    ApiStatus = NetApiBufferAllocate(DstSidSize,
+                                     &DstSid);
+    if (ApiStatus != NERR_Success)
+        return ApiStatus;
+
+    RtlInitializeSid(DstSid,
+                     RtlIdentifierAuthoritySid(SrcSid),
+                     RidCount + 1);
+
+    for (i = 0; i < (ULONG)RidCount; i++)
+    {
+        p = RtlSubAuthoritySid(SrcSid, i);
+        q = RtlSubAuthoritySid(DstSid, i);
+        *q = *p;
+    }
+
+    q = RtlSubAuthoritySid(DstSid, (ULONG)RidCount);
+    *q = RelativeId;
+
+    *DestSid = DstSid;
+
+    return NERR_Success;
+}
+
 /* EOF */