W32API conversion update
[reactos.git] / reactos / ntoskrnl / io / dir.c
1 /* $Id: dir.c,v 1.19 2003/08/07 11:47:33 silverblade Exp $
2 *
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)
8 * UPDATE HISTORY:
9 * Created 22/05/98
10 */
11
12 /* INCLUDES *****************************************************************/
13
14 #include <ddk/ntddk.h>
15 #include <internal/io.h>
16
17 #define NDEBUG
18 #include <internal/debug.h>
19
20 /* FUNCTIONS *****************************************************************/
21
22
23
24 /*
25 * @unimplemented
26 */
27 NTSTATUS
28 STDCALL
29 NtNotifyChangeDirectoryFile (
30 IN HANDLE FileHandle,
31 IN HANDLE Event OPTIONAL,
32 IN PIO_APC_ROUTINE ApcRoutine OPTIONAL,
33 IN PVOID ApcContext OPTIONAL,
34 OUT PIO_STATUS_BLOCK IoStatusBlock,
35 OUT PVOID Buffer,
36 IN ULONG BufferSize,
37 IN ULONG CompletionFilter,
38 IN BOOLEAN WatchTree
39 )
40 {
41 UNIMPLEMENTED;
42 }
43
44
45 /*
46 * @implemented
47 */
48 NTSTATUS
49 STDCALL
50 NtQueryDirectoryFile(
51 IN HANDLE FileHandle,
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,
57 IN ULONG Length,
58 IN FILE_INFORMATION_CLASS FileInformationClass,
59 IN BOOLEAN ReturnSingleEntry,
60 IN PUNICODE_STRING FileName OPTIONAL,
61 IN BOOLEAN RestartScan
62 )
63 /*
64 * FUNCTION: Queries a directory file.
65 * ARGUMENTS:
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.
72 *
73 * FileNameInformation FILE_NAMES_INFORMATION
74 * FileDirectoryInformation FILE_DIRECTORY_INFORMATION
75 * FileFullDirectoryInformation FILE_FULL_DIRECTORY_INFORMATION
76 * FileBothDirectoryInformation FILE_BOTH_DIR_INFORMATION
77 *
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
81 * directory found.
82 * FileName = Initial directory name to query, that may contain wild
83 * cards.
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 ]
88 */
89 {
90 PIRP Irp;
91 PDEVICE_OBJECT DeviceObject;
92 PFILE_OBJECT FileObject;
93 NTSTATUS Status;
94 PEXTENDED_IO_STACK_LOCATION IoStack;
95 IO_STATUS_BLOCK IoSB;
96
97 DPRINT("NtQueryDirectoryFile()\n");
98
99 Status = ObReferenceObjectByHandle(FileHandle,
100 FILE_LIST_DIRECTORY,
101 IoFileObjectType,
102 UserMode,
103 (PVOID *)&FileObject,
104 NULL);
105
106 if (Status != STATUS_SUCCESS)
107 {
108 ObDereferenceObject(FileObject);
109 return(Status);
110 }
111 DeviceObject = FileObject->DeviceObject;
112
113 Irp = IoAllocateIrp(DeviceObject->StackSize, TRUE);
114 if (Irp==NULL)
115 {
116 ObDereferenceObject(FileObject);
117 return STATUS_UNSUCCESSFUL;
118 }
119
120 //trigger FileObject/Event dereferencing
121 Irp->Tail.Overlay.OriginalFileObject = FileObject;
122
123 Irp->UserIosb = &IoSB;
124 Irp->UserEvent = &FileObject->Event;
125 KeResetEvent( &FileObject->Event );
126 Irp->UserBuffer=FileInformation;
127
128 IoStack = (PEXTENDED_IO_STACK_LOCATION) IoGetNextIrpStackLocation(Irp);
129
130 IoStack->MajorFunction = IRP_MJ_DIRECTORY_CONTROL;
131 IoStack->MinorFunction = IRP_MN_QUERY_DIRECTORY;
132 IoStack->Flags = 0;
133 IoStack->Control = 0;
134 IoStack->DeviceObject = DeviceObject;
135 IoStack->FileObject = FileObject;
136
137 if (RestartScan)
138 {
139 IoStack->Flags = IoStack->Flags | SL_RESTART_SCAN;
140 }
141 if (ReturnSingleEntry)
142 {
143 IoStack->Flags = IoStack->Flags | SL_RETURN_SINGLE_ENTRY;
144 }
145 if (((PFILE_DIRECTORY_INFORMATION)FileInformation)->FileIndex != 0)
146 {
147 IoStack->Flags = IoStack->Flags | SL_INDEX_SPECIFIED;
148 }
149
150 IoStack->Parameters.QueryDirectory.FileInformationClass =
151 FileInformationClass;
152 IoStack->Parameters.QueryDirectory.FileName = FileName;
153 IoStack->Parameters.QueryDirectory.Length = Length;
154
155 Status = IoCallDriver(FileObject->DeviceObject,Irp);
156 if (Status==STATUS_PENDING && !(FileObject->Flags & FO_SYNCHRONOUS_IO))
157 {
158 if (FileObject->Flags & FO_ALERTABLE_IO)
159 {
160 KeWaitForSingleObject(&FileObject->Event,Executive,KernelMode,TRUE,NULL);
161 }
162 else
163 {
164 KeWaitForSingleObject(&FileObject->Event,Executive,KernelMode,FALSE,NULL);
165 }
166 Status = IoSB.Status;
167 }
168 if (IoStatusBlock)
169 {
170 *IoStatusBlock = IoSB;
171 }
172 return(Status);
173 }
174
175 NTSTATUS STDCALL NtQueryOleDirectoryFile(VOID)
176 {
177 UNIMPLEMENTED;
178 }
179
180
181 /* EOF */