Bagikan melalui


Membuat Penggerak Ekspor

Driver ekspor adalah DLL mode kernel yang dapat dimuat oleh berbagai komponen spesifik perangkat atau tumpukan perangkat lainnya, tetapi tidak memiliki beberapa karakteristik driver mode kernel lengkap. Secara khusus, driver ekspor tidak memiliki tabel pengiriman, itu tidak memiliki tempat di driver stack, dan tidak memiliki entri dalam database manajer kontrol layanan yang mendefinisikannya sebagai layanan sistem. Meskipun driver ekspor tidak memiliki tabel pengiriman , itu dapat memasok mengirimkan rutinitas ke driver standar. Driver standar memasukkan rutinitas pengiriman ke dalam tabel pengirimannya sendiri. Driver ekspor memiliki stub DriverEntry rutinitas yang tidak pernah dipanggil.

Driver ekspor modus kernel sangat cocok untuk mengimplementasikan bagian dari pasangan driver yang tidak bergantung pada karakteristik tumpukan dan perangkat keras yang mendasarinya.

Windows mencakup beberapa driver ekspor yang dimuat oleh driver lain, misalnya:

  • Driver SCSI port
  • Driver kelas pita
  • Semua driver pengontrol IDE disediakan oleh sistem sebagai driver ekspor.

Driver standar juga dapat berfungsi sebagai driver ekspor. Agar driver berfungsi dalam kedua cara, driver harus dibangun sebagai driver ekspor dan dimuat sebagai driver biasa.

Membangun Penggerak Ekspor

Untuk membuat driver ekspor di Visual Studio, gunakan prosedur berikut:

  1. Buat proyek baru dari template, seperti WDM Driver Kosong.
  2. Tambahkan file definisi modul ke proyek, misalnya:
LIBRARY mydriver.sys
EXPORTS
  DllInitialize PRIVATE
  DllUnload PRIVATE

Poin masuk untuk DLL mode kernel selalu DllInitialize. Sistem segera memanggil rutinitas DllInitialize dari DLL mode kernel setelah DLL dimuat. Driver penggerak ekspor harus menyediakan rutin DllInitialize. Anda dapat menggunakan DllInitialize rutin untuk memperoleh atau menginisialisasi sumber daya yang diperlukan oleh rutinitas lain di DLL.

Anda tidak dapat menentukan titik entri menggunakan makro DLLENTRY.

NTSTATUS DllInitialize(
  _In_ PUNICODE_STRING RegistryPath
);

RegistryPath adalah penunjuk ke string Unicode yang dihitung yang menentukan jalur ke kunci registri DLL, HKEY_LOCAL_MACHINE\CurrentControlSet\Services\DllName. Rutinitas DLL dapat menggunakan kunci ini untuk menyimpan informasi khusus DLL. Buffer yang ditunjukkan oleh RegistryPath dibebaskan setelah fungsi DllInitialize berakhir. Oleh karena itu, jika DLL menggunakan kunci, DllInitialize harus menduplikasi nama kunci.

Proses build menghasilkan pustaka ekspor dengan ekstensi .lib, dan driver ekspor dengan ekstensi .sys.

Mengimpor Fungsi dari Export Driver

Untuk mengimpor fungsi yang diekspor oleh driver ekspor, Anda harus mendeklarasikan fungsi menggunakan makro DECLSPEC_IMPORT, yang didefinisikan dalam Ntdef.h. Contohnya:

DECLSPEC_IMPORT int LoadPrinterDriver (int arg1); 

Makro ini menyelesaikan deklarasi kelas penyimpanan __declspec(dllimport) pada platform tersebut jika diperlukan dan menjadi tidak ada pada platform di mana hal itu tidak diperlukan.

Dalam driver ekspor, fungsi yang akan diekspor harus dideklarasikan dengan makro DECLSPEC_EXPORT. Makro ini menyelesaikan deklarasi kelas penyimpanan __declspec(dllexport) pada platform tersebut jika diperlukan dan tidak pada platform tersebut jika tidak diperlukan. Jika driver ekspor memasok rutinitas pengiriman ke driver standar, rutinitas tersebut tidak harus diekspor.

Mengaktifkan dan Menonaktifkan Driver Ekspor

Driver ekspor harus diinstal di direktori %Windir%\System32\Drivers. Dimulai dengan Windows 2000, sistem operasi menyimpan jumlah referensi yang menunjukkan berapa kali fungsi driver ekspor telah diimpor oleh driver lain. Sistem mengurangi hitungan ini setiap kali salah satu driver impor dibongkar. Ketika jumlah referensi jatuh ke nol, sistem melepaskan driver ekspor. Namun, driver ekspor harus berisi titik masuk standar dan rutinitas bongkar, DllInitialize dan DllUnload, atau sistem operasi tidak akan mengaktifkan mekanisme jumlah referensi ini.

Sistem memanggil rutinitas DllUnload dari DLL mode kernel ketika membongkar DLL.

NTSTATUS DllUnload(void);

Pengandar ekspor harus menyediakan rutinitas DllUnload. Anda dapat menggunakan rutinitas DllUnload untuk merilis sumber daya apa pun yang digunakan oleh rutinitas di DLL.