偶然的机会知道了一个同事的工资,竟然比自己多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: