[ros-diffs] [ekohl] 56669: [SAMSRV] - Support container objects in SampCreateDbObject. - Implement SampGetObjectAttribute and SampSetObjectAttribute.

ekohl at svn.reactos.org ekohl at svn.reactos.org
Mon May 28 12:26:55 UTC 2012


Author: ekohl
Date: Mon May 28 12:26:54 2012
New Revision: 56669

URL: http://svn.reactos.org/svn/reactos?rev=56669&view=rev
Log:
[SAMSRV]
- Support container objects in SampCreateDbObject.
- Implement SampGetObjectAttribute and SampSetObjectAttribute.

Modified:
    trunk/reactos/dll/win32/samsrv/database.c
    trunk/reactos/dll/win32/samsrv/samsrv.h

Modified: trunk/reactos/dll/win32/samsrv/database.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/samsrv/database.c?rev=56669&r1=56668&r2=56669&view=diff
==============================================================================
--- trunk/reactos/dll/win32/samsrv/database.c [iso-8859-1] (original)
+++ trunk/reactos/dll/win32/samsrv/database.c [iso-8859-1] Mon May 28 12:26:54 2012
@@ -309,6 +309,7 @@
     OBJECT_ATTRIBUTES ObjectAttributes;
     UNICODE_STRING KeyName;
     HANDLE ParentKeyHandle;
+    HANDLE ContainerKeyHandle = NULL;
     HANDLE ObjectKeyHandle;
     NTSTATUS Status;
 
@@ -320,25 +321,73 @@
     else
         ParentKeyHandle = ParentObject->KeyHandle;
 
