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.
[Yalnızca KMDF için geçerlidir]
DMA cihazlarının sürücüleri bazen hem bir cihazın hem de sürücünün erişebileceği arabellek alanı ayırmalıdır. Örneğin, bir cihaz bayt sayısı gibi aktarım bilgilerini bu arabellek alanına yazabilir ve sürücü aktarılan bayt sayısını belirlemek için bu bilgileri okuyabilir. Bu arabellek alanı türü, ortak arabellek olarak adlandırılır.
Ortak bir arabellek ayırmak için sürücünüzün EvtDriverDeviceAdd geri çağırma fonksiyonu:
DMA etkinleştirici nesnesi oluşturmak için WdfDmaEnablerCreateçağırır.
Arabelleği oluşturmak için WdfCommonBufferCreate veya WdfCommonBufferCreateWithConfig çağırır.
Cihazın erişebileceği arabelleğin mantıksal adresini almak için WdfCommonBufferGetAlignedLogicalAddress çağırır.
Sürücünün erişebileceği arabelleğin sanal adresini almak için WdfCommonBufferGetAlignedVirtualAddress çağırır.
Aşağıdaki kod örneği, PLX9x5x örneğinin Init.c dosyasından alınmıştır. Bu kod, KMDF sürücüsünün ortak arabellek alanını nasıl ayırıyor olduğunu gösterir.
// Allocate common buffer for building writes
DevExt->WriteCommonBufferSize =
sizeof( DMA_TRANSFER_ELEMENT) * DevExt->WriteTransferElements;
status = WdfCommonBufferCreate( DevExt->DmaEnabler,
DevExt->WriteCommonBufferSize,
WDF_NO_OBJECT_ATTRIBUTES,
&DevExt->WriteCommonBuffer );
if (!NT_SUCCESS(status)) {
. . . //Error-handling code omitted
}
DevExt->WriteCommonBufferBase =
WdfCommonBufferGetAlignedVirtualAddress(
DevExt->WriteCommonBuffer);
DevExt->WriteCommonBufferBaseLA =
WdfCommonBufferGetAlignedLogicalAddress(
DevExt->WriteCommonBuffer);
RtlZeroMemory( DevExt->WriteCommonBufferBase, DevExt->WriteCommonBufferSize);
Sürücünüz WdfDmaEnablerCreate'i çağırmadan önce WdfDeviceSetAlignmentRequirement'i çağırırsa, WdfDmaEnablerCreate tarafından oluşturulan arabellekler, sürücünün WdfDeviceSetAlignmentRequirement 'e belirttiği bellek adresi sınırına hizalanır. Aksi takdirde, ortak arabellekler sözcük adresi sınırlarına hizalanır. Alternatif olarak, sürücü tek bir arabellek için bir hizalama belirtmek üzere WdfCommonBufferCreateWithConfig çağırabilir.
Sürücünüzün ayırdığı ortak bir arabelleğin uzunluğunu elde etmek için, sürücü WdfCommonBufferGetLengthçağırabilir.
Sürücü ortak bir arabellek kullanmayı bitirdiğinde, sürücü WdfObjectDelete çağırır.