시작 시퀀스
어댑터 드라이버는 커널 모드 드라이버 서비스로 설치되므로 운영 체제는 시스템 시작 시 어댑터 드라이버를 로드하고 드라이버의 DriverEntry 루틴을 호출합니다. DriverEntry 루틴은 드라이버 개체와 레지스트리 경로 이름이라는 두 개의 매개 변수를 받습니다. DriverEntry는 driver-object 및 registry-path 이름 매개 변수와 어댑터 드라이버의 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가 디바이스에 대한 컨텍스트 정보를 저장하는 데 사용하는 확장으로 만들어집니다. 이 컨텍스트에는 에서 MyStartDevice
제공하는 MyAddDevice
함수 포인터가 포함됩니다.
운영 체제가 디바이스에 할당할 리소스(인터럽트, 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 드라이버 키트)의 샘플 오디오 어댑터 드라이버를 참조하세요.