How to list directory?

Hi everyone,

I am currently trying to list directory entry using NtOpenDirectoryObject() and NtQueryDirectoryObject() but without any success so far. FYI, I am using MINGW/gcc to test. If anyone can give me some insight on my problem, I will really appreciate it. Thanks. Here are two error messages and my code.

$ listdir.exe
Failed to open directory object “??\C:\msys\1.0\home\Administrator”
(Status: 0xc0000024)

$ listdir.exe
Failed to open directory object “C:\msys\1.0\home\Administrator”
(Status: 0xc000003b)

BOOL STDCALL ListDirectory ()
{
OBJECT_ATTRIBUTES obj;
NTSTATUS Status;
HANDLE hDir;
BYTE DirectoryEntry [MAX_DIR_ENTRY *
sizeof(OBJDIR_INFORMATION)];
POBJDIR_INFORMATION pDirEntry = (POBJDIR_INFORMATION) DirectoryEntry;
ULONG Context = 0, Ret = 0, EntryCount = 0;
WCHAR *uString = L"\??\C:\msys\1.0\home\Administrator";
CHAR Str[MAX_PATH];
UNICODE_STRING str;

str.Length = wcslen(uString)*2;
str.MaximumLength = wcslen(uString)*2+2;
str.Buffer = uString;

InitializeObjectAttributes(&obj, &str, 0, 0, 0);

/*
* Try opening the directory.
*/
Status = NtOpenDirectoryObject (&hDir,DIRECTORY_QUERY,&obj);
if (!NT_SUCCESS(Status)) {
printf (“Failed to open directory object "%s" (Status: %s)\n”,
RawUszAsz(uString,Str), StatusToName
(Status));
return (FALSE);
}
/*
* Enumerate each item in the directory.
*/
Status = NtQueryDirectoryObject (
hDir,
pDirEntry,
sizeof DirectoryEntry,
FALSE,/* ReturnSingleEntry */
TRUE, /* RestartScan */
& Context,
& Ret
);
if (!NT_SUCCESS(Status))
{
if (STATUS_NO_MORE_ENTRIES == Status)
{
NtClose (hDir);
return TRUE;
}
printf(“Failed to query dir object (Status:%s)\n”, StatusToName
(Status));
NtClose (hDir);
return (FALSE);
}
while (0 != pDirEntry->ObjectTypeName.Length)
{
CHAR ObjectNameA [MAX_PATH];
CHAR TypeNameA [MAX_PATH];
CHAR TargetNameA [MAX_PATH];

printf (“%-16s %s\n”,
RawUszAsz (pDirEntry->ObjectTypeName.Buffer, TypeNameA),
RawUszAsz (pDirEntry->ObjectName.Buffer, ObjectNameA));
++ EntryCount;
++ pDirEntry;
}
printf (“\n\t%d object(s)\n”, EntryCount);

/* Free any resource. */
NtClose (hDir);
return (TRUE);
}

Thank you very much in advance.

Ilho <><

If you mean a filesystem directory see the documentation for
ZwQueryDirectoryFile/NtQueryDirectoryFile. The apis you mention are for
object directories not file directories.

-----Original Message-----
From: xxxxx@lists.osr.com
[mailto:xxxxx@lists.osr.com] On Behalf Of xxxxx@trigence.com
Sent: Wednesday, April 18, 2007 4:12 PM
To: Windows System Software Devs Interest List
Subject: [ntdev] How to list directory?

Hi everyone,

I am currently trying to list directory entry using
NtOpenDirectoryObject() and NtQueryDirectoryObject() but without any
success so far. FYI, I am using MINGW/gcc to test. If anyone can give me
some insight on my problem, I will really appreciate it. Thanks. Here
are two error messages and my code.

$ listdir.exe
Failed to open directory object “??\C:\msys\1.0\home\Administrator”
(Status: 0xc0000024)

$ listdir.exe
Failed to open directory object “C:\msys\1.0\home\Administrator”
(Status: 0xc000003b)

BOOL STDCALL ListDirectory ()
{
OBJECT_ATTRIBUTES obj;
NTSTATUS Status;
HANDLE hDir;
BYTE DirectoryEntry [MAX_DIR_ENTRY *
sizeof(OBJDIR_INFORMATION)];
POBJDIR_INFORMATION pDirEntry = (POBJDIR_INFORMATION)
DirectoryEntry;
ULONG Context = 0, Ret = 0, EntryCount = 0;
WCHAR *uString =
L"\??\C:\msys\1.0\home\Administrator";
CHAR Str[MAX_PATH];
UNICODE_STRING str;

str.Length = wcslen(uString)*2;
str.MaximumLength = wcslen(uString)*2+2;
str.Buffer = uString;

InitializeObjectAttributes(&obj, &str, 0, 0, 0);

/*
* Try opening the directory.
*/
Status = NtOpenDirectoryObject (&hDir,DIRECTORY_QUERY,&obj);
if (!NT_SUCCESS(Status)) {
printf (“Failed to open directory object "%s" (Status: %s)\n”,
RawUszAsz(uString,Str), StatusToName
(Status));
return (FALSE);
}
/*
* Enumerate each item in the directory.
*/
Status = NtQueryDirectoryObject (
hDir,
pDirEntry,
sizeof DirectoryEntry,
FALSE,/* ReturnSingleEntry */
TRUE, /* RestartScan */
& Context,
& Ret
);
if (!NT_SUCCESS(Status))
{
if (STATUS_NO_MORE_ENTRIES == Status)
{
NtClose (hDir);
return TRUE;
}
printf(“Failed to query dir object (Status:%s)\n”, StatusToName
(Status));
NtClose (hDir);
return (FALSE);
}
while (0 != pDirEntry->ObjectTypeName.Length)
{
CHAR ObjectNameA [MAX_PATH];
CHAR TypeNameA [MAX_PATH];
CHAR TargetNameA [MAX_PATH];

printf (“%-16s %s\n”,
RawUszAsz (pDirEntry->ObjectTypeName.Buffer, TypeNameA),
RawUszAsz (pDirEntry->ObjectName.Buffer, ObjectNameA));
++ EntryCount;
++ pDirEntry;
}
printf (“\n\t%d object(s)\n”, EntryCount);

/* Free any resource. */
NtClose (hDir);
return (TRUE);
}

Thank you very much in advance.

Ilho <><


Questions? First check the Kernel Driver FAQ at
http://www.osronline.com/article.cfm?id=256

To unsubscribe, visit the List Server section of OSR Online at
http://www.osronline.com/page.cfm?name=ListServer

> I am currently trying to list directory entry using NtOpenDirectoryObject()
and

NtQueryDirectoryObject() but without any success so far. FYI, I am using
MINGW/gcc to test.

MINGW/gcc are not supported for Windows kernel-mode development. Sorry.

So, if you have any issues with using these tools - then sorry.


Maxim Shatskih, Windows DDK MVP
StorageCraft Corporation
xxxxx@storagecraft.com
http://www.storagecraft.com