1 /* $Id: dir.c,v 1.24 2004/08/22 20:51:43 navaraf 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 *****************************************************************/
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 PEXTENDED_IO_STACK_LOCATION IoStack
;
44 KPROCESSOR_MODE PreviousMode
;
46 DPRINT("NtNotifyChangeDirectoryFile()\n");
48 PreviousMode
= ExGetPreviousMode();
50 Status
= ObReferenceObjectByHandle(FileHandle
,
57 if (Status
!= STATUS_SUCCESS
)
59 ObDereferenceObject(FileObject
);
62 DeviceObject
= FileObject
->DeviceObject
;
64 Irp
= IoAllocateIrp(DeviceObject
->StackSize
, TRUE
);
67 ObDereferenceObject(FileObject
);
68 return STATUS_UNSUCCESSFUL
;
73 Event
= &FileObject
->Event
;
76 /* Trigger FileObject/Event dereferencing */
77 Irp
->Tail
.Overlay
.OriginalFileObject
= FileObject
;
78 Irp
->RequestorMode
= PreviousMode
;
79 Irp
->UserIosb
= IoStatusBlock
;
80 Irp
->Tail
.Overlay
.Thread
= PsGetCurrentThread();
81 Irp
->UserEvent
= Event
;
82 KeResetEvent( Event
);
83 Irp
->UserBuffer
= Buffer
;
84 Irp
->Overlay
.AsynchronousParameters
.UserApcRoutine
= ApcRoutine
;
85 Irp
->Overlay
.AsynchronousParameters
.UserApcContext
= ApcContext
;
87 IoStack
= (PEXTENDED_IO_STACK_LOCATION
) IoGetNextIrpStackLocation(Irp
);
89 IoStack
->MajorFunction
= IRP_MJ_DIRECTORY_CONTROL
;
90 IoStack
->MinorFunction
= IRP_MN_NOTIFY_CHANGE_DIRECTORY
;
93 IoStack
->DeviceObject
= DeviceObject
;
94 IoStack
->FileObject
= FileObject
;
98 IoStack
->Flags
= SL_WATCH_TREE
;
101 IoStack
->Parameters
.NotifyDirectory
.CompletionFilter
= CompletionFilter
;
102 IoStack
->Parameters
.NotifyDirectory
.Length
= BufferSize
;
104 Status
= IoCallDriver(FileObject
->DeviceObject
,Irp
);
106 /* FIXME: Should we wait here or not for synchronously opened files? */
117 NtQueryDirectoryFile(
118 IN HANDLE FileHandle
,
119 IN HANDLE PEvent OPTIONAL
,
120 IN PIO_APC_ROUTINE ApcRoutine OPTIONAL
,
121 IN PVOID ApcContext OPTIONAL
,
122 OUT PIO_STATUS_BLOCK IoStatusBlock
,
123 OUT PVOID FileInformation
,
125 IN FILE_INFORMATION_CLASS FileInformationClass
,
126 IN BOOLEAN ReturnSingleEntry
,
127 IN PUNICODE_STRING FileName OPTIONAL
,
128 IN BOOLEAN RestartScan
131 * FUNCTION: Queries a directory file.
133 * FileHandle = Handle to a directory file
134 * EventHandle = Handle to the event signaled on completion
135 * ApcRoutine = Asynchroneous procedure callback, called on completion
136 * ApcContext = Argument to the apc.
137 * IoStatusBlock = Caller supplies storage for extended status information.
138 * FileInformation = Caller supplies storage for the resulting information.
140 * FileNameInformation FILE_NAMES_INFORMATION
141 * FileDirectoryInformation FILE_DIRECTORY_INFORMATION
142 * FileFullDirectoryInformation FILE_FULL_DIRECTORY_INFORMATION
143 * FileBothDirectoryInformation FILE_BOTH_DIR_INFORMATION
145 * Length = Size of the storage supplied
146 * FileInformationClass = Indicates the type of information requested.
147 * ReturnSingleEntry = Specify true if caller only requests the first
149 * FileName = Initial directory name to query, that may contain wild
151 * RestartScan = Number of times the action should be repeated
152 * RETURNS: Status [ STATUS_SUCCESS, STATUS_ACCESS_DENIED, STATUS_INSUFFICIENT_RESOURCES,
153 * STATUS_INVALID_PARAMETER, STATUS_INVALID_DEVICE_REQUEST, STATUS_BUFFER_OVERFLOW,
154 * STATUS_INVALID_INFO_CLASS, STATUS_NO_SUCH_FILE, STATUS_NO_MORE_FILES ]
158 PDEVICE_OBJECT DeviceObject
;
159 PFILE_OBJECT FileObject
;
161 PEXTENDED_IO_STACK_LOCATION IoStack
;
162 KPROCESSOR_MODE PreviousMode
;
164 DPRINT("NtQueryDirectoryFile()\n");
166 PreviousMode
= ExGetPreviousMode();
168 Status
= ObReferenceObjectByHandle(FileHandle
,
172 (PVOID
*)&FileObject
,
175 if (Status
!= STATUS_SUCCESS
)
177 ObDereferenceObject(FileObject
);
180 DeviceObject
= FileObject
->DeviceObject
;
182 Irp
= IoAllocateIrp(DeviceObject
->StackSize
, TRUE
);
185 ObDereferenceObject(FileObject
);
186 return STATUS_UNSUCCESSFUL
;
189 /* Trigger FileObject/Event dereferencing */
190 Irp
->Tail
.Overlay
.OriginalFileObject
= FileObject
;
191 Irp
->RequestorMode
= PreviousMode
;
192 Irp
->UserIosb
= IoStatusBlock
;
193 Irp
->UserEvent
= &FileObject
->Event
;
194 Irp
->Tail
.Overlay
.Thread
= PsGetCurrentThread();
195 KeResetEvent( &FileObject
->Event
);
196 Irp
->UserBuffer
=FileInformation
;
197 Irp
->Overlay
.AsynchronousParameters
.UserApcRoutine
= ApcRoutine
;
198 Irp
->Overlay
.AsynchronousParameters
.UserApcContext
= ApcContext
;
200 IoStack
= (PEXTENDED_IO_STACK_LOCATION
) IoGetNextIrpStackLocation(Irp
);
202 IoStack
->MajorFunction
= IRP_MJ_DIRECTORY_CONTROL
;
203 IoStack
->MinorFunction
= IRP_MN_QUERY_DIRECTORY
;
205 IoStack
->Control
= 0;
206 IoStack
->DeviceObject
= DeviceObject
;
207 IoStack
->FileObject
= FileObject
;
211 IoStack
->Flags
= IoStack
->Flags
| SL_RESTART_SCAN
;
213 if (ReturnSingleEntry
)
215 IoStack
->Flags
= IoStack
->Flags
| SL_RETURN_SINGLE_ENTRY
;
217 if (((PFILE_DIRECTORY_INFORMATION
)FileInformation
)->FileIndex
!= 0)
219 IoStack
->Flags
= IoStack
->Flags
| SL_INDEX_SPECIFIED
;
222 IoStack
->Parameters
.QueryDirectory
.FileInformationClass
=
223 FileInformationClass
;
224 IoStack
->Parameters
.QueryDirectory
.FileName
= FileName
;
225 IoStack
->Parameters
.QueryDirectory
.Length
= Length
;
227 Status
= IoCallDriver(FileObject
->DeviceObject
,Irp
);
228 if (Status
==STATUS_PENDING
&& !(FileObject
->Flags
& FO_SYNCHRONOUS_IO
))
230 KeWaitForSingleObject(&FileObject
->Event
,
233 FileObject
->Flags
& FO_ALERTABLE_IO
,
235 Status
= IoStatusBlock
->Status
;
241 NTSTATUS STDCALL
NtQueryOleDirectoryFile(VOID
)
244 return(STATUS_NOT_IMPLEMENTED
);