mirror of
https://github.com/reactos/reactos.git
synced 2025-04-25 16:10:29 +00:00
- Fix ReadDirectoryChangesW
- FindFirstChangeNotificationW +17 passed winetests svn path=/trunk/; revision=38486
This commit is contained in:
parent
abdee726bc
commit
85e610895c
1 changed files with 44 additions and 10 deletions
|
@ -92,12 +92,7 @@ FindFirstChangeNotificationW (
|
||||||
&ObjectAttributes,
|
&ObjectAttributes,
|
||||||
&IoStatus,
|
&IoStatus,
|
||||||
FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE,
|
FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE,
|
||||||
FILE_DIRECTORY_FILE);
|
FILE_DIRECTORY_FILE | FILE_OPEN_FOR_BACKUP_INTENT);
|
||||||
|
|
||||||
/*
|
|
||||||
FIXME: I think we should use FILE_OPEN_FOR_BACKUP_INTENT. See M$ Q188321
|
|
||||||
-Gunnar
|
|
||||||
*/
|
|
||||||
|
|
||||||
RtlFreeHeap(RtlGetProcessHeap(),
|
RtlFreeHeap(RtlGetProcessHeap(),
|
||||||
0,
|
0,
|
||||||
|
@ -122,6 +117,7 @@ FindFirstChangeNotificationW (
|
||||||
(BOOLEAN)bWatchSubtree);
|
(BOOLEAN)bWatchSubtree);
|
||||||
if (!NT_SUCCESS(Status))
|
if (!NT_SUCCESS(Status))
|
||||||
{
|
{
|
||||||
|
NtClose(hDir);
|
||||||
SetLastErrorByStatus(Status);
|
SetLastErrorByStatus(Status);
|
||||||
return INVALID_HANDLE_VALUE;
|
return INVALID_HANDLE_VALUE;
|
||||||
}
|
}
|
||||||
|
@ -185,24 +181,62 @@ ReadDirectoryChangesW(
|
||||||
LPOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine /* OPTIONAL???????? */
|
LPOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine /* OPTIONAL???????? */
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
|
PVOID CompletionRoutine;
|
||||||
NTSTATUS Status;
|
NTSTATUS Status;
|
||||||
IO_STATUS_BLOCK IoStatus;
|
IO_STATUS_BLOCK IoStatus;
|
||||||
|
HANDLE EventHandle;
|
||||||
|
PIO_APC_ROUTINE IoApcRoutine;
|
||||||
|
|
||||||
if (lpOverlapped )
|
if (lpOverlapped )
|
||||||
|
{
|
||||||
|
if (lpCompletionRoutine)
|
||||||
|
{
|
||||||
|
CompletionRoutine = (PVOID) lpCompletionRoutine;
|
||||||
|
EventHandle = NULL;
|
||||||
|
IoApcRoutine = ApcRoutine;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (((ULONG_PTR) lpOverlapped->hEvent & 1) == 0)
|
||||||
|
CompletionRoutine = (PVOID) lpOverlapped;
|
||||||
|
else
|
||||||
|
CompletionRoutine = NULL;
|
||||||
|
|
||||||
|
EventHandle = lpOverlapped->hEvent;
|
||||||
|
IoApcRoutine = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
lpOverlapped->Internal = STATUS_PENDING;
|
lpOverlapped->Internal = STATUS_PENDING;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
EventHandle = NULL;
|
||||||
|
IoApcRoutine = NULL;
|
||||||
|
CompletionRoutine = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
Status = NtNotifyChangeDirectoryFile(
|
Status = NtNotifyChangeDirectoryFile(
|
||||||
hDirectory,
|
hDirectory,
|
||||||
lpOverlapped ? lpOverlapped->hEvent : NULL,
|
EventHandle,
|
||||||
lpCompletionRoutine ? ApcRoutine : NULL, /* ApcRoutine OPTIONAL???? */
|
IoApcRoutine,
|
||||||
lpCompletionRoutine, /* ApcContext */
|
CompletionRoutine, /* ApcContext */
|
||||||
lpOverlapped ? (PIO_STATUS_BLOCK)lpOverlapped : &IoStatus,
|
lpOverlapped ? (PIO_STATUS_BLOCK)lpOverlapped->Internal : &IoStatus,
|
||||||
lpBuffer,
|
lpBuffer,
|
||||||
nBufferLength,
|
nBufferLength,
|
||||||
dwNotifyFilter,
|
dwNotifyFilter,
|
||||||
(BOOLEAN)bWatchSubtree
|
(BOOLEAN)bWatchSubtree
|
||||||
);
|
);
|
||||||
|
|
||||||
|
if ((Status == STATUS_PENDING) && (!lpOverlapped))
|
||||||
|
{
|
||||||
|
Status = NtWaitForSingleObject(hDirectory, FALSE, NULL);
|
||||||
|
|
||||||
|
if (NT_SUCCESS(Status))
|
||||||
|
{
|
||||||
|
Status = IoStatus.Status;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (!NT_SUCCESS(Status))
|
if (!NT_SUCCESS(Status))
|
||||||
{
|
{
|
||||||
SetLastErrorByStatus(Status);
|
SetLastErrorByStatus(Status);
|
||||||
|
|
Loading…
Reference in a new issue