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;
}
}
'프로그래밍 팁 > Driver' 카테고리의 다른 글
[크로스인증서]64비트 윈도우에 드라이버 구동하기 (0) | 2011.11.14 |
---|---|
windows 64비트 드라이버 실행 및 테스트 방법 (0) | 2011.03.19 |
Visual Studio 2008 드라이버 개발환경 셋팅 (0) | 2010.04.07 |