- Fix compile issues caused by previous patch.
[reactos.git] / reactos / ntoskrnl / ob / dirobj.c
index cc374db..e2558f0 100644 (file)
@@ -58,9 +58,7 @@ NtOpenDirectoryObject (OUT PHANDLE DirectoryHandle,
    {
      _SEH_TRY
      {
-       ProbeForWrite(DirectoryHandle,
-                     sizeof(HANDLE),
-                     sizeof(ULONG));
+       ProbeForWriteHandle(DirectoryHandle);
      }
      _SEH_HANDLE
      {
@@ -186,18 +184,14 @@ NtQueryDirectoryObject (IN HANDLE DirectoryHandle,
       ProbeForWrite(Buffer,
                     BufferLength,
                     sizeof(WCHAR));
-      ProbeForWrite(Context,
-                    sizeof(ULONG),
-                    sizeof(ULONG));
+      ProbeForWriteUlong(Context);
       if(!RestartScan)
       {
         SkipEntries = *Context;
       }
       if(ReturnLength != NULL)
       {
-        ProbeForWrite(ReturnLength,
-                      sizeof(ULONG),
-                      sizeof(ULONG));
+        ProbeForWriteUlong(ReturnLength);
       }
     }
     _SEH_HANDLE
@@ -225,14 +219,14 @@ NtQueryDirectoryObject (IN HANDLE DirectoryHandle,
                                      NULL);
   if(NT_SUCCESS(Status))
   {
-    PVOID TemporaryBuffer = ExAllocatePool(PagedPool,
+    PVOID TemporaryBuffer = ExAllocatePool(NonPagedPool,
                                            BufferLength);
     if(TemporaryBuffer != NULL)
     {
       POBJECT_HEADER EntryHeader;
       PLIST_ENTRY ListEntry;
       KIRQL OldLevel;
-      ULONG RequiredSize = 0;
+      ULONG RequiredSize = sizeof(OBJECT_DIRECTORY_INFORMATION);
       ULONG nDirectories = 0;
       POBJECT_DIRECTORY_INFORMATION DirInfo = (POBJECT_DIRECTORY_INFORMATION)TemporaryBuffer;
 
@@ -253,11 +247,11 @@ NtQueryDirectoryObject (IN HANDLE DirectoryHandle,
           EntryHeader = CONTAINING_RECORD(ListEntry, OBJECT_HEADER, Entry);
 
           /* calculate the size of the required buffer space for this entry */
-          Name = (EntryHeader->Name.Length != 0 ? &EntryHeader->Name : NULL);
-          Type = &EntryHeader->ObjectType->Name;
+          Name = (HEADER_TO_OBJECT_NAME(EntryHeader)->Name.Length != 0 ? &HEADER_TO_OBJECT_NAME(EntryHeader)->Name : NULL);
+          Type = &EntryHeader->Type->Name;
           EntrySize = sizeof(OBJECT_DIRECTORY_INFORMATION) +
                       ((Name != NULL) ? ((ULONG)Name->Length + sizeof(WCHAR)) : 0) +
-                      (ULONG)EntryHeader->ObjectType->Name.Length + sizeof(WCHAR);
+                      (ULONG)EntryHeader->Type->Name.Length + sizeof(WCHAR);
 
           if(RequiredSize + EntrySize <= BufferLength)
           {
@@ -321,10 +315,11 @@ NtQueryDirectoryObject (IN HANDLE DirectoryHandle,
 
       if(NT_SUCCESS(Status) && nDirectories > 0)
       {
-        PWSTR strbuf = (PWSTR)((POBJECT_DIRECTORY_INFORMATION)TemporaryBuffer + nDirectories);
-        PWSTR deststrbuf = (PWSTR)((POBJECT_DIRECTORY_INFORMATION)Buffer + nDirectories);
+        PWSTR strbuf = (PWSTR)((POBJECT_DIRECTORY_INFORMATION)TemporaryBuffer + nDirectories + 1);
+        PWSTR deststrbuf = (PWSTR)((POBJECT_DIRECTORY_INFORMATION)Buffer + nDirectories + 1);
+        memset((POBJECT_DIRECTORY_INFORMATION)TemporaryBuffer + nDirectories, 0, sizeof(OBJECT_DIRECTORY_INFORMATION));
 
-        CopyBytes = nDirectories * sizeof(OBJECT_DIRECTORY_INFORMATION);
+        CopyBytes = (nDirectories + 1) * sizeof(OBJECT_DIRECTORY_INFORMATION);
 
         /* copy the names from the objects and append them to the list of the
            objects. copy to the temporary buffer only because the directory
@@ -440,8 +435,8 @@ NtCreateDirectoryObject (OUT PHANDLE DirectoryHandle,
   PAGED_CODE();
 
   DPRINT("NtCreateDirectoryObject(DirectoryHandle %x, "
-        "DesiredAccess %x, ObjectAttributes %x\n",
-        DirectoryHandle, DesiredAccess, ObjectAttributes);
+         "DesiredAccess %x, ObjectAttributes %x\n",
+          DirectoryHandle, DesiredAccess, ObjectAttributes);
 
   PreviousMode = ExGetPreviousMode();
 
@@ -449,9 +444,7 @@ NtCreateDirectoryObject (OUT PHANDLE DirectoryHandle,
   {
     _SEH_TRY
     {
-      ProbeForWrite(DirectoryHandle,
-                    sizeof(HANDLE),
-                    sizeof(ULONG));
+      ProbeForWriteHandle(DirectoryHandle);
     }
     _SEH_HANDLE
     {
@@ -484,6 +477,10 @@ NtCreateDirectoryObject (OUT PHANDLE DirectoryHandle,
                             0,
                             NULL,
                             &hDirectory);
+    if (!NT_SUCCESS(Status))
+    {
+       ObMakeTemporaryObject(Directory);
+    }
     ObDereferenceObject(Directory);
 
     if(NT_SUCCESS(Status))