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 SetLastErrorByStatus(Status
);
42 FindFirstChangeNotificationA(IN LPCSTR lpPathName
,
43 IN BOOL bWatchSubtree
,
44 IN DWORD dwNotifyFilter
)
47 ANSI_STRING PathNameString
;
49 RtlInitAnsiString(&PathNameString
, lpPathName
);
50 Status
= RtlAnsiStringToUnicodeString(&(NtCurrentTeb()->StaticUnicodeString
), &PathNameString
, FALSE
);
51 if (!NT_SUCCESS(Status
))
53 if (Status
!= STATUS_BUFFER_OVERFLOW
)
55 SetLastError(ERROR_FILENAME_EXCED_RANGE
);
59 BaseSetLastNTError(Status
);
61 return INVALID_HANDLE_VALUE
;
64 return FindFirstChangeNotificationW(NtCurrentTeb()->StaticUnicodeString
.Buffer
,
65 bWatchSubtree
, dwNotifyFilter
);
74 FindFirstChangeNotificationW (
81 UNICODE_STRING NtPathU
;
82 IO_STATUS_BLOCK IoStatus
;
83 OBJECT_ATTRIBUTES ObjectAttributes
;
86 if (!RtlDosPathNameToNtPathName_U (lpPathName
,
91 SetLastErrorByStatus(STATUS_OBJECT_PATH_SYNTAX_BAD
);
92 return INVALID_HANDLE_VALUE
;
97 InitializeObjectAttributes (&ObjectAttributes
,
103 Status
= NtOpenFile (&hDir
,
104 SYNCHRONIZE
|FILE_LIST_DIRECTORY
,
107 FILE_SHARE_READ
|FILE_SHARE_WRITE
|FILE_SHARE_DELETE
,
108 FILE_DIRECTORY_FILE
| FILE_OPEN_FOR_BACKUP_INTENT
);
110 RtlFreeHeap(RtlGetProcessHeap(),
116 if (!NT_SUCCESS(Status
))
118 SetLastErrorByStatus(Status
);
119 return INVALID_HANDLE_VALUE
;
122 Status
= NtNotifyChangeDirectoryFile(hDir
,
130 (BOOLEAN
)bWatchSubtree
);
131 if (!NT_SUCCESS(Status
))
134 SetLastErrorByStatus(Status
);
135 return INVALID_HANDLE_VALUE
;
147 FindNextChangeNotification (
151 IO_STATUS_BLOCK IoStatus
;
154 Status
= NtNotifyChangeDirectoryFile(hChangeHandle
,
161 FILE_NOTIFY_CHANGE_SECURITY
,//meaningless/ignored for subsequent calls, but must contain a valid flag
162 0 //meaningless/ignored for subsequent calls
165 if (!NT_SUCCESS(Status
))
167 SetLastErrorByStatus(Status
);
176 (WINAPI ApcRoutine
)(PVOID ApcContext
,
177 struct _IO_STATUS_BLOCK
* IoStatusBlock
,
186 ReadDirectoryChangesW(
188 LPVOID lpBuffer OPTIONAL
,
191 DWORD dwNotifyFilter
,
192 LPDWORD lpBytesReturned
, /* undefined for asych. operations */
193 LPOVERLAPPED lpOverlapped OPTIONAL
,
194 LPOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine
/* OPTIONAL???????? */
197 PVOID CompletionRoutine
;
199 IO_STATUS_BLOCK IoStatus
;
201 PIO_APC_ROUTINE IoApcRoutine
;
205 if (lpCompletionRoutine
)
207 CompletionRoutine
= (PVOID
) lpCompletionRoutine
;
209 IoApcRoutine
= ApcRoutine
;
213 if (((ULONG_PTR
) lpOverlapped
->hEvent
& 1) == 0)
214 CompletionRoutine
= (PVOID
) lpOverlapped
;
216 CompletionRoutine
= NULL
;
218 EventHandle
= lpOverlapped
->hEvent
;
222 lpOverlapped
->Internal
= STATUS_PENDING
;
228 CompletionRoutine
= NULL
;
231 Status
= NtNotifyChangeDirectoryFile(
235 CompletionRoutine
, /* ApcContext */
236 lpOverlapped
? (PIO_STATUS_BLOCK
) lpOverlapped
: &IoStatus
,
240 (BOOLEAN
)bWatchSubtree
243 if ((Status
== STATUS_PENDING
) && (!lpOverlapped
))
245 Status
= NtWaitForSingleObject(hDirectory
, FALSE
, NULL
);
247 if (NT_SUCCESS(Status
))
249 Status
= IoStatus
.Status
;
253 if (!NT_SUCCESS(Status
))
255 SetLastErrorByStatus(Status
);
260 /* NOTE: lpBytesReturned is undefined for asynch. operations */
261 *lpBytesReturned
= IoStatus
.Information
;