MINIPORT_MESSAGE_INTERRUPT fungsi panggilan balik (ndis.h)

NDIS memanggil fungsi MiniportMessageInterrupt ketika NIC menghasilkan gangguan berbasis pesan.

Catatan Anda harus mendeklarasikan fungsi dengan menggunakan jenis MINIPORT_MESSAGE_INTERRUPT . Untuk informasi selengkapnya, lihat bagian Contoh berikut ini.
 

Sintaks

MINIPORT_MESSAGE_INTERRUPT MiniportMessageInterrupt;

BOOLEAN MiniportMessageInterrupt(
  [in]  NDIS_HANDLE MiniportInterruptContext,
  [in]  ULONG MessageId,
  [out] PBOOLEAN QueueDefaultInterruptDpc,
  [out] PULONG TargetProcessors
)
{...}

Parameter

[in] MiniportInterruptContext

Handel ke blok informasi konteks interupsi. Driver miniport menyediakan handel ini di parameter MiniportInterruptContext yang diteruskan driver miniport ke Fungsi NdisMRegisterInterruptEx .

[in] MessageId

Pengidentifikasi pesan interupsi bersinyali pesan (MSI). MessageId adalah indeks ke IO_INTERRUPT_MESSAGE_INFO_ENTRY struktur di dalam IO_INTERRUPT_MESSAGE_INFO struktur. NDIS meneruskan penunjuk ke struktur IO_INTERRUPT_MESSAGE_INFO terkait di anggota MessageInfoTable ketika driver berhasil mendaftar untuk MSI dengan fungsi NdisMRegisterInterruptEx .

[out] QueueDefaultInterruptDpc

Pointer ke variabel Boolean yang diatur driver miniport sebelum kembali dari panggilan ini. Driver miniport mengatur nilai ini ke TRUE untuk menunjukkan bahwa driver memerlukan DPC pada CPU default (saat ini). Jika diatur ke TRUE, NDIS mengabaikan nilai parameter TargetProcessors . Jika diatur ke FALSE, NDIS menggunakan nilai parameter TargetProcessors untuk menjadwalkan DPC.

[out] TargetProcessors

Bitmask yang menunjukkan prosesor target di mana NDIS harus menjadwalkan DPC. Bitmask ini mewakili 32 prosesor pertama dalam grup prosesor 0. Setiap bit dalam bitmask mengidentifikasi CPU. Jika pemanggil menetapkan bit 0, NDIS menjadwalkan DPC untuk CPU 0. Jika penelepon mengatur bit 1, NDIS menjadwalkan DPC untuk CPU 1, dan sebagainya.

Catatan Driver NDIS 6.20 dan yang lebih baru tidak boleh menggunakan parameter ini untuk menjadwalkan DPC. Sebaliknya, mereka harus mengatur parameter ini ke nol dan menggunakan fungsi NdisMQueueDpcEx untuk menjadwalkan DPC.
 

Nilai kembali

MiniportMessageInterrupt mengembalikan TRUE jika NIC yang mendasar menghasilkan interupsi; jika tidak, ia mengembalikan FALSE.

Keterangan

Driver miniport yang mendaftar untuk dukungan message-signaled interrupts (MSI) dengan fungsi NdisMRegisterInterruptEx harus menyediakan fungsi MiniportMessageInterrupt .

Driver miniport harus melakukan pekerjaan sesedikit mungkin dalam fungsi MiniportMessageInterrupt-nya . Ini harus menumpahkan operasi I/O untuk gangguan yang dihasilkan NIC ke Fungsi MiniportMessageInterruptDPC .

Ketika NIC menghasilkan MSI, NDIS memanggil fungsi MiniportMessageInterrupt driver miniport.

MiniportMessageInterrupt menyimpan informasi status yang diperlukan tentang gangguan dan menunda pemrosesan I/O sebanyak mungkin ke Fungsi MiniportMessageInterruptDPC .

Jika driver miniport meminta panggilan prosedur yang ditangguhkan (DPC) untuk pesan tertentu, driver miniport harus menonaktifkan semua gangguan lebih lanjut untuk pesan tersebut dan mengaktifkan kembali gangguan setelah semua DPC selesai.

Driver miniport harus mengatur QueueDefaultInterruptDpc ke TRUE untuk menjadwalkan DPC hanya untuk CPU default. Driver dapat melakukan ini, misalnya, jika:

  • NIC menghasilkan gangguan untuk memberi sinyal penyelesaian operasi pengiriman atau permintaan lain yang tidak berjalan pada CPU lain.
  • NIC menghasilkan gangguan pada data yang diterima sinyal dan driver miniport tidak dapat memproses paket yang diterima di DPC terpisah.
  • Gangguan menunjukkan paket yang diterima dan driver miniport dapat memproses paket yang diterima di DPC terpisah, tetapi menerima penskalaan sisi (RSS) tidak diaktifkan untuk driver miniport. Untuk mengetahui informasi selengkapnya, lihat OID_GEN_RECEIVE_SCALE_CAPABILITIES dan OID_GEN_RECEIVE_SCALE_PARAMETERS.
  • Penskalaan samping penerimaan diaktifkan untuk driver miniport, dan driver miniport dapat menghasilkan pesan yang berbeda pada setiap antrean penerima.
