Struktur IRP (wdm.h)

Struktur IRP adalah struktur buram sebagian yang mewakili paket permintaan I/O. Anggota struktur IRP yang tidak terdokumentasi dicadangkan, hanya digunakan oleh manajer I/O atau dalam beberapa kasus, oleh driver sistem file (FSD).

Sintaks

typedef struct _IRP {
  CSHORT                    Type;
  USHORT                    Size;
  PMDL                      MdlAddress;
  ULONG                     Flags;
  union {
    struct _IRP     *MasterIrp;
    __volatile LONG IrpCount;
    PVOID           SystemBuffer;
  } AssociatedIrp;
  LIST_ENTRY                ThreadListEntry;
  IO_STATUS_BLOCK           IoStatus;
  KPROCESSOR_MODE           RequestorMode;
  BOOLEAN                   PendingReturned;
  CHAR                      StackCount;
  CHAR                      CurrentLocation;
  BOOLEAN                   Cancel;
  KIRQL                     CancelIrql;
  CCHAR                     ApcEnvironment;
  UCHAR                     AllocationFlags;
  union {
    PIO_STATUS_BLOCK UserIosb;
    PVOID            IoRingContext;
  };
  PKEVENT                   UserEvent;
  union {
    struct {
      union {
        PIO_APC_ROUTINE UserApcRoutine;
        PVOID           IssuingProcess;
      };
      union {
        PVOID                 UserApcContext;
#if ...
        _IORING_OBJECT        *IoRing;
#else
        struct _IORING_OBJECT *IoRing;
#endif
      };
    } AsynchronousParameters;
    LARGE_INTEGER AllocationSize;
  } Overlay;
  __volatile PDRIVER_CANCEL CancelRoutine;
  PVOID                     UserBuffer;
  union {
    struct {
      union {
        KDEVICE_QUEUE_ENTRY DeviceQueueEntry;
        struct {
          PVOID DriverContext[4];
        };
      };
      PETHREAD     Thread;
      PCHAR        AuxiliaryBuffer;
      struct {
        LIST_ENTRY ListEntry;
        union {
          struct _IO_STACK_LOCATION *CurrentStackLocation;
          ULONG                     PacketType;
        };
      };
      PFILE_OBJECT OriginalFileObject;
    } Overlay;
    KAPC  Apc;
    PVOID CompletionKey;
  } Tail;
} IRP;

Anggota

Type

Dicadangkan untuk penggunaan sistem internal.

Size

Dicadangkan untuk penggunaan sistem internal.

MdlAddress

Penunjuk ke MDL yang menjelaskan buffer pengguna, jika driver menggunakan I/O langsung, dan kode fungsi utama IRP adalah salah satu hal berikut:

  • IRP_MJ_READ

    MDL menjelaskan buffer kosong yang diisi perangkat atau driver.

  • IRP_MJ_WRITE

    MDL menjelaskan buffer yang berisi data untuk perangkat atau driver.

  • IRP_MJ_DEVICE_CONTROL atau IRP_MJ_INTERNAL_DEVICE_CONTROL

    Jika kode IOCTL menentukan jenis transfer METHOD_IN_DIRECT, MDL menjelaskan buffer yang berisi data untuk perangkat atau driver.

Jika kode IOCTL menentukan jenis transfer METHOD_OUT_DIRECT, MDL menjelaskan buffer kosong yang diisi perangkat atau driver.

Untuk informasi selengkapnya tentang buffer yang terkait dengan jenis transfer METHOD_IN_DIRECT dan METHOD_OUT_DIRECT dalam kode IOCTL, lihat Deskripsi Buffer untuk Kode Kontrol I/O.

Jika driver tidak menggunakan I/O langsung, pointer ini adalah NULL.

Flags

Driver sistem file menggunakan bidang ini, yang bersifat baca-saja untuk semua driver. Jaringan dan, mungkin, driver perangkat tingkat tertinggi juga dapat membaca bidang ini. Bidang ini diatur ke nol atau ke bitwise-OR dari satu atau beberapa bit bendera yang ditentukan sistem berikut:

  • IRP_NOCACHE
  • IRP_PAGING_IO
  • IRP_MOUNT_COMPLETION
  • IRP_SYNCHRONOUS_API
  • IRP_ASSOCIATED_IRP
  • IRP_BUFFERED_IO
  • IRP_DEALLOCATE_BUFFER
  • IRP_INPUT_OPERATION
  • IRP_SYNCHRONOUS_PAGING_IO
  • IRP_CREATE_OPERATION
  • IRP_READ_OPERATION
  • IRP_WRITE_OPERATION
  • IRP_CLOSE_OPERATION
  • IRP_DEFER_IO_COMPLETION
  • IRP_OB_QUERY_NAME
  • IRP_HOLD_DEVICE_QUEUE
  • IRP_UM_DRIVER_INITIATED_IO