-    RtlInitUnicodeString(&KeyName,
-                         ObjectName);
-
-    InitializeObjectAttributes(&ObjectAttributes,
-                               &KeyName,
-                               OBJ_CASE_INSENSITIVE,
-                               ParentKeyHandle,
-                               NULL);
-
-    Status = NtCreateKey(&ObjectKeyHandle,
-                         KEY_ALL_ACCESS,
-                         &ObjectAttributes,
-                         0,
-                         NULL,
-                         0,
-                         NULL);
-    if (!NT_SUCCESS(Status))
-    {
-        return Status;
+    if (ContainerName != NULL)
+    {
+        /* Open the container key */
+        RtlInitUnicodeString(&KeyName,
+                             ContainerName);
+
+        InitializeObjectAttributes(&ObjectAttributes,
+                                   &KeyName,
+                                   OBJ_CASE_INSENSITIVE,
+                                   ParentKeyHandle,
+                                   NULL);
+
+        Status = NtOpenKey(&ContainerKeyHandle,
+                           KEY_ALL_ACCESS,
+                           &ObjectAttributes);
+        if (!NT_SUCCESS(Status))
+        {
+            return Status;
+        }
+
+        /* Open the object key */
+        RtlInitUnicodeString(&KeyName,
+                             ObjectName);
+
+        InitializeObjectAttributes(&ObjectAttributes,
+                                   &KeyName,
+                                   OBJ_CASE_INSENSITIVE,
+                                   ContainerKeyHandle,
+                                   NULL);
+
+        Status = NtCreateKey(&ObjectKeyHandle,
+                             KEY_ALL_ACCESS,
+                             &ObjectAttributes,
+                             0,
+                             NULL,
+                             0,
+                             NULL);
+
+        NtClose(ContainerKeyHandle);
+
+        if (!NT_SUCCESS(Status))
+        {
+            return Status;
+        }
+    }
+    else
+    {
+        RtlInitUnicodeString(&KeyName,
+                             ObjectName);
+
+        InitializeObjectAttributes(&ObjectAttributes,
+                                   &KeyName,
+                                   OBJ_CASE_INSENSITIVE,
+                                   ParentKeyHandle,
+                                   NULL);
+
+        Status = NtCreateKey(&ObjectKeyHandle,
+                             KEY_ALL_ACCESS,
+                             &ObjectAttributes,
+                             0,
+                             NULL,
+                             0,
+                             NULL);
+        if (!NT_SUCCESS(Status))
+        {
+            return Status;
+        }
     }
 
     NewObject = RtlAllocateHeap(RtlGetProcessHeap(),
@@ -553,120 +602,82 @@
 }
 
 
-#if 0
 NTSTATUS
-LsapSetObjectAttribute(PLSA_DB_OBJECT DbObject,
+SampSetObjectAttribute(PSAM_DB_OBJECT DbObject,
                        LPWSTR AttributeName,
+                       ULONG AttributeType,
                        LPVOID AttributeData,
                        ULONG AttributeSize)
 {
-    OBJECT_ATTRIBUTES ObjectAttributes;
-    UNICODE_STRING KeyName;
-    HANDLE AttributeKey;
-    NTSTATUS Status;
-
-    RtlInitUnicodeString(&KeyName,
+    UNICODE_STRING ValueName;
+
+    RtlInitUnicodeString(&ValueName,
                          AttributeName);
 
-    InitializeObjectAttributes(&ObjectAttributes,
-                               &KeyName,
-                               OBJ_CASE_INSENSITIVE,
-                               DbObject->KeyHandle,
-                               NULL);
-
-    Status = NtCreateKey(&AttributeKey,
-                         KEY_SET_VALUE,
-                         &ObjectAttributes,
-                         0,
-                         NULL,
-                         REG_OPTION_NON_VOLATILE,
-                         NULL);
-    if (!NT_SUCCESS(Status))
-    {
-
-        return Status;
-    }
-
-    Status = RtlpNtSetValueKey(AttributeKey,
-                               REG_NONE,
-                               AttributeData,
-                               AttributeSize);
-
-    NtClose(AttributeKey);
-
-    return Status;
+    return ZwSetValueKey(DbObject->KeyHandle,
+                         &ValueName,
+                         0,
+                         AttributeType,
+                         AttributeData,
+                         AttributeSize);
 }
 
 
 NTSTATUS
-LsapGetObjectAttribute(PLSA_DB_OBJECT DbObject,
+SampGetObjectAttribute(PSAM_DB_OBJECT DbObject,
                        LPWSTR AttributeName,
+                       PULONG AttributeType,
                        LPVOID AttributeData,
                        PULONG AttributeSize)
 {
-    OBJECT_ATTRIBUTES ObjectAttributes;
-    UNICODE_STRING KeyName;
-    HANDLE AttributeKey;
-    ULONG ValueSize;
+    PKEY_VALUE_PARTIAL_INFORMATION ValueInfo;
+    UNICODE_STRING ValueName;
+    ULONG BufferLength = 0;
     NTSTATUS Status;
 
-    RtlInitUnicodeString(&KeyName,
+    RtlInitUnicodeString(&ValueName,
                          AttributeName);
 
-    InitializeObjectAttributes(&ObjectAttributes,
-                               &KeyName,
-                               OBJ_CASE_INSENSITIVE,
-                               DbObject->KeyHandle,
-                               NULL);
-
-    Status = NtOpenKey(&AttributeKey,
-                       KEY_QUERY_VALUE,
-                       &ObjectAttributes);
-    if (!NT_SUCCESS(Status))
-    {
-        return Status;
-    }
-
-    ValueSize = *AttributeSize;
-    Status = RtlpNtQueryValueKey(AttributeKey,
-                                 NULL,
-                                 NULL,
-                                 &ValueSize,
-                                 0);
-    if (!NT_SUCCESS(Status) && Status != STATUS_BUFFER_OVERFLOW)
-    {
-        goto Done;
-    }
-
-    if (AttributeData == NULL || *AttributeSize == 0)
-    {
-        *AttributeSize = ValueSize;
-        Status = STATUS_SUCCESS;
-        goto Done;
-    }
-    else if (*AttributeSize < ValueSize)
-    {
-        *AttributeSize = ValueSize;
-        Status = STATUS_BUFFER_OVERFLOW;
-        goto Done;
-    }
-
-    Status = RtlpNtQueryValueKey(AttributeKey,
-                                 NULL,
-                                 AttributeData,
-                                 &ValueSize,
-                                 0);
-    if (NT_SUCCESS(Status))
-    {
-        *AttributeSize = ValueSize;
-    }
-
-Done:
-    NtClose(AttributeKey);
+    if (AttributeSize != NULL)
+        BufferLength = *AttributeSize;
+
+    BufferLength += FIELD_OFFSET(KEY_VALUE_PARTIAL_INFORMATION, Data);
+
+    /* Allocate memory for the value */
+    ValueInfo = RtlAllocateHeap(RtlGetProcessHeap(), 0, BufferLength);
+    if (ValueInfo == NULL)
+        return STATUS_NO_MEMORY;
+
+    /* Query the value */
+    Status = ZwQueryValueKey(DbObject->KeyHandle,
+                             &ValueName,
+                             KeyValuePartialInformation,
+                             ValueInfo,
+                             BufferLength,
+                             &BufferLength);
+    if ((NT_SUCCESS(Status)) || (Status == STATUS_BUFFER_OVERFLOW))
+    {
+        if (AttributeType != NULL)
+            *AttributeType = ValueInfo->Type;
+
+        if (AttributeSize != NULL)
+            *AttributeSize = ValueInfo->DataLength;
+    }
+
+    /* Check if the caller wanted data back, and we got it */
+    if ((NT_SUCCESS(Status)) && (AttributeData != NULL))
+    {
+        /* Copy it */
+        RtlMoveMemory(AttributeData,
+                      ValueInfo->Data,
+                      ValueInfo->DataLength);
+    }
+
+    /* Free the memory and return status */
+    RtlFreeHeap(RtlGetProcessHeap(), 0, ValueInfo);
 
     return Status;
 }
-#endif
 
 /* EOF */
 

Modified: trunk/reactos/dll/win32/samsrv/samsrv.h
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/samsrv/samsrv.h?rev=56669&r1=56668&r2=56669&view=diff
==============================================================================
--- trunk/reactos/dll/win32/samsrv/samsrv.h [iso-8859-1] (original)
+++ trunk/reactos/dll/win32/samsrv/samsrv.h [iso-8859-1] Mon May 28 12:26:54 2012
@@ -75,6 +75,20 @@
 NTSTATUS
 SampCloseDbObject(PSAM_DB_OBJECT DbObject);
 
+NTSTATUS
+SampSetObjectAttribute(PSAM_DB_OBJECT DbObject,
+                       LPWSTR AttributeName,
+                       ULONG AttributeType,
+                       LPVOID AttributeData,
+                       ULONG AttributeSize);
+
+NTSTATUS
+SampGetObjectAttribute(PSAM_DB_OBJECT DbObject,
+                       LPWSTR AttributeName,
+                       PULONG AttributeType,
+                       LPVOID AttributeData,
+                       PULONG AttributeSize);
+
 /* samspc.c */
 VOID SampStartRpcServer(VOID);
 




More information about the Ros-diffs mailing list