fixed usage of NtQueryDirectoryObject()
Modified: trunk/reactos/apps/utils/objdir/objdir.c
_____
Modified: trunk/reactos/apps/utils/objdir/objdir.c
--- trunk/reactos/apps/utils/objdir/objdir.c 2005-01-26 13:54:07 UTC
(rev 13309)
+++ trunk/reactos/apps/utils/objdir/objdir.c 2005-01-26 13:54:53 UTC
(rev 13310)
@@ -79,10 +79,14 @@
return "STATUS_PATH_SYNTAX_BAD";
case STATUS_NO_MORE_ENTRIES:
return "STATUS_NO_MORE_ENTRIES";
+ case STATUS_MORE_ENTRIES:
+ return "STATUS_MORE_ENTRIES";
case STATUS_ACCESS_DENIED:
return "STATUS_ACCESS_DENIED";
case STATUS_UNSUCCESSFUL:
return "STATUS_UNSUCCESSFUL";
+ case STATUS_INVALID_HANDLE:
+ return "STATUS_INVALID_HANDLE";
}
sprintf (RawValue, "0x%08lx", Status);
return (const char *) RawValue;
@@ -173,8 +177,9 @@
OBJECT_ATTRIBUTES ObjectAttributes;
NTSTATUS Status;
HANDLE DirectoryHandle;
- BYTE DirectoryEntry [MAX_DIR_ENTRY *
sizeof(OBJECT_DIRECTORY_INFORMATION)];
+ BYTE DirectoryEntry [512];
POBJECT_DIRECTORY_INFORMATION pDirectoryEntry =
(POBJECT_DIRECTORY_INFORMATION) DirectoryEntry;
+ POBJECT_DIRECTORY_INFORMATION pDirectoryEntries =
(POBJECT_DIRECTORY_INFORMATION) DirectoryEntry;
ULONG Context = 0;
ULONG ReturnLength = 0;
ULONG EntryCount = 0;
@@ -217,25 +222,23 @@
return (FALSE);
}
printf ("\n Directory of %s\n\n", DirectoryNameA);
+
+ for(;;)
+ {
/*
* Enumerate each item in the directory.
*/
Status = NtQueryDirectoryObject (
DirectoryHandle,
- pDirectoryEntry,
+ pDirectoryEntries,
sizeof DirectoryEntry,
FALSE,/* ReturnSingleEntry */
- TRUE, /* RestartScan */
+ FALSE, /* RestartScan */
& Context,
& ReturnLength
);
- if (!NT_SUCCESS(Status))
+ if (!NT_SUCCESS(Status) && Status != STATUS_NO_MORE_ENTRIES)
{
- if (STATUS_NO_MORE_ENTRIES == Status)
- {
- NtClose (DirectoryHandle);
- return TRUE;
- }
printf (
"Failed to query directory object (Status:
%s)\n",
StatusToName (Status)
@@ -243,12 +246,17 @@
NtClose (DirectoryHandle);
return (FALSE);
}
- while (0 != pDirectoryEntry->ObjectTypeName.Length)
+ if (Status == STATUS_NO_MORE_ENTRIES)
{
+ break;
+ }
+ pDirectoryEntry = pDirectoryEntries;
+ while (EntryCount < Context)
+ {
CHAR ObjectNameA [MAX_PATH];
CHAR TypeNameA [MAX_PATH];
CHAR TargetNameA [MAX_PATH];
-
+
if (0 == wcscmp (L"SymbolicLink",
pDirectoryEntry->ObjectTypeName.Buffer))
{
if (TRUE == ExpandSymbolicLink (
@@ -258,7 +266,7 @@
)
)
{
-
+
printf (
"%-16s %s -> %s\n",
RawUszAsz
(pDirectoryEntry->ObjectTypeName.Buffer, TypeNameA),
@@ -283,9 +291,10 @@
RawUszAsz
(pDirectoryEntry->ObjectName.Buffer, ObjectNameA)
);
}
+ ++ pDirectoryEntry;
++ EntryCount;
- ++ pDirectoryEntry;
}
+ };
printf ("\n\t%lu object(s)\n", EntryCount);
/*
* Free any resource.
Show replies by date