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

📄 dispatchroutines.c

📁 此驱动程序是SATA功能的PCI卡为例
💻 C
📖 第 1 页 / 共 5 页
字号:
/******************************************************************************
 * * File Name:
 * *      DispatchRoutines.c
 * * Description:
 * *      This file routes incoming I/O Request packets.
 * * Revision History:
 * *      10-11-07 : Silicon Image 1.00
 *******************************************************************************/

#include "Sil3124.h"

/******************************************************************************
 *
 * Function   :  DispatchCreate
 *
 * Description:  Handle IRP_MJ_CREATE, which allows applications to open handles
 *               to our device, win32 function is CreateFile().
 *
 ******************************************************************************/
NTSTATUS DispatchCreate(IN PDEVICE_OBJECT fdo,
						IN PIRP pIrp)
{											//DispatchCreate
    DebugPrint("DispatchCreate Routine start...");
	//we can do some initial things here
    return(CompleteRequestInfo(pIrp, STATUS_SUCCESS,0));
}											//DispatchCreate

/************************************************************************
 *
 * Function   :  DispatchClose
 *
 * Description:  Handle IRP_MJ_CLOSE, which allows applications to close handles
 *               to our device,win32 function is CloseHandle().
 *
 ******************************************************************************/
NTSTATUS DispatchClose(IN PDEVICE_OBJECT fdo,
					   IN PIRP  pIrp)
{												//DispatchClose
	
	//todo 
	PDEVICE_EXTENSION pdx = (PDEVICE_EXTENSION)fdo->DeviceExtension;
    DebugPrint("DispatchClose Routine start...");
    return(CompleteRequestInfo(pIrp,STATUS_SUCCESS,0));
}												//DispatchClose

/******************************************************************************
 *
 * Function   :  DispatchRead
 *
 * Description:  Handle IRP_MJ_READ
 ******************************************************************************/
NTSTATUS DispatchRead(IN PDEVICE_OBJECT fdo,
					  IN PIRP pIrp)
{													//DispatchRead	
	PIO_STACK_LOCATION pIrpStack	= IoGetCurrentIrpStackLocation(pIrp);
	DebugPrint("DispatchRead Routine start...");

    // If the request has a buffer of length 0, we will complete it right here.
    if (pIrpStack->Parameters.Read.Length == 0) {
	pIrp->IoStatus.Status = STATUS_INFO_LENGTH_MISMATCH ;
	pIrp->IoStatus.Information = 0 ;
	IoCompleteRequest (pIrp, IO_NO_INCREMENT) ;
	return STATUS_INFO_LENGTH_MISMATCH ;
    }
    //pass this Irp to StartIo;

	IoMarkIrpPending(pIrp);
	IoStartPacket(fdo, pIrp, NULL, NULL);
	
	DebugPrint("Read Device End.");
	return STATUS_PENDING;
}
													//DispatchRead
/******************************************************************************
 *
 * Function   :  DispatchWrite
 *
 * Description:  Handle IRP_MJ_WRITE
 ******************************************************************************/
NTSTATUS DispatchWrite(IN PDEVICE_OBJECT fdo,
					  IN PIRP pIrp)
{													//DispatchWrite
    PIO_STACK_LOCATION pIrpStack	= IoGetCurrentIrpStackLocation(pIrp);
	DebugPrint("DispatchWrite Routine start...%u",sizeof(PRB));
     // If the request has a buffer of length 0, we will complete it right here.
    if (pIrpStack->Parameters.Write.Length == 0) {
	pIrp->IoStatus.Status = STATUS_INFO_LENGTH_MISMATCH ;
	pIrp->IoStatus.Information = 0 ;
	IoCompleteRequest (pIrp, IO_NO_INCREMENT) ;
	return STATUS_INFO_LENGTH_MISMATCH ;
    }

    //pass this Irp to StartIo;

	IoMarkIrpPending(pIrp);
	IoStartPacket(fdo, pIrp, NULL, NULL);
	
	DebugPrint("Write Device End.");
	return STATUS_PENDING;
}
													//DispatchWrite
/***********************************************************
*
* Function		:		CompleteRequestInfo
*
* Description	:		Complete the request without infomation.
*
************************************************************/
NTSTATUS CompleteRequest(IN PIRP Irp,
						 IN NTSTATUS status)
{												// CompleteRequest
	Irp->IoStatus.Status = status;
	IoCompleteRequest(Irp, IO_NO_INCREMENT);
	return(status);
}												// CompleteRequest
//////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////
NTSTATUS CompleteRequestInfo(IN PIRP Irp, 
							 IN NTSTATUS status, 
							 IN ULONG_PTR info)
{												// CompleteRequestInfo
	Irp->IoStatus.Status = status;
	Irp->IoStatus.Information = info;
	IoCompleteRequest(Irp, IO_NO_INCREMENT);
	return(status);
}												// CompleteRequestInfo

