pnhhit
驱动牛犊
驱动牛犊
  • 注册日期2005-06-23
  • 最后登录2009-12-03
  • 粉丝0
  • 关注0
  • 积分7分
  • 威望18点
  • 贡献值0点
  • 好评度15点
  • 原创分0分
  • 专家分0分
阅读:1547回复:0

USB的C语言驱动程序*ReadDispatch/*WriteDispatch/*DeviceIoControlDispatch如何编写

楼主#
更多 发布于:2008-06-06 16:39
我用DS3.1生成了USB驱动程序,VID、PID都正确,USB资源申请了两个管道PIPE01PIPE00/bulk/1/IN/64/4096;PIPE01/bulk/1/OUT/64/4096,允许多个句柄打开设备。IRP_MJ_READI、RP_MJ_WRITE和自定义的IOCTL_Control都为Buffered方式。编译,插上USB,硬件驱动正常,应用程序也能找到驱动程序,应用程序执行DeviceIoControl,softice跟踪发现,驱动程序的*DeviceIoControlDispatch得到执行。问题是如何用C语言在*ReadDispatch/*WriteDispatch/*DeviceIoControlDispatch编写对这两个管道的操作,如管道0为IN,如何用管道0读取数据?管道1为OUT,如何用管道1写数据?
应用程序需要两个句柄来对应两个管道吗?
IORW.C代码见下:

// iorw.c
//
// Generated by C DriverWizard 3.1.0 (Build 1722)
// Requires DDK Only
// File created on 6/6/2008
//

#include "pch.h"
#include "..\intrface.h"
#ifdef TEMP_WMI_TRACE
#include "iorw.tmh"
#endif

///////////////////////////////////////////////////////////////////////////////////////////////////
//  TempReadDispatch
//      Handled incoming read requests
//
//  Arguments:
//      IN  DeviceObject
//              Device object for our device
//
//      IN  Irp
//              The read IRP to handle
//
//  Return Value:
//      NT status code
//
NTSTATUS TempReadDispatch(
    IN  PDEVICE_OBJECT  DeviceObject,
    IN  PIRP            Irp
    )
{
    PTEMP_DEVICE_EXTENSION    deviceExtension;
    NTSTATUS                        status;
    PIO_STACK_LOCATION              irpStack;
    PVOID                           readBuffer;
    ULONG                           readLength;

    //TempDebugPrint(DBG_IO, DBG_TRACE, __FUNCTION__"++. IRP %p", Irp);

    deviceExtension = (PTEMP_DEVICE_EXTENSION)DeviceObject->DeviceExtension;

    status = TempCheckIoLock(&deviceExtension->IoLock, Irp);
    if (!NT_SUCCESS(status) || (status == STATUS_PENDING))
    {
        //TempDebugPrint(DBG_IO, DBG_WARN, __FUNCTION__"--. IRP %p STATUS %x", Irp, status);

        return status;
    }

    // Get our IRP stack location
    irpStack = IoGetCurrentIrpStackLocation(Irp);

    // Get the read buffer length
    readLength = irpStack->Parameters.Read.Length;
    if (readLength == 0)
    {
        // just complete 0 length request
        status = STATUS_SUCCESS;

        Irp->IoStatus.Information = 0;
        Irp->IoStatus.Status = status;
        IoCompleteRequest(Irp, IO_NO_INCREMENT);

        TempDecrementIoCount(&deviceExtension->IoLock);

        //TempDebugPrint(DBG_IO, DBG_WARN, __FUNCTION__"--. IRP %p, STATUS %x", Irp, status);

        return status;
    }

    readBuffer = Irp->AssociatedIrp.SystemBuffer;
//*************************************************************************************************
//此处应做出处理。我做的PCI是在这里处理
//*************************************************************************************************
    status = STATUS_NOT_IMPLEMENTED;
    Irp->IoStatus.Information = 0;
    Irp->IoStatus.Status = status;
    IoCompleteRequest (Irp, IO_NO_INCREMENT);

    TempDecrementIoCount(&deviceExtension->IoLock);

    //TempDebugPrint(DBG_IO, DBG_TRACE, __FUNCTION__"--. IRP %p STATUS %x", Irp, status);

    return status;
}

///////////////////////////////////////////////////////////////////////////////////////////////////
//  TempWriteDispatch
//      Handled incoming write requests
//
//  Arguments:
//      IN  DeviceObject
//              Device object for our device
//
//      IN  Irp
//              The write IRP to handle
//
//  Return Value:
//      NT status code
//
NTSTATUS TempWriteDispatch(
    IN  PDEVICE_OBJECT  DeviceObject,
    IN  PIRP            Irp
    )
{
    PTEMP_DEVICE_EXTENSION    deviceExtension;
    NTSTATUS                        status;
    PIO_STACK_LOCATION              irpStack;
    PVOID                           writeBuffer;
    ULONG                           writeLength;

    //TempDebugPrint(DBG_IO, DBG_TRACE, __FUNCTION__"++. IRP %p", Irp);

    deviceExtension = (PTEMP_DEVICE_EXTENSION)DeviceObject->DeviceExtension;

    status = TempCheckIoLock(&deviceExtension->IoLock, Irp);
    if (!NT_SUCCESS(status) || (status == STATUS_PENDING))
    {
        //TempDebugPrint(DBG_IO, DBG_WARN, __FUNCTION__"--. IRP %p STATUS %x", Irp, status);

        return status;
    }

    // Get our IRP stack location
    irpStack = IoGetCurrentIrpStackLocation(Irp);

    // Get the write buffer length
    writeLength = irpStack->Parameters.Write.Length;
    if (writeLength == 0)
    {
        // just complete 0 length request
        status = STATUS_SUCCESS;

        Irp->IoStatus.Information = 0;
        Irp->IoStatus.Status = status;
        IoCompleteRequest(Irp, IO_NO_INCREMENT);

        TempDecrementIoCount(&deviceExtension->IoLock);

        //TempDebugPrint(DBG_IO, DBG_WARN, __FUNCTION__"--. IRP %p, STATUS %x", Irp, status);

        return status;
    }

    writeBuffer = Irp->AssociatedIrp.SystemBuffer;
//*************************************************************************************************
//此处应做出处理,我做的PCI是在这里处理
//*************************************************************************************************
    status = STATUS_NOT_IMPLEMENTED;
    Irp->IoStatus.Information = 0;
    Irp->IoStatus.Status = status;
    IoCompleteRequest (Irp, IO_NO_INCREMENT);

    TempDecrementIoCount(&deviceExtension->IoLock);

    //TempDebugPrint(DBG_IO, DBG_TRACE, __FUNCTION__"--. IRP %p STATUS %x", Irp, status);

    return status;
}

///////////////////////////////////////////////////////////////////////////////////////////////////
//  TempDeviceIoControlDispatch
//      Handled incoming IOCTL requests
//
//  Arguments:
//      IN  DeviceObject
//              Device object for our device
//
//      IN  Irp
//              The IOCTL IRP to handle
//
//  Return Value:
//      NT status code
//
NTSTATUS TempDeviceIoControlDispatch(
    IN  PDEVICE_OBJECT  DeviceObject,
    IN  PIRP            Irp
    )
{
    PIO_STACK_LOCATION              irpStack;
    NTSTATUS                        status;
    PTEMP_DEVICE_EXTENSION    deviceExtension;
    PVOID                           inputBuffer;
    ULONG                           inputLength;
    PVOID                           outputBuffer;
    ULONG                           outputLength;

    //TempDebugPrint(DBG_IO, DBG_TRACE, __FUNCTION__"++. IRP %p", Irp);

    deviceExtension = (PTEMP_DEVICE_EXTENSION)DeviceObject->DeviceExtension;

    // Get our IRP stack location
    irpStack = IoGetCurrentIrpStackLocation(Irp);

    // Get the buffer lengths
    inputLength = irpStack->Parameters.DeviceIoControl.InputBufferLength;
    outputLength = irpStack->Parameters.DeviceIoControl.OutputBufferLength;

    switch (irpStack->Parameters.DeviceIoControl.IoControlCode)
    {

    case IOCTL_Control:
        //TempDebugPrint(DBG_IO, DBG_INFO, __FUNCTION__": IOCTL_Control");

        status = TempCheckIoLock(&deviceExtension->IoLock, Irp);
        if (!NT_SUCCESS(status) || (status == STATUS_PENDING))
        {
            //TempDebugPrint(DBG_IO, DBG_WARN, __FUNCTION__"--. IRP %p STATUS %x", Irp, status);

            return status;
        }

        // buffered ioctl
        inputBuffer = Irp->AssociatedIrp.SystemBuffer;
        outputBuffer = Irp->AssociatedIrp.SystemBuffer;
//*************************************************************************************************
//此处应做出处理,我做的PCI是在这里处理
//*************************************************************************************************
        status = STATUS_NOT_IMPLEMENTED;
        Irp->IoStatus.Information = 0;
        Irp->IoStatus.Status = status;
        IoCompleteRequest (Irp, IO_NO_INCREMENT);

        TempDecrementIoCount(&deviceExtension->IoLock);
        break;

    default:
        status = STATUS_INVALID_DEVICE_REQUEST;
        Irp->IoStatus.Status = status;
        IoCompleteRequest (Irp, IO_NO_INCREMENT);
        break;
    }

    //TempDebugPrint(DBG_IO, DBG_TRACE, __FUNCTION__"--. IRP %p STATUS %x", Irp, status);

    return status;
}
游客

返回顶部