فهرست منبع

Fixes for handling TFileNotifyInformation structure from dc855630a2a

(FileName is not null-terminated + Next entry offset was incorrectly processed as PChar is two-byte in Unicode)

(cherry picked from commit 941e1d6f7df879acb508f5e513b0e7ef07d7ed79)

Source commit: 2557a9119ed2531825a11d3e3046f175805a31be
Martin Prikryl 7 سال پیش
والد
کامیت
a0074b338a
1فایلهای تغییر یافته به همراه10 افزوده شده و 8 حذف شده
  1. 10 8
      source/packages/my/DirectoryMonitor.pas

+ 10 - 8
source/packages/my/DirectoryMonitor.pas

@@ -96,19 +96,21 @@ end;
 procedure TDirectoryMonitorThread.HandleEvent;
 var
   FileOpNotification: PFileNotifyInformation;
-  Offset: Longint;
+  Offset: DWord;
+  FileName: string;
 begin
-  Pointer(FileOpNotification) := @FParent.FNotificationBuffer[0];
+  FileOpNotification := PFileNotifyInformation(@FParent.FNotificationBuffer[0]);
   repeat
     Offset := FileOpNotification^.NextEntryOffset;
+    FileName := WideCharLenToString(@(FileOpNotification^.FileName), FileOpNotification^.FileNameLength div SizeOf(Char));
     case FileOpNotification^.Action of
-      1: FParent.DoCreated(FParent, WideCharTostring(@(FileOpNotification^.FileName)));
-      2: FParent.DoDeleted(FParent, WideCharTostring(@(FileOpNotification^.FileName)));
-      3: FParent.DoModified(FParent, WideCharTostring(@(FileOpNotification^.FileName)));
-      4: FRenamedFrom := WideCharTostring(@(FileOpNotification^.FileName));
-      5: FParent.DoRenamed(FParent, FRenamedFrom, WideCharToString(@(FileOpNotification^.FileName)));
+      1: FParent.DoCreated(FParent, FileName);
+      2: FParent.DoDeleted(FParent, FileName);
+      3: FParent.DoModified(FParent, FileName);
+      4: FRenamedFrom := FileName;
+      5: FParent.DoRenamed(FParent, FRenamedFrom, FileName);
     end;
-    PChar(FileOpNotification) := PChar(FileOpNotification)+Offset;
+    FileOpNotification := PFileNotifyInformation(IntPtr(FileOpNotification) + IntPtr(Offset));
   until (Offset = 0);
 end;