/******************************************************************************
 *
 * Function   :  StartIo
 *
 * Description:  The StartIo Service Routine for PCI9052Demo.
 *
 ******************************************************************************/
VOID StartIo(IN PDEVICE_OBJECT fdo,
			 IN PIRP pIrp)
{												//StartIo
    NTSTATUS status;
	PDEVICE_EXTENSION	pdx;
    PIO_STACK_LOCATION  pIrpStack;
	ULONG TransferBytes             = 0;  //bytes of transfer
	DebugPrint("the StartIo begin...");

	pdx = (PDEVICE_EXTENSION) fdo->DeviceExtension;
    pIrpStack = IoGetCurrentIrpStackLocation(pIrp);
	status = STATUS_SUCCESS;

	switch(pIrpStack->Parameters.DeviceIoControl.IoControlCode)
	{
	case IOCTL_3124REGISTER_PIO_READ:
		DebugPrint("Sil3124 PIO read begin in startIo...");
		status = IOCTL_3124REGISTER_PIO_READ_Handler(fdo,pIrp);
	    if(status == STATUS_SUCCESS)
			TransferBytes = pdx->TansferedCount;     
		break;
	case IOCTL_3124REGISTER_PIO_WRITE:
		DebugPrint("Sil3124 PIO write begin in startIo...");
		status = IOCTL_3124REGISTER_PIO_WRITE_Handler(fdo,pIrp);
	    if(status == STATUS_SUCCESS)
			TransferBytes = pdx->TansferedCount;     
		break;
	case IOCTL_3124REGISTER_COMMAND:
		DebugPrint("Sil3124 no-data commands begin in startIo...");
		 status = IOCTL_3124REGISTER_COMMAND_Handler(fdo,pIrp);
		 break;
	case IOCTL_3124_DMA_READ:
		DebugPrint("Sil3124 DMA Read begin in startIo...");
		status = IOCTL_3124_DMA_Handler(fdo,pIrp);
		break;
	case IOCTL_3124_DMA_WRITE:
		DebugPrint("Sil3124 DMA Write begin in startIo...");
		status = IOCTL_3124_DMA_Handler(fdo,pIrp);
		break;
	default:
		status = STATUS_NOT_SUPPORTED;
		break;
	}
	DebugPrint("StartIo End.");


}												//StartIo

/******************************************************************************
 *
 * Function   :  DispatchIoControl
 *
 * Description:  Handle IRP_MJ_DEVICE_CONTROL
 ******************************************************************************/
