aspist
驱动牛犊
驱动牛犊
  • 注册日期2004-07-13
  • 最后登录2012-12-19
  • 粉丝0
  • 关注0
  • 积分3分
  • 威望30点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:2434回复:4

如何给指定的端点发数据?

楼主#
更多 发布于:2004-08-02 12:36
我用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]
zfw
zfw
驱动小牛
驱动小牛
  • 注册日期2001-12-16
  • 最后登录2006-09-01
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望1点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2004-08-02 14:35
管道名是你驱动里自已写的,怎会不知道呢?驱动程序得到设备描述符后就能知道设备有几个端点,再一一和每个端点建立管道,也就有了管道名,CreatFile时用你定义的管道名打开各个管道就OK啦!
zfw
aspist
驱动牛犊
驱动牛犊
  • 注册日期2004-07-13
  • 最后登录2012-12-19
  • 粉丝0
  • 关注0
  • 积分3分
  • 威望30点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于: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]
jinghuiren
驱动巨牛
驱动巨牛
  • 注册日期2002-06-01
  • 最后登录2008-10-27
  • 粉丝0
  • 关注0
  • 积分291分
  • 威望460点
  • 贡献值0点
  • 好评度428点
  • 原创分0分
  • 专家分0分
地板#
发布于:2004-08-02 16:15
用第一种方法吧。
第二种方法也可行,只是太麻烦
第三种方法不太可行,恐怕实现比较麻烦。
zfw
zfw
驱动小牛
驱动小牛
  • 注册日期2001-12-16
  • 最后登录2006-09-01
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望1点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
地下室#
发布于: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;
    }
zfw
游客

返回顶部