2 Stimmen

ReadDirectoryChangesW: Wie erkennt man einen Pufferüberlauf, wenn man asynchron verwendet?

Ich benutze ReadDirectoryChangesW (Windows API) asynchron in Kombination mit GetQueuedCompletionStatus. Wie kann ich einen möglichen Pufferüberlauf erkennen, um zu verstehen, dass mindestens ein Dateisystemänderungsereignis verloren gegangen ist?

2voto

Ben Voigt Punkte 268424

Wenn Sie ReadDirectoryChangesW asynchron verwenden, erhalten Sie die erste Gruppe von Ereignissen, dann müssen Sie sie erneut aufrufen, um weitere Ereignisse zu erhalten. Es ist kein Fehler, mehr Ereignisse zu haben als in Ihrem Puffer passen. Wenn es mehr Ereignisse gibt, als in den OS-Ebene-Puffer passen, handelt es sich um den Fehlerfall, den Sie wie folgt herausfinden:

  1. Ein Ereignis tritt auf.
  2. Die asynchrone Operation, die durch ReadDirectoryChangesW gestartet wurde, wird erfolgreich abgeschlossen. Ihr Puffer ist gefüllt, Ihr Ereignishandle ist gesetzt oder der IOCP wird ausgelöst.
  3. Zusätzliche Ereignisse treten auf, die im OS-Ebene-Puffer gespeichert sind.
  4. Weitere zusätzliche Ereignisse treten auf, die den OS-Ebene-Puffer überlaufen. Dies ändert nicht den Status der überlappenden Operation, die bereits in Schritt 2 erfolgreich war.
  5. Sie warten auf das Ereignishandle oder verarbeiten das IOCP und entdecken den abgeschlossenen überlappenden Aufruf.
  6. Sie rufen ReadDirectoryChangesW erneut auf, um eine asynchrone überlappende Operation zu starten und nach Ereignissen zu suchen, die seit Schritt 2 aufgetreten sind. Dieser Aufruf schlägt synchron fehl, mit GetLastError() == ERROR_NOTIFY_ENUM_DIR, oder gelingt mit dwBytesTransferred == 0, da die Dokumentation sagt, dass dies auch bedeutet, das Verzeichnis erneut aufzulisten

Wenn die Anzahl der übertragenen Bytes null beträgt, war der Puffer entweder zu groß für das System zur Allokation oder zu klein, um detaillierte Informationen zu allen Änderungen zu liefern, die im Verzeichnis oder Unterbaum aufgetreten sind. In diesem Fall sollten Sie die Änderungen berechnen, indem Sie das Verzeichnis oder den Unterbaum aufzählen.

0voto

Jeff Wolski Punkte 6324

Sie können Ihre Erkennungen auf diese Weise möglicherweise nicht durchführen, aber hier ist ein großartiges Tutorial, das helfen könnte.

Sie könnten auch die Antwort auf diese andere Frage überprüfen.

-1voto

user541686 Punkte 196656

Es scheint, dass laut hier kein solcher Fehlercode asynchron zurückgegeben wird.

Vorschlag: Überwachen Sie Änderungen synchron, aber in einem dedizierten Thread, und achten Sie auf ERROR_NOTIFY_ENUM_DIR.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X