mirror of
https://github.com/reactos/reactos.git
synced 2024-12-28 01:55:19 +00:00
init. change notification work
svn path=/trunk/; revision=4416
This commit is contained in:
parent
f771a79dd9
commit
d3c97ea09d
1 changed files with 92 additions and 14 deletions
|
@ -1,4 +1,4 @@
|
|||
/* $Id: cnotify.c,v 1.4 2003/01/15 21:24:33 chorns Exp $
|
||||
/* $Id: cnotify.c,v 1.5 2003/03/23 19:51:11 gdalsnes Exp $
|
||||
*
|
||||
* COPYRIGHT: See COPYING in the top level directory
|
||||
* PROJECT: ReactOS system libraries
|
||||
|
@ -11,11 +11,14 @@
|
|||
|
||||
#include <k32.h>
|
||||
|
||||
#define NDEBUG
|
||||
#include <kernel32/kernel32.h>
|
||||
|
||||
WINBOOL STDCALL
|
||||
FindCloseChangeNotification (HANDLE hChangeHandle)
|
||||
{
|
||||
return FALSE;
|
||||
NtClose(hChangeHandle);
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
||||
|
@ -27,34 +30,34 @@ FindFirstChangeNotificationA (
|
|||
DWORD dwNotifyFilter
|
||||
)
|
||||
{
|
||||
#if 0
|
||||
UNICODE_STRING PathNameU;
|
||||
ANSI_STRING PathName;
|
||||
HANDLE Result;
|
||||
HANDLE hNotify;
|
||||
|
||||
RtlInitAnsiString (&PathName,
|
||||
(LPSTR)lpPathName);
|
||||
|
||||
/* convert ansi (or oem) string to unicode */
|
||||
if (bIsFileApiAnsi)
|
||||
{
|
||||
RtlAnsiStringToUnicodeString (&PathNameU,
|
||||
&PathName,
|
||||
TRUE);
|
||||
}
|
||||
else
|
||||
{
|
||||
RtlOemStringToUnicodeString (&PathNameU,
|
||||
&PathName,
|
||||
TRUE);
|
||||
}
|
||||
|
||||
Result = FindFirstChangeNotificationW (PathNameU.Buffer,
|
||||
bWatchSubtree,
|
||||
dwNotifyFilter);
|
||||
hNotify = FindFirstChangeNotificationW (PathNameU.Buffer,
|
||||
bWatchSubtree,
|
||||
dwNotifyFilter);
|
||||
|
||||
RtlFreeHeap (RtlGetProcessHeap (),
|
||||
0,
|
||||
RootPathNameU.Buffer);
|
||||
RtlFreeUnicodeString(&PathNameU);
|
||||
|
||||
return Result;
|
||||
#endif
|
||||
return hNotify;
|
||||
}
|
||||
|
||||
|
||||
|
@ -66,7 +69,63 @@ FindFirstChangeNotificationW (
|
|||
DWORD dwNotifyFilter
|
||||
)
|
||||
{
|
||||
return NULL;
|
||||
NTSTATUS Status;
|
||||
UNICODE_STRING NtPathU;
|
||||
IO_STATUS_BLOCK IoStatus;
|
||||
OBJECT_ATTRIBUTES ObjectAttributes;
|
||||
HANDLE hDir;
|
||||
|
||||
/*
|
||||
RtlDosPathNameToNtPathName takes a fully qualified file name "C:\Projects\LoadLibrary\Debug\TestDll.dll"
|
||||
and returns something like "\??\C:\Projects\LoadLibrary\Debug\TestDll.dll."
|
||||
If the file name cannot be interpreted, then the routine returns STATUS_OBJECT_PATH_SYNTAX_BAD and
|
||||
ends execution.
|
||||
*/
|
||||
|
||||
if (!RtlDosPathNameToNtPathName_U ((LPWSTR)lpPathName,
|
||||
&NtPathU,
|
||||
NULL,
|
||||
NULL))
|
||||
{
|
||||
SetLastErrorByStatus(STATUS_PATH_SYNTAX_BAD);
|
||||
return INVALID_HANDLE_VALUE;
|
||||
}
|
||||
|
||||
InitializeObjectAttributes (&ObjectAttributes,
|
||||
&NtPathU,
|
||||
0,
|
||||
NULL,
|
||||
NULL);
|
||||
|
||||
Status = NtOpenFile (hDir,
|
||||
SYNCHRONIZE|FILE_LIST_DIRECTORY,
|
||||
&ObjectAttributes,
|
||||
&IoStatus,
|
||||
FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE,
|
||||
FILE_DIRECTORY_FILE);
|
||||
|
||||
if (!NT_SUCCESS(Status))
|
||||
{
|
||||
SetLastErrorByStatus(Status);
|
||||
return INVALID_HANDLE_VALUE;
|
||||
}
|
||||
|
||||
Status = NtNotifyChangeDirectoryFile(hDir,
|
||||
NULL,
|
||||
NULL,
|
||||
NULL,
|
||||
&IoStatus,
|
||||
NULL,//Buffer,
|
||||
0,//BufferLength,
|
||||
dwNotifyFilter,
|
||||
bWatchSubtree);
|
||||
if (!NT_SUCCESS(Status))
|
||||
{
|
||||
SetLastErrorByStatus(Status);
|
||||
return INVALID_HANDLE_VALUE;
|
||||
}
|
||||
|
||||
return hDir;
|
||||
}
|
||||
|
||||
|
||||
|
@ -76,7 +135,26 @@ FindNextChangeNotification (
|
|||
HANDLE hChangeHandle
|
||||
)
|
||||
{
|
||||
return FALSE;
|
||||
IO_STATUS_BLOCK IoStatus;
|
||||
NTSTATUS Status;
|
||||
|
||||
Status = NtNotifyChangeDirectoryFile(hChangeHandle,
|
||||
NULL,
|
||||
NULL,
|
||||
NULL,
|
||||
&IoStatus,
|
||||
NULL,//Buffer,
|
||||
0,//BufferLength,
|
||||
FILE_NOTIFY_CHANGE_SECURITY,//meaningless for subsequent calls, but must contain a valid flag(s)
|
||||
0//meaningless for subsequent calls
|
||||
);
|
||||
if (!NT_SUCCESS(Status))
|
||||
{
|
||||
SetLastErrorByStatus(Status);
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
/* EOF */
|
||||
|
|
Loading…
Reference in a new issue