阅读:1438回复:8
请教高手们一些关于Irp的疑问(
在driverStudio中,端口数据的读写可以通过KIoRang来实现.我不知道是不是读入的数据直接添加给Irp中的Systembuffer就可实现端口往上层用户的传送数据.在我看的Irp的文档中,Irp有两个buffer:一个是Userbuffer,一个是Systembuffer.好像是Userbuffer里放的是地址信息.我不是特别清楚.我想请教各位高手.在driverStudio中,KIrp在读写数据和IOCTL控制中,他们具体的工作方式.
|
|
沙发#
发布于: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. |
|
板凳#
发布于: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] |
|
地板#
发布于:2002-05-16 14:29
你说什么?没有懂 :D
|
|
地下室#
发布于:2002-05-16 14:33
不知道你现在能不能理解了
|
|
5楼#
发布于:2002-05-16 14:40
You\'re right。
|
|
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] |
|
7楼#
发布于:2002-05-16 19:25
是WRITE里
|
|
8楼#
发布于:2002-05-17 14:20
资源包括I/O地址,memory range,中断等。
|
|