阅读:1315回复:16
第一肺
struct foo { ULONG dataLen; PVOID buffer; }; afoo.buffer = malloc(200); afoo.dataLen =200 BOOL result = DeviceIoControl(handle, IOCTL_FOO, &afoo, sizeof(afoo), NULL,0, NULL); 第二肺 struct foo { ULONG dataLen; UCHAR buffer[1]; }; ULONG fooLen = sizeof(foo) + 200 -1; foo *aFoo= (foo * )malloc(fooLen ); aFoo->dataLen = 200; BOOL result = DeviceIoControl(handle, IOCTL_FOO, afoo, fooLen, NULL,0, NULL); 第三肺 UCHAR g_Data[200]; ULONG dataLen = 200; PUCHAR buffer= g_Data; result = DeviceIoControl(handle, IOCTL_FOO, buffer, dataLen, NULL,0, NULL); 著著 |
|
最新喜欢:![]() |
沙发#
发布于:2004-06-04 12:40
从驱动角度来看前面两种类似,收到的BUFFER是个foo结构,里面的buffer指针在驱动中不一定有效,在引用之前应验证。第三种方法收到的BUFFER的内容是g_Data里面的200个字符(只是一个拷贝)。
|
|
板凳#
发布于:2004-06-04 15:50
第一个方法
afoo在栈中分配, afoo的buffer成员在堆中分配。 DeviceIoControl只传递了8字节(32位OS,以下同) 在驱动中afoo.buffer不可用 第二个方法 aFoo在堆中分配, aFoo的buffer成员无意义,因为你并没有指定。 DeviceIoControl传递了fooLen字节 第三个方法 如果g_Data是全局的,则g_Data在数据段中(却省条件下), buffer是对g_Data的引用,与foo 结构无关。 DeviceIoControl传递了dataLen字节. |
|
|
地板#
发布于:2004-06-04 15:53
这个拿来作为招聘VC++开发人员的题目很合适,不只mihopaul是不是去面试了呀?哈哈
|
|
|
地下室#
发布于:2004-06-04 18:57
这个拿来作为招聘VC++开发人员的题目很合适,不只mihopaul是不是去面试了呀?哈哈 哈,不是耶 是因 |
|
5楼#
发布于:2004-06-04 19:26
我程式的目的在於
|
|
6楼#
发布于:2004-06-04 22:33
第一个方法 afoo.buffer并不是不可用,而是要在driver中先lock后,再用。 所以,1、2、3皆可。 但如果要传大量的数据,还是用1好,速度快。若用2、3,而又要速度快,就应该用direct方式。 |
|
|
7楼#
发布于:2004-06-05 02:35
.
[/quote] afoo.buffer并不是不可用,而是要在driver中先lock后,再用。 |
|
8楼#
发布于:2004-06-05 15:10
[quote
afoo.buffer并不是不可用,而是要在driver中先lock后,再用。 所以,1、2、3皆可。 但如果要传大量的数据,还是用1好,速度快。若用2、3,而又要速度快,就应该用direct方式。 [/quote] lock后并且同步使用当然没有问题 如何一个地址空间(ring0或ring3)都可读写,包括代码段,只是你需要处理一下而已(当然写代码段写的不好会使系统崩溃) |
|
|
9楼#
发布于:2004-06-07 09:49
lock后并且同步使用当然没有问题 如何一个地址空间(ring0或ring3)都可读写,包括代码段,只是你需要处理一下而已(当然写代码段写的不好会使系统崩溃) 那 |
|
10楼#
发布于:2004-06-07 10:09
[quote]
此外 栈中分配和堆中分配,呃原文意柳是指?? 等解 |
|
11楼#
发布于:2004-06-07 18:49
栈--STACK ,堆---HEAP
台海局势现在如何了? :D ================================================ 著著你的答覆 台海?? |
|
12楼#
发布于:2004-06-08 00:54
使用MmMapLockedPages等函数
|
|
|
13楼#
发布于:2004-06-08 11:55
使用MmMapLockedPages等函数 |
|
14楼#
发布于:2004-06-08 20:58
是指lock住afoo.buffer指向的一段长afoo.dataLen的内存,因为是ring3的地址,不lock基本不可用
|
|
15楼#
发布于:2004-06-09 10:30
是指lock住afoo.buffer指向的一段长afoo.dataLen的内存,因为是ring3的地址,不lock基本不可用 |
|
16楼#
发布于:2004-06-09 16:53
是这样:
PVOID p ; PMDL pMdl = IoAllocateMdl(afoo.buffer, afoo.dataLen, FALSE, FALSE, NULL); MmBuildMdlForNonPagedPool(pMdl ); p = MmMapLockedPages(pMdl ,KernelMode); RtlCopyMemory( p , (PULONG )pLDI->Buffers[afoo->Channel].Virtual,afoo.dataLen*sizeof(ULONG)); 需要使用MmMapLockedPages返回的指针,不能使用afoo.buffer,否则,嘿嘿蓝屏可能发生 |
|
|