[NTOSKRNL] Add a raw implementation of !irpfind in kdbg
[reactos.git] / ntoskrnl / config / cmse.c
index 6042204..780c887 100644 (file)
@@ -138,7 +138,7 @@ CmpHiveRootSecurityDescriptor(VOID)
 }
 
 NTSTATUS
-CmpQuerySecurityDescriptor(IN PCM_KEY_BODY KeyBody,
+CmpQuerySecurityDescriptor(IN PCM_KEY_CONTROL_BLOCK Kcb,
                            IN SECURITY_INFORMATION SecurityInformation,
                            OUT PSECURITY_DESCRIPTOR SecurityDescriptor,
                            IN OUT PULONG BufferLength)
@@ -153,7 +153,9 @@ CmpQuerySecurityDescriptor(IN PCM_KEY_BODY KeyBody,
     ULONG Group = 0;
     ULONG Dacl = 0;
 
-    DBG_UNREFERENCED_PARAMETER(KeyBody);
+    DBG_UNREFERENCED_PARAMETER(Kcb);
+
+    DPRINT("CmpQuerySecurityDescriptor()\n");
 
     if (SecurityInformation == 0)
     {
@@ -235,6 +237,26 @@ CmpQuerySecurityDescriptor(IN PCM_KEY_BODY KeyBody,
     return Status;
 }
 
+NTSTATUS
+CmpSetSecurityDescriptor(IN PCM_KEY_CONTROL_BLOCK Kcb,
+                         IN PSECURITY_INFORMATION SecurityInformation,
+                         IN PSECURITY_DESCRIPTOR SecurityDescriptor,
+                         IN POOL_TYPE PoolType,
+                         IN PGENERIC_MAPPING GenericMapping)
+{
+    DPRINT("CmpSetSecurityDescriptor()\n");
+    return STATUS_SUCCESS;
+}
+
+NTSTATUS
+CmpAssignSecurityDescriptor(IN PCM_KEY_CONTROL_BLOCK Kcb,
+                            IN PSECURITY_DESCRIPTOR SecurityDescriptor)
+{
+    DPRINT("CmpAssignSecurityDescriptor(%p %p)\n",
+           Kcb, SecurityDescriptor);
+    return STATUS_SUCCESS;
+}
+
 NTSTATUS
 NTAPI
 CmpSecurityMethod(IN PVOID ObjectBody,
@@ -246,23 +268,57 @@ CmpSecurityMethod(IN PVOID ObjectBody,
                   IN POOL_TYPE PoolType,
                   IN PGENERIC_MAPPING GenericMapping)
 {
+    PCM_KEY_CONTROL_BLOCK Kcb;
+    NTSTATUS Status = STATUS_SUCCESS;
+
     DBG_UNREFERENCED_PARAMETER(OldSecurityDescriptor);
     DBG_UNREFERENCED_PARAMETER(GenericMapping);
 
+    Kcb = ((PCM_KEY_BODY)ObjectBody)->KeyControlBlock;
+
+    /* Acquire the hive lock */
+    CmpLockRegistry();
+
+    /* Acquire the KCB lock */
+    if (OperationCode == QuerySecurityDescriptor)
+    {
+        CmpAcquireKcbLockShared(Kcb);
+    }
+    else
+    {
+        CmpAcquireKcbLockExclusive(Kcb);
+    }
+
+    /* Don't touch deleted keys */
+    if (Kcb->Delete)
+    {
+        /* Release the KCB lock */
+        CmpReleaseKcbLock(Kcb);
+
+        /* Release the hive lock */
+        CmpUnlockRegistry();
+        return STATUS_KEY_DELETED;
+    }
+
     switch (OperationCode)
     {
         case SetSecurityDescriptor:
             DPRINT("Set security descriptor\n");
             ASSERT((PoolType == PagedPool) || (PoolType == NonPagedPool));
-            /* HACK */
+            Status = CmpSetSecurityDescriptor(Kcb,
+                                              SecurityInformation,
+                                              SecurityDescriptor,
+                                              PoolType,
+                                              GenericMapping);
             break;
 
         case QuerySecurityDescriptor:
             DPRINT("Query security descriptor\n");
-            return CmpQuerySecurityDescriptor(ObjectBody,
-                                              *SecurityInformation,
-                                              SecurityDescriptor,
-                                              BufferLength);
+            Status = CmpQuerySecurityDescriptor(Kcb,
+                                                *SecurityInformation,
+                                                SecurityDescriptor,
+                                                BufferLength);
+            break;
 
         case DeleteSecurityDescriptor:
             DPRINT("Delete security descriptor\n");
@@ -271,13 +327,19 @@ CmpSecurityMethod(IN PVOID ObjectBody,
 
         case AssignSecurityDescriptor:
             DPRINT("Assign security descriptor\n");
-            /* HACK */
+            Status = CmpAssignSecurityDescriptor(Kcb,
+                                                 SecurityDescriptor);
             break;
 
         default:
             KeBugCheckEx(SECURITY_SYSTEM, 0, STATUS_INVALID_PARAMETER, 0, 0);
     }
 
-    /* HACK */
-    return STATUS_SUCCESS;
+    /* Release the KCB lock */
+    CmpReleaseKcbLock(Kcb);
+
+    /* Release the hive lock */
+    CmpUnlockRegistry();
+
+    return Status;
 }