realanchoret
驱动牛犊
驱动牛犊
  • 注册日期2002-08-24
  • 最后登录2008-07-09
  • 粉丝0
  • 关注0
  • 积分100分
  • 威望11点
  • 贡献值0点
  • 好评度11点
  • 原创分0分
  • 专家分0分
阅读:1508回复:9

菜鸟求助

楼主#
更多 发布于:2002-10-23 10:26
求各位指点:
要用DDK做开发一个I/O驱动程序,在DDK里的例子程序:\\src\\general\\portio的基础上改进,可是我不知道怎么一次性写入数据块了。看例子是用 WRITE_PORT_UCHAR(..)写入的数据,于是照葫芦写了WRITE_PORT_BUFFER_UCHAR(..)可是不知道第二个参数,也就是数据的指针怎么从最上层的应用程序传过来的。在上层的DLL里调用DeviceIoContrl(..)通过应用程序传进一个数据块的指针,可是...可是....驱动里究竟该怎么做才能得到能用的指针啊?? :( :(
因为是第一次写这个东东,DDK看的头都大了,所以还是请哪位大侠用中文不吝指教(最好能有个例程 ;)我的mail:realanchoret@yahoo.com.cn) ,在下不胜感激之至。
另外上面的那个给分是怎么回事?说是范围是0-20。
lonkiss
驱动牛犊
驱动牛犊
  • 注册日期2002-01-15
  • 最后登录2004-07-28
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2002-11-29 09:57
~~这么简单的问题也来这里问??
现在的新手怎么都这么懒了
我的真名就叫-龙旗
realanchoret
驱动牛犊
驱动牛犊
  • 注册日期2002-08-24
  • 最后登录2008-07-09
  • 粉丝0
  • 关注0
  • 积分100分
  • 威望11点
  • 贡献值0点
  • 好评度11点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2002-11-29 09:28
偶的问题终于解决了,其实也很简单,不过楼上上两位的答复答非所问,有那个骗分之嫌.. :(
minsoft
驱动小牛
驱动小牛
  • 注册日期2001-07-30
  • 最后登录2007-03-06
  • 粉丝0
  • 关注0
  • 积分8分
  • 威望2点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2002-11-08 11:28
唉,新手的分就是这样被骗的。
少了e,就少了全部
realanchoret
驱动牛犊
驱动牛犊
  • 注册日期2002-08-24
  • 最后登录2008-07-09
  • 粉丝0
  • 关注0
  • 积分100分
  • 威望11点
  • 贡献值0点
  • 好评度11点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2002-10-29 16:59
好像还是不行呢,我没有全部把例程中代码的改掉,所以看起来部分代码是这样的:
DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL]  = GpdDispatch;

....GpdDispatch例程:
case IOCTL_GPD_WRITE_PORT_BUFFER_UCHAR:
Status = GpdIoctlWritePort(pLDI,pIrp,pIrpStack,pIrpStack->Parameters.DeviceIoControl.IoControlCode);

.....GpdIoctlWritePort例程:
    InBufferSize  = IrpStack->Parameters.DeviceIoControl.InputBufferLength;
    pIOBuffer     = (PULONG) pIrp->AssociatedIrp.SystemBuffer;
    pIrp->IoStatus.Information = 0;
...
    if (pLDI->PortMemoryType == 1)
{...
case IOCTL_GPD_WRITE_PORT_BUFFER_UCHAR:
WRITE_PORT_BUFFER_UCHAR((PULONG)((ULONG_PTR)pLDI->PortBase + nPort),(PUCHAR)pIOBuffer,InBufferSize);

}....
我还改了typedef struct  _GENPORT_WRITE_INPUT {
    ULONG   PortNumber;     // Port # to write to
    union   {               // Data to be output to port
        ULONG   LongData;
        USHORT  ShortData;
        UCHAR   CharData;
//=-------------Add ---------
PUCHAR CharBuffer;
PULONG LongBuffer;
PUSHORT ShortBuffer;
//=-----------------
    };
}   GENPORT_WRITE_INPUT;

其它地方就没动过,都是DDK中的源代码。我的愿望是在DeviceIoControl里把在上层分配的一块内存通过GENPORT_WRITE_INPUT这个结构把指针传到下层,然后由驱动层WRITE到硬件里面就一切OK,结果在DeviceIoControl调用的时候给个\"参数错误\"信息来,faint.....

偶现在惨啊,像是被赶的鸭子一样,本来连 C 都不大懂的说.....
还是希望各位求我于水火......bow

 
realanchoret
驱动牛犊
驱动牛犊
  • 注册日期2002-08-24
  • 最后登录2008-07-09
  • 粉丝0
  • 关注0
  • 积分100分
  • 威望11点
  • 贡献值0点
  • 好评度11点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2002-10-26 08:59
暂时还没空改,可能要到下周去了,多谢各位关照!
VanCheer
驱动老牛
驱动老牛
  • 注册日期2002-02-21
  • 最后登录2003-08-28
  • 粉丝0
  • 关注0
  • 积分-20分
  • 威望-10点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2002-10-25 17:53
你的问题解决了吗?

没错,解决了就放点分庆祝一下 :D
[img]http://www.driverdevelop.com/forum/upload/VanCheer/2003-03-21_mon.gif[/img][img]http://www.driverdevelop.com/forum/upload/VanCheer/2002-12-07_smallbaby.jpg[/img]
Tom_lyd
驱动大牛
驱动大牛
  • 注册日期2001-09-02
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望1点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2002-10-25 17:48
你的问题解决了吗?
Tom_lyd
realanchoret
驱动牛犊
驱动牛犊
  • 注册日期2002-08-24
  • 最后登录2008-07-09
  • 粉丝0
  • 关注0
  • 积分100分
  • 威望11点
  • 贡献值0点
  • 好评度11点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2002-10-23 10:52
多谢版主!
先试试!
Tom_lyd
驱动大牛
驱动大牛
  • 注册日期2001-09-02
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望1点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2002-10-23 10:50
在IRP_MJ_DEVICE_CONTROL里面
设传入IRP的指针参数为pIrp
ULONG uInputBufferLen, uOutputBufferLen;
PVOID pInputBuffer, pOutputBuffer;

PIO_STACK_LOCATION pThisSP = IoGetCurrentStackLocation( pIrp );
pInputBuffer=pIrp->AssociatedIrp.SystemBuffer;
pOutputBuffer=pIrp->AssociatedIrp.SystemBuffer;
uInputBufferLen=pThisSP->Parameters.DeviceIoControl.InputBufferLength;
uOutputBufferLen=pThisSP->Parameters.DeviceIoControl.OutputBufferLength;
uIoControlCode=pThisSP->Parameters.DeviceIoControl.IoControlCode;
if( pIrp->MdlAddress )
{
    pOutputBuffer = MmGetSystemAddressForMdl( pIrp->MdlAddress );
}
然后,你在驱动中获得了应用层需要的数据后,拷入pOutputBuffer,并设置pIrp->IoStatus.Information=你拷入的数据的长度即可。
记住,长度一定要设置正确,且不能超过应用层提供的内存缓冲区大小。
Tom_lyd
游客

返回顶部