Aracılığıyla paylaş


Çerçeve Dosyası Nesneleri

Bir uygulama veya sürücü genellikle bir dosya oluşturarak veya açarak bir cihaza erişmeye çalıştığında, işletim sistemi sürücü yığınına bir dosya oluşturma isteği gönderir. Uygulama veya sürücü cihazı kullanmayı bitirdiğinde, sistem sürücü yığınına dosya temizleme ve kapatma istekleri gönderir. Bu üç isteğin istek türleri sırasıyla WdfRequestTypeCreate, WdfRequestTypeCleanup ve WdfRequestTypeClose'dir.

Genellikle, sürücünüz WdfDeviceInitSetExclusive'ı çağırmadığı sürece, birden çok dosya aynı anda açabildiği veya birden çok uygulamanın cihaza aynı anda erişebildiği için, sürücü dosya oluşturma, temizleme ve kapatma istekleri aldığında dosyaya özgü veya diğer erişime özgü işlemler gerçekleştirmelidir. Bu nedenle sürücünün her dosya veya uygulamayla ilişkili G/Ç isteklerini izlemesi gerekir.

Çerçeve, bir uygulamanın veya sürücünün bir cihaza erişmek için dosya, dizin, birim, posta yuvası, adlandırılmış kanal veya tüm cihaz gibi araçlarını temsil eden çerçeve dosya nesnelerini tanımlar. Dosya adı bir dosya nesnesiyle ilişkilendirilebilir, ancak dosya adının anlamı sürücüye özgüdür. Dosya adları hakkında daha fazla bilgi için bkz. Cihaz Ad Alanı Erişimini Denetleme.

Sürücünüz dosya işlemlerini işlemesi gerekiyorsa, EvtDriverDeviceAdd geri çağırma işlevinin içinden WdfDeviceInitSetFileObjectConfig çağrısı yapmalıdır. WdfDeviceInitSetFileObjectConfig yöntemi giriş olarak bir WDF_FILEOBJECT_CONFIG yapısı alır. Sürücü, evtDeviceFileCreate, EvtFileCleanup ve EvtFileClose geri çağırma işlevlerini kaydetmek ve isteğe bağlı olarak, sürücünün her dosya oluşturma isteği aldığında çerçeve dosya nesnesi oluşturup oluşturmayacağını belirtmek için bu yapıyı kullanır.

Dosya işlemlerini işleyen sürücülerin çoğu, dosyaya özgü bilgileri çerçeve dosya nesnesinin bağlam alanında depolar. Sürücünüz dosya işlemlerini işlerse ancak bilgileri bir dosya nesnesinin bağlam alanında depolaması gerekmiyorsa, çerçevenin sürücü için çerçeve dosya nesneleri oluşturması gerekmez.

Dosya Oluşturma veya Açma

Çerçeve, işlev sürücünüz için bir dosya oluşturma isteği aldığında:

  1. Sürücü daha önce çerçeve dosyası nesnelerini kullanması gerekmediğini belirtmediği sürece dosyayı temsil eden bir çerçeve dosyası nesnesi oluşturur.

  2. Sürücü geri çağırma işlevini kaydettiyse, sürücünüzün EvtDeviceFileCreate geri çağırma işlevini çağırır.

EvtDeviceFileCreate geri çağırma işlevi genellikle dosya hakkında adı ve dosya nesnesi bayrakları gibi bilgileri alır. Sürücü genellikle bu bilgileri çerçeve dosyası nesnesinin bağlam alanında depolar.

Sürücü, bir EvtDeviceFileCreate geri çağırma işlevi sağlamak yerine WdfDeviceConfigureRequestDispatching'i çağırarak tüm dosya oluşturma isteklerini alacak bir G/Ç kuyruğu ayarlayabilir (WdfRequestTypeCreate istek türü). Sürücü daha sonra sıranın EvtIoDefault istek işleyicisinde dosya oluşturma isteklerini alır. (Kuyruğun WDF_IO_QUEUE_CONFIG yapısının DefaultQueue üyesi TRUE olarak ayarlandıysa G/Ç kuyruğu dosya oluşturma isteklerini kabul edemez.)

Sürücünüz bir EvtDeviceFileCreate geri çağırma işlevi sağlamıyorsa ve WdfRequestTypeCreate türündeki G/Ç isteklerini işlemek için bir G/Ç kuyruğu ayarlamazsa, çerçeve:

  • Sürücünüz bir işlev sürücüsüyse, sürücü için durum değeri STATUS_SUCCESS olan tüm dosya oluşturma isteklerini tamamlar.

  • Sürücünüz bir filtre sürücüsüyse, tüm dosya oluşturma isteklerini sonraki alt sürücüye iletir.

(Bu davranışı nasıl değiştirebileceğinizi görmek için WDF_FILEOBJECT_CONFIG yapısınınAutoForwardCleanupClose üyesine bakın.)

Not İşlev sürücünüz, uygulamaların sürücünün cihazlarına erişmek için kullanabileceği herhangi bir cihaz arabirimi sağlamazsa, sürücünün tüm dosya oluşturma isteklerini tamamlayan ve NT_SUCCESS(durum) değeri YANLIŞ olan bir durum değeriyle tamamlayan bir EvtDeviceFileCreate geri çağırma işlevi sağlaması gerekir. Aksi takdirde, kötü amaçlı bir uygulama cihazın fiziksel cihaz nesnesinin (PDO) adını kullanarak bir cihaza erişmeye çalışabilir. Tüm PPO'ların adları vardır.

