阅读:2434回复:4
如何给指定的端点发数据?
我用Driverstudio的向导生成了一个USB驱动,现在遇到点问题,请大家指教:
向导在NTSTATUS TESTDevice::Write(KIrp I)函数中给我生成了如下的代码: // TODO: Select the correct pipe to write to // Create an URB to do actual Bulk write to the pipe PURB pUrb = m_Endpoint2OUT.BuildInterruptTransfer( Mem, // Where is data coming from? dwTotalSize, // How much data to read? FALSE, // direction (FALSE = OUT) NULL // Link to next URB ); 代码默认是往端点2发数据,我的usb设备有7个端点,我该如何向指定的端点发送数据: 目前我想到了3个方法: 1.在每次调用writefile之前用DeviveIOControl指定端点; 2.用数据的第一个字节指定端点; 3.在CreateFile的时候用不同的文件名(比如“\usb?......PIPE01”); 前两个方法都比较好实现,但是我觉得这这样不够标准,但第三个方法又不知道如何得到PIPE01的字符串,我发现在Createfile的时候,不管文件名的后面写什么系统都会调用TESTDevice::Write我要如何才能在TESTDevice::Write得到形如"PIPE01"的字符串从而选择正确的管道发送呢?我想在参数(KIrp I)肯定包含这样的信息,可是他的成员实在太多了,请大家给个提示,谢谢!! [编辑 - 8/2/04 by aspist] |
|
沙发#
发布于:2004-08-02 14:35
管道名是你驱动里自已写的,怎会不知道呢?驱动程序得到设备描述符后就能知道设备有几个端点,再一一和每个端点建立管道,也就有了管道名,CreatFile时用你定义的管道名打开各个管道就OK啦!
|
|
|
板凳#
发布于:2004-08-02 15:27
你没明白我的意思,可能是我没有说清楚。当然我会在驱动里对管道名有个约定:比如PIPE00是读端点1
,PIPE01是写端点1,PIPE02是读端点2,PIPE03是写端点2......然后用户如果要往端点1写数据就先 CreateFile("DevicePath/PIPI00"),然后再WriteFile().问题是我在驱动里如何知道用户的CreateFile的 第一个参数(设备路径名)"/"后面的值(本例就是PIPE00)? [编辑 - 8/2/04 by aspist] |
|
地板#
发布于:2004-08-02 16:15
用第一种方法吧。
第二种方法也可行,只是太麻烦 第三种方法不太可行,恐怕实现比较麻烦。 |
|
地下室#
发布于:2004-08-03 08:41
在驱动的IRP_MJ_CREATE例程中有如下语句:
irpStack = IoGetCurrentIrpStackLocation (Irp); fileObject = irpStack->FileObject; // fscontext is null for device fileObject->FsContext = NULL; if (fileObject->FileName.Length != 0) { ntStatus = STATUS_INSUFFICIENT_RESOURCES; // // a name was specified, convert it to a pipe id // for (i=0; i<D12_MAX_PIPES; i++) { if (RtlCompareMemory (fileObject->FileName.Buffer, deviceExtension->PipeList.Name, fileObject->FileName.Length) == fileObject->FileName.Length && !deviceExtension->PipeList.Opened) { // // found a match // pipeHandle = &deviceExtension->PipeList; //D12_ResetPipe(DeviceObject, pipeHandle); break; } } } // if we are opening a pipe set stuff up and set FsContext if (pipeHandle) { D12_KdPrint (("D12TEST.SYS: open pipe %x\n", pipeHandle)); fileObject->FsContext = pipeHandle; pipeHandle->Opened = TRUE; pipeHandle->bPerfTimerEnabled = FALSE; ntStatus = STATUS_SUCCESS; } |
|
|