Aracılığıyla paylaş


Kilitleri Kaldır'ı kullanma

Kilit kaldırma yordamları, bir cihazdaki bekleyen G/Ç işlemlerinin sayısını izlemenin ve bir sürücünün cihaz nesnesini ayırmanın ve silmenin ne zaman güvenli olduğunu belirlemenin bir yolunu sağlar. Sistem, bu rutinleri sürücü geliştiricilerine, kendi izleme mekanizmalarını uygulamaya alternatif olarak sunar.

Bir sürücü bu mekanizmayı iki amaçla kullanabilir:

  1. Sürücünün DispatchPnP rutininin, kilit tutulurken (örneğin, başka bir sürücü rutini cihaza erişirken), bir IRP_MN_REMOVE_DEVICE isteğini tamamlamadığından emin olmak için.

  2. Sürücünün cihaz nesnesini silmeme nedenini saymak ve bu sayı sıfıra çıktığında bir olay ayarlamak için.

Kaldırma kilidi başlatmak için, sürücü cihaz uzantısındabir IO_REMOVE_LOCK yapısı ayırmalı ve ardından IoInitializeRemoveLock çağrısı yapmalıdır. Sürücü genellikle bir cihaz nesnesi için cihaz uzantısının geri kalanını başlatırken AddDevice yordamında IoInitializeRemoveLock'u çağırır.

Sürücünüz her G/Ç işlemi başlattığında IoAcquireRemoveLock'u çağırmalıdır. Sürücünün G/Ç işlemini her bitirişinde IoReleaseRemoveLock çağrısı yapması gerekir. Bir sürücü kilidi birden çok kez alabilir. Kilit kaldırma yordamları, kilidin açık kalan edinimlerinin sayısını korur. Her IoAcquireRemoveLock çağrısı sayıyı artırır ve IoReleaseRemoveLock sayıyı düşürür.

Sürücünüz, koduna bir başvuru iletirken (süreölçerler, DPC'ler, geri çağırmalar vb. için) IoAcquireRemoveLock'u da çağırmalıdır. Olay geri döndüğünde sürücü IoReleaseRemoveLock çağrısını yapmalıdır.

IRP_MN_REMOVE_DEVICE dağıtım kodunda, sürücünün kilidi bir kez daha alması ve ardından IoReleaseRemoveLockAndWait çağrısı yapması gerekir. Bu rutin, kilidin tüm aktif alımları serbest bırakılana kadar geri dönmez. Kuyruğa alınan G/Ç işlemlerinin tamamlanmasına izin vermek için, her sürücü IRP_MN_REMOVE_DEVICE isteğini sonraki-alt sürücüye geçirdikten sonra ve belleği serbest bırakmadan önceIoDetachDevice'i veya IoDeleteDevice'i çağırdıktan sonra IoReleaseRemoveLockAndWait'i çağırmalıdır. Belirli bir kaldırma kilidi için IoReleaseRemoveLockAndWait çağrıldıktan sonra, aynı kaldırma kilidi için IoAcquireRemoveLock'a yapılan sonraki tüm çağrılar başarısız olur.

IoReleaseRemoveLockAndWait döndürüldüğünde, sürücü cihazın kaldırılmaya hazır olduğu ve G/Ç işlemlerini gerçekleştiremediği bir durumda olduğunu düşünmelidir. Bu nedenle, kaldırma kilidini yeniden başlatmak için sürücünün IoInitializeRemoveLock'u çağırmaması gerekir. Sürücü Sürücü Doğrulayıcı tarafından doğrulanırken bu kuralın ihlali bir hata denetimine neden olur.

Sürücü bir IO_REMOVE_LOCK yapısını bir cihaz nesnesinin cihaz uzantısında depoladığından, sürücü bir IRP_MN_REMOVE_DEVICE isteğini işlerken cihaz uzantısını sildiğinde kaldırma kilidi silinir.