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 *****************************************************************/
16 #include <internal/debug.h>
18 /* FUNCTIONS *****************************************************************/
27 NtNotifyChangeDirectoryFile (
29 IN HANDLE Event OPTIONAL
,
30 IN PIO_APC_ROUTINE ApcRoutine OPTIONAL
,
31 IN PVOID ApcContext OPTIONAL
,
32 OUT PIO_STATUS_BLOCK IoStatusBlock
,
35 IN ULONG CompletionFilter
,
40 PDEVICE_OBJECT DeviceObject
;
41 PFILE_OBJECT FileObject
;
43 PIO_STACK_LOCATION IoStack
;
44 KPROCESSOR_MODE PreviousMode
;
46 DPRINT("NtNotifyChangeDirectoryFile()\n");
48 PreviousMode
= ExGetPreviousMode();
50 Status
= ObReferenceObjectByHandle(FileHandle
,
57 if (Status
!= STATUS_SUCCESS
)
61 DeviceObject
= FileObject
->DeviceObject
;
63 Irp
= IoAllocateIrp(DeviceObject
->StackSize
, TRUE
);
66 ObDereferenceObject(FileObject
);
67 return STATUS_UNSUCCESSFUL
;
72 Event
= &FileObject
->Event
;
75 /* Trigger FileObject/Event dereferencing */
76 Irp
->Tail
.Overlay
.OriginalFileObject
= FileObject
;
77 Irp
->RequestorMode
= PreviousMode
;
78 Irp
->UserIosb
= IoStatusBlock
;
79 Irp
->Tail
.Overlay
.Thread
= PsGetCurrentThread();
80 Irp
->UserEvent
= Event
;
81 KeResetEvent( Event
);
82 Irp
->UserBuffer
= Buffer
;
83 Irp
->Overlay
.AsynchronousParameters
.UserApcRoutine
= ApcRoutine
;
84 Irp
->Overlay
.AsynchronousParameters
.UserApcContext
= ApcContext
;
86 IoStack
= IoGetNextIrpStackLocation(Irp
);
88 IoStack
->MajorFunction
= IRP_MJ_DIRECTORY_CONTROL
;
89 IoStack
->MinorFunction
= IRP_MN_NOTIFY_CHANGE_DIRECTORY
;
92 IoStack
->DeviceObject
= DeviceObject
;
93 IoStack
->FileObject
= FileObject
;
97 IoStack
->Flags
= SL_WATCH_TREE
;
100 IoStack
->Parameters
.NotifyDirectory
.CompletionFilter
= CompletionFilter
;
101 IoStack
->Parameters
.NotifyDirectory
.Length
= BufferSize
;
103 Status
= IoCallDriver(FileObject
->DeviceObject
,Irp
);
105 /* FIXME: Should we wait here or not for synchronously opened files? */
116 NtQueryDirectoryFile(
117 IN HANDLE FileHandle
,
118 IN HANDLE PEvent OPTIONAL
,
119 IN PIO_APC_ROUTINE ApcRoutine OPTIONAL
,
120 IN PVOID ApcContext OPTIONAL
,
121 OUT PIO_STATUS_BLOCK IoStatusBlock
,
122 OUT PVOID FileInformation
,
124 IN FILE_INFORMATION_CLASS FileInformationClass
,
125 IN BOOLEAN ReturnSingleEntry
,
126 IN PUNICODE_STRING FileName OPTIONAL
,
127 IN BOOLEAN RestartScan
130 * FUNCTION: Queries a directory file.
132 * FileHandle = Handle to a directory file
133 * EventHandle = Handle to the event signaled on completion
134 * ApcRoutine = Asynchroneous procedure callback, called on completion
135 * ApcContext = Argument to the apc.
136 * IoStatusBlock = Caller supplies storage for extended status information.
137 * FileInformation = Caller supplies storage for the resulting information.
139 * FileNameInformation FILE_NAMES_INFORMATION
140 * FileDirectoryInformation FILE_DIRECTORY_INFORMATION
141 * FileFullDirectoryInformation FILE_FULL_DIRECTORY_INFORMATION
142 * FileBothDirectoryInformation FILE_BOTH_DIR_INFORMATION
144 * Length = Size of the storage supplied
145 * FileInformationClass = Indicates the type of information requested.
146 * ReturnSingleEntry = Specify true if caller only requests the first
148 * FileName = Initial directory name to query, that may contain wild
150 * RestartScan = Number of times the action should be repeated
151 * RETURNS: Status [ STATUS_SUCCESS, STATUS_ACCESS_DENIED, STATUS_INSUFFICIENT_RESOURCES,
152 * STATUS_INVALID_PARAMETER, STATUS_INVALID_DEVICE_REQUEST, STATUS_BUFFER_OVERFLOW,
153 * STATUS_INVALID_INFO_CLASS, STATUS_NO_SUCH_FILE, STATUS_NO_MORE_FILES ]
157 PDEVICE_OBJECT DeviceObject
;
158 PFILE_OBJECT FileObject
;
160 PIO_STACK_LOCATION IoStack
;
161 KPROCESSOR_MODE PreviousMode
;
163 DPRINT("NtQueryDirectoryFile()\n");
165 PreviousMode
= ExGetPreviousMode();
167 Status
= ObReferenceObjectByHandle(FileHandle
,
171 (PVOID
*)&FileObject
,
174 if (Status
!= STATUS_SUCCESS
)
178 DeviceObject
= FileObject
->DeviceObject
;
180 Irp
= IoAllocateIrp(DeviceObject
->StackSize
, TRUE
);
183 ObDereferenceObject(FileObject
);
184 return STATUS_UNSUCCESSFUL
;
187 /* Trigger FileObject/Event dereferencing */
188 Irp
->Tail
.Overlay
.OriginalFileObject
= FileObject
;
189 Irp
->RequestorMode
= PreviousMode
;
190 Irp
->UserIosb
= IoStatusBlock
;
191 Irp
->UserEvent
= &FileObject
->Event
;
192 Irp
->Tail
.Overlay
.Thread
= PsGetCurrentThread();
193 KeResetEvent( &FileObject
->Event
);
194 Irp
->UserBuffer
=FileInformation
;
195 Irp
->Overlay
.AsynchronousParameters
.UserApcRoutine
= ApcRoutine
;
196 Irp
->Overlay
.AsynchronousParameters
.UserApcContext
= ApcContext
;
198 IoStack
= IoGetNextIrpStackLocation(Irp
);
200 IoStack
->MajorFunction
= IRP_MJ_DIRECTORY_CONTROL
;
201 IoStack
->MinorFunction
= IRP_MN_QUERY_DIRECTORY
;
203 IoStack
->Control
= 0;
204 IoStack
->DeviceObject
= DeviceObject
;
205 IoStack
->FileObject
= FileObject
;
209 IoStack
->Flags
= IoStack
->Flags
| SL_RESTART_SCAN
;
211 if (ReturnSingleEntry
)
213 IoStack
->Flags
= IoStack
->Flags
| SL_RETURN_SINGLE_ENTRY
;
215 if (((PFILE_DIRECTORY_INFORMATION
)FileInformation
)->FileIndex
!= 0)
217 IoStack
->Flags
= IoStack
->Flags
| SL_INDEX_SPECIFIED
;
220 IoStack
->Parameters
.QueryDirectory
.FileInformationClass
=
221 FileInformationClass
;
222 IoStack
->Parameters
.QueryDirectory
.FileName
= FileName
;
223 IoStack
->Parameters
.QueryDirectory
.Length
= Length
;
225 Status
= IoCallDriver(FileObject
->DeviceObject
,Irp
);
226 if (Status
==STATUS_PENDING
&& !(FileObject
->Flags
& FO_SYNCHRONOUS_IO
))
228 KeWaitForSingleObject(&FileObject
->Event
,
231 FileObject
->Flags
& FO_ALERTABLE_IO
,
233 Status
= IoStatusBlock
->Status
;
239 NTSTATUS STDCALL
NtQueryOleDirectoryFile(VOID
)
242 return(STATUS_NOT_IMPLEMENTED
);