어댑터 드라이버는 커널 모드 드라이버 서비스로 설치되므로 운영 체제는 시스템 시작 시 어댑터 드라이버를 로드하고 드라이버의 DriverEntry 루틴을 호출합니다. DriverEntry 루틴은 드라이버 개체와 레지스트리 경로 이름의 두 매개 변수를 받습니다. DriverEntry는 드라이버-개체 및 레지스트리 경로 이름 매개 변수와 어댑터 드라이버의 AddDevice 함수에 대한 포인터인 세 번째 매개 변수를 사용하여 PortCls 함수 PcInitializeAdapterDriver를 호출해야 합니다.
다음 예제에서 드라이버의 DriverEntry 함수는 드라이버의 AddDevice 함수를 가리키는 함수 포인터MyAddDevice를 PcInitializeAdapterDriver 루틴의 세 번째 매개 변수로 전달합니다.
NTSTATUS
DriverEntry(
PDRIVER_OBJECT DriverObject,
PUNICODE_STRING RegistryPath
)
{
return PcInitializeAdapterDriver(DriverObject, RegistryPath, MyAddDevice);
}
PcInitializeAdapterDriver 루틴은 제공된 AddDevice 루틴을 드라이버 개체의 드라이버 확장에 설치하고 드라이버 개체 자체에 PortCls 드라이버의 IRP 처리기를 설치합니다.
다음 코드는 드라이버 함수의 예제 구현입니다 MyAddDevice .
#define MAX_MINIPORTS 6 // maximum number of miniports
NTSTATUS
MyAddDevice(
PDRIVER_OBJECT DriverObject,
PDEVICE_OBJECT PhysicalDeviceObject
)
{
return PcAddAdapterDevice(DriverObject, PhysicalDeviceObject, MyStartDevice,
MAX_MINIPORTS, 0);
}
이 함수는 지정된 어댑터 디바이스를 만들고, 드라이버를 디바이스와 연결하고, 운영 체제가 디바이스를 시작할 때 호출되는 어댑터 드라이버의 MyStartDevice 함수에 대한 포인터를 저장하는 PortCls 함수 PcAddAdapterDevice를 호출합니다(디바이스 시작 참조).
PcAddAdapterDevice 루틴은 FDO(기능 디바이스 개체)를 만들고 시스템에서 제공하는 PDO(물리적 디바이스 개체)와 연결합니다. 새 FDO는 PortCls가 디바이스에 대한 컨텍스트 정보를 저장하는 데 사용하는 확장으로 만들어집니다. 해당 문맥에는 MyAddDevice이 제공하는 MyStartDevice 함수 포인터가 포함됩니다.
운영 체제가 디바이스에 할당할 리소스(인터럽트, DMA 채널, I/O 포트 주소 등)를 결정하면 디바이스에 시작 요청(IRP_MN_START_DEVICE)을 보냅니다. 이 요청에 대한 응답으로 PortCls 드라이버의 요청 처리기는 다음 예제 코드에 표시된 어댑터 드라이버의 MyStartDevice 함수를 호출합니다.
NTSTATUS
MyStartDevice(
PDEVICE_OBJECT DeviceObject,
PIRP Irp,
PRESOURCELIST ResourceList
)
{
...
}
요청 처리기는 디바이스 개체, IRP_MN_START_DEVICE 요청 및 리소스 목록에 대한 포인터를 제공합니다 MyStartDevice ( IResourceList 참조). 이 함수는 MyStartDevice 리소스 목록을 시작해야 하는 각 미니포트 드라이버에 필요한 리소스로 분할합니다. 그런 다음, 함수는 각 미니포트 드라이버를 시작하고 컨트롤을 PortCls로 반환하여 IRP를 완료하고 컨트롤을 운영 체제로 반환합니다.
드라이버 시작 코드의 더 많은 예제는 Microsoft WDK(Windows 드라이버 키트)의 샘플 오디오 어댑터 드라이버를 참조하세요.