objdir made compilable.

svn path=/trunk/; revision=1141
This commit is contained in:
Emanuele Aliberti 2000-05-01 13:53:43 +00:00
parent 32ea00da50
commit fdf480d262
2 changed files with 131 additions and 30 deletions

View file

@ -1,13 +1,17 @@
#
#
#
OBJECTS= objdir.o
OBJECTS= ../common/crt0.o objdir.o
PROGS= objdir.exe
BASE_CFLAGS = -I../../include
LIBS = ../../lib/ntdll/ntdll.a
LIB_BASE=../../lib
LIBS = \
$(LIB_BASE)/ntdll/ntdll.a \
$(LIB_BASE)/kernel32/kernel32.a \
$(LIB_BASE)/crtdll/crtdll.a
all: $(PROGS)

View file

@ -1,7 +1,11 @@
/* $Id: objdir.c,v 1.1 2000/03/26 22:00:06 dwelch Exp $
/* $Id: objdir.c,v 1.2 2000/05/01 13:53:43 ea Exp $
*
* DESCRIPTION: Simple LPC Server
* DESCRIPTION: Object Manager Simple Explorer
* PROGRAMMER: David Welch
* REVISIONS
* 2000-04-30 (ea)
* Added directory enumeration.
* (tested under nt4sp4/x86)
*/
#include <ddk/ntddk.h>
@ -10,33 +14,126 @@
#include <stdio.h>
#include <stdlib.h>
#define MAX_TYPE 64
typedef
struct _DIRECTORY_ENTRY_HEADER
{
UNICODE_STRING Name;
UNICODE_STRING Type;
} DIRECTORY_ENTRY_HEADER;
struct
{
DIRECTORY_ENTRY_HEADER Entry;
WCHAR Buffer [MAX_PATH + MAX_TYPE + 2];
} DirectoryEntry;
int main(int argc, char* argv[])
{
UNICODE_STRING DirectoryNameW;
UNICODE_STRING DirectoryNameA:
ANSI_STRING DirectoryNameA;
OBJECT_ATTRIBUTES ObjectAttributes;
NTSTATUS Status;
HANDLE DirectoryHandle;
ULONG BytesReturned = 0;
ULONG EntryCount = 0;
RtlInitAnsiString(&DirectoryNameA, argv[1]);
RtlAnsiStringToUnicodeString(&DirectoryNameW,
&DirectoryNameA,
TRUE);
InitializeObjectAttributes(&ObjectAttributes,
&DirectoryNameW,
/*
* Check user arguments.
*/
if (2 != argc)
{
fprintf (
stderr,
"Usage: %s directory\n\n"
" directory a directory name in the system namespace\n",
argv [0]
);
return EXIT_FAILURE;
}
/*
* Prepare parameters for next call.
*/
RtlInitAnsiString (
& DirectoryNameA,
argv [1]
);
RtlAnsiStringToUnicodeString (
& DirectoryNameW,
& DirectoryNameA,
TRUE
);
InitializeObjectAttributes (
& ObjectAttributes,
& DirectoryNameW,
0,
NULL,
NULL);
Status = NtOpenDirectoryObject(&DirectoryHandle,
0,
&ObjectAttributes);
NULL
);
/*
* Try opening the directory the
* user requested.
*/
Status = NtOpenDirectoryObject (
& DirectoryHandle,
DIRECTORY_QUERY,
& ObjectAttributes
);
if (!NT_SUCCESS(Status))
{
printf("Failed to open directory object (Status%x)\n", Status);
return(EXIT_FAILURE);
printf (
"Failed to open directory object (Status: %x)\n",
Status
);
return EXIT_FAILURE;
}
NtClose(DirectoryHandle);
/*
* Enumerate each item in the directory.
*/
Status = NtQueryDirectoryObject (
DirectoryHandle,
& DirectoryEntry,
sizeof DirectoryEntry,
TRUE,
TRUE,
& BytesReturned,
& EntryCount
);
if (!NT_SUCCESS(Status))
{
printf (
"Failed to query directory object (Status: %x)\n",
Status
);
NtClose (DirectoryHandle);
return EXIT_FAILURE;
}
wprintf (L"%d entries:\n", EntryCount);
while (STATUS_NO_MORE_ENTRIES != Status)
{
wprintf (
L"%-16s %s\n",
DirectoryEntry.Entry.Type.Buffer,
DirectoryEntry.Entry.Name.Buffer
);
Status = NtQueryDirectoryObject (
DirectoryHandle,
& DirectoryEntry,
sizeof DirectoryEntry,
TRUE,
FALSE,
& BytesReturned,
& EntryCount
);
}
/*
* Free any resource.
*/
NtClose (DirectoryHandle);
return EXIT_SUCCESS;
}