implement the object type SE_KERNEL_OBJECT for GetSecurityInfo()
Modified: trunk/reactos/lib/ntmarta/ntmarta.c
Modified: trunk/reactos/lib/ntmarta/ntmarta.h

Modified: trunk/reactos/lib/ntmarta/ntmarta.c
--- trunk/reactos/lib/ntmarta/ntmarta.c	2006-01-22 02:43:36 UTC (rev 20966)
+++ trunk/reactos/lib/ntmarta/ntmarta.c	2006-01-22 03:07:21 UTC (rev 20967)
@@ -48,8 +48,81 @@
                           PACL* ppSacl,
                           PSECURITY_DESCRIPTOR* ppSecurityDescriptor)
 {
-    UNIMPLEMENTED;
-    return ERROR_CALL_NOT_IMPLEMENTED;
+    PSECURITY_DESCRIPTOR pSD = NULL;
+    ULONG RequiredSize, SDSize = 0;
+    NTSTATUS Status;
+    DWORD LastErr;
+    DWORD Ret = ERROR_SUCCESS;
+
+    /* save the last error code */
+    LastErr = GetLastError();
+
+AllocBuffer:
+    /* allocate a buffer large enough to hold the
+       security descriptor we need to return */
+    SDSize += 0x100;
+    if (pSD != NULL)
+    {
+        pSD = LocalAlloc(LMEM_FIXED,
+                         (SIZE_T)SDSize);
+    }
+    else
+    {
+        pSD = LocalReAlloc((HLOCAL)pSD,
+                           (SIZE_T)SDSize,
+                           LMEM_MOVEABLE);
+    }
+
+    if (pSD == NULL)
+    {
+        Ret = GetLastError();
+        goto Cleanup;
+    }
+
+    /* perform the actual query depending on the object type */
+    switch (ObjectType)
+    {
+        case SE_KERNEL_OBJECT:
+        {
+            Status = NtQuerySecurityObject(handle,
+                                           SecurityInfo,
+                                           pSD,
+                                           SDSize,
+                                           &RequiredSize);
+            if (Status == STATUS_BUFFER_TOO_SMALL)
+            {
+                /* not enough memory, increase the size of
+                   the buffer and try again */
+                ASSERT(RequiredSize > SDSize);
+                SDSize = RequiredSize;
+                goto AllocBuffer;
+            }
+            Ret = RtlNtStatusToDosError(Status);
+            break;
+        }
+
+        default:
+        {
+            UNIMPLEMENTED;
+            Ret = ERROR_CALL_NOT_IMPLEMENTED;
+            break;
+        }
+    }
+
+Cleanup:
+    if (Ret == ERROR_SUCCESS)
+    {
+        *ppSecurityDescriptor = pSD;
+    }
+    else if (pSD != NULL)
+    {
+        LocalFree((HLOCAL)pSD);
+    }
+
+    /* restore the last error code */
+    SetLastError(LastErr);
+
+    return Ret;
 }
 
 

Modified: trunk/reactos/lib/ntmarta/ntmarta.h
--- trunk/reactos/lib/ntmarta/ntmarta.h	2006-01-22 02:43:36 UTC (rev 20966)
+++ trunk/reactos/lib/ntmarta/ntmarta.h	2006-01-22 03:07:21 UTC (rev 20967)
@@ -1,4 +1,7 @@
+#define WIN32_NO_STATUS
+#define NTOS_MODE_USER
 #include <windows.h>
+#include <ndk/ntndk.h>
 #include <accctrl.h>
 
 #ifndef HAS_FN_PROGRESSW