3 * COPYRIGHT: See COPYING in the top level directory
4 * PROJECT: ReactOS system libraries
5 * FILE: lib/kernel32/file/find.c
6 * PURPOSE: Find functions
7 * PROGRAMMER: Ariadne ( ariadne@xs4all.nl)
20 FindCloseChangeNotification (HANDLE hChangeHandle
)
22 NTSTATUS Status
= NtClose(hChangeHandle
);
23 if(!NT_SUCCESS(Status
))
25 SetLastErrorByStatus(Status
);
38 FindFirstChangeNotificationA (
46 if (!(PathNameW
= FilenameA2W(lpPathName
, FALSE
)))
47 return INVALID_HANDLE_VALUE
;
49 return FindFirstChangeNotificationW (PathNameW
,
60 FindFirstChangeNotificationW (
67 UNICODE_STRING NtPathU
;
68 IO_STATUS_BLOCK IoStatus
;
69 OBJECT_ATTRIBUTES ObjectAttributes
;
72 if (!RtlDosPathNameToNtPathName_U (lpPathName
,
77 SetLastErrorByStatus(STATUS_OBJECT_PATH_SYNTAX_BAD
);
78 return INVALID_HANDLE_VALUE
;
83 InitializeObjectAttributes (&ObjectAttributes
,
89 Status
= NtOpenFile (&hDir
,
90 SYNCHRONIZE
|FILE_LIST_DIRECTORY
,
93 FILE_SHARE_READ
|FILE_SHARE_WRITE
|FILE_SHARE_DELETE
,
94 FILE_DIRECTORY_FILE
| FILE_OPEN_FOR_BACKUP_INTENT
);
96 RtlFreeHeap(RtlGetProcessHeap(),
102 if (!NT_SUCCESS(Status
))
104 SetLastErrorByStatus(Status
);
105 return INVALID_HANDLE_VALUE
;
108 Status
= NtNotifyChangeDirectoryFile(hDir
,
116 (BOOLEAN
)bWatchSubtree
);
117 if (!NT_SUCCESS(Status
))
120 SetLastErrorByStatus(Status
);
121 return INVALID_HANDLE_VALUE
;
133 FindNextChangeNotification (
137 IO_STATUS_BLOCK IoStatus
;
140 Status
= NtNotifyChangeDirectoryFile(hChangeHandle
,
147 FILE_NOTIFY_CHANGE_SECURITY
,//meaningless/ignored for subsequent calls, but must contain a valid flag
148 0 //meaningless/ignored for subsequent calls
151 if (!NT_SUCCESS(Status
))
153 SetLastErrorByStatus(Status
);
162 (WINAPI ApcRoutine
)(PVOID ApcContext
,
163 struct _IO_STATUS_BLOCK
* IoStatusBlock
,
172 ReadDirectoryChangesW(
174 LPVOID lpBuffer OPTIONAL
,
177 DWORD dwNotifyFilter
,
178 LPDWORD lpBytesReturned
, /* undefined for asych. operations */
179 LPOVERLAPPED lpOverlapped OPTIONAL
,
180 LPOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine
/* OPTIONAL???????? */
183 PVOID CompletionRoutine
;
185 IO_STATUS_BLOCK IoStatus
;
187 PIO_APC_ROUTINE IoApcRoutine
;
191 if (lpCompletionRoutine
)
193 CompletionRoutine
= (PVOID
) lpCompletionRoutine
;
195 IoApcRoutine
= ApcRoutine
;
199 if (((ULONG_PTR
) lpOverlapped
->hEvent
& 1) == 0)
200 CompletionRoutine
= (PVOID
) lpOverlapped
;
202 CompletionRoutine
= NULL
;
204 EventHandle
= lpOverlapped
->hEvent
;
208 lpOverlapped
->Internal
= STATUS_PENDING
;
214 CompletionRoutine
= NULL
;
217 Status
= NtNotifyChangeDirectoryFile(
221 CompletionRoutine
, /* ApcContext */
222 lpOverlapped
? (PIO_STATUS_BLOCK
) lpOverlapped
: &IoStatus
,
226 (BOOLEAN
)bWatchSubtree
229 if ((Status
== STATUS_PENDING
) && (!lpOverlapped
))
231 Status
= NtWaitForSingleObject(hDirectory
, FALSE
, NULL
);
233 if (NT_SUCCESS(Status
))
235 Status
= IoStatus
.Status
;
239 if (!NT_SUCCESS(Status
))
241 SetLastErrorByStatus(Status
);
246 /* NOTE: lpBytesReturned is undefined for asynch. operations */
247 *lpBytesReturned
= IoStatus
.Information
;