AssociatedIrp

Dicadangkan untuk penggunaan sistem internal.

AssociatedIrp.MasterIrp

Arahkan ke IRP master dalam IRP yang dibuat oleh panggilan driver tingkat tertinggi ke IoMakeAssociatedIrp.

AssociatedIrp.IrpCount

Dicadangkan untuk penggunaan sistem internal.

AssociatedIrp.SystemBuffer

Penunjuk ke buffer ruang sistem.

Jika driver menggunakan I/O buffer, tujuan buffer ditentukan oleh kode fungsi utama IRP, sebagai berikut:

  • SystemBuffer.IRP_MJ_READ

    Buffer menerima data dari perangkat atau driver. Panjang buffer ditentukan oleh Parameters.Read.Length dalam struktur IO_STACK_LOCATION driver.

  • SystemBuffer.IRP_MJ_WRITE

    Buffer memasok data untuk perangkat atau driver. Panjang buffer ditentukan oleh Parameters.Write.Length dalam struktur IO_STACK_LOCATION driver.

  • SystemBuffer.IRP_MJ_DEVICE_CONTROL atau IRP_MJ_INTERNAL_DEVICE_CONTROL

    Buffer mewakili buffer input dan output yang disediakan ke DeviceIoControl dan IoBuildDeviceIoControlRequest. Data output menimpa data input.

Untuk input, panjang buffer ditentukan oleh Parameters.DeviceIoControl.InputBufferLength dalam struktur IO_STACK_LOCATION driver.

Untuk output, panjang buffer ditentukan oleh Parameters.DeviceIoControl.OutputBufferLength dalam struktur IO_STACK_LOCATION driver.

Untuk informasi selengkapnya, lihat Deskripsi Buffer untuk Kode Kontrol I/O.

Buffer mewakili buffer input yang disediakan untuk DeviceIoControl dan IoBuildDeviceIoControlRequest.

Panjang buffer ditentukan oleh Parameters.DeviceIoControl.InputBufferLength dalam struktur IO_STACK_LOCATION driver.

Untuk informasi selengkapnya, lihat Deskripsi Buffer untuk Kode Kontrol I/O.

Jika driver menggunakan I/O langsung, tujuan buffer ditentukan oleh kode fungsi utama IRP, sebagai berikut:

ThreadListEntry

Dicadangkan untuk penggunaan sistem internal.

IoStatus

Berisi struktur IO_STATUS_BLOCK tempat driver menyimpan status dan informasi sebelum memanggil IoCompleteRequest.

RequestorMode

Menunjukkan mode eksekusi pemohon asli operasi, salah satu UserMode atau KernelMode.

PendingReturned

Jika diatur ke TRUE, driver telah menandai IRP yang tertunda. Setiap rutinitas IoCompletion harus memeriksa nilai bendera ini. Jika bendera TRUE, dan jika rutinitas IoCompletion tidak akan mengembalikan STATUS_MORE_PROCESSING_REQUIRED, rutinitas harus memanggil IoMarkIrpPending untuk menyebarkan status tertunda ke driver di atasnya di tumpukan perangkat.

StackCount

Dicadangkan untuk penggunaan sistem internal.

CurrentLocation

Dicadangkan untuk penggunaan sistem internal.

Cancel

Jika diatur ke TRUE, IRP adalah atau harus dibatalkan.

CancelIrql

Berisi IRQL tempat driver berjalan ketika IoAcquireCancelSpinLock dipanggil.

ApcEnvironment

Dicadangkan untuk penggunaan sistem internal.

AllocationFlags

Dicadangkan untuk penggunaan sistem internal.

UserIosb

Dicadangkan untuk penggunaan sistem internal.

IoRingContext

Dicadangkan untuk penggunaan sistem internal.

UserEvent

Dicadangkan untuk penggunaan sistem internal.

Overlay

Dicadangkan untuk penggunaan sistem internal.

Overlay.AsynchronousParameters

Dicadangkan untuk penggunaan sistem internal.

Overlay.AsynchronousParameters.UserApcRoutine

Dicadangkan untuk penggunaan sistem internal.

Overlay.AsynchronousParameters.IssuingProcess

Dicadangkan untuk penggunaan sistem internal.

Overlay.AsynchronousParameters.UserApcContext

Dicadangkan untuk penggunaan sistem internal.

