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)
15 #include "../include/debug.h"
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
,
98 FIXME: I think we should use FILE_OPEN_FOR_BACKUP_INTENT. See M$ Q188321
102 RtlFreeHeap(RtlGetProcessHeap(),
108 if (!NT_SUCCESS(Status
))
110 SetLastErrorByStatus(Status
);
111 return INVALID_HANDLE_VALUE
;
114 Status
= NtNotifyChangeDirectoryFile(hDir
,
122 (BOOLEAN
)bWatchSubtree
);
123 if (!NT_SUCCESS(Status
))
125 SetLastErrorByStatus(Status
);
126 return INVALID_HANDLE_VALUE
;
138 FindNextChangeNotification (
142 IO_STATUS_BLOCK IoStatus
;
145 Status
= NtNotifyChangeDirectoryFile(hChangeHandle
,
152 FILE_NOTIFY_CHANGE_SECURITY
,//meaningless/ignored for subsequent calls, but must contain a valid flag
153 0 //meaningless/ignored for subsequent calls
156 if (!NT_SUCCESS(Status
))
158 SetLastErrorByStatus(Status
);
167 (STDCALL ApcRoutine
)(PVOID ApcContext
,
168 struct _IO_STATUS_BLOCK
* IoStatusBlock
,
177 ReadDirectoryChangesW(
179 LPVOID lpBuffer OPTIONAL
,
182 DWORD dwNotifyFilter
,
183 LPDWORD lpBytesReturned
, /* undefined for asych. operations */
184 LPOVERLAPPED lpOverlapped OPTIONAL
,
185 LPOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine
/* OPTIONAL???????? */
189 IO_STATUS_BLOCK IoStatus
;
192 lpOverlapped
->Internal
= STATUS_PENDING
;
194 Status
= NtNotifyChangeDirectoryFile(
196 lpOverlapped
? lpOverlapped
->hEvent
: NULL
,
197 lpCompletionRoutine
? ApcRoutine
: NULL
, /* ApcRoutine OPTIONAL???? */
198 lpCompletionRoutine
, /* ApcContext */
199 lpOverlapped
? (PIO_STATUS_BLOCK
)lpOverlapped
: &IoStatus
,
203 (BOOLEAN
)bWatchSubtree
206 if (!NT_SUCCESS(Status
))
208 SetLastErrorByStatus(Status
);
213 /* NOTE: lpBytesReturned is undefined for asynch. operations */
214 *lpBytesReturned
= IoStatus
.Information
;