Sürücü bir oluşturma isteğini G/Ç hedefine iletirse , sürücü G/Ç hedefinden bir hata durumu değeri almadığı sürece, sürücü daha sonra bir hata durumu değeriyle isteği tamamlamamalıdır . Aksi takdirde, alt sürücülere oluşturma isteğinin başarısız olduğu bildirilmez ve dosya açıkmış gibi çalışmaya çalışabilirler.

Sürücü bir oluşturma isteğini G/Ç hedefine iletirse, eğer çerçeve oluşturma isteği için bir framework dosya nesnesi oluşturduysa, sürücü WDF_REQUEST_SEND_OPTION_SEND_AND_FORGET bayrağını ayarlayamaz. Bu nedenle, sürücü WdfFileObjectNotRequired bayrağını ayarlamadığı sürece bir oluşturma isteği için WDF_REQUEST_SEND_OPTION_SEND_AND_FORGET bayrağını ayarlayamaz çünkü yığında daha düşük bir sürücünün oluşturma isteğini başarısız olması durumunda sürücü WDFFILEOBJECT'i temizleyemez. Bunun yerine, sürücü diğer tüm gönderme seçeneklerini kullanabilir; örneğin, bir tamamlama yordamıyla asenkron veya senkron olarak gönderebilir. Her iki durumda da, sürücü denetimi yeniden kazandığında WdfRequestComplete'i çağırmalıdır.

Bir sürücü oluşturma isteğini hata durumuyla tamamlarsa, çerçevenin çerçeve dosyası nesnesini sildiğini ancak sürücünün EvtFileCleanup veya EvtFileClose geri çağırma işlevlerini çağırmadığını unutmayın. Bu nedenle, sürücü dosya nesnesinin bağlam alanının dışında nesneye özgü ek bellek ayırırsa, ayrılan belleği silen bir EvtCleanupCallback veya EvtDestroyCallback geri çağırma işlevi sağlamalıdır.

Windows Vista ve sonraki sürümler için dosya oluşturma istekleri iptal edilebilir. Windows işletim sisteminin önceki sürümleri, dosya oluşturma isteklerinin iptalini desteklemez.

Sistem her zaman bir kullanıcı uygulamasından gelen her oluşturma isteği için bir Windows Sürücü Modeli (WDM) dosya nesnesi oluşturur. Sürücü oluşturma isteği gönderirse, istek için bir WDM dosya nesnesi oluşturmayabilir. WDM dosya nesnesi yoksa, çerçeve genellikle bir çerçeve dosyası nesnesi oluşturmaz. Ancak, sürücünüz WdfDeviceInitSetExclusive adını verdiyse ve sürücü WDF_FILEOBJECT_CONFIG yapısının FileObjectClass üyesinde WdfFileObjectWdfCannotUseFsContexts ayarladıysa, WDM dosya nesnesi olmasa bile çerçeve bir çerçeve dosyası nesnesi oluşturur.

Dosya Bilgilerini Alma

Sürücünün EvtDeviceFileCreate geri çağırma işlevi, bir uygulamanın veya sürücünün cihaza erişimi hakkında bilgi edinmek için aşağıdaki nesne yöntemlerinden birini veya daha fazlasını çağırabilir:

WdfFileObjectGetFileName
Bir çerçeve dosyası nesnesinde bulunan dosya adını döndürür.

WdfFileObjectGetFlags
Bir çerçeve dosyası nesnesi içinde yer alan bayrakları döndürür.

WdfFileObjectWdmGetFileObject
Bir çerçeve dosyası nesnesiyle ilişkili WDM dosya nesnesini döndürür.

WdfRequestGetParameters
Bir çerçeve isteği nesnesiyle ilişkili parametreleri alır. İstek türüWdfRequestTypeCreate ise, WDF_REQUEST_PARAMETERS yapısının Parameters.Create üyesi dosya oluşturma isteği hakkında bilgi içerir.

Genellikle, sürücü dosya bilgilerini çerçeve dosya nesnesinin bağlam alanında depolar. Sürücünüz, G/Ç kuyruklarından birinden bir G/Ç isteği aldığında, istekle ilişkili çerçeve dosya nesnesine bir tanıtıcı almak için WdfRequestGetFileObject işlevini çağırabilir. Sürücü daha sonra çerçeve dosya nesnesinin bağlam alanında depolandığı dosya bilgilerini alabilir.

Sürücünüz WdfIoQueueRetrieveRequestByFileObject öğesini çağırarak belirli bir dosyayla ilişkilendirilmiş istekler için G/Ç kuyruğunda arama yapabilir.

Sürücünüzün WDM DEVICE_OBJECT yapısına bir işaretçisi varsa, sürücü WDM cihaz nesnesiyle ilişkili çerçeve dosyası nesnesine bir tanıtıcı almak için WdfDeviceGetFileObject'i çağırabilir.

Dosyayı Kapatma

Bir uygulama veya başka bir sürücü bir dosyayı kapattığında, çerçeve bir temizleme isteği ve sürücünüz için bir kapatma isteği alır. Çerçeve:

  1. Sürücü bu geri çağırma işlevlerini kaydettiyse sürücünüzün EvtFileCleanup ve EvtFileClose geri çağırma işlevlerini çağırır.

  2. Dosyayı temsil eden çerçeve dosyası nesnesini siler.

Sürücünün EvtFileCleanup ve EvtFileClose geri çağırma işlevleri, çerçeve dosyası nesnesine bir tanıtıcı alır. Sürücü, hangi çerçeve cihaz nesnesinin çerçeve dosya nesnesiyle ilişkili olduğunu belirlemek için WdfFileObjectGetDevice'i çağırabilir.