1 /* $Id: dir.c,v 1.19 2003/08/07 11:47:33 silverblade Exp $
3 * COPYRIGHT: See COPYING in the top level directory
4 * PROJECT: ReactOS kernel
5 * FILE: ntoskrnl/io/dir.c
6 * PURPOSE: Directory functions
7 * PROGRAMMER: David Welch (welch@mcmail.com)
12 /* INCLUDES *****************************************************************/
14 #include <ddk/ntddk.h>
15 #include <internal/io.h>
18 #include <internal/debug.h>
20 /* FUNCTIONS *****************************************************************/
29 NtNotifyChangeDirectoryFile (
31 IN HANDLE Event OPTIONAL
,
32 IN PIO_APC_ROUTINE ApcRoutine OPTIONAL
,
33 IN PVOID ApcContext OPTIONAL
,
34 OUT PIO_STATUS_BLOCK IoStatusBlock
,
37 IN ULONG CompletionFilter
,
52 IN HANDLE PEvent OPTIONAL
,
53 IN PIO_APC_ROUTINE ApcRoutine OPTIONAL
,
54 IN PVOID ApcContext OPTIONAL
,
55 OUT PIO_STATUS_BLOCK IoStatusBlock
,
56 OUT PVOID FileInformation
,
58 IN FILE_INFORMATION_CLASS FileInformationClass
,
59 IN BOOLEAN ReturnSingleEntry
,
60 IN PUNICODE_STRING FileName OPTIONAL
,
61 IN BOOLEAN RestartScan
64 * FUNCTION: Queries a directory file.
66 * FileHandle = Handle to a directory file
67 * EventHandle = Handle to the event signaled on completion
68 * ApcRoutine = Asynchroneous procedure callback, called on completion
69 * ApcContext = Argument to the apc.
70 * IoStatusBlock = Caller supplies storage for extended status information.
71 * FileInformation = Caller supplies storage for the resulting information.
73 * FileNameInformation FILE_NAMES_INFORMATION
74 * FileDirectoryInformation FILE_DIRECTORY_INFORMATION
75 * FileFullDirectoryInformation FILE_FULL_DIRECTORY_INFORMATION
76 * FileBothDirectoryInformation FILE_BOTH_DIR_INFORMATION
78 * Length = Size of the storage supplied
79 * FileInformationClass = Indicates the type of information requested.
80 * ReturnSingleEntry = Specify true if caller only requests the first
82 * FileName = Initial directory name to query, that may contain wild
84 * RestartScan = Number of times the action should be repeated
85 * RETURNS: Status [ STATUS_SUCCESS, STATUS_ACCESS_DENIED, STATUS_INSUFFICIENT_RESOURCES,
86 * STATUS_INVALID_PARAMETER, STATUS_INVALID_DEVICE_REQUEST, STATUS_BUFFER_OVERFLOW,
87 * STATUS_INVALID_INFO_CLASS, STATUS_NO_SUCH_FILE, STATUS_NO_MORE_FILES ]
91 PDEVICE_OBJECT DeviceObject
;
92 PFILE_OBJECT FileObject
;
94 PEXTENDED_IO_STACK_LOCATION IoStack
;
97 DPRINT("NtQueryDirectoryFile()\n");
99 Status
= ObReferenceObjectByHandle(FileHandle
,
103 (PVOID
*)&FileObject
,
106 if (Status
!= STATUS_SUCCESS
)
108 ObDereferenceObject(FileObject
);
111 DeviceObject
= FileObject
->DeviceObject
;
113 Irp
= IoAllocateIrp(DeviceObject
->StackSize
, TRUE
);
116 ObDereferenceObject(FileObject
);
117 return STATUS_UNSUCCESSFUL
;
120 //trigger FileObject/Event dereferencing
121 Irp
->Tail
.Overlay
.OriginalFileObject
= FileObject
;
123 Irp
->UserIosb
= &IoSB
;
124 Irp
->UserEvent
= &FileObject
->Event
;
125 KeResetEvent( &FileObject
->Event
);
126 Irp
->UserBuffer
=FileInformation
;
128 IoStack
= (PEXTENDED_IO_STACK_LOCATION
) IoGetNextIrpStackLocation(Irp
);
130 IoStack
->MajorFunction
= IRP_MJ_DIRECTORY_CONTROL
;
131 IoStack
->MinorFunction
= IRP_MN_QUERY_DIRECTORY
;
133 IoStack
->Control
= 0;
134 IoStack
->DeviceObject
= DeviceObject
;
135 IoStack
->FileObject
= FileObject
;
139 IoStack
->Flags
= IoStack
->Flags
| SL_RESTART_SCAN
;
141 if (ReturnSingleEntry
)
143 IoStack
->Flags
= IoStack
->Flags
| SL_RETURN_SINGLE_ENTRY
;
145 if (((PFILE_DIRECTORY_INFORMATION
)FileInformation
)->FileIndex
!= 0)
147 IoStack
->Flags
= IoStack
->Flags
| SL_INDEX_SPECIFIED
;
150 IoStack
->Parameters
.QueryDirectory
.FileInformationClass
=
151 FileInformationClass
;
152 IoStack
->Parameters
.QueryDirectory
.FileName
= FileName
;
153 IoStack
->Parameters
.QueryDirectory
.Length
= Length
;
155 Status
= IoCallDriver(FileObject
->DeviceObject
,Irp
);
156 if (Status
==STATUS_PENDING
&& !(FileObject
->Flags
& FO_SYNCHRONOUS_IO
))
158 if (FileObject
->Flags
& FO_ALERTABLE_IO
)
160 KeWaitForSingleObject(&FileObject
->Event
,Executive
,KernelMode
,TRUE
,NULL
);
164 KeWaitForSingleObject(&FileObject
->Event
,Executive
,KernelMode
,FALSE
,NULL
);
166 Status
= IoSB
.Status
;
170 *IoStatusBlock
= IoSB
;
175 NTSTATUS STDCALL
NtQueryOleDirectoryFile(VOID
)