NTSTATUS DispatchIoControl(IN PDEVICE_OBJECT fdo,
						   IN PIRP pIrp)
{										//DispatchIoControl
    ULONG ReturnedValue     =   0;   //bytes transfered
	NTSTATUS            status;
    PDEVICE_EXTENSION	pdx;
    PIO_STACK_LOCATION  pIrpStack;

    pdx = (PDEVICE_EXTENSION) fdo->DeviceExtension;

    pIrpStack = IoGetCurrentIrpStackLocation(pIrp);


    // Assume a successful return status
    status = STATUS_SUCCESS;

	DebugPrint("DeviceIoControl Start...");

    // Handle the Sil3124 specific request
    switch (pIrpStack->Parameters.DeviceIoControl.IoControlCode)
    {
	case IOCTL_GET_3124REGISTER_PORT0_BASEADDRESS:		//obtain channel#0's  base address
		DebugPrint("request Port0 Register base address...\n");
		status = IOCTL_GET_3124REGISTER_PORT0_BASEADDRESS_Handler(fdo,pIrp);
		if(status == STATUS_SUCCESS)
			ReturnedValue = 4;            
		break;
	case IOCTL_GET_3124REGISTER_PORT1_BASEADDRESS:		//obtain channel#1's base address
		DebugPrint("request Port1 Register base address...\n");
		status = IOCTL_GET_3124REGISTER_PORT1_BASEADDRESS_Handler(fdo,pIrp);
		if(status == STATUS_SUCCESS)
			ReturnedValue = 4;            
		break;
    case IOCTL_GET_3124REGISTER_PORT2_BASEADDRESS:		//obtain channel#2's base address
		DebugPrint("request Port2 Register base address...\n");
		status = IOCTL_GET_3124REGISTER_PORT2_BASEADDRESS_Handler(fdo,pIrp);
		if(status == STATUS_SUCCESS)
			ReturnedValue = 4;            
		break;
	case IOCTL_GET_3124REGISTER_PORT3_BASEADDRESS:		//obtain channel#3's base address
		DebugPrint("request Port3 Register base address...\n");
		status = IOCTL_GET_3124REGISTER_PORT3_BASEADDRESS_Handler(fdo,pIrp);
		if(status == STATUS_SUCCESS)
			ReturnedValue = 4;            
		break;
	case IOCTL_GET_3124REGISTER_GLOBAL_BASEADDRESS:		//obtain Global base address
		DebugPrint("request Global Register base address...\n");
		status = IOCTL_GET_3124REGISTER_GLOBAL_BASEADDRESS_Handler(fdo,pIrp);
		if(status == STATUS_SUCCESS)
			ReturnedValue = 4;            
		break;
    case IOCTL_GET_3124PORT_INDIRECT_BASEADDRESS:		//obtain Global base address
		DebugPrint("request indirect access Register base address...\n");
		status = IOCTL_GET_3124PORT_INDIRECT_BASEADDRESS_Handler(fdo,pIrp);
		if(status == STATUS_SUCCESS)
			ReturnedValue = 4;            
		break;
	case IOCTL_3124REGISTER_PIO_READ:
        DebugPrint("request PIO READ command,...\n");
		//pass it to StartIo
        IoMarkIrpPending(pIrp);
	    IoStartPacket(fdo, pIrp, NULL, NULL);

		status = STATUS_PENDING;
		break;
	case IOCTL_3124REGISTER_PIO_WRITE:
        DebugPrint("request PIO WRITE command...\n");
		//pass it to StartIo
        IoMarkIrpPending(pIrp);
	    IoStartPacket(fdo, pIrp, NULL, NULL);      
		status = STATUS_PENDING;
		break;
	case IOCTL_GET_3124TASKFILE:
		DebugPrint("require to obtain task file register status");
		status = IOCTL_GET_3124TASKFILE_Handler(fdo,pIrp);
		if(status == STATUS_SUCCESS)
			ReturnedValue = 1;
		break;
	case IOCTL_3124REGISTER_COMMAND:
        DebugPrint("request to execute ATA command(s) without data transfer");
		//pass it to StartIo
        IoMarkIrpPending(pIrp);
	    IoStartPacket(fdo, pIrp, NULL, NULL);
		status = STATUS_PENDING;      
		break;
    case IOCTL_3124REGISTER_MAP_PORT:
          DebugPrint("request to map PORT register");
          status = IOCTL_3124REGISTER_MAP_PORT_Handler(fdo,pIrp);
		  ReturnedValue = 4;
		  break;
    case IOCTL_3124REGISTER_MAP_GLOBAL:
          DebugPrint("request to map GLOBAL register");
          status = IOCTL_3124REGISTER_MAP_GLOBAL_Handler(fdo,pIrp);
		  ReturnedValue = 4;
		  break;
    case IOCTL_3124REGISTER_UNMAP_PORT:
          DebugPrint("request to unmap PORT register");
          status = IOCTL_3124REGISTER_UNMAP_PORT_Handler(fdo,pIrp);
		  break;
    case IOCTL_3124REGISTER_UNMAP_GLOBAL:
          DebugPrint("request to unmap GLOBAL register");
          status = IOCTL_3124REGISTER_UNMAP_GLOBAL_Handler(fdo,pIrp);
		  break;
	case IOCTL_3124_PORT_RESET:
          DebugPrint("request to Reset Port");
          status = IOCTL_3124_PORT_RESET_Handler(fdo,pIrp);
		  break;
     case IOCTL_3124_DMA_READ:
          DebugPrint("request to DMA READ");
		  IoMarkIrpPending(pIrp);
	      IoStartPacket(fdo, pIrp, NULL, NULL);
          status = STATUS_PENDING;    
		  break;
    case IOCTL_3124_DMA_WRITE:
          DebugPrint("request to DMA WRITE");
		  IoMarkIrpPending(pIrp);
	      IoStartPacket(fdo, pIrp, NULL, NULL);
          status = STATUS_PENDING;    
		  break;
	default:
		status = STATUS_INVALID_DEVICE_REQUEST;
		DebugPrintMsg("unsupport device control code");
        break;
    }


	DebugPrint("DeviceIoControl End.");

    if (status == STATUS_PENDING)
        return STATUS_PENDING;

    return CompleteRequestInfo(pIrp,status,ReturnedValue);
}												//DispatchIoControl


/******************************************************************************************************************
 *
 * Function   :  IOCTL_GET_3124REGISTER_PORT0_BASEADDRESS_Handler
 *
 * Description:  Handle IRP_MJ_DEVICE_CONTROL which Control_Code is IOCTL_GET_3124REGISTER_PORT0_BASEADDRESS
 ******************************************************************************************************************/
NTSTATUS IOCTL_GET_3124REGISTER_PORT0_BASEADDRESS_Handler(IN PDEVICE_OBJECT fdo,
												IN PIRP pIrp)
{
	NTSTATUS status;
	PDEVICE_EXTENSION	pdx;

	PVOID   IoBuffer;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -