IoCallDriver 정보
/*++
Routine Description:
This routine is invoked to pass an I/O Request Packet (IRP) to another
driver at its dispatch routine.
Arguments:
DeviceObject - Pointer to device object to which the IRP should be passed.
Irp - Pointer to IRP for request.
Return Value:
Return status from driver's dispatch routine.
–*/
{ PIO_STACK_LOCATION irpSp; PDRIVER_OBJECT driverObject; NTSTATUS status;
//
// Ensure that this is really an I/O Request Packet.
//
ASSERT( Irp->Type == IO_TYPE_IRP );
//
// Update the IRP stack to point to the next location.
//
Irp->CurrentLocation--;
if (Irp->CurrentLocation <= 0) {
KiBugCheck3( NO_MORE_IRP_STACK_LOCATIONS, (ULONG_PTR) Irp, 0, 0 );
}
irpSp = IoGetNextIrpStackLocation( Irp );
Irp->Tail.Overlay.CurrentStackLocation = irpSp;
//
// Save a pointer to the device object for this request so that it can
// be used later in completion.
//
irpSp->DeviceObject = DeviceObject;
//
// Invoke the driver at its dispatch routine entry point.
//
driverObject = DeviceObject->DriverObject;
//
// Prevent the driver from unloading.
//
status = driverObject->MajorFunction[irpSp->MajorFunction]( DeviceObject,
Irp );
return status;
}
IopfCallDriver가 먼저 irp의 현재 위치를 하나 줄이면 다음 위치를 얻을 수 있습니다.IoGetNextIrpStackLocation은 매크로로 다음irp창고의 지침을 받고 이 지침을 현재irp창고 지침으로 한다.실제로irp->Tail.Overlay.CurrentStackLocation - 1.그리고irp 창고에서 대응하는 device object를 꺼내서driver object를 가져옵니다.마지막으로irp를 전달하는 것은 사실상 이번 요청에 대응하는 규칙을 호출하는 것이다.이 요청은irp 창고에서 파라미터를 꺼내거나 다른 일을 하든지 상관없습니다.
그리고 완성 루틴 IoCompletionRoutine에 관해서는 어떻게 호출되었습니까?irp가 완성되면 IoCompleteRequest를 호출합니다.이 함수는irp창고를 한 번 훑어보며, 창고에 IoCompletionRoutine 포인터가 설정되어 있는 것을 발견하면 호출합니다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.