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)
12 /* INCLUDES *****************************************************************/
18 /* FUNCTIONS ****************************************************************/
24 FindCloseChangeNotification (HANDLE hChangeHandle
)
26 NTSTATUS Status
= NtClose(hChangeHandle
);
27 if(!NT_SUCCESS(Status
))
29 BaseSetLastNTError(Status
);
42 FindFirstChangeNotificationA(IN LPCSTR lpPathName
,
43 IN BOOL bWatchSubtree
,
44 IN DWORD dwNotifyFilter
)
46 /* Call the W(ide) function */
47 ConvertWin32AnsiChangeApiToUnicodeApi(FindFirstChangeNotification
,
59 FindFirstChangeNotificationW (
66 UNICODE_STRING NtPathU
;
67 IO_STATUS_BLOCK IoStatus
;
68 OBJECT_ATTRIBUTES ObjectAttributes
;
71 if (!RtlDosPathNameToNtPathName_U (lpPathName
,
76 BaseSetLastNTError(STATUS_OBJECT_PATH_SYNTAX_BAD
);
77 return INVALID_HANDLE_VALUE
;
82 InitializeObjectAttributes (&ObjectAttributes
,
88 Status
= NtOpenFile (&hDir
,
89 SYNCHRONIZE
|FILE_LIST_DIRECTORY
,
92 FILE_SHARE_READ
|FILE_SHARE_WRITE
|FILE_SHARE_DELETE
,
93 FILE_DIRECTORY_FILE
| FILE_OPEN_FOR_BACKUP_INTENT
);
95 RtlFreeHeap(RtlGetProcessHeap(),
101 if (!NT_SUCCESS(Status
))
103 BaseSetLastNTError(Status
);
104 return INVALID_HANDLE_VALUE
;
107 Status
= NtNotifyChangeDirectoryFile(hDir
,
115 (BOOLEAN
)bWatchSubtree
);
116 if (!NT_SUCCESS(Status
))
119 BaseSetLastNTError(Status
);
120 return INVALID_HANDLE_VALUE
;
132 FindNextChangeNotification (
136 IO_STATUS_BLOCK IoStatus
;
139 Status
= NtNotifyChangeDirectoryFile(hChangeHandle
,
146 FILE_NOTIFY_CHANGE_SECURITY
,//meaningless/ignored for subsequent calls, but must contain a valid flag
147 0 //meaningless/ignored for subsequent calls
150 if (!NT_SUCCESS(Status
))
152 BaseSetLastNTError(Status
);
161 (WINAPI ApcRoutine
)(PVOID ApcContext
,
162 struct _IO_STATUS_BLOCK
* IoStatusBlock
,
171 ReadDirectoryChangesW(
173 LPVOID lpBuffer OPTIONAL
,
176 DWORD dwNotifyFilter
,
177 LPDWORD lpBytesReturned
, /* undefined for asych. operations */
178 LPOVERLAPPED lpOverlapped OPTIONAL
,
179 LPOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine
/* OPTIONAL???????? */
182 PVOID CompletionRoutine
;
184 IO_STATUS_BLOCK IoStatus
;
186 PIO_APC_ROUTINE IoApcRoutine
;
190 if (lpCompletionRoutine
)
192 CompletionRoutine
= (PVOID
) lpCompletionRoutine
;
194 IoApcRoutine
= ApcRoutine
;
198 if (((ULONG_PTR
) lpOverlapped
->hEvent
& 1) == 0)
199 CompletionRoutine
= (PVOID
) lpOverlapped
;
201 CompletionRoutine
= NULL
;
203 EventHandle
= lpOverlapped
->hEvent
;
207 lpOverlapped
->Internal
= STATUS_PENDING
;
213 CompletionRoutine
= NULL
;
216 Status
= NtNotifyChangeDirectoryFile(
220 CompletionRoutine
, /* ApcContext */
221 lpOverlapped
? (PIO_STATUS_BLOCK
) lpOverlapped
: &IoStatus
,
225 (BOOLEAN
)bWatchSubtree
228 if ((Status
== STATUS_PENDING
) && (!lpOverlapped
))
230 Status
= NtWaitForSingleObject(hDirectory
, FALSE
, NULL
);
232 if (NT_SUCCESS(Status
))
234 Status
= IoStatus
.Status
;
238 if (!NT_SUCCESS(Status
))
240 BaseSetLastNTError(Status
);
245 /* NOTE: lpBytesReturned is undefined for asynch. operations */
246 *lpBytesReturned
= IoStatus
.Information
;