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

📄 dispatch.cpp

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