public void NotifyChange(out object ioRequest, NtHandle handle, NotifyChangeFilter completionFilter, bool watchTree, int outputBufferSize, OnNotifyChangeCompleted onNotifyChangeCompleted, object context) { throw new NotImplementedException(); }
public NTStatus NotifyChange(out object ioRequest, object handle, NotifyChangeFilter completionFilter, bool watchTree, int outputBufferSize, OnNotifyChangeCompleted onNotifyChangeCompleted, object context) { byte[] buffer = new byte[outputBufferSize]; ManualResetEvent requestAddedEvent = new ManualResetEvent(false); PendingRequest request = new PendingRequest(); Thread m_thread = new Thread(delegate() { request.FileHandle = (IntPtr)handle; request.ThreadID = ThreadingHelper.GetCurrentThreadId(); m_pendingRequests.Add(request); // The request has been added, we can now return STATUS_PENDING. requestAddedEvent.Set(); NTStatus status = NtNotifyChangeDirectoryFile((IntPtr)handle, IntPtr.Zero, IntPtr.Zero, IntPtr.Zero, out request.IOStatusBlock, buffer, (uint)buffer.Length, completionFilter, watchTree); if (status == NTStatus.STATUS_SUCCESS) { int length = (int)request.IOStatusBlock.Information; buffer = ByteReader.ReadBytes(buffer, 0, length); } else { const NTStatus STATUS_ALERTED = (NTStatus)0x00000101; const NTStatus STATUS_OBJECT_TYPE_MISMATCH = (NTStatus)0xC0000024; buffer = new byte[0]; if (status == STATUS_OBJECT_TYPE_MISMATCH) { status = NTStatus.STATUS_INVALID_HANDLE; } else if (status == STATUS_ALERTED) { status = NTStatus.STATUS_CANCELLED; } // If the handle is closing and we had to cancel a ChangeNotify request as part of a cleanup, // we return STATUS_NOTIFY_CLEANUP as specified in [MS-FSA] 2.1.5.4. if (status == NTStatus.STATUS_CANCELLED && request.Cleanup) { status = NTStatus.STATUS_NOTIFY_CLEANUP; } } onNotifyChangeCompleted(status, buffer, context); m_pendingRequests.Remove((IntPtr)handle, request.ThreadID); }); m_thread.Start(); // We must wait for the request to be added in order for Cancel to function properly. requestAddedEvent.WaitOne(); ioRequest = request; return(NTStatus.STATUS_PENDING); }
public NTStatus NotifyChange(out object ioRequest, object handle, NotifyChangeFilter completionFilter, bool watchTree, int outputBufferSize, OnNotifyChangeCompleted onNotifyChangeCompleted, object context) { ioRequest = null; return(NTStatus.STATUS_NOT_SUPPORTED); }