BUS_INTERFACE_STANDARD 구조체(wdm.h)

BUS_INTERFACE_STANDARD 인터페이스 구조를 사용하면 디바이스 드라이버가 부모 버스 드라이버 루틴을 직접 호출할 수 있습니다. 이 구조체는 GUID_BUS_INTERFACE_STANDARD 인터페이스를 정의합니다.

구문

typedef struct _BUS_INTERFACE_STANDARD {
  USHORT                 Size;
  USHORT                 Version;
  PVOID                  Context;
  PINTERFACE_REFERENCE   InterfaceReference;
  PINTERFACE_DEREFERENCE InterfaceDereference;
  PTRANSLATE_BUS_ADDRESS TranslateBusAddress;
  PGET_DMA_ADAPTER       GetDmaAdapter;
  PGET_SET_DEVICE_DATA   SetBusData;
  PGET_SET_DEVICE_DATA   GetBusData;
} BUS_INTERFACE_STANDARD, *PBUS_INTERFACE_STANDARD;

멤버

Size

이 구조체의 크기(바이트)입니다.

Version

드라이버 정의 인터페이스 버전입니다.

Context

인터페이스별 컨텍스트 정보에 대한 포인터입니다.

InterfaceReference

인터페이스의 참조 수를 증가시키는 InterfaceReference 루틴에 대한 포인터입니다.

InterfaceDereference

인터페이스의 참조 수를 감소시키는 InterfaceDereference 루틴에 대한 포인터입니다.

TranslateBusAddress

부모 버스의 주소를 논리 주소로 변환하는 TranslateBusAddress 루틴에 대한 포인터입니다.

GetDmaAdapter

대상 디바이스에 대한 DMA 어댑터 구조(DMA_ADAPTER)를 반환하는 GetDmaAdapter 루틴에 대한 포인터입니다.

SetBusData

디바이스의 구성 공간에 데이터를 쓰는 SetBusData 루틴에 대한 포인터입니다.

GetBusData

디바이스의 구성 공간에서 데이터를 읽는 GetBusData 루틴에 대한 포인터입니다.

설명

BUS_INTERFACE_STANDARD 구조체는 INTERFACE 구조체의 확장입니다.

디바이스의 일부 작업은 디바이스의 부모 버스 드라이버용으로 예약되어 있습니다. 이러한 작업에는 버스의 디바이스별 구성 공간에 액세스하거나 DMA 컨트롤러를 프로그래밍하는 작업이 포함될 수 있습니다.

디바이스의 구성 공간에서 읽거나 쓰려면 디바이스 드라이버가 다음 두 가지 방법 중 하나로 버스 드라이버의 기관에 의존해야 합니다.

  • I/O 요청 패킷(IRP) IRP_MN_READ_CONFIG 보내고 버스 드라이버에 IRP_MN_WRITE_CONFIG .

  • 버스 드라이버에서 인터페이스를 가져옵니다. 그런 다음 디바이스 드라이버는 BUS_INTERFACE_STANDARD 인터페이스 구조에서 제공하는 버스 드라이버 루틴을 직접 호출하여 디바이스의 구성 공간에 액세스할 수 있습니다. 해당 멤버 루틴인 GetBusDataSetBusData는 각각 디바이스의 구성 공간에서 읽고 쓰는 데 사용할 수 있습니다.

구성 공간에 액세스하는 방법에 대한 자세한 내용은 디바이스 구성 공간 액세스를 참조하세요.

버스 마스터링 스토리지 디바이스와 같은 일부 유형의 디바이스에는 온보드 DMA 컨트롤러가 있습니다. 그러나 이러한 디바이스의 디바이스 드라이버는 이러한 DMA 컨트롤러를 직접 프로그래밍할 수 없습니다. 대신 부모 버스 드라이버에서 제공하는 루틴에 의존해야 합니다. 디바이스 드라이버가 해당 디바이스에 대해 DMA 컨트롤러를 프로그래밍하려면 먼저 부모 버스 드라이버에서 어댑터 개체를 요청해야 합니다. 어댑터 개체에는 디바이스의 DMA 컨트롤러를 프로그래밍하는 데 사용할 수 있는 버스 드라이버에서 제공하는 루틴이 포함되어 있습니다. 디바이스 드라이버는 어댑터 개체를 얻으려면 직접 또는 간접적으로 BUS_INTERFACE_STANDARD 사용해야 합니다.

드라이버가 IRQL = PASSIVE_LEVEL 실행되는 경우 IoGetDmaAdapter를 호출하여 디바이스의 DMA 어댑터 개체를 가져와야 합니다. IoGetDmaAdapter 는 버스 드라이버가 BUS_INTERFACE_STANDARD 인터페이스를 지원하는지 여부를 검색합니다. 이 경우 IoGetDmaAdapter 는 이 인터페이스의 GetDmaAdapter 멤버가 가리키는 루틴을 호출하여 어댑터 개체를 가져옵니다. 그렇지 않으면 IoGetDmaAdapter 는 동등한 레거시 루틴을 호출합니다.

그러나 드라이버가 IRQL >= DISPATCH_LEVEL 실행하는 동안 어댑터 개체를 가져와야 하는 경우 IoGetDmaAdapter를 사용하여 수행할 수 없습니다. 이 경우 드라이버는 IRP_MN_QUERY_INTERFACE 사용하여IRQL = PASSIVE_LEVEL 있는 동안 BUS_INTERFACE_STANDARD 인터페이스를 쿼리해야 합니다.

요구 사항

요구 사항
헤더 wdm.h(Wdm.h, Ntddk.h, Ntifs.h 포함)

추가 정보

DEVICE_DESCRIPTION

DMA_ADAPTER

GUID_BUS_INTERFACE_STANDARD

GetBusData

GetDmaAdapter

인터페이스

IRP_MN_QUERY_INTERFACE

IRP_MN_READ_CONFIG

IRP_MN_WRITE_CONFIG

InterfaceDereference

InterfaceReference

IoGetDmaAdapter

SetBusData

TranslateBusAddress