NTSTATUS ForwardedIrpCompletionRoutine( IN PDEVICE_OBJECT fdo, IN PIRP Irp, IN PKEVENT ev)
{
// 이벤트를 신호 상태로 한다.
 KeSetEvent( ev, 0, FALSE);
// 이 드라이버에 의해 IRP 처리가 완료되지 않고 드라이버의 다른 부분이 그것을 완료할 것이라는 것.
 return STATUS_MORE_PROCESSING_REQUIRED;
}

NTSTATUS Operation()
{
KEVENT event;
KeInitializeEvent( &event, NotificationEvent, FALSE);
//IoCopyCurrentIrpStackLocationToNext(query_irp);
IoSetCompletionRoutine( query_irp, (PIO_COMPLETION_ROUTINE)ForwardedIrpCompletionRoutine,(PVOID)&event, TRUE, TRUE, TRUE);

status = IoCallDriver(devobj, query_irp);
if( status == STATUS_PENDING )
{
KdPrint(("ForwardIrpAndWait: waiting for completion"));
// 이벤트가 신호 상태로 될 때까지 대기한다.
KeWaitForSingleObject( &event, Executive, KernelMode, FALSE, NULL);
status = query_irp->IoStatus.Status;
}
}

Posted by 띠깜
,