USBCAMD2 기능 획득
새 USBCAMD2 기능을 사용하려면 먼저 USBCAMD_INTERFACE 구조체에 대한 포인터를 획득해야 합니다. 포인터를 가져오려면 AdapterReceivePacket 콜백 함수의 카메라 미니 드라이버 SRB_INITIALIZATION_COMPLETE 처리기에서 IRP_MN_QUERY_INTERFACE요청을 빌드하고 보냅니다. USBCAMD2 미니드라이버 라이브러리는 이 IRP를 처리하고 카메라 미니드라이버에 USBCAMD_INTERFACE 형식의 직접 호출 인터페이스를 반환합니다. 인터페이스는 기본적으로 함수 포인터의 테이블입니다.
다음 코드에서는 카메라 미니드라이버에서 IRP_MN_QUERY_INTERFACE 요청을 빌드하고 보내는 방법을 보여 줍니다.
KeInitializeEvent(&Event, NotificationEvent, FALSE);
Irp = IoBuildSynchronousFsdRequest(
IRP_MJ_PNP,
pDeviceObject,
NULL,
0,
NULL,
&Event,
&IoStatusBlock);
if (NULL != Irp)
{
Irp->RequestorMode = KernelMode;
IrpStackNext = IoGetNextIrpStackLocation(Irp);
//
// Create an interface query out of the Irp.
//
IrpStackNext->MinorFunction = IRP_MN_QUERY_INTERFACE;
IrpStackNext->Parameters.QueryInterface.InterfaceType = (GUID*)&GUID_USBCAMD_INTERFACE;
IrpStackNext->Parameters.QueryInterface.Size = sizeof(*pUsbcamdInterface);
IrpStackNext->Parameters.QueryInterface.Version = USBCAMD_VERSION_200;
IrpStackNext->Parameters.QueryInterface.Interface = (PINTERFACE)pUsbcamdInterface;
IrpStackNext->Parameters.QueryInterface.InterfaceSpecificData = NULL;
Status = IoCallDriver(pDeviceObject, Irp);
if (STATUS_PENDING == Status)
{
//
// This waits using KernelMode so that the stack, and therefore the
// event on that stack, is not paged out.
//
KeWaitForSingleObject(&Event, Executive, KernelMode, FALSE, NULL);
Status = IoStatusBlock.Status;
}
}
else
{
Status = STATUS_INSUFFICIENT_RESOURCES;
}