Overlay.AsynchronousParameters.IoRing

Dicadangkan untuk penggunaan sistem internal.

Overlay.AllocationSize

Dicadangkan untuk penggunaan sistem internal.

CancelRoutine

Berisi titik masuk untuk rutinitas Batal yang disediakan pengemudi untuk dipanggil jika IRP dibatalkan. NULL menunjukkan bahwa IRP saat ini tidak dapat dibatalkan.

UserBuffer

Berisi alamat buffer output jika kedua kondisi berikut berlaku:

Untuk METHOD_BUFFERED, driver harus menggunakan buffer yang ditujukkan oleh Irp-AssociatedIrp.SystemBuffer> sebagai buffer output. Ketika driver menyelesaikan permintaan, manajer I/O menyalin konten buffer ini ke buffer output yang ditunjukkan oleh Irp-UserBuffer>. Driver tidak boleh menulis langsung ke buffer yang ditujukkan oleh Irp-UserBuffer>. Untuk informasi selengkapnya, lihat Deskripsi Buffer untuk Kode Kontrol I/O.

Tail

Dicadangkan untuk penggunaan sistem internal.

Tail.Overlay

Dicadangkan untuk penggunaan sistem internal.

Tail.Overlay.DeviceQueueEntry

Jika IRP diantrekan dalam antrean perangkat yang terkait dengan objek perangkat driver, bidang ini menautkan RUNP dalam antrean perangkat. Tautan ini hanya dapat digunakan saat driver sedang memproses IRP.

Tail.Overlay.DriverContext[4]

Jika IRP tidak diantrekan dalam antrean perangkat yang terkait dengan objek perangkat driver, bidang ini dapat digunakan oleh driver untuk menyimpan hingga empat pointer. Bidang ini hanya dapat digunakan saat driver memiliki IRP.

Tail.Overlay.Thread

Penunjuk ke blok kontrol utas pemanggil (TCB). Untuk permintaan yang berasal dari mode pengguna, manajer I/O selalu mengatur bidang ini untuk menunjuk ke TCB utas yang mengeluarkan permintaan.

Tail.Overlay.AuxiliaryBuffer

Dicadangkan untuk penggunaan sistem internal.

Tail.Overlay.ListEntry

Jika driver mengelola antrean IRP internalnya sendiri, driver menggunakan bidang ini untuk menautkan satu IRP ke IRP berikutnya. Tautan ini hanya dapat digunakan saat driver memegang IRP dalam antreannya atau sedang memproses IRP.

Tail.Overlay.CurrentStackLocation

Dicadangkan untuk penggunaan sistem internal.

Tail.Overlay.PacketType

Dicadangkan untuk penggunaan sistem internal.

Tail.Overlay.OriginalFileObject

Dicadangkan untuk penggunaan sistem internal.

Tail.Apc

Dicadangkan untuk penggunaan sistem internal.

Tail.CompletionKey

Dicadangkan untuk penggunaan sistem internal.

Keterangan

Anggota struktur IRP yang tidak terdokumentasi dicadangkan, hanya digunakan oleh manajer I/O atau dalam beberapa kasus, oleh driver sistem file (FSD).

IRP adalah struktur manajer I/O dasar yang digunakan untuk berkomunikasi dengan driver dan memungkinkan driver berkomunikasi satu sama lain. Paket terdiri dari dua bagian yang berbeda:

  • Header, atau bagian paket tetap— Ini digunakan oleh manajer I/O untuk menyimpan informasi tentang permintaan asli, seperti parameter independen perangkat pemanggil, alamat objek perangkat tempat file terbuka, dan sebagainya. Ini juga digunakan oleh driver untuk menyimpan informasi seperti status akhir permintaan.

  • Lokasi tumpukan I/O — Mengikuti header adalah sekumpulan lokasi tumpukan I/O, satu per driver dalam rantai driver berlapis yang permintaannya terikat. Setiap lokasi tumpukan berisi parameter, kode fungsi, dan konteks yang digunakan oleh driver yang sesuai untuk menentukan apa yang seharusnya dilakukan. Untuk informasi selengkapnya, lihat struktur IO_STACK_LOCATION .

Meskipun driver tingkat yang lebih tinggi mungkin memeriksa nilai Batalkan Boolean dalam IRP, driver tersebut tidak dapat mengasumsikan IRP akan diselesaikan dengan STATUS_CANCELLED oleh driver tingkat bawah meskipun nilainya TRUE.

Persyaratan

Persyaratan Nilai
Header wdm.h (termasuk Wdm.h, Ntddk.h, Ntifs.h)

Lihat juga