Jika driver miniport memproses paket yang diterima di DPC terpisah, driver miniport mengatur parameter QueueDefaultInterruptDpc ke FALSE. Driver miniport harus mengatur bit TargetProcessors untuk CPU yang terkait dengan setiap antrean penerimaan yang tidak kosong. NDIS akan menjadwalkan DPC pada setiap CPU yang ditunjukkan dalam grup prosesor 0.

Jika MiniportMessageInterrupt berbagi sumber daya untuk pesan tertentu, seperti register NIC atau variabel status, dengan fungsi MiniportXxx lain yang berjalan pada IRQL yang lebih rendah, fungsi MiniportXxx tersebut harus memanggil fungsi MiniportXxx Fungsi NdisMSynchronizeWithInterruptEx . Ini memastikan bahwa fungsi MiniportSynchronizeMessageInterrupt driver mengakses sumber daya bersama dengan cara yang disinkronkan dan multiprosesor-aman.

Driver miniport dapat memanggil Fungsi NdisMDeregisterInterruptEx dari fungsi MiniportInitializeEx atau MiniportHaltEx untuk merilis sumber daya yang dialokasikan dengan NdisMRegisterInterruptEx. Setelah NdisMDeregisterInterruptEx kembali, NDIS tidak memanggil fungsi MiniportMessageInterrupt atau MiniportMessageInterruptDPC driver miniport.

NDIS memanggil MiniportMessageInterrupt di DIRQL MSI yang didaftarkan driver miniport dalam panggilan sebelumnya ke NdisMRegisterInterruptEx. Oleh karena itu, MiniportMessageInterrupt harus memanggil subset fungsi NDIS, seperti fungsi NdisRawXxx atau NdisRead/WriteRegisterXxx , yang aman untuk dipanggil di IRQL apa pun.

Contoh

Untuk menentukan fungsi MiniportMessageInterrupt , Anda harus terlebih dahulu memberikan deklarasi fungsi yang mengidentifikasi jenis fungsi yang Anda tentukan. Windows menyediakan sekumpulan tipe fungsi untuk pengandar. Mendeklarasikan fungsi menggunakan jenis fungsi membantu Analisis Kode untuk Driver, Pemverifikasi Driver Statis (SDV), dan alat verifikasi lainnya menemukan kesalahan, dan itu adalah persyaratan untuk menulis driver untuk sistem operasi Windows.

Misalnya, untuk menentukan fungsi MiniportMessageInterrupt yang diberi nama "MyMessageInterrupt", gunakan jenis MINIPORT_MESSAGE_INTERRUPT seperti yang ditunjukkan dalam contoh kode ini:

MINIPORT_MESSAGE_INTERRUPT MyMessageInterrupt;

Kemudian, terapkan fungsi Anda sebagai berikut:

_Use_decl_annotations_
BOOLEAN
 MyMessageInterrupt(
    NDIS_HANDLE  MiniportInterruptContext,
    ULONG  MessageId,
    PBOOLEAN  QueueDefaultInterruptDpc,
    PULONG  TargetProcessors
    )
  {...}

Jenis fungsi MINIPORT_MESSAGE_INTERRUPT ditentukan dalam file header Ndis.h. Untuk mengidentifikasi kesalahan secara lebih akurat saat Anda menjalankan alat analisis kode, pastikan untuk menambahkan anotasi Use_decl_annotations ke definisi fungsi Anda. Anotasi Use_decl_annotations memastikan bahwa anotasi yang diterapkan ke jenis fungsi MINIPORT_MESSAGE_INTERRUPT dalam file header digunakan. Untuk informasi selengkapnya tentang persyaratan untuk deklarasi fungsi, lihat Mendeklarasikan Fungsi dengan Menggunakan Jenis Peran Fungsi untuk Driver NDIS.

Untuk informasi tentang Use_decl_annotations, lihat Perilaku Fungsi Anotasi.

Persyaratan

Persyaratan Nilai
Klien minimum yang didukung Didukung di NDIS 6.0 dan yang lebih baru.
Target Platform Windows
Header ndis.h (termasuk Ndis.h)
IRQL Lihat bagian Keterangan

Lihat juga

IO_INTERRUPT_MESSAGE_INFO

IO_INTERRUPT_MESSAGE_INFO_ENTRY

MiniportHaltEx

MiniportInitializeEx

MiniportMessageInterruptDPC

MiniportSynchronizeMessageInterrupt

NDIS_MINIPORT_INTERRUPT_CHARACTERISTICS

NdisMDeregisterInterruptEx

NdisMQueueDpcEx

NdisMRegisterInterruptEx

NdisMSynchronizeWithInterruptEx OID_GEN_RECEIVE_SCALE_CAPABILITIES OID_GEN_RECEIVE_SCALE_PARAMETERS

Receive Side Scaling (RSS)