DriverEntry untuk rutinitas Driver WDF
[Berlaku untuk KMDF dan UMDF]
DriverEntry adalah rutinitas pertama yang disediakan driver yang dipanggil setelah driver dimuat. Ini bertanggung jawab untuk menginisialisasi driver.
Sintaks
NTSTATUS DriverEntry(
_In_ PDRIVER_OBJECT DriverObject,
_In_ PUNICODE_STRING RegistryPath
);
Parameter
DriverObject [in]
Penunjuk ke struktur DRIVER_OBJECT yang mewakili objek driver WDM driver.
RegistryPath [in]
Penunjuk ke struktur UNICODE_STRING yang menentukan jalur ke kunci Parameter driver dalam registri .
Menampilkan nilai
Jika rutinitas berhasil, rutinitas harus mengembalikan STATUS_SUCCESS. Jika tidak, itu harus mengembalikan salah satu nilai status kesalahan yang ditentukan dalam ntstatus.h.
Keterangan
Seperti semua driver WDM, driver berbasis kerangka kerja harus memiliki rutinitas DriverEntry , yang dipanggil setelah driver dimuat. Rutinitas DriverEntry berbasis kerangka kerja harus:
Aktifkan pelacakan perangkat lunak WPP.
DriverEntry harus menyertakan makro WPP_INIT_TRACING untuk mengaktifkan pelacakan perangkat lunak.
Panggil WdfDriverCreate.
Panggilan ke WdfDriverCreate memungkinkan driver menggunakan antarmuka Windows Driver Framework. (Driver tidak dapat memanggil rutinitas kerangka kerja lain sebelum memanggil WdfDriverCreate.)
Alokasikan sumber daya sistem non-perangkat khusus dan variabel global yang mungkin diperlukan.
Biasanya, driver mengaitkan sumber daya sistem dengan perangkat individual. Oleh karena itu, driver berbasis kerangka kerja mengalokasikan sebagian besar sumber daya dalam panggilan balik EvtDriverDeviceAdd , yang dipanggil saat perangkat individual terdeteksi.
Karena beberapa instans driver UMDF mungkin dihosting oleh instans terpisah Wudfhost, variabel global mungkin tidak tersedia di semua instans driver UMDF.
Dapatkan parameter khusus driver dari registri.
Beberapa driver mendapatkan parameter dari registri. Driver ini dapat memanggil WdfDriverOpenParametersRegistryKey untuk membuka kunci registri yang berisi parameter ini.
Berikan nilai pengembalian DriverEntry.
Catatan Driver UMDF berjalan dalam proses host mode pengguna, sementara driver KMDF berjalan dalam mode kernel dalam proses sistem. Kerangka kerja mungkin memuat beberapa instans driver UMDF ke dalam instans terpisah dari proses host. Akibatnya:
- Kerangka kerja mungkin memanggil rutinitas DriverEntry driver UMDF beberapa kali jika memuat instans driver dalam proses host yang berbeda. Sebaliknya, kerangka kerja memanggil rutinitas DriverEntry driver KMDF hanya sekali.
- Jika driver UMDF membuat variabel global dalam rutinitas DriverEntry-nya, variabel mungkin tidak tersedia untuk semua instans driver. Namun, variabel global yang dibuat driver KMDF dalam rutinitas DriverEntry-nya tersedia untuk semua instans driver.
Untuk informasi selengkapnya tentang kapan rutinitas DriverEntry driver berbasis kerangka kerja dipanggil, lihat Membangun dan Memuat Driver WDF.
Rutinitas DriverEntry tidak dideklarasikan dalam header WDK. Pemverifikasi Driver Statis (SDV) dan alat verifikasi lainnya mungkin memerlukan deklarasi seperti berikut:
DRIVER_INITIALIZE MyDriverEntry;
NTSTATUS
DriverEntry(
IN PDRIVER_OBJECT DriverObject,
IN PUNICODE_STRING RegistryPath
)
{
// Function body
}
Contoh
Contoh kode berikut menunjukkan rutinitas DriverEntry driver sampel Serial (KMDF).
NTSTATUS
DriverEntry(
IN PDRIVER_OBJECT DriverObject,
IN PUNICODE_STRING RegistryPath
)
{
WDF_DRIVER_CONFIG config;
WDFDRIVER hDriver;
NTSTATUS status;
WDF_OBJECT_ATTRIBUTES attributes;
SERIAL_FIRMWARE_DATA driverDefaults;
//
// Initialize WPP tracing.
//
WPP_INIT_TRACING(
DriverObject,
RegistryPath
);
SerialDbgPrintEx(
TRACE_LEVEL_INFORMATION,
DBG_INIT,
"Serial Sample (WDF Version) - Built %s %s\n",
__DATE__, __TIME__
);
//
// Register a cleanup callback function (which calls WPP_CLEANUP)
// for the framework driver object. The framework will call
// the cleanup callback function when it deletes the driver object,
// before the driver is unloaded.
//
WDF_OBJECT_ATTRIBUTES_INIT(&attributes);
attributes.EvtCleanupCallback = SerialEvtDriverContextCleanup;
WDF_DRIVER_CONFIG_INIT(
&config,
SerialEvtDeviceAdd
);
status = WdfDriverCreate(
DriverObject,
RegistryPath,
&attributes,
&config,
&hDriver
);
if (!NT_SUCCESS(status)) {
SerialDbgPrintEx(
TRACE_LEVEL_ERROR,
DBG_INIT,
"WdfDriverCreate failed with status 0x%x\n",
status
);
//
// Clean up tracing here because WdfDriverCreate failed.
//
WPP_CLEANUP(DriverObject);
return status;
}
//
// Call an internal routine to obtain registry values
// to use for all the devices that the driver
// controls, including whether or not to break on entry.
//
SerialGetConfigDefaults(
&driverDefaults,
hDriver
);
//
// Break on entry if requested bt registry value.
//
if (driverDefaults.ShouldBreakOnEntry) {
DbgBreakPoint();
}
return status;
}
Lihat juga
Saran dan Komentar
https://aka.ms/ContentUserFeedback.
Segera hadir: Sepanjang tahun 2024 kami akan menghentikan penggunaan GitHub Issues sebagai mekanisme umpan balik untuk konten dan menggantinya dengan sistem umpan balik baru. Untuk mengetahui informasi selengkapnya, lihat:Kirim dan lihat umpan balik untuk