Freigeben über


Reagieren auf Check-Verify Anforderungen aus dem Dateisystem

Nach eigenem Ermessen kann das Dateisystem ein IRP an den Dispatch-Einstiegspunkt des Gerätetreibers senden, um IRP_MJ_DEVICE_CONTROL Anforderungen mit Parameters.DeviceIoControl.IoControlCode an den Dispatch-Einstiegspunkt des Gerätetreibers zu senden, wobei Parameters.DeviceIoControl.IoControlCode im E/A-Stapelspeicherort wie folgt festgelegt ist:

IOCTL_XXX_CHECK_VERIFY
Dabei ist XXX der Gerätetyp, z. B. DISK, TAPE oder CDROM.

Der Typ DISK umfasst sowohl nicht partitionierbare (Floppy) als auch partitionierbare Wechselmediengeräte.

Wenn der zugrunde liegende Gerätetreiber feststellt, dass sich die Medien nicht geändert haben, sollte der Treiber die IRP abschließen und den IoStatus-Block mit den folgenden Werten zurückgeben:

Status

Auf STATUS_SUCCESS festgelegt

Information

Auf 0 festlegen

Wenn der Gerätetyp DISK oder CDROM ist und der Aufrufer einen Ausgabepuffer angegeben hat, gibt der Treiber die Medienänderungsanzahl im Puffer bei Irp-AssociatedIrp.SystemBuffer> zurück und legt Irp-IoStatus.Information> auf sizeof(ULONG) fest. Durch die Rückgabe dieser Anzahl gibt der Treiber dem Aufrufer die Möglichkeit, zu bestimmen, ob sich die Medien aus seiner Perspektive geändert haben.

Wenn der zugrunde liegende Gerätetreiber feststellt, dass sich die Medien geändert haben, führt er eine andere Aktion aus, je nachdem, ob das Volume eingebunden ist. Wenn das Volume eingebunden ist (das flag VPB_MOUNTED im VPB festgelegt ist), sollte der Treiber die folgenden Schritte ausführen:

  1. Legen Sie die Flags im DeviceObject by ORing Flags mit DO_VERIFY_VOLUME fest.

  2. Legen Sie den IoStatus-Block im IRP auf Folgendes fest:

    • Status auf STATUS_VERIFY_REQUIRED festgelegt
    • Informationen , die auf 0 (null) festgelegt sind
  3. Rufen Sie IoCompleteRequest mit dem Eingabe-IRP auf.

Wenn das Volume nicht eingebunden ist, darf der Treiber das DO_VERIFY_VOLUME Bit nicht festlegen. Der Treiber sollte IoStatus.Status auf STATUS_IO_DEVICE_ERROR festlegen, IoStatus.Information auf Null festlegen und IoCompleteRequest mit dem IRP aufrufen.