Windows驱动_USB驱动之七

这篇博客探讨了Windows驱动中USB设备的同步传输过程,重点分析ReadWriteIsochEndPoints函数及其相关回调函数的工作原理。文章指出,工资水平与个人经历、项目需求和公司政策有关,提醒读者从长远角度看待职业发展。最后,博主计划通过USBVIEW.EXE进一步研究USB驱动,并尝试编写USB鼠标驱动。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

              偶然的机会知道了一个同事的工资,竟然比自己多1K多,刚开始,自己心里有点不平衡,一般来说,经验差不多,工资的水平应该不会低多少,后来,这跟自己的环境,以及以前的工资都是有很大的关系的,后来想到,自己之前的工资,真实很低,这边给这么多,马上就答应了,如果换做另外一个人,因为他目前的工资水平已经很高,所以他可能对这个工资会考虑一下,如果公司的项目急需要人,就会跟他涨工资,这就促成了,他的工资比一般人高,但是这种高,千万不要以为,是公司认为他的能力够,而是项目的原因,所以,当公司一下没项目的时候,就立马会从这样的人下手。所以,我们要从长远来看,比如,你在公司的发展,公司是不是认可你,承认过你等等,这些都可以看出公司对你的看重,当然,公司不能一下,将你的工资,加得很高,这个必须符合整个公司的工资水平等等。所以,我们必须从长远来看这个问题。

 

             今天,我们来看关于Windows驱动中USB设备的同步传输是如何进行的,昨天,我们说到了,这个函数是ReadWriteIsochEndPoints,首先看下这个函数的源码:

VOID
ReadWriteIsochEndPoints(
    _In_ WDFQUEUE         Queue,
    _In_ WDFREQUEST       Request,
    _In_ ULONG            Length,
    _In_ WDF_REQUEST_TYPE RequestType
    )
/*++

Routine Description:

    This routine does some validation and invokes appropriate function to perform Isoch transfer

--*/
{
    NTSTATUS                    status;
    WDF_USB_PIPE_INFORMATION    pipeInfo;
    PFILE_CONTEXT               fileContext;
    WDFUSBPIPE                  pipe;
    PDEVICE_CONTEXT             deviceContext;
    PREQUEST_CONTEXT            rwContext;

    UNREFERENCED_PARAMETER(Length);

    UsbSamp_DbgPrint(3, ("ReadWriteIsochEndPoints - begins\n"));

    //
    // Get the pipe associate with this request.
    //
    fileContext = GetFileContext(WdfRequestGetFileObject(Request));
    pipe = fileContext->Pipe;

    WDF_USB_PIPE_INFORMATION_INIT(&pipeInfo);
    WdfUsbTargetPipeGetInformation(pipe, &pipeInfo);

    if ((WdfUsbPipeTypeIsochronous != pipeInfo.PipeType)) {
        UsbSamp_DbgPrint(1, ("Pipe type is not Isochronous\n"));
        status = STATUS_INVALID_DEVICE_REQUEST;
        goto Exit;

    }

    if (RequestType == WdfRequestTypeRead && WdfUsbTargetPipeIsInEndpoint(pipe) == FALSE) {
        UsbSamp_DbgPrint(1, ("Invalid pipe - not an input pipe\n"));
        status = STATUS_INVALID_PARAMETER;
        goto Exit;    
    }

    if (RequestType == WdfRequestTypeWrite && WdfUsbTargetPipeIsOutEndpoint(pipe) == FALSE) {
        UsbSamp_DbgPrint(1, ("Invalid pipe - not an output pipe\n"));
        status = STATUS_INVALID_PARAMETER;
        goto Exit;    
    }

    deviceContext = GetDeviceContext(WdfIoQueueGetDevice(Queue));
    rwContext = GetRequestContext(Request);

    if (RequestType == WdfRequestTypeRead) {       
        rwContext->Read = TRUE;
        status = WdfRequestForwardToIoQueue(Request, deviceContext->IsochReadQueue);
    } 
    else {
        rwContext->Read = FALSE;
        status = WdfRequestForwardToIoQueue(Request, deviceContext->IsochWriteQueue);
    }

    if (!NT_SUCCESS(status)){
       UsbSamp_DbgPrint(1, ("WdfRequestForwardToIoQueue failed with status 0x%x\n", status));
       goto Exit;
    }

    return;

Exit:
    WdfRequestCompleteWithInformation(Request, status, 0);
    return;
}


这个函数的上半部分,好理解,得到pipeinfo,我们知道同步读,所以对应的PIPE输出端点OUT ,同步写,对应的PIPE的输入端点IN,下半部分很简单,直接调用WdfRequestForwardToIoQueue将请求送至相应的同步读和写队列。这个时候,我们可以回忆一下,这两个队列,是如何注册的,我们这两个队列都有注册队列事件回调函数,当队列中有请求进入的时候,将调用这个回调函数,我们看前面的代码:

    status = WdfIoQueueReadyNotify(pDevContext->IsochReadQueue,
                                   UsbSamp_EvtIoQueueReadyNotification,
                                   (WDFCONTEXT)pDevContext);

    status = WdfIoQueueReadyNotify(pDevContext->IsochWriteQueue,
                                   UsbSamp_EvtIoQueueReadyNotification,
                                   (WDFCONTEXT)pDevContext);

我们直接来看下这个函数UsbSamp_EvtIoQueueReadyNotification:


                
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值