阅读:2932回复:10
WRITE_PORT_BUFFER_ULONG 谁使用过这个函数?
我在使用WRITE_PORT_ULONG函数向并口写数据时,通过示波器可以观察到数据的输出,但是在使用WRITE_PORT_BUFFER_ULONG 函数向并口写数据时,用示波器却观察不到任何输出。有谁遇到过这样的问题
大概的代码如下,请指教 应用程序中: unsigned long BufferL[1024];//一个双字类型的数组,长度1024 int i; for(i=0;i<=1024;i++) BufferL=0x0000ffff;//给数组赋初值 error = DeviceIoControl(PortTalk_Handle,IOCTL_WRITE_PORT_BUFFER_UNLONG, &BufferL,4096,NULL,0 &BytesReturned ,NULL); //将数组地址传递给驱动程序 在驱动程序的DeviceControl例程中 PULONG LongBuffer; PVOID ioBuffer; unsigned short LongBuffer2[1]; unsigned long *pLongBuffer2; ioBuffer = pIrp->AssociatedIrp.SystemBuffer; LongBuffer = (PULONG) ioBuffer; pLongBuffer2=(unsigned long *)&LongBuffer2[0]; *pLongBuffer2=0x37C; if (inBufLength >= 4096) WRITE_PORT_BUFFER_ULONG((PULONG)pLongBuffer2,LongBuffer,1024); [编辑 - 4/30/04 by amei] |
|
沙发#
发布于:2004-04-29 15:53
没看懂什么意思????
|
|
|
板凳#
发布于:2004-04-30 09:14
意思就是
在应用程序中定义个一个长度为1024,双字类型的数组,并给这个数组赋初值后,将这个数组的头地址通过DeviceIoControl传送给驱动程序。 在驱动程序的DeviceControl例程的case语句 case:IOCTL_WRITE_PORT_BUFFER_UNLONG 中执行WRITE_PORT_BUFFER_ULONG,试图将应用程序中定义的双字数组的内容通过驱动程序发送到端口。其第一个参数是指向端口的指针,第二个参数是指向 buffer的指针,第三个参数是要传输的双字的个数。 但是,在外接示波器观察输出时,什么也没有,不知道原因出在哪 [编辑 - 4/30/04 by amei] |
|
地板#
发布于:2004-04-30 10:57
PULONG LongBuffer;
PVOID ioBuffer; unsigned short LongBuffer2[1]; unsigned long *pLongBuffer2; ioBuffer = pIrp->AssociatedIrp.SystemBuffer; LongBuffer = (PULONG) ioBuffer; pLongBuffer2=(unsigned long *)&LongBuffer2[0]; *pLongBuffer2=0x37C; if (inBufLength >= 4096) WRITE_PORT_BUFFER_ULONG((PULONG)*pLongBuffer2,LongBuffer,1024); WRITE_PORT_BUFFER_ULONG proc near .text:80019FF4 .text:80019FF4 Port= dword ptr 4 .text:80019FF4 Buffer= dword ptr 8 .text:80019FF4 Count= dword ptr 0Ch .text:80019FF4 .text:80019FF4 8B C6 mov eax, esi .text:80019FF6 8B 54 24 04 mov edx, [esp+Port] .text:80019FFA 8B 74 24 08 mov esi, [esp+Buffer] .text:80019FFE 8B 4C 24 0C mov ecx, [esp+Count] .text:8001A002 F3 6F rep outsd .text:8001A004 8B F0 mov esi, eax .text:8001A006 C2 0C 00 retn 0Ch .text:8001A006 WRITE_PORT_BUFFER_ULONG endp |
|
|
地下室#
发布于:2004-05-07 22:13
请问那段汇编代码是调用WRITE_PORT_BUFFER_ULONG((PULONG)*pLongBuffer2,LongBuffer,1024)的实际过程吗?是怎么得到的
|
|
5楼#
发布于:2004-05-08 10:02
请问那段汇编代码是调用WRITE_PORT_BUFFER_ULONG((PULONG)*pLongBuffer2,LongBuffer,1024)的实际过程吗?是怎么得到的 什么意思???? |
|
|
6楼#
发布于:2004-05-08 11:17
意思是这段代码:
WRITE_PORT_BUFFER_ULONG proc near .text:80019FF4 .text:80019FF4 Port= dword ptr 4 .text:80019FF4 Buffer= dword ptr 8 .text:80019FF4 Count= dword ptr 0Ch .text:80019FF4 .text:80019FF4 8B C6 mov eax, esi .text:80019FF6 8B 54 24 04 mov edx, [esp+Port] .text:80019FFA 8B 74 24 08 mov esi, [esp+Buffer] .text:80019FFE 8B 4C 24 0C mov ecx, [esp+Count] .text:8001A002 F3 6F rep outsd .text:8001A004 8B F0 mov esi, eax .text:8001A006 C2 0C 00 retn 0Ch .text:8001A006 WRITE_PORT_BUFFER_ULONG endp 是怎么来得:是你写的,还是你通过什么软件得到的 |
|
7楼#
发布于:2004-05-08 12:13
IDAPRO反编译得来的.
|
|
|
8楼#
发布于:2004-05-08 15:29
喔,原来是这样呀!
我对32位的汇编语言不太了解,这段反编译得来的代码是不是这样理解: 在ESP中,从ESP+PORT即ESP+4地址开始依次存放的值是端口地址0x37c、0x37d、0x37e、0x37f;在ESP+BUFFER即ESP+8地址开始存放由应用程序传递来的缓冲区地址,ESP+COUNT地址中存放的值是1024。 |
|
9楼#
发布于:2004-05-08 15:57
从ESP+PORT即ESP+4地址开始依次存放的值是端口地址0x37c、0x37d、0x37e、0x37f
晕............. |
|
|
10楼#
发布于:2004-05-08 20:28
那就是放着0x37c,是一个双字
|
|