Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Dışarı aktarma sürücüsü, donanıma veya cihaza özgü diğer çeşitli bileşenler tarafından yüklenebilen ancak çekirdek modu sürücüsünün bazı özelliklerine sahip olmayan çekirdek modu DLL'dir. Özellikle, dışarı aktarma sürücüsünün dağıtım tablosu yoktur, sürücü yığınında bir yeri yoktur ve hizmet denetim yöneticisinin veritabanında bunu bir sistem hizmeti olarak tanımlayan bir girdisi yoktur. Dışarı aktarma sürücüsünün dağıtım tablosu olmasa da, standart bir sürücüye dağıtım yordamları sağlayabilir. Standart sürücü, dağıtım yordamlarını kendi dağıtım tablosuna ekler. Dışarı aktarma sürücüsünün hiçbir zaman çağrılmayan bir DriverEntry yordamı vardır.
Çekirdek modu dışarı aktarma sürücüleri, bir sürücü çiftinin temel yığın ve donanım özelliklerinden bağımsız bölümünü uygulamak için özellikle uygundur.
Windows, diğer sürücüler tarafından yüklenen çeşitli dışarı aktarma sürücüleri içerir, örneğin:
- SCSI bağlantı noktası sürücüsü
- Bant sınıfı sürücüsü
- IDE denetleyici sürücüsü, sistem tarafından sağlanan tüm dışarı aktarma sürücüleridir
Standart sürücüler, dışarı aktarma sürücüleri olarak da işlev görebilir. Bir sürücünün her iki şekilde de çalışması için, bir dışarı aktarma sürücüsü olarak derlenip normal sürücü olarak yüklenmesi gerekir.
Dışarı Aktarma Sürücüsü Oluşturma
Visual Studio'da dışarı aktarma sürücüsü oluşturmak için aşağıdaki yordamı kullanın:
- Boş WDM Sürücüsü gibi bir şablondan yeni bir proje oluşturun.
- Projeye bir modül tanım dosyası ekleyin, örneğin:
LIBRARY mydriver.sys
EXPORTS
DllInitialize PRIVATE
DllUnload PRIVATE
Çekirdek modu DLL'sinin giriş noktası her zaman DllInitialize'dır. Sistem, DLL yüklendikten hemen sonra çekirdek modu DLL'sinin DllInitialize yordamını çağırır. Dışarı aktarma sürücüleri DllInitialize yordamları sağlamalıdır. DLL'deki diğer yordamların gerektirdiği kaynakları almak veya başlatmak için DllInitialize yordamını kullanabilirsiniz.
DLLENTRY makrosunun kullanıldığı giriş noktasını belirtemezsiniz.
NTSTATUS DllInitialize(
_In_ PUNICODE_STRING RegistryPath
);
RegistryPath, DLL'nin kayıt defteri anahtarının yolunu belirten,HKEY_LOCAL_MACHINE\CurrentControlSet\Services\DllNamesayılmış bir Unicode dizesinin işaretçisidir . DLL yordamları, DLL'ye özgü bilgileri depolamak için bu anahtarı kullanabilir. DllInitialize çıktıktan sonra RegistryPath tarafından işaret edilen arabellek serbest bırakılır. Bu nedenle, DLL anahtarı kullanırsa , DllInitialize anahtar adını yinelemelidir.
Derleme işlemi.lib uzantısına sahip bir dışarı aktarma kitaplığı ve .sys uzantısına sahip bir dışarı aktarma sürücüsü oluşturur.
Dışarı Aktarma Sürücüsünden İşlevleri İçeri Aktarma
Dışarı aktarma sürücüsü tarafından dışarı aktarılan işlevleri içeri aktarmak için, ntdef.h dosyasında tanımlanan DECLSPEC_IMPORT makroyu kullanarak işlevleri bildirmeniz gerekir. Örneğin:
DECLSPEC_IMPORT int LoadPrinterDriver (int arg1);
Bu makro, gerekli olduğu platformlarda __declspec (dllimport) depolama sınıfı bildirimine ve gerekli olmayan platformlarda hiçbir şeye çözümlenmez.
Dışarı aktarma sürücüsünde, dışarı aktarılacak işlev DECLSPEC_EXPORT makroyla bildirilmelidir. Bu makro, gerekli olduğu platformlarda __declspec (dllexport) depolama sınıfı bildirimine çözümleniyor ve gerekli olmayan platformlarda hiçbir şey yok. Dışarı aktarma sürücüsü standart bir sürücüye dağıtım yordamı sağlarsa, bu yordamın dışarı aktarılması gerekmez.
Dışarı Aktarma Sürücüsünü Yükleme ve Kaldırma
Dışarı aktarma sürücüleri %Windir%\System32\Drivers dizinine yüklenmelidir. Windows 2000'den başlayarak, işletim sistemi dışarı aktarma sürücüsünün işlevlerinin diğer sürücüler tarafından kaç kez içeri aktarıldığını gösteren bir başvuru sayısı tutar. Sistem, içeri aktarılan sürücülerden biri her kaldırılışında bu sayıyı azaltır. Başvuru sayısı sıfıra düştüğünde sistem ihracat sürücüsünü yükten çıkarır. Ancak, dışarı aktarma sürücüsü standart giriş noktası ve kaldırma yordamlarını içermelidir, DllInitialize ve DllUnload, aksi takdirde işletim sistemi bu başvuru sayısı mekanizmasını etkinleştirmez.
Sistem, DLL'yi kaldırdığında çekirdek modu DLL'sinin DllUnload yordamını çağırır.
NTSTATUS DllUnload(void);
Dışa aktarma sürücüleri DllUnload rutinlerini sağlamalıdır. DLL'deki yordamlar tarafından kullanılan tüm kaynakları serbest bırakmak için DllUnload yordamını kullanabilirsiniz.