📄 dispatch.cpp
字号:
status = STATUS_INSUFFICIENT_RESOURCES;
goto Exitasycnread;
}
allocNewIrp = TRUE;
}
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_STRUCTURE)pIOBuffer)->address;
pIrb->u.AsyncRead.nNumberOfBytesToRead=4;
pIrb->u.AsyncRead.nBlockSize=0;
pIrb->u.AsyncRead.fulFlags=0;
pIrb->u.AsyncRead.ulGeneration=dx->Generation;
pMdl=IoAllocateMdl(&(((PV1394_IO_STRUCTURE)pIOBuffer)->data),4,FALSE,FALSE,NULL);
if(pMdl==NULL)
status=STATUS_INSUFFICIENT_RESOURCES;
else
{
MmBuildMdlForNonPagedPool(pMdl);
pIrb->u.AsyncRead.Mdl=pMdl;
if((((PV1394_IO_STRUCTURE)pIOBuffer)->address.Off_High==0x0204)
&&(dx->pEvent!=NULL))
{
DebugPrint("Read Address:%x,%x",((PV1394_IO_STRUCTURE)pIOBuffer)->address.Off_High,((PV1394_IO_STRUCTURE)pIOBuffer)->address.Off_Low);
((PV1394_IO_STRUCTURE)pIOBuffer)->data=*((ULONG *)dx->interrupt);
DebugPrint("v1394 Async Read dx->interrupt:%x",((PV1394_IO_STRUCTURE)pIOBuffer)->data);
}
else
{
//status=ForwardIrpAndWait(fdo,Irp,pIrb);
if(allocNewIrp==TRUE)
{
//hehu 2005 5 30
DebugPrintMsg("allocNewIrp==TRUE ,Enter to ");
NextIrpStack = IoGetNextIrpStackLocation(newIrp);
NextIrpStack->Parameters.Others.Argument1 = pIrb;
status = IoCallDriver (dx->NextStackDevice, newIrp);
if (status == STATUS_PENDING)
{ DebugPrintMsg("IoCallDriver return status_pending");
interval=RtlConvertLongToLargeInteger((LONG)(-10));
status=KeWaitForSingleObject (&Event, Executive, KernelMode, FALSE, NULL);
//status=KeDelayExecutionThread(KernelMode,FALSE,&interval);
//KeStallExecutionProcessor(1);
//DebugPrint("%I",status);
status = ioStatus.Status;
// DebugPrint("%I",status);
}
}
if(((PV1394_IO_STRUCTURE)pIOBuffer)->address.Off_High==0x0300)
{ NodeID=((PV1394_IO_STRUCTURE)pIOBuffer)->data;
dx->NodeID=(USHORT)((NodeID>>24)|((NodeID>>8)&0xff00));
DebugPrint("the dx->NodeID :%x",dx->NodeID);
}
DebugPrint("the single read status:%x",status);
DebugPrint("Read Address:%x,%x",((PV1394_IO_STRUCTURE)pIOBuffer)->address.Off_High,((PV1394_IO_STRUCTURE)pIOBuffer)->address.Off_Low);
DebugPrint("v1394 Async Read:%x",((PV1394_IO_STRUCTURE)pIOBuffer)->data);
}
IoFreeMdl(pMdl);
}
ExFreePool(pIrb);
}
Exitasycnread :
if (allocNewIrp)
Irp->IoStatus = ioStatus;
//status=CompleteIrp(Irp,status,sizeof(V1394_IO_STRUCTURE));
break;
*/
///////////////////////////////////////////////////////////////////////////
case IOCTL_ASYNC_WRITE:
case IOCTL_ASYNC_READ:
case IOCTL_BLOCK_READ:
case IOCTL_BLOCK_WRITE:
case IOCTL_GET_REQUEST:
DebugPrintMsg("DeviceIoControl: StartIo called");
IoMarkIrpPending(Irp);
IoStartPacket( fdo, Irp, 0, 0);
return STATUS_PENDING;
default:
status=STATUS_INVALID_PARAMETER;
status=CompleteIrp(Irp,status,0);
}
//UnlockDevice(dx);
return status;
}
////////////////////////////////////////////////////////////////////////////////////
//hehu ADD排队程序
VOID v1394StartIo( IN PDEVICE_OBJECT fdo,IN PIRP Irp)
{
PIO_STACK_LOCATION IrpStack=IoGetCurrentIrpStackLocation(Irp);
PV1394_DEVICE_EXTENSION dx=(PV1394_DEVICE_EXTENSION)fdo->DeviceExtension;
ULONG ControlCode=IrpStack->Parameters.DeviceIoControl.IoControlCode;
PMDL pMdl=NULL;
PIRB pIrb=NULL;
PVOID pIOBuffer=NULL;
ULONG NodeID=0;
NTSTATUS status=STATUS_SUCCESS;
//hehu add 2005 5 30
//PIRP newIrp;
//BOOLEAN allocNewIrp = FALSE;
//KEVENT Event;
//IO_STATUS_BLOCK ioStatus;
//PIO_STACK_LOCATION NextIrpStack;
//hehu 2005 5 30
DebugPrint( "WdmIoStartIo: %x %I",Irp,Irp);
switch( IrpStack->MajorFunction)
{
case IRP_MJ_DEVICE_CONTROL:
{switch( ControlCode)
{
case IOCTL_ASYNC_READ:
//
// If this is a UserMode request create a newIrp so that the request
// will be issued from KernelMode
//
/*
if (Irp->RequestorMode == UserMode) {
KeInitializeEvent (&Event, NotificationEvent, FALSE);
newIrp = IoBuildDeviceIoControlRequest (IOCTL_1394_CLASS, dx->NextStackDevice,
NULL, 0, NULL, 0, TRUE, &Event, &ioStatus);
if (!newIrp) {
status = STATUS_INSUFFICIENT_RESOURCES;
goto Exitasycnread;
}
allocNewIrp = TRUE;
}
*/
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_STRUCTURE)pIOBuffer)->address;
pIrb->u.AsyncRead.nNumberOfBytesToRead=4;
pIrb->u.AsyncRead.nBlockSize=0;
pIrb->u.AsyncRead.fulFlags=0;
pIrb->u.AsyncRead.ulGeneration=dx->Generation;
pMdl=IoAllocateMdl(&(((PV1394_IO_STRUCTURE)pIOBuffer)->data),4,FALSE,FALSE,NULL);
if(pMdl==NULL)
status=STATUS_INSUFFICIENT_RESOURCES;
else
{
MmBuildMdlForNonPagedPool(pMdl);
pIrb->u.AsyncRead.Mdl=pMdl;
if((((PV1394_IO_STRUCTURE)pIOBuffer)->address.Off_High==0x0204)
&&(dx->pEvent!=NULL))
{
DebugPrint("Read Address:%x,%x",((PV1394_IO_STRUCTURE)pIOBuffer)->address.Off_High,((PV1394_IO_STRUCTURE)pIOBuffer)->address.Off_Low);
((PV1394_IO_STRUCTURE)pIOBuffer)->data=*((ULONG *)dx->interrupt);
DebugPrint("v1394 Async Read dx->interrupt:%x",((PV1394_IO_STRUCTURE)pIOBuffer)->data);
status=STATUS_SUCCESS;
}
else
{
//status=ForwardIrpAndWait(fdo,Irp,pIrb);
/*
if(allocNewIrp==TRUE)
{
//hehu 2005 5 30
DebugPrintMsg("allocNewIrp==TRUE ,Enter to ");
NextIrpStack = IoGetNextIrpStackLocation(newIrp);
NextIrpStack->Parameters.Others.Argument1 = pIrb;
status = IoCallDriver (dx->NextStackDevice, newIrp);
if (status == STATUS_PENDING)
{ DebugPrintMsg("IoCallDriver return status_pending");
status=KeWaitForSingleObject (&Event, Executive, KernelMode, FALSE, NULL);
//DebugPrint("%I",status);
status = ioStatus.Status;
// DebugPrint("%I",status);
}
}
*/
if(Irp->RequestorMode == UserMode)
{
//allocNewIrp=TRUE;
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);
}
else
{
status=ForwardIrpAndWait(fdo,Irp,pIrb);
}
if(((PV1394_IO_STRUCTURE)pIOBuffer)->address.Off_High==0x0300)
{ NodeID=((PV1394_IO_STRUCTURE)pIOBuffer)->data;
dx->NodeID=(USHORT)((NodeID>>24)|((NodeID>>8)&0xff00));
DebugPrint("the dx->NodeID :%x",dx->NodeID);
}
DebugPrint("the single read status:%x",status);
DebugPrint("Read Address:%x,%x",((PV1394_IO_STRUCTURE)pIOBuffer)->address.Off_High,((PV1394_IO_STRUCTURE)pIOBuffer)->address.Off_Low);
DebugPrint("v1394 Async Read:%x",((PV1394_IO_STRUCTURE)pIOBuffer)->data);
}
IoFreeMdl(pMdl);
}
ExFreePool(pIrb);
}
/*
Exitasycnread :
if (allocNewIrp)
Irp->IoStatus = ioStatus;
//status=CompleteIrp(Irp,status,sizeof(V1394_IO_STRUCTURE));
*/
status=CompleteIrp(Irp,status,sizeof(V1394_IO_STRUCTURE));
break;
//////////////////////////////////////////////////////////////
case IOCTL_ASYNC_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_STRUCTURE)pIOBuffer)->address;
pIrb->u.AsyncWrite.nNumberOfBytesToWrite=4;
pIrb->u.AsyncWrite.nBlockSize=0;
pIrb->u.AsyncWrite.fulFlags=0;
pIrb->u.AsyncWrite.ulGeneration=dx->Generation;
pMdl=IoAllocateMdl(&(((PV1394_IO_STRUCTURE)pIOBuffer)->data),4,FALSE,FALSE,NULL);
if(pMdl==NULL)
status=STATUS_INSUFFICIENT_RESOURCES;
else
{
MmBuildMdlForNonPagedPool(pMdl);
pIrb->u.AsyncWrite.Mdl=pMdl;
/*
DebugPrint("the single write status:%x",status);
DebugPrint("Write Address:%x,%x",((PV1394_IO_STRUCTURE)pIOBuffer)->address.Off_High,((PV1394_IO_STRUCTURE)pIOBuffer)->address.Off_Low);
DebugPrint("v1394 Async Write:%x",((PV1394_IO_STRUCTURE)pIOBuffer)->data);
*/
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);
}
else
{
status=ForwardIrpAndWait(fdo,Irp,pIrb);
}
DebugPrint("the single write status:%x",status);
DebugPrint("write Address:%x,%x",((PV1394_IO_STRUCTURE)pIOBuffer)->address.Off_High,((PV1394_IO_STRUCTURE)pIOBuffer)->address.Off_Low);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -