📄 dispatch.cpp
字号:
DebugPrint("v1394 Async write:%x",((PV1394_IO_STRUCTURE)pIOBuffer)->data);
IoFreeMdl(pMdl);
}
ExFreePool(pIrb);
}
/*
if (allocNewIrp)
Irp->IoStatus = ioStatus;
*/
//status=CompleteIrp(Irp,status,0);hehu 2005 5 30
status=CompleteIrp(Irp,status,0);
break;
//////////////////////////////////////////////////////////////
case IOCTL_BLOCK_READ:
pIrb=(PIRB)ExAllocatePool(NonPagedPool,sizeof(IRB));
if(pIrb==NULL)
status=STATUS_INSUFFICIENT_RESOURCES;
else
{
pIOBuffer=Irp->AssociatedIrp.SystemBuffer;
pIrb->FunctionNumber=REQUEST_ASYNC_READ;
pIrb->Flags=0;
pIrb->u.AsyncRead.DestinationAddress.IA_Destination_Offset=((PV1394_IO_BLOCK)pIOBuffer)->address;
DebugPrint("v1394 Block read:off_high:%x",((PV1394_IO_BLOCK)pIOBuffer)->address.Off_High);
DebugPrint("v1394 Block read:off_low:%x",((PV1394_IO_BLOCK)pIOBuffer)->address.Off_Low);
pIrb->u.AsyncRead.nNumberOfBytesToRead=((PV1394_IO_BLOCK)pIOBuffer)->length;
DebugPrint("v1394 Block Read:length:%x",((PV1394_IO_BLOCK)pIOBuffer)->length);
pIrb->u.AsyncRead.nBlockSize=((PV1394_IO_BLOCK)pIOBuffer)->blockSize;
pIrb->u.AsyncRead.fulFlags=((PV1394_IO_BLOCK)pIOBuffer)->accessMode;
DebugPrint("accessmode:%x",((PV1394_IO_BLOCK)pIOBuffer)->accessMode);
pIrb->u.AsyncRead.ulGeneration=dx->Generation;
DebugPrint("Generation:%x",dx->Generation);
pMdl=IoAllocateMdl(((PV1394_IO_BLOCK)pIOBuffer)->data,((PV1394_IO_BLOCK)pIOBuffer)->length,FALSE,FALSE,NULL);
if(pMdl==NULL)
status=STATUS_INSUFFICIENT_RESOURCES;
else
{
MmBuildMdlForNonPagedPool(pMdl);
pIrb->u.AsyncRead.Mdl=pMdl;
if(Irp->RequestorMode == UserMode)
{
KIRQL irql;
KeAcquireSpinLock(&BufferLock,&irql);
dx->WorkItem=IoAllocateWorkItem(fdo);
IoQueueWorkItem(dx->WorkItem,
(PIO_WORKITEM_ROUTINE)UsermodeForwardIrpandWait,
CriticalWorkQueue,
(PVOID)pIrb
);
//status=UsermodeForwardIrpandWait(ioStatus,fdo,pIrb);
KeWaitForSingleObject(&(dx->Event),Executive,KernelMode,FALSE,NULL);
Irp->IoStatus = dx->ioStatus;
status=dx->ioStatus.Status;
KeReleaseSpinLock(&BufferLock,irql);
//status=UsermodeForwardIrpandWait(ioStatus,fdo,pIrb);
//Irp->IoStatus = ioStatus;
}
else
{
status=ForwardIrpAndWait(fdo,Irp,pIrb);
}
DebugPrint("v1394 Block Read0:%x",((PV1394_IO_BLOCK)pIOBuffer)->data[0]);
DebugPrint("v1394 Block Read1:%x",((PV1394_IO_BLOCK)pIOBuffer)->data[1]);
DebugPrint("v1394 Block Read2:%x",((PV1394_IO_BLOCK)pIOBuffer)->data[2]);
DebugPrint("v1394 Block Read3:%x",((PV1394_IO_BLOCK)pIOBuffer)->data[3]);
//DebugPrint("v1394 Block Read200:%x",((PV1394_IO_BLOCK)pIOBuffer)->data[200]);
//DebugPrint("v1394 Block Read201:%x",((PV1394_IO_BLOCK)pIOBuffer)->data[201]);
//DebugPrint("v1394 Block Read202:%x",((PV1394_IO_BLOCK)pIOBuffer)->data[202]);
//DebugPrint("v1394 Block Read400:%x",((PV1394_IO_BLOCK)pIOBuffer)->data[400]);
//DebugPrint("v1394 Block Read800:%x",((PV1394_IO_BLOCK)pIOBuffer)->data[800]);
//DebugPrint("v1394 Block Read1000:%x",((PV1394_IO_BLOCK)pIOBuffer)->data[1000]);
//DebugPrint("v1394 Block Read2000:%x",((PV1394_IO_BLOCK)pIOBuffer)->data[2000]);
DebugPrint("v1394 Block Read Status:%x",status);
IoFreeMdl(pMdl);
}
ExFreePool(pIrb);
}
status=CompleteIrp(Irp,status,sizeof(V1394_IO_BLOCK)+((PV1394_IO_BLOCK)pIOBuffer)->length);
break;
//////////////////////////////////////////////////////////////
case IOCTL_BLOCK_WRITE:
pIrb=(PIRB)ExAllocatePool(NonPagedPool,sizeof(IRB));
if(pIrb==NULL)
status=STATUS_INSUFFICIENT_RESOURCES;
else
{
pIOBuffer=Irp->AssociatedIrp.SystemBuffer;
pIrb->FunctionNumber=REQUEST_ASYNC_WRITE;
pIrb->Flags=0;
pIrb->u.AsyncWrite.DestinationAddress.IA_Destination_Offset=((PV1394_IO_BLOCK)pIOBuffer)->address;
DebugPrint("v1394 Block write:off_high:%x",((PV1394_IO_BLOCK)pIOBuffer)->address.Off_High);
DebugPrint("v1394 Block write:off_low:%x",((PV1394_IO_BLOCK)pIOBuffer)->address.Off_Low);
pIrb->u.AsyncWrite.nNumberOfBytesToWrite=((PV1394_IO_BLOCK)pIOBuffer)->length;
DebugPrint("v1394 Block write:length:%x",((PV1394_IO_BLOCK)pIOBuffer)->length);
pIrb->u.AsyncWrite.nBlockSize=((PV1394_IO_BLOCK)pIOBuffer)->blockSize;
pIrb->u.AsyncWrite.fulFlags=((PV1394_IO_BLOCK)pIOBuffer)->accessMode;
DebugPrint("v1394 Block write:accessMode:%x",((PV1394_IO_BLOCK)pIOBuffer)->accessMode);
pIrb->u.AsyncWrite.ulGeneration=dx->Generation;
pMdl=IoAllocateMdl(((PV1394_IO_BLOCK)pIOBuffer)->data,((PV1394_IO_BLOCK)pIOBuffer)->length,FALSE,FALSE,NULL);
if(pMdl==NULL)
status=STATUS_INSUFFICIENT_RESOURCES;
else
{
MmBuildMdlForNonPagedPool(pMdl);
pIrb->u.AsyncRead.Mdl=pMdl;
DebugPrint("v1394 Block Write:%x",((PV1394_IO_BLOCK)pIOBuffer)->data[0]);
DebugPrint("v1394 Block Write:%x",((PV1394_IO_BLOCK)pIOBuffer)->data[1]);
DebugPrint("v1394 Block Write:%x",((PV1394_IO_BLOCK)pIOBuffer)->data[2]);
DebugPrint("v1394 Block Write:%x",((PV1394_IO_BLOCK)pIOBuffer)->data[3]);
if(Irp->RequestorMode == UserMode)
{
KIRQL irql;
KeAcquireSpinLock(&BufferLock,&irql);
dx->WorkItem=IoAllocateWorkItem(fdo);
IoQueueWorkItem(dx->WorkItem,
(PIO_WORKITEM_ROUTINE)UsermodeForwardIrpandWait,
CriticalWorkQueue,
(PVOID)pIrb
);
//status=UsermodeForwardIrpandWait(ioStatus,fdo,pIrb);
KeWaitForSingleObject(&(dx->Event),Executive,KernelMode,FALSE,NULL);
Irp->IoStatus = dx->ioStatus;
status=dx->ioStatus.Status;
KeReleaseSpinLock(&BufferLock,irql);
//status=UsermodeForwardIrpandWait(ioStatus,fdo,pIrb);
//Irp->IoStatus = ioStatus;
}
else
{
status=ForwardIrpAndWait(fdo,Irp,pIrb);
}
DebugPrint("v1394 Block Write Status:%x",status);
IoFreeMdl(pMdl);
}
ExFreePool(pIrb);
}
status=CompleteIrp(Irp,status,sizeof(V1394_IO_BLOCK)+((PV1394_IO_BLOCK)pIOBuffer)->length);
break;
//////////////////////////////////////////////////////////////
case IOCTL_GET_REQUEST:
pIOBuffer=Irp->AssociatedIrp.SystemBuffer;
DebugPrint("%x",dx->interrupt);
*(PULONG)pIOBuffer = *(PULONG)(dx->interrupt);
if(*(dx->interrupt) != 0)
*(PULONG)(dx->interrupt) = 0;
DebugPrint("%x",dx->interrupt);
status=CompleteIrp(Irp,STATUS_SUCCESS,4);
break;
//////////////////////////////////////////////////////////////
default:
status=STATUS_INVALID_PARAMETER;
status=CompleteIrp(Irp,status,0);
}
break;
}//case end
}//switch end
IoStartNextPacket( fdo, TRUE);
}
NTSTATUS v1394SystemControl(IN PDEVICE_OBJECT fdo,
IN PIRP Irp)
{
DebugPrintMsg("v1394 System Control");
NTSTATUS status=STATUS_SUCCESS;
PV1394_DEVICE_EXTENSION dx=(PV1394_DEVICE_EXTENSION)fdo->DeviceExtension;
IoSkipCurrentIrpStackLocation(Irp);
status=IoCallDriver(dx->NextStackDevice,Irp);
return status;
}
NTSTATUS ForwardIrpAndWait(IN PDEVICE_OBJECT fdo,
IN PIRP Irp,
IN PIRB pIrb)
{
DebugPrintMsg("ForwardIrpAndWait");
NTSTATUS status=STATUS_SUCCESS;
PV1394_DEVICE_EXTENSION dx=(PV1394_DEVICE_EXTENSION)fdo->DeviceExtension;
PIO_STACK_LOCATION NextIrpStack;
KEVENT event;
KeInitializeEvent(&event,NotificationEvent,FALSE);
if(pIrb)
{
NextIrpStack=IoGetNextIrpStackLocation(Irp);
NextIrpStack->MajorFunction=IRP_MJ_INTERNAL_DEVICE_CONTROL;
NextIrpStack->Parameters.DeviceIoControl.IoControlCode=IOCTL_1394_CLASS;
NextIrpStack->Parameters.Others.Argument1=pIrb;
}
else
IoCopyCurrentIrpStackLocationToNext(Irp);
IoSetCompletionRoutine(Irp,
(PIO_COMPLETION_ROUTINE)ForwardedIrpCompletionRoutine,
(PVOID)&event,TRUE,TRUE,TRUE);
DebugPrintMsg("iocalldriverstart");
status=IoCallDriver(dx->NextStackDevice,Irp);
DebugPrintMsg("iocalldriverend");
if(status==STATUS_PENDING)
{
KeWaitForSingleObject(&event,Executive,KernelMode,FALSE,NULL);
status=Irp->IoStatus.Status;
DebugPrintMsg("iocalldrivehavereturned");
}
return status;
}
NTSTATUS ForwardedIrpCompletionRoutine(IN PDEVICE_OBJECT fdo,
IN PIRP Irp,
IN PKEVENT ev)
{
KeSetEvent(ev,0,FALSE);
return STATUS_MORE_PROCESSING_REQUIRED;
}
NTSTATUS CompleteIrp(PIRP Irp,NTSTATUS status,ULONG info)
{
Irp->IoStatus.Status=status;
Irp->IoStatus.Information=info;
IoCompleteRequest(Irp,IO_NO_INCREMENT);
return status;
}
VOID NotificationRoutine(IN PNOTIFICATION_INFO NotificationInfo)
{
PV1394_DEVICE_EXTENSION dx=(PV1394_DEVICE_EXTENSION)NotificationInfo->Context;
if(dx->pEvent!=NULL)
{
KeSetEvent(dx->pEvent,0,FALSE);
DebugPrint("****************************************have signated");
/*
PKEVENT ev;
ev=(PKEVENT)NotificationInfo->Context;
DebugPrint("Notificaiton Routine:%x",ev);
KeSetEvent(ev,0,FALSE);
//hehu modify 2004 11 29
*/
DebugPrintMsg("dx->interrupt have been trigger");
}
else
{
DebugPrintMsg("*******************************no interrupt event");
}
}
VOID UsermodeForwardIrpandWait(IN PDEVICE_OBJECT fdo,
IN PVOID pIrb)
{
KEVENT Event;
PIRP newIrp;
BOOLEAN allocNewIrp = FALSE;
PIO_STACK_LOCATION NextIrpStack;
NTSTATUS status=STATUS_SUCCESS;
PV1394_DEVICE_EXTENSION dx=(PV1394_DEVICE_EXTENSION)fdo->DeviceExtension;
KeInitializeEvent (&Event, NotificationEvent, FALSE);
newIrp = IoBuildDeviceIoControlRequest (IOCTL_1394_CLASS, dx->NextStackDevice,
NULL, 0, NULL, 0, TRUE, &Event, &(dx->ioStatus));
if (!newIrp)
{
IoFreeWorkItem(dx->WorkItem);
KeSetEvent(&(dx->Event),0,FALSE);
return ;
}
NextIrpStack = IoGetNextIrpStackLocation(newIrp);
NextIrpStack->Parameters.Others.Argument1 =(PIRB)pIrb;
status = IoCallDriver (dx->NextStackDevice, newIrp);
if (status == STATUS_PENDING)
{ DebugPrintMsg("IoCallDriver return status_pending");
KeWaitForSingleObject (&Event, Executive, KernelMode, FALSE, NULL);
}
IoFreeWorkItem(dx->WorkItem);
KeSetEvent(&(dx->Event),0,FALSE);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -