- Acquire the temporary buffer from non paged pool in
NtQueryDirectoryObject, because the buffer is accessed at DPC_LEVEL.
- Do always add an empty entry at the end of the buffer
Modified: trunk/reactos/ntoskrnl/ob/dirobj.c
_____
Modified: trunk/reactos/ntoskrnl/ob/dirobj.c
--- trunk/reactos/ntoskrnl/ob/dirobj.c 2005-09-10 20:19:23 UTC (rev
17788)
+++ trunk/reactos/ntoskrnl/ob/dirobj.c 2005-09-10 22:35:08 UTC (rev
17789)
@@ -219,14 +219,14 @@
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;
@@ -315,10 +315,11 @@
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
Show replies by date