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.
Cihaz arabirimi, bir uygulamanın cihaza erişmek için kullanabileceği Tak Çalıştır (PnP) cihazına sembolik bir bağlantıdır. Kullanıcı modu uygulaması arabirimin sembolik bağlantı adını Microsoft Win32 CreateFile işlevi gibi bir API öğesine geçirebilir. Cihaz arabiriminin sembolik bağlantı adını almak için kullanıcı modu uygulaması configuration manager işlevlerini veya SetupApi işlevlerini çağırabilir. Daha fazla bilgi için bkz . Yüklü cihaz arabirimlerini listeleme.
Her cihaz arabirimi bir cihaz arabirimi sınıfına aittir. Örneğin, bir CD-ROM cihazı için sürücü yığını GUID_DEVINTERFACE_CDROM sınıfına ait bir arabirim sağlayabilir. CD-ROM cihazın sürücülerinden biri, sisteme ve uygulamalara bir CD-ROM cihazının kullanılabilir olduğunu bildirmek için GUID_DEVINTERFACE_CDROM sınıfının bir örneğini kaydeder. Cihaz arabirimi sınıfları hakkında daha fazla bilgi için bkz. Cihaz Arabirimi Sınıflara Genel Bakış.
Cihaz Arayüzü Kaydetme
Bir cihaz arabirimi sınıfının örneğini kaydetmek için, çerçeve tabanlı bir sürücü, cihaz başlamadan önce veya sonra WdfDeviceCreateDeviceInterface'i çağırabilir. Sürücü arabiriminin birden çok örneğini destekliyorsa, her örneğe benzersiz bir başvuru dizesi atayabilir.
Sürücü bir cihaz arabirimi kaydettikten sonra, sistemin cihaz arabirimine atadığı sembolik bağlantı adını almak için WdfDeviceRetrieveDeviceInterfaceString'i çağırabilir.
Sürücülerin cihaz arabirimlerini kaydetmenin diğer yolları hakkında bilgi için bkz. Cihaz Arabirimi Sınıfı Kaydetme.
Aygıt Arabirimini Etkinleştirme ve Devre Dışı Bırakma
Cihaz başlatılmadan önce oluşturulan arabirimler (örneğin EvtDriverDeviceAdd, EvtChildListCreateDevice veya EvtDevicePrepareHardware'den) cihaz PnP numaralandırmasından geçtiğinde ve başlatıldığında çerçeve tarafından otomatik olarak etkinleştirilir. PnP başlatma sırasında arabirimin otomatik olarak etkinleştirilmesini önlemek için, PnP başlamadan önce bu arabirim için aynı geri çağırma işlevinden WdfDeviceSetDeviceInterfaceStateEx'i çağırın ( EnableInterface parametresini YANLIŞ olarak ayarlayın).
Cihaz zaten başlatıldıktan sonra oluşturulan arabirimler otomatik olarak etkinleştirilmez. Bu tür arabirimleri etkinleştirmek için sürücünün WdfDeviceSetDeviceInterfaceState veya WdfDeviceSetDeviceInterfaceStateEx çağrısı yapması gerekir.
Cihaz PnP kaldırıldığında tüm arabirimler otomatik olarak devre dışı bırakılır. Cihaz güç durumu değişikliklerinin veya PnP kaynağının yeniden dengelemesinin arabirimin durumunu değiştirmediğini unutmayın.
Bir sürücü gerekirse bir cihaz arabirimini devre dışı bırakabilir ve yeniden etkinleştirebilir. Örneğin, bir sürücü cihazının yanıt vermeyi durdurduğunu belirlerse, sürücü WdfDeviceSetDeviceInterfaceState veya WdfDeviceSetDeviceInterfaceStateEx'i çağırarak cihazın arabirimlerini devre dışı bırakabilir ve uygulamaların arabirime yeni tanıtıcılar almasını engelleyebilir. (Arabirimdeki mevcut tanıtıcılar etkilenmez.) Cihaz daha sonra kullanılabilir hale gelirse, sürücü arabirimleri yeniden etkinleştirmek için WdfDeviceSetDeviceInterfaceState veya WdfDeviceSetDeviceInterfaceStateEx'i yeniden çağırabilir.
Cihaz Arabirimine Erişim İsteklerinin Alınması
Bir uygulama veya çekirdek modu bileşeni bir sürücünün cihaz arabirimine erişim istediğinde, çerçeve sürücünün EvtDeviceFileCreate geri çağırma işlevini çağırır. Sürücü, uygulama veya çekirdek modu bileşeninin eriştiği cihazın veya dosyanın adını almak için WdfFileObjectGetFileName öğesini çağırabilir. Sürücü cihaz arabirimini kaydederken bir başvuru dizesi belirttiyse, işletim sistemi WdfFileObjectGetFileName'in döndürdüğü dosya veya cihaz adına başvuru dizesini içerir.
Başka Bir Sürücünün Cihaz Arabirimine Erişme
Bu bölümde, bir Kernel-Mode Driver Framework (KMDF) sürücüsünün veya User-Mode Driver Framework (UMDF) sürüm 2 sürücüsünün, başka bir sürücü tarafından sağlanan bir cihaz arabiriminin varılması veya kaldırılması bildirimi için nasıl kaydedildiği ve ardından cihaz arabirimi tarafından temsil edilen cihazla iletişim kurmak için uzak bir G/Ç hedefi oluşturması gösterilmektedir.
Bunu bir UMDF sürüm 1 sürücüsünde yapma hakkında bilgi için bkz. UMDF Sürücülerinde Cihaz Arabirimlerini Kullanma.
Cihaz arabirimi olaylarının bildirimine kaydolmak için BIR KMDF sürücüsü IoRegisterPlugPlayNotification'ı çağırırken, UMDF 2 sürücüsü CM_Register_Notification çağırır. Her iki durumda da sürücü , EvtDriverDeviceAdd geri çağırma işlevinden uygun yordamı çağırır.
Aşağıdaki kod örneği, yerel UMDF 2 sürücüsünün bildirimlere nasıl kaydolup uzak G/Ç hedefini nasıl açtığını gösterir.
Uzak sürücü, EvtDriverDeviceAdd'denWdfDeviceCreateDeviceInterface çağrısı yaparak bir cihaz arabirimine kaydolabilir.
UNICODE_STRING ref; RtlInitUnicodeString(&ref, MY_HID_FILTER_REFERENCE_STRING); status = WdfDeviceCreateDeviceInterface( hDevice, (LPGUID) &GUID_DEVINTERFACE_MY_HIDFILTER_DRIVER, &ref // ReferenceString ); if (!NT_SUCCESS (status)) { MyKdPrint( ("WdfDeviceCreateDeviceInterface failed 0x%x\n", status)); return status; }Yerel sürücü, bir cihaz arabirimi kullanılabilir olduğunda bildirime kaydolmak için EvtDriverDeviceAdd'denCM_Register_Notification çağırır. Cihaz arabirimleri kullanılabilir olduğunda, çerçevenin çağıracağı bildirim geri çağırma rutinine bir işaretçi sağlayın.
DWORD cmRet; CM_NOTIFY_FILTER cmFilter; ZeroMemory(&cmFilter, sizeof(cmFilter)); cmFilter.cbSize = sizeof(cmFilter); cmFilter.FilterType = CM_NOTIFY_FILTER_TYPE_DEVICEINTERFACE; cmFilter.u.DeviceInterface.ClassGuid = GUID_DEVINTERFACE_MY_HIDFILTER_DRIVER; cmRet = CM_Register_Notification( &cmFilter, // PCM_NOTIFY_FILTER pFilter, (PVOID) hDevice, // PVOID pContext, MyCmInterfaceNotification, // PCM_NOTIFY_CALLBACK pCallback, &fdoData->CmNotificationHandle // PHCMNOTIFICATION pNotifyContext ); if (cmRet != CR_SUCCESS) { MyKdPrint( ("CM_Register_Notification failed, error %d\n", cmRet)); status = STATUS_UNSUCCESSFUL; return status; }Sistem, belirtilen cihaz arabirimi her geldiğinde veya kaldırıldığında yerel sürücünün bildirim geri çağırma yordamını çağırır. Geri çağırma yordamı, hangi cihaz arabiriminin geldiğini belirlemek için EventData parametresini inceleyebilir. Ardından cihaz arabirimini açmak için bir iş öğesini kuyruğa alabilir.
DWORD MyCmInterfaceNotification( _In_ HCMNOTIFICATION hNotify, _In_opt_ PVOID Context, _In_ CM_NOTIFY_ACTION Action, _In_reads_bytes_(EventDataSize) PCM_NOTIFY_EVENT_DATA EventData, _In_ DWORD EventDataSize ) { PFDO_DATA fdoData; UNICODE_STRING name; WDFDEVICE device; NTSTATUS status; WDFWORKITEM workitem; UNREFERENCED_PARAMETER(hNotify); UNREFERENCED_PARAMETER(EventDataSize); device = (WDFDEVICE) Context; fdoData = ToasterFdoGetData(device); switch(Action) { case CM_NOTIFY_ACTION_DEVICEINTERFACEARRIVAL: MyKdPrint( ("MyCmInterfaceNotification: Arrival of %S\n", EventData->u.DeviceInterface.SymbolicLink)); // // Enqueue a work item to open target // break; case CM_NOTIFY_ACTION_DEVICEINTERFACEREMOVAL: MyKdPrint( ("MyCmInterfaceNotification: removal of %S\n", EventData->u.DeviceInterface.SymbolicLink)); break; default: MyKdPrint( ("MyCmInterfaceNotification: Arrival unknown action\n")); break; } return 0; }İş öğesi geri çağırma işlevinden, yerel sürücü uzak hedefi oluşturmak için WdfIoTargetCreate ve uzak G/Ç hedefi açmak için WdfIoTargetOpen'ı çağırır.
WdfIoTargetOpen çağrılırken, sürücü isteğe bağlı olarak kaldırma bildirimini almak için bir EvtIoTargetQueryRemove geri çağırma işlevini kaydeder ve kaldırmayı reddetme fırsatı sağlar. Sürücü EvtIoTargetQueryRemove sağlamazsa, cihaz kaldırıldığında çerçeve G/Ç hedefini kapatır.
Nadir durumlarda, bir UMDF 2 sürücüsü cihaz kaldırma bildirimine kaydolmak için CM_Register_Notification ikinci kez çağırabilir. Örneğin, sürücü aygıt arabirimine bir HANDLE almak için CreateFile işlevini çağırırsa, kaldırma sorgularına düzgün yanıt verebilmesi için cihaz kaldırma bildirimine kaydolması gerekir. Çoğu durumda, UMDF 2 sürücüsü yalnızca bir kez CM_Register_Notification çağırır ve cihaz kaldırma için WDF desteğine dayanır.
VOID EvtWorkItem( _In_ WDFWORKITEM WorkItem ) { // // create and open remote target // return; }
İlgili konular
Cihaz ArabirimiNin Varış ve Cihaz Kaldırma Bildirimine Kaydolma