i11usi0n
驱动牛犊
驱动牛犊
  • 注册日期2002-04-18
  • 最后登录2006-05-22
  • 粉丝0
  • 关注0
  • 积分81分
  • 威望10点
  • 贡献值0点
  • 好评度7点
  • 原创分0分
  • 专家分0分
阅读:1438回复:8

请教高手们一些关于Irp的疑问(

楼主#
更多 发布于:2002-05-16 13:29
在driverStudio中,端口数据的读写可以通过KIoRang来实现.我不知道是不是读入的数据直接添加给Irp中的Systembuffer就可实现端口往上层用户的传送数据.在我看的Irp的文档中,Irp有两个buffer:一个是Userbuffer,一个是Systembuffer.好像是Userbuffer里放的是地址信息.我不是特别清楚.我想请教各位高手.在driverStudio中,KIrp在读写数据和IOCTL控制中,他们具体的工作方式.
arthurtu
驱动巨牛
驱动巨牛
  • 注册日期2001-11-08
  • 最后登录2020-12-19
  • 粉丝0
  • 关注0
  • 积分26分
  • 威望161点
  • 贡献值0点
  • 好评度35点
  • 原创分0分
  • 专家分0分
  • 社区居民
沙发#
发布于:2002-05-16 13:59
when WRITE, data in nonpage pool, address of it in SystemBuffer, UserBuffer=NULL;
when READ, after complete irp, copy data from systemmbuffer to userbuffer.
you don\'t acccess UserBuffer.
i11usi0n
驱动牛犊
驱动牛犊
  • 注册日期2002-04-18
  • 最后登录2006-05-22
  • 粉丝0
  • 关注0
  • 积分81分
  • 威望10点
  • 贡献值0点
  • 好评度7点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2002-05-16 14:17
您是相对系统说的,还是驱动开发者说的.
而且,一直困扰我的是我不能理解Irp是如何与底层设备联系的.我们以并口为例,你说写数据时数据时在non_pagedpool里的,是不是我在将他发送倒底层设备时还要从pool里取出数据,然后通过KIoRang来out to device.在读数据时,通过KIoRang读入数据,防盗systembuffer里,systembuffer copy to userbuffer(system finish it).then application get the data..

I donot know if it is right.   :mad:

[编辑 -  5/16/02 by  i11usi0n]
arthurtu
驱动巨牛
驱动巨牛
  • 注册日期2001-11-08
  • 最后登录2020-12-19
  • 粉丝0
  • 关注0
  • 积分26分
  • 威望161点
  • 贡献值0点
  • 好评度35点
  • 原创分0分
  • 专家分0分
  • 社区居民
地板#
发布于:2002-05-16 14:29
你说什么?没有懂 :D
i11usi0n
驱动牛犊
驱动牛犊
  • 注册日期2002-04-18
  • 最后登录2006-05-22
  • 粉丝0
  • 关注0
  • 积分81分
  • 威望10点
  • 贡献值0点
  • 好评度7点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2002-05-16 14:33
不知道你现在能不能理解了
arthurtu
驱动巨牛
驱动巨牛
  • 注册日期2001-11-08
  • 最后登录2020-12-19
  • 粉丝0
  • 关注0
  • 积分26分
  • 威望161点
  • 贡献值0点
  • 好评度35点
  • 原创分0分
  • 专家分0分
  • 社区居民
5楼#
发布于:2002-05-16 14:40
You\'re right。
i11usi0n
驱动牛犊
驱动牛犊
  • 注册日期2002-04-18
  • 最后登录2006-05-22
  • 粉丝0
  • 关注0
  • 积分81分
  • 威望10点
  • 贡献值0点
  • 好评度7点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2002-05-16 19:20
下面是我在read里添加的代码
NTSTATUS ParDevice::Write(KIrp I) (注KIoRange Io_base)
{
    t << \"Entering ParDevice::Write, \" << I << EOL;


    PULONG pIOBuffer;      
    ULONG InBufferSize ;        
    ULONG nPort;                
    ULONG DataBufferSize;


    InBufferSize  = I.IoctlInputBufferSize();

    pIOBuffer     = (PULONG) I.IoctlBuffer();

    I.Information() = 0;

DataBufferSize = sizeof(UCHAR);

if ( InBufferSize < (sizeof(ULONG) + DataBufferSize) )
    {
        return STATUS_INVALID_PARAMETER;
    }

    nPort = *pIOBuffer++;

    KPeripheralAddress* pAddress = static_cast<KPeripheralAddress*>(&Io_base);

if (  nPort >= pAddress->Count() || (nPort + DataBufferSize) > pAddress->Count() || (nPort & (DataBufferSize - 1)) != 0)
    {
        return STATUS_ACCESS_VIOLATION;  
    }

if(&Io_base)
{
Io_base.outb(nPort, *PUCHAR(pIOBuffer));
}
else
{
return STATUS_UNSUCCESSFUL;
}


I.Information() = DataBufferSize;

if (I.WriteSize() == 0)
{
I.Information() = 0;
return I.PnpComplete(this, STATUS_SUCCESS);
}


return m_DriverManagedQueue.QueueIrp(I);
}


我很想听听大虾们的建议.(这里的代码是我东拼西凑来的)
另外:
在驱动中有两个历程是StartDevice和StopDevice.在前者中我看到一些文档提到资源分配的问题.我不太能理解这里所谓的资源是什么(是端口地址?),他们分配有一些什么规范.

[编辑 -  5/16/02 by  i11usi0n]
i11usi0n
驱动牛犊
驱动牛犊
  • 注册日期2002-04-18
  • 最后登录2006-05-22
  • 粉丝0
  • 关注0
  • 积分81分
  • 威望10点
  • 贡献值0点
  • 好评度7点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2002-05-16 19:25
是WRITE里
arthurtu
驱动巨牛
驱动巨牛
  • 注册日期2001-11-08
  • 最后登录2020-12-19
  • 粉丝0
  • 关注0
  • 积分26分
  • 威望161点
  • 贡献值0点
  • 好评度35点
  • 原创分0分
  • 专家分0分
  • 社区居民
8楼#
发布于:2002-05-17 14:20
资源包括I/O地址,memory range,中断等。
游客

返回顶部