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)
13 #include <wine/debug.h>
15 WINE_DEFAULT_DEBUG_CHANNEL(kernel32file
);
21 FindCloseChangeNotification (HANDLE hChangeHandle
)
23 NTSTATUS Status
= NtClose(hChangeHandle
);
24 if(!NT_SUCCESS(Status
))
26 SetLastErrorByStatus(Status
);
39 FindFirstChangeNotificationA (
47 if (!(PathNameW
= FilenameA2W(lpPathName
, FALSE
)))
48 return INVALID_HANDLE_VALUE
;
50 return FindFirstChangeNotificationW (PathNameW
,
61 FindFirstChangeNotificationW (
68 UNICODE_STRING NtPathU
;
69 IO_STATUS_BLOCK IoStatus
;
70 OBJECT_ATTRIBUTES ObjectAttributes
;
73 if (!RtlDosPathNameToNtPathName_U (lpPathName
,
78 SetLastErrorByStatus(STATUS_OBJECT_PATH_SYNTAX_BAD
);
79 return INVALID_HANDLE_VALUE
;
84 InitializeObjectAttributes (&ObjectAttributes
,
90 Status
= NtOpenFile (&hDir
,
91 SYNCHRONIZE
|FILE_LIST_DIRECTORY
,
94 FILE_SHARE_READ
|FILE_SHARE_WRITE
|FILE_SHARE_DELETE
,
95 FILE_DIRECTORY_FILE
| FILE_OPEN_FOR_BACKUP_INTENT
);
97 RtlFreeHeap(RtlGetProcessHeap(),
103 if (!NT_SUCCESS(Status
))
105 SetLastErrorByStatus(Status
);
106 return INVALID_HANDLE_VALUE
;
109 Status
= NtNotifyChangeDirectoryFile(hDir
,
117 (BOOLEAN
)bWatchSubtree
);
118 if (!NT_SUCCESS(Status
))
121 SetLastErrorByStatus(Status
);
122 return INVALID_HANDLE_VALUE
;
134 FindNextChangeNotification (
138 IO_STATUS_BLOCK IoStatus
;
141 Status
= NtNotifyChangeDirectoryFile(hChangeHandle
,
148 FILE_NOTIFY_CHANGE_SECURITY
,//meaningless/ignored for subsequent calls, but must contain a valid flag
149 0 //meaningless/ignored for subsequent calls
152 if (!NT_SUCCESS(Status
))
154 SetLastErrorByStatus(Status
);
163 (WINAPI ApcRoutine
)(PVOID ApcContext
,
164 struct _IO_STATUS_BLOCK
* IoStatusBlock
,
173 ReadDirectoryChangesW(
175 LPVOID lpBuffer OPTIONAL
,
178 DWORD dwNotifyFilter
,
179 LPDWORD lpBytesReturned
, /* undefined for asych. operations */
180 LPOVERLAPPED lpOverlapped OPTIONAL
,
181 LPOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine
/* OPTIONAL???????? */
184 PVOID CompletionRoutine
;
186 IO_STATUS_BLOCK IoStatus
;
188 PIO_APC_ROUTINE IoApcRoutine
;
192 if (lpCompletionRoutine
)
194 CompletionRoutine
= (PVOID
) lpCompletionRoutine
;
196 IoApcRoutine
= ApcRoutine
;
200 if (((ULONG_PTR
) lpOverlapped
->hEvent
& 1) == 0)
201 CompletionRoutine
= (PVOID
) lpOverlapped
;
203 CompletionRoutine
= NULL
;
205 EventHandle
= lpOverlapped
->hEvent
;
209 lpOverlapped
->Internal
= STATUS_PENDING
;
215 CompletionRoutine
= NULL
;
218 Status
= NtNotifyChangeDirectoryFile(
222 CompletionRoutine
, /* ApcContext */
223 lpOverlapped
? (PIO_STATUS_BLOCK
)lpOverlapped
->Internal
: &IoStatus
,
227 (BOOLEAN
)bWatchSubtree
230 if ((Status
== STATUS_PENDING
) && (!lpOverlapped
))
232 Status
= NtWaitForSingleObject(hDirectory
, FALSE
, NULL
);
234 if (NT_SUCCESS(Status
))
236 Status
= IoStatus
.Status
;
240 if (!NT_SUCCESS(Status
))
242 SetLastErrorByStatus(Status
);
247 /* NOTE: lpBytesReturned is undefined for asynch. operations */
248 *lpBytesReturned
= IoStatus
.Information
;