Aracılığıyla paylaş


Çerçeve Nesnesi Bağlam Alanı

Nesne bağlam alanı, sürücünün bir nesneye ayırabileceği ve atayabileceği ek, sayfalanamayan bellek alanıdır. Her çerçeve tabanlı sürücü, sürücünün aldığı veya oluşturduğu her çerçeve nesnesi için bir veya daha fazla nesneye özgü bağlam alanı oluşturabilir.

Çerçeve tabanlı sürücüler, nesneye özgü tüm verileri değere veya işaretçiye göre, verilerin ait olduğu nesnenin bağlam alanında depolamalıdır.

Örneğin, USB cihazları için bir sürücü, çerçeve cihaz nesneleri için bağlam alanı oluşturabilir. Bağlam alanında, sürücü cihazın USB_DEVICE_DESCRIPTOR ve USB_CONFIGURATION_DESCRIPTOR yapıları gibi cihaza özgü bilgilerin yanı sıra cihaz arabiriminin borularını temsil eden bir koleksiyonu nesnesi tanıtıcı depolayabilir.

Çerçeve, çerçeve nesnelerini bir sürücüden diğerine geçirmediğinden, iki sürücü arasında veri geçirmek için nesnenin bağlam alanını kullanamazsınız.

Bir nesnenin bağlam alanını tanımlamak için bir veya daha fazla yapı oluşturmanız gerekir. Her yapı ayrı bir bağlam alanını temsil eder. Sürücünüz nesneye özgü bilgilerin bir parçasını depolamak için her yapı üyesini kullanır. Ayrıca, sürücünüz çerçeveden her yapı için bir erişimci yöntemi oluşturmasını istemelidir. Bu erişimci yöntemi giriş olarak bir nesne tutamacını kabul eder ve nesnenin bağlam alanının adresini döndürür.

Sürücünüz WdfDeviceCreategibi bir nesne oluşturma yöntemini her çağırdığı zaman yöntemi isteğe bağlı olarak bağlam alanı ayırır. Tüm nesne oluşturma yöntemleri giriş olarak isteğe bağlı bir WDF_OBJECT_ATTRIBUTES yapısını kabul eder. Bu yapı, çerçevenin nesne için ayırmasını istediğiniz bağlam alanını açıklar.

Sürücü nesnenin oluşturma yöntemini çağırdıktan sonra nesneye ek bağlam alanı eklemek için, sürücü WdfObjectAllocateContext yöntemini çağırabilir. Bu yöntem, nesne oluşturma yöntemleri gibi WDF_OBJECT_ATTRIBUTES bir yapıyı giriş olarak kabul eder.

Çerçeve bir nesne için bağlam alanı ayırdığında, bağlam alanını da sıfırla başlatır.

Çerçeve veya sürücü bir çerçeve nesnesini sildiğinde, çerçeve nesnenin tüm bağlam alanını siler.

Sürücünüz bir nesne oluştururken sürücünün ayırdığı arabelleklere yönelik işaretçileri depolamak için bağlam alanı kullanıyorsa, sürücü nesne silindiğinde arabellekleri serbest bırakacak bir EvtCleanupCallback işlevi sağlamalıdır.

Sürücünüzün oluşturduğu nesneler için nesnenin bağlam alanı yapısını ve erişimci yöntemini tanımlamak için, sürücünüz aşağıdaki adımları kullanmalıdır:

  1. Depolamak istediğiniz verileri açıklayan bir yapı tanımlayın. Örneğin, sürücünüzün cihaz nesneleri için bağlam verileri oluşturmak istiyorsanız, sürücünüz MY_DEVICE_CONTEXT adlı bir yapı tanımlayabilir.

  2. WDF_DECLARE_CONTEXT_TYPE makroyu veya WDF_DECLARE_CONTEXT_TYPE_WITH_NAME makroyu kullanın. Bu makroların her ikisi de aşağıdakileri yapar:

    • WDF_OBJECT_CONTEXT_TYPE_INFO yapısını oluşturun ve başlatın.
    • Sürücünüzün daha sonra bir nesnenin bağlam alanına erişmek için kullanacağı bir erişimci yöntemi tanımlayın. Erişimci yönteminin dönüş değeri, nesnenin bağlam alanına bir işaretçidir.

    WDF_DECLARE_CONTEXT_TYPE makro, yapınızın adından erişimci yönteminin adını oluşturur. Örneğin, bağlam yapınızın adı MY_DEVICE_CONTEXT ise, makro WdfObjectGet_MY_DEVICE_CONTEXTadlı bir erişimci yöntemi oluşturur.

    WDF_DECLARE_CONTEXT_TYPE_WITH_NAME makro, erişimci yönteminin adını belirtmenize olanak tanır. Örneğin, cihaz nesneleri için bağlam erişimcisi yönteminizin adı olarak GetMyDeviceContext belirtebilirsiniz.

  3. Nesnenin WDF_OBJECT_ATTRIBUTES yapısını başlatmak için WDF_OBJECT_ATTRIBUTES_INIT çağırın.

  4. WDF_OBJECT_ATTRIBUTES yapısının ContextTypeInfo üyesini WDF_OBJECT_CONTEXT_TYPE_INFO yapısının adresine ayarlamak için WDF_OBJECT_ATTRIBUTES_SET_CONTEXT_TYPE makrosunu kullanın.

  5. WdfDeviceCreategibi bir nesne oluşturma yöntemini çağır.

Sürücünüz bir nesne oluşturduktan sonra, nesneye ek bağlam alanı eklemek için istediğiniz zaman WdfObjectAllocateContext çağırabilir.

1. ve 2. adımlar genel veri yapılarını tanımladığından ve sürücü çağrılabilen bir yordam oluşturduğundan, sürücünüz genel verileri bildiren bir sürücü alanında (genellikle bir üst bilgi dosyası) bu adımları tamamlamalıdır. Bu adımlar, sürücünüzün işlemleri içerisinden tamamlanmamalıdır.

Sürücünüz, WdfDeviceCreate'yi çağıran bir nesne oluşturan bir sürücü rutininde bulunan EvtDriverDeviceAdd geri çağırma işlevi gibi, 3., 4. ve 5. adımları tamamlamalıdır.

Çerçeve, sürücünüz adına iki tür nesne (çerçeve isteği nesneleri ve çerçeve dosyası nesneleri) oluşturabilir. Sürücünüz sırasıyla WdfDeviceInitSetRequestAttributes ve WdfDeviceInitSetFileObjectConfigçağırarak bu nesneler için bağlam alanı kaydedebilir. Sürücünüz, bu nesneler için bağlam alanı ayırmak için WdfObjectAllocateContext de çağırabilir.

Bir nesne oluşturulduktan sonra, sürücü aşağıdaki tekniklerden birini kullanarak nesnenin bağlam alanına bir işaretçi alabilir:

Sürücünüzde bağlam alanı işaretçisi varsa, WdfObjectContextGetObjectçağırarak bağlam alanının ait olduğu nesneyi bulabilir.