Aracılığıyla paylaş


Framework Nesne Koleksiyonları

Sürücüler, çerçeve nesnelerini çerçeve koleksiyonu nesneleriyle temsil edilen koleksiyonlar halinde gruplandırabilir.

Örneğin, bir sürücü büyük bir G/Ç isteğini temsil eden bir çerçeve isteği nesnesi alırsa, sürücünün büyük isteği G /Ç hedefine gönderebileceği daha küçük isteklere bölmesi gerekebilir. Büyük bir isteği daha küçük isteklere bölmek için, sürücünün küçük istekleri temsil eden bir istek nesneleri kümesi oluşturması gerekir. Sürücü tarafından oluşturulan bu istek nesnelerini izlemek için, sürücü bir koleksiyon nesnesi oluşturabilir ve bunları koleksiyona ekleyebilir.

Genellikle, bir nesne koleksiyonundaki nesneler tek bir çerçeve nesnesi türünden oluşur, ancak bir sürücü farklı nesne türlerinden oluşan bir koleksiyon oluşturabilir.

Sürücünüz ayrıca birden fazla koleksiyondan oluşan bir koleksiyon oluşturabilir. Yani, bir koleksiyon bir dizi koleksiyon nesnesinden oluşabilir.

Çerçeve tabanlı sürücüler nesne koleksiyonlarında aşağıdaki işlemleri gerçekleştirebilir:

  • Koleksiyon nesnesi oluşturun.

    Yeni bir koleksiyon oluşturmak için sürücüler WdfCollectionCreate öğesini çağırabilir.

  • Bir koleksiyona nesne ekleyin.

    Bir koleksiyona nesne eklemek için sürücüler WdfCollectionAdd öğesini bir veya daha fazla kez çağırabilir. WdfCollectionAdd'a yapılan her çağrı, koleksiyonun sonuna bir nesne ekler ve eklenen nesnenin başvuru sayısını artırır.

  • Bir nesneyi koleksiyondan kaldırma.

    Bir nesneyi koleksiyondan kaldırmak ve başvuru sayısını kısaltmak için sürücüler WdfCollectionRemove veya WdfCollectionRemoveItem'ı çağırabilir. Bir nesne kaldırıldığında, kaldırılan nesneden sonraki tüm nesnelerin dizini otomatik olarak azalmış olur.

  • Bir koleksiyondaki nesne sayısını elde edin.

    Bir koleksiyonun içerdiği nesne sayısını belirlemek için sürücüler WdfCollectionGetCount'u çağırabilir.

  • Koleksiyondaki bir nesneye erişim tutumu alın.

    Sürücü giriş bağımsız değişkeni olarak bir dizin değeri sağlayarak WdfCollectionGetItem'i çağırırsa, sürücü dizin değeriyle ilişkili nesneye bir tanıtıcı alır. (Sıfır dizin değeri koleksiyondaki ilk nesneyi temsil eder, birinin dizin değeri ikinci nesneyi temsil eder, vb. bağlı liste gibi. Sürücü bir koleksiyondan i öğesini kaldırdığında, i+1 öğesi i. öğe olur.)

    Sürücüler ayrıca WdfCollectionGetFirstItem veya WdfCollectionGetLastItem'ı çağırarak koleksiyona eklenen ilk veya son öğeye tanıtıcı elde edebilir.

  • Bir koleksiyonu kilitleyin.

    Sürücü, IRQL = PASSIVE_LEVEL'da bir koleksiyona erişimi eşitlemek için WdfWaitLockAcquire'ı çağırabilir veya IRQL = DISPATCH_LEVEL'de WdfSpinLockAcquire eşitleme erişimini çağırabilir. Bir sürücü kilit aldıktan sonra, WdfWaitLockAcquire veya WdfSpinLockAcquire'ı da çağıran sürücüdeki diğer kodlar koleksiyona erişemez. Koleksiyondaki bir işlemi tamamladıktan sonra sürücünün WdfWaitLockRelease çağrısı yapması gerekir.

    WdfWaitLockAcquire veya WdfSpinLockAcquire çağrılması, diğer kod WdfWaitLockAcquire veya WdfSpinLockAcquire'ı da çağırmazsa sürücüdeki diğer kodun koleksiyona aynı anda erişmesini engellemez.

  • Koleksiyonu silme.

    Bir koleksiyon nesnesini silmek için sürücüler WdfObjectDelete'i çağırabilir. Ancak genellikle, sürücüler bir koleksiyon oluştururken bir üst nesne belirtir ve çerçeve üst nesneyi sildiğinde koleksiyon nesnesini siler.

    Örneğin, bir sürücü büyük G/Ç isteğini daha küçük isteklere bölebilmesi için bir dizi istek nesnesi oluşturursa, büyük G/Ç isteğinin istek nesnesini koleksiyon nesnesinin üst nesnesi yapabilir. Sonunda sürücünün G/Ç hedefi daha küçük istekleri tamamlamak için WdfRequestComplete'i çağırır. Bu noktada, sürücü büyük G/Ç isteği için WdfRequestComplete'i çağırarak çerçevenin istek nesnesini ve alt nesnesini silmesine neden olur: koleksiyon nesnesi.

    Çerçeve kaldırılmayan nesneler içeren bir koleksiyon nesnesini sildiğinde, çerçeve nesneleri koleksiyondan kaldırır ve başvuru sayılarını siler, ancak yalnızca koleksiyon nesnesini siler.

Bazen bir sürücü bir koleksiyondaki tüm nesneleri incelemelidir. Aşağıdaki kod örneği bu durumu gösterir:

WdfWaitLockAcquire(CollectionLockHandle, NULL);
ItemCount = WdfCollectionGetCount(CollectionHandle);
for (i=0; i<ItemCount; i++) {
    ObjectHandle = WdfCollectionGetItem(CollectionHandle, i);
    // 1. Call object-specific methods to obtain object properties.
    // 2. Perform object-specific operations.
    }
WdfWaitLockRelease(CollectionLockHandle);