⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dispatch.cpp

📁 这是一个人精简的1394设备驱动程序
💻 CPP
📖 第 1 页 / 共 3 页
字号:
			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 + -