Поиск и сопоставление аппаратных ресурсов
В этом разделе описывается, как драйвер Kernel-Mode Driver Framework (KMDF) или драйвер User-Mode Driver Framework (UMDF), начиная с версии 2, сопоставляет преобразованный ресурс памяти (CmResourceTypeMemory), который он получает в функции обратного вызова EvtDevicePrepareHardware .
Драйвер UMDF 1.x также может получать этот тип ресурса в методе IPnpCallbackHardware2::OnPrepareHardware . Дополнительные сведения см. в разделе Поиск и сопоставление аппаратных ресурсов в драйверах UMDF 1.x.
Драйвер получает необработанные и переведенные версии аппаратных ресурсов в списке ресурсов устройства в функции обратного вызова EvtDevicePrepareHardware . Драйвер может сохранить список ресурсов, который действителен до тех пор, пока платформа не вызовет функцию обратного вызова EvtDeviceReleaseHardware драйвера.
Как правило, драйвер вызывает WdfCmResourceListGetCount из функции обратного вызова EvtDevicePrepareHardware , чтобы определить количество дескрипторов ресурсов в списке переведенных ресурсов, а затем вызывает WdfCmResourceListGetDescriptor в цикле для определения сопоставленных в памяти регистров, портов ввода-вывода и прерываний.
Если драйверу назначен переведенный ресурс памяти (CmResourceTypeMemory), он должен сопоставить физический адрес с адресом, по которому он может получить доступ к регистрам устройств.
Драйвер KMDF вызывает MmMapIoSpace , чтобы сопоставить заданный диапазон физических адресов с непогашенным системным пространством. Затем он использует процедуры библиотеки HAL для чтения и записи в регистры.
Драйвер UMDF вызывает WdfDeviceMapIoSpace , чтобы сопоставить физический адрес с псевдобазовым адресом, который он может использовать в сочетании с функциями WDF register/Port Access для чтения и записи в регистры и порты.
Драйвер отменяет сопоставление ресурсов, вызывая MmUnmapIoSpace или WdfDeviceUnmapIoSpace из функции обратного вызова EvtDeviceReleaseHardware .
Не нужно сопоставлять ресурсы в пространстве ввода-вывода (CmResourceTypePort, CmResourceTypeInterrupt, CmResourceTypeDma).
Если драйвер UMDF вызывает WdfDeviceMapIoSpace, необходимо задать для директивы INF UmdfDirectHardwareAccess значение AllowDirectHardwareAccess.
Пример, показывающий, как драйвер находит и сопоставляет ресурсы регистров, сопоставленных в памяти, см. в разделе Чтение и запись в регистры устройств.