- Go away STDCALL, time has come for WINAPI and NTAPI
[reactos.git] / reactos / dll / win32 / kernel32 / file / cnotify.c
1 /* $Id$
2 *
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)
8 * UPDATE HISTORY:
9 * Created 01/11/98
10 */
11
12 #include <k32.h>
13 #include <wine/debug.h>
14
15 WINE_DEFAULT_DEBUG_CHANNEL(kernel32file);
16
17 /*
18 * @implemented
19 */
20 BOOL WINAPI
21 FindCloseChangeNotification (HANDLE hChangeHandle)
22 {
23 NTSTATUS Status = NtClose(hChangeHandle);
24 if(!NT_SUCCESS(Status))
25 {
26 SetLastErrorByStatus(Status);
27 return FALSE;
28 }
29
30 return TRUE;
31 }
32
33
34 /*
35 * @implemented
36 */
37 HANDLE
38 WINAPI
39 FindFirstChangeNotificationA (
40 LPCSTR lpPathName,
41 BOOL bWatchSubtree,
42 DWORD dwNotifyFilter
43 )
44 {
45 PWCHAR PathNameW;
46
47 if (!(PathNameW = FilenameA2W(lpPathName, FALSE)))
48 return INVALID_HANDLE_VALUE;
49
50 return FindFirstChangeNotificationW (PathNameW ,
51 bWatchSubtree,
52 dwNotifyFilter);
53 }
54
55
56 /*
57 * @implemented
58 */
59 HANDLE
60 WINAPI
61 FindFirstChangeNotificationW (
62 LPCWSTR lpPathName,
63 BOOL bWatchSubtree,
64 DWORD dwNotifyFilter
65 )
66 {
67 NTSTATUS Status;
68 UNICODE_STRING NtPathU;
69 IO_STATUS_BLOCK IoStatus;
70 OBJECT_ATTRIBUTES ObjectAttributes;
71 HANDLE hDir;
72
73 if (!RtlDosPathNameToNtPathName_U (lpPathName,
74 &NtPathU,
75 NULL,
76 NULL))
77 {
78 SetLastErrorByStatus(STATUS_OBJECT_PATH_SYNTAX_BAD);
79 return INVALID_HANDLE_VALUE;
80 }
81
82
83
84 InitializeObjectAttributes (&ObjectAttributes,
85 &NtPathU,
86 OBJ_CASE_INSENSITIVE,
87 NULL,
88 NULL);
89
90 Status = NtOpenFile (&hDir,
91 SYNCHRONIZE|FILE_LIST_DIRECTORY,
92 &ObjectAttributes,
93 &IoStatus,
94 FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE,
95 FILE_DIRECTORY_FILE);
96
97 /*
98 FIXME: I think we should use FILE_OPEN_FOR_BACKUP_INTENT. See M$ Q188321
99 -Gunnar
100 */
101
102 RtlFreeHeap(RtlGetProcessHeap(),
103 0,
104 NtPathU.Buffer);
105
106
107
108 if (!NT_SUCCESS(Status))
109 {
110 SetLastErrorByStatus(Status);
111 return INVALID_HANDLE_VALUE;
112 }
113
114 Status = NtNotifyChangeDirectoryFile(hDir,
115 NULL,
116 NULL,
117 NULL,
118 &IoStatus,
119 NULL,//Buffer,
120 0,//BufferLength,
121 dwNotifyFilter,
122 (BOOLEAN)bWatchSubtree);
123 if (!NT_SUCCESS(Status))
124 {
125 SetLastErrorByStatus(Status);
126 return INVALID_HANDLE_VALUE;
127 }
128
129 return hDir;
130 }
131
132
133 /*
134 * @implemented
135 */
136 BOOL
137 WINAPI
138 FindNextChangeNotification (
139 HANDLE hChangeHandle
140 )
141 {
142 IO_STATUS_BLOCK IoStatus;
143 NTSTATUS Status;
144
145 Status = NtNotifyChangeDirectoryFile(hChangeHandle,
146 NULL,
147 NULL,
148 NULL,
149 &IoStatus,
150 NULL,//Buffer,
151 0,//BufferLength,
152 FILE_NOTIFY_CHANGE_SECURITY,//meaningless/ignored for subsequent calls, but must contain a valid flag
153 0 //meaningless/ignored for subsequent calls
154 );
155
156 if (!NT_SUCCESS(Status))
157 {
158 SetLastErrorByStatus(Status);
159 return FALSE;
160 }
161
162 return TRUE;
163 }
164
165
166 extern VOID
167 (WINAPI ApcRoutine)(PVOID ApcContext,
168 struct _IO_STATUS_BLOCK* IoStatusBlock,
169 ULONG Reserved);
170
171
172 /*
173 * @implemented
174 */
175 BOOL
176 WINAPI
177 ReadDirectoryChangesW(
178 HANDLE hDirectory,
179 LPVOID lpBuffer OPTIONAL,
180 DWORD nBufferLength,
181 BOOL bWatchSubtree,
182 DWORD dwNotifyFilter,
183 LPDWORD lpBytesReturned, /* undefined for asych. operations */
184 LPOVERLAPPED lpOverlapped OPTIONAL,
185 LPOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine /* OPTIONAL???????? */
186 )
187 {
188 NTSTATUS Status;
189 IO_STATUS_BLOCK IoStatus;
190
191 if (lpOverlapped )
192 lpOverlapped->Internal = STATUS_PENDING;
193
194 Status = NtNotifyChangeDirectoryFile(
195 hDirectory,
196 lpOverlapped ? lpOverlapped->hEvent : NULL,
197 lpCompletionRoutine ? ApcRoutine : NULL, /* ApcRoutine OPTIONAL???? */
198 lpCompletionRoutine, /* ApcContext */
199 lpOverlapped ? (PIO_STATUS_BLOCK)lpOverlapped : &IoStatus,
200 lpBuffer,
201 nBufferLength,
202 dwNotifyFilter,
203 (BOOLEAN)bWatchSubtree
204 );
205
206 if (!NT_SUCCESS(Status))
207 {
208 SetLastErrorByStatus(Status);
209 return FALSE;
210 }
211
212
213 /* NOTE: lpBytesReturned is undefined for asynch. operations */
214 *lpBytesReturned = IoStatus.Information;
215
216 return TRUE;
217 }
218
219
220
221
222
223 /* EOF */