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.
İşlev sürücüsü bir IoCompletion yordamı ayarlar, IRP_MN_START_DEVICE isteğini cihaz yığınına gönderir ve başlatma işlemlerini, alt sürücüler IRP ile işlemlerini tamamlayana kadar erteler. IRP işlemini ertelemek için çekirdek olayı ve IoCompletion yordamı kullanma hakkında ayrıntılı bilgi için bkz. PnP IRP İşlemesini Daha Düşük Sürücüler Bitene Kadar Erteleme.
DispatchPnP yordamı, tüm alttaki sürücülerin IRP'yi tamamladıktan sonra denetimi yeniden kazandığında, işlev sürücüsü, cihazı başlatmak için görevlerini gerçekleştirir. İşlev sürücüsü cihazı aşağıdaki gibi bir yordamla başlatır:
Daha düşük bir sürücü IRP'yi başarısız olduysa (IoCallDriver bir hata döndürdü), IRP'yi işlemeye devam etmeyin. Gerekli temizlemeleri yapın ve DispatchPnP yordamından dönün (bu listedeki son adıma gidin).
Alt düzey sürücüler IRP'yi başarıyla işlediyse, cihazı başlatın.
Bir cihazı başlatmanın tam adımları cihazdan cihaza farklılık gösterir. Bu tür adımlar arasında G/Ç alanını eşleme, donanım yazmaçlarını başlatma, cihazı D0 güç durumunda ayarlama ve IoConnectInterrupt ile kesmeyi bağlama sayılabilir. Sürücü bir IRP_MN_STOP_DEVICE isteğinden sonra cihazı yeniden başlatıyorsa, sürücünün cihaz durumunu geri yüklemeye ihtiyacı olabilir.
Herhangi bir sürücünün erişebilmesi için cihazın açık olması gerekir. Daha fazla bilgi için bkz . Cihazı Açma .
Cihazın uyandırma için etkinleştirilmesi gerekiyorsa, güç ilkesi sahibi (genellikle işlev sürücüsü), cihazı güçlendirdikten sonra ve IRP_MN_START_DEVICE isteğini tamamlamadan önce bir bekleme/uyandırma IRP'sini göndermelidir. Ayrıntılar için bkz. Bekleme/Uyandırma IRP'sini Gönderme.
IRP tutma kuyruğunda IRP'leri başlatın.
Sürücü tarafından tanımlanan HOLD_NEW_REQUESTS bayrağını temizleyin ve IRP tutma kuyruğundaki IRP'leri çalıştırmaya başlayın. Sürücüler, bir cihazı ilk kez başlatırken ve sorgu-durdurma veya IRP'yi durdurma işlemlerinin ardından cihazı yeniden başlatırken bunu yapmalıdır. Daha fazla bilgi için bkz. Cihaz Duraklatıldığında Gelen IRP'leri Bekletme.
[İsteğe bağlı] IoSetDeviceInterfaceState çağrısı yaparak cihaz için arabirimleri etkinleştirin.
Varsa, sürücünün önceden AddDevice yordamına (veya bir INF'de ya da ortak yükleyici gibi başka bir bileşene) kaydettiği arabirimleri etkinleştirin.
Windows 2000 ve sonraki Windows sürümlerinde PnP yöneticisi, IRP_MN_START_DEVICE IRP tamamlanana kadar cihaz arabirimine gelenler hakkında bildirim göndermez ve cihazın tüm sürücülerinin başlangıç işlemlerini tamamladığını gösterir. PnP yöneticisi, cihazın tüm sürücüleri başlatma IRP'sini tamamlamadan önce gelen oluşturma isteklerini de başarısız kılar.
IRP'yi tamamlayın.
İşlev sürücüsünün IoCompletion yordamı, PnP IRP İşlemini Daha Düşük Sürücüler Bitene Kadar Duraklatma bölümünde açıklandığı gibi STATUS_MORE_PROCESSING_REQUIRED döndürdü, bu nedenle işlev sürücüsünün DispatchPnP yordamı G/Ç tamamlama işlemini sürdürmek için IoCompleteRequest'i çağırmalıdır.
İşlev sürücüsünün başlatma işlemleri başarılı olursa, sürücü Irp-IoStatus.Status> değerini STATUS_SUCCESS olarak ayarlar, IO_NO_INCREMENT öncelik artışıyla IoCompleteRequest'i çağırır ve DispatchPnP yordamından STATUS_SUCCESS döndürür.
İşlev sürücüsü başlatma işlemleri sırasında bir hatayla karşılaşırsa, sürücü IRP'de bir hata durumu ayarlar, ioCompleteRequest'i IO_NO_INCREMENT ile çağırır ve DispatchPnP yordamından hatayı döndürür.
Daha düşük bir sürücü IRP'yi başarısız olduysa (IoCallDriver bir hata döndürdü), işlev sürücüsü IO_NO_INCREMENT ile IoCompleteRequest'i çağırır ve DispatchPnP yordamından IoCallDriver hatasını döndürür. İşlev sürücüsü, bu durumda Irp-IoStatus.Status> değerini ayarlamaz çünkü durum, IRP'yi başarısız eden alt sürücü tarafından zaten ayarlandı.
İşlev sürücüsü bir IRP_MN_START_DEVICE isteği aldığında, PnP yöneticisinin cihaza atadığı ham ve çevrilmiş kaynakları açıklayan IrpSp-Parameters.StartDevice.AllocatedResources> ve IrpSp-Parameters.StartDevice.AllocatedResourcesTranslated'deki> yapıları incelemelidir. Sürücüler, her kaynak listesinin bir kopyasını hata ayıklama yardımı olarak cihaz uzantısına kaydetmelidir.
Kaynak listeleri, CM_RESOURCE_LIST yapıları olarak eşleştirilir. Bu yapılarda, ham listenin her bir öğesi, çevrilen listenin aynı öğesine karşılık gelir. Örneğin , AllocatedResources.List[0] ham G/Ç bağlantı noktası aralığını açıklıyorsa , AllocatedResourcesTranslated.List[0] çeviriden sonra aynı aralığı açıklar. Çevrilen her kaynak bir fiziksel adres ve kaynağın türünü içerir.
Bir sürücüye çevrilmiş bir bellek kaynağı (CmResourceTypeMemory) atanırsa, fiziksel adresi cihaz kayıtlarına erişebileceği bir sanal adresle eşlemek için MmMapIoSpace çağrısı yapması gerekir. Bir sürücünün platformdan bağımsız bir şekilde çalışması için döndürülen, çevrilen her kaynağı denetlemesi ve gerekirse eşlemesi gerekir.
Bir işlev sürücüsü, tüm cihaz kaynaklarına erişim sağlamak için bir IRP_MN_START_DEVICE'a yanıt olarak aşağıdakileri yapmalıdır:
IrpSp-Parameters.StartDevice.AllocatedResources> dosyasını cihaz uzantısına kopyalayın.
IrpSp-Parameters.StartDevice.AllocatedResourcesTranslated> öğesini cihaz uzantısına kopyalayın.
Döngüde AllocatedResourcesTranslated içindeki her tanımlayıcı öğesini inceleyin. Tanımlayıcı kaynak türü CmResourceTypeMemory ise, çevrilen kaynağın fiziksel adresini ve uzunluğunu geçirerek MmMapIoSpace'i çağırın.
Sürücü bir IRP_MN_STOP_DEVICE, IRP_MN_REMOVE_DEVICE veya IRP_MN_SURPRISE_REMOVAL isteği aldığında, benzer bir döngüde MmUnmapIoSpace'i çağırarak eşlemeleri serbest bırakması gerekir. Sürücü, IRP_MN_START_DEVICE isteğinde başarısız olması durumunda MmUnmapIoSpace'ı da çağırmalıdır.
Daha fazla bilgi için bkz. Bus-Relative Adreslerini Sanal Adreslerle Eşleme .