阅读:1508回复:9
菜鸟求助
求各位指点:
要用DDK做开发一个I/O驱动程序,在DDK里的例子程序:\\src\\general\\portio的基础上改进,可是我不知道怎么一次性写入数据块了。看例子是用 WRITE_PORT_UCHAR(..)写入的数据,于是照葫芦写了WRITE_PORT_BUFFER_UCHAR(..)可是不知道第二个参数,也就是数据的指针怎么从最上层的应用程序传过来的。在上层的DLL里调用DeviceIoContrl(..)通过应用程序传进一个数据块的指针,可是...可是....驱动里究竟该怎么做才能得到能用的指针啊?? :( :( 因为是第一次写这个东东,DDK看的头都大了,所以还是请哪位大侠用中文不吝指教(最好能有个例程 ;)我的mail:realanchoret@yahoo.com.cn) ,在下不胜感激之至。 另外上面的那个给分是怎么回事?说是范围是0-20。 |
|
沙发#
发布于:2002-11-29 09:57
~~这么简单的问题也来这里问??
现在的新手怎么都这么懒了 |
|
|
板凳#
发布于:2002-11-29 09:28
偶的问题终于解决了,其实也很简单,不过楼上上两位的答复答非所问,有那个骗分之嫌.. :(
|
|
地板#
发布于:2002-11-08 11:28
唉,新手的分就是这样被骗的。
|
|
|
地下室#
发布于: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 |
|
5楼#
发布于:2002-10-26 08:59
暂时还没空改,可能要到下周去了,多谢各位关照!
|
|
6楼#
发布于:2002-10-25 17:53
你的问题解决了吗? 没错,解决了就放点分庆祝一下 :D |
|
|
7楼#
发布于:2002-10-25 17:48
你的问题解决了吗?
|
|
|
8楼#
发布于:2002-10-23 10:52
多谢版主!
先试试! |
|
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=你拷入的数据的长度即可。 记住,长度一定要设置正确,且不能超过应用层提供的内存缓冲区大小。 |
|
|