suerdj2k
驱动牛犊
驱动牛犊
  • 注册日期2004-12-28
  • 最后登录2006-02-08
  • 粉丝0
  • 关注0
  • 积分2分
  • 威望1点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1821回复:2

PassthruEX学习笔记之一(DevOpen和DevOpenAdapter)

楼主#
更多 发布于:2005-02-04 12:33
最近学习passthru,下了两个对passthru进行修改的例子,学习之,写点体会,希望对其他像我这样的初学者以一些帮助。



PtRegisterDevice的时候指定:
    DispatchTable[IRP_MJ_CREATE] = DevOpen;
即,由devOpen函数处理major code 为IRP_MJ_CREATE 的 IRP请求;

用户态的CreateFile直接导致I/O Manager产生一个major code 为IRP_MJ_CREATE 的 IRP
送往passthru的驱动。因此,每次CreateFile都会“调用”devOpen函数。

而这个DevOpen函数只是在收到IRP后返回success,并不做更多其它事情。

------------------

用户态若发送一个DeviceIoControl请求,如下:
DeviceIoControl(
            hAdapter,
            (DWORD)IOCTL_PTUSERIO_OPEN_ADAPTER, //major code
            pszAdapterName,   // 物理NIC名称,作为输入参数
            nBufferLength,
            &NdisStatus,
            sizeof( NdisStatus ),
            &bytesReturned,
            NULL
            );

请求代码为:IOCTL_PTUSERIO_OPEN_ADAPTER,那将首先导致内核态的DevIoControl发生,
因为:
    DispatchTable[IRP_MJ_DEVICE_CONTROL] = DevIoControl;

--------------------------

在DevIoControl中判断major code,如果是IOCTL_PTUSERIO_OPEN_ADAPTER,则导致执行D
evOpenAdapter函数。

-------------------------

在DevOpenAdapter函数中,主要用到IRP,根据这个IRP,可以得到一些其他信息(比如Dev
iceIoControl的输入参数,是哪个用户态的FileObject发送的这个IRP等)。

    (1)由于,I/O Manager构造IRP包的时候,会把把输入参数(即物理NIC名称)存放在
irp.AssociatedIrp.SystemBuffer中,这是一个内核态的缓冲区。
         所以在DevOpenAdapter函数中,根据IRP就可以得到物理NIC的名称,并调用PtL
ookupAdapterByName,找到一个Adapter,这个Adapter指向的是虚拟NIC!!
    
(注意,PtLookupAdapterByName中作了转换,输入的是物理NIC的名称,在函数中进行寻找
,找到匹配的虚拟NIC(该虚拟NIC的lowerdevice == 输入的物理NIC),返回的是该虚拟NI
C的handle.)

    (2)接着,为这个虚拟NIC Adapter分配一个上下文环境:DevAllocateOpenContext,做了一个指针交换,最后的结果是:
         pIRP->FileObject->FsContext指向刚刚为虚拟网卡分配的上下文环境,并且可以通过pIRP->FileObject->FsContext->adapter访问虚拟网卡。
         (这一步的意义何在?直接返回pAdapter不就行吗?)
    
    (3)返回虚拟NIC的adapter。


[编辑 -  2/4/05 by  suerdj2k]

[编辑 -  2/4/05 by  suerdj2k]

最新喜欢:

cyliucyliu
============================== 苏州工业园区 NDIS驱动 软件研发
makefriend8
驱动小牛
驱动小牛
  • 注册日期2003-08-01
  • 最后登录2014-06-27
  • 粉丝0
  • 关注0
  • 积分84分
  • 威望111点
  • 贡献值0点
  • 好评度9点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2005-02-11 14:19
不错。期待继续
suerdj2k
驱动牛犊
驱动牛犊
  • 注册日期2004-12-28
  • 最后登录2006-02-08
  • 粉丝0
  • 关注0
  • 积分2分
  • 威望1点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2005-02-14 14:23
谢谢,有支持才有动力!

写得不好请见谅!

下一篇:《设置过滤器》正在准备中...

[编辑 -  2/14/05 by  suerdj2k]
============================== 苏州工业园区 NDIS驱动 软件研发
游客

返回顶部