📄 dispatchroutines.c
字号:
/******************************************************************************
* * 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 + -