mihopaul
驱动牛犊
驱动牛犊
  • 注册日期2002-10-01
  • 最后登录2009-10-14
  • 粉丝0
  • 关注0
  • 积分32分
  • 威望13点
  • 贡献值0点
  • 好评度3点
  • 原创分0分
  • 专家分0分
阅读:1316回复:16

楼主#
更多 发布于:2004-06-04 11:26
第一肺

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);


著著





最新喜欢:

flyingflying
ysr
ysr
驱动牛犊
驱动牛犊
  • 注册日期2001-05-11
  • 最后登录2015-01-29
  • 粉丝0
  • 关注0
  • 积分79分
  • 威望48点
  • 贡献值0点
  • 好评度7点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2004-06-04 12:40
从驱动角度来看前面两种类似,收到的BUFFER是个foo结构,里面的buffer指针在驱动中不一定有效,在引用之前应验证。第三种方法收到的BUFFER的内容是g_Data里面的200个字符(只是一个拷贝)。
AllenZh
驱动老牛
驱动老牛
  • 注册日期2001-08-19
  • 最后登录2015-11-27
  • 粉丝19
  • 关注10
  • 积分1316分
  • 威望2387点
  • 贡献值7点
  • 好评度321点
  • 原创分0分
  • 专家分0分
板凳#
发布于: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字节.
1,承接Windows下驱动/应用开发 2,本人原创虚拟鼠标/键盘,触摸屏,虚拟显卡,Mirror驱动,XP无盘的SCSI虚拟磁盘驱动等 3,windows下有尝技术服务(包括BUG调试,员工培训等) 欢迎深圳和海外企业联系.msn:mfczmh@sina.com
AllenZh
驱动老牛
驱动老牛
  • 注册日期2001-08-19
  • 最后登录2015-11-27
  • 粉丝19
  • 关注10
  • 积分1316分
  • 威望2387点
  • 贡献值7点
  • 好评度321点
  • 原创分0分
  • 专家分0分
地板#
发布于:2004-06-04 15:53
这个拿来作为招聘VC++开发人员的题目很合适,不只mihopaul是不是去面试了呀?哈哈
1,承接Windows下驱动/应用开发 2,本人原创虚拟鼠标/键盘,触摸屏,虚拟显卡,Mirror驱动,XP无盘的SCSI虚拟磁盘驱动等 3,windows下有尝技术服务(包括BUG调试,员工培训等) 欢迎深圳和海外企业联系.msn:mfczmh@sina.com
mihopaul
驱动牛犊
驱动牛犊
  • 注册日期2002-10-01
  • 最后登录2009-10-14
  • 粉丝0
  • 关注0
  • 积分32分
  • 威望13点
  • 贡献值0点
  • 好评度3点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2004-06-04 18:57
这个拿来作为招聘VC++开发人员的题目很合适,不只mihopaul是不是去面试了呀?哈哈



哈,不是耶

是因
mihopaul
驱动牛犊
驱动牛犊
  • 注册日期2002-10-01
  • 最后登录2009-10-14
  • 粉丝0
  • 关注0
  • 积分32分
  • 威望13点
  • 贡献值0点
  • 好评度3点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2004-06-04 19:26
我程式的目的在於
rayyang2000
管理员
管理员
  • 注册日期2001-03-23
  • 最后登录2012-09-13
  • 粉丝3
  • 关注0
  • 积分1036分
  • 威望925点
  • 贡献值3点
  • 好评度823点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2004-06-04 22:33
第一个方法
afoo在栈中分配,
afoo的buffer成员在堆中分配。
DeviceIoControl只传递了8字节(32位OS,以下同)
在驱动中afoo.buffer不可用

第二个方法
aFoo在堆中分配,
aFoo的buffer成员无意义,因为你并没有指定。
DeviceIoControl传递了fooLen字节

第三个方法
如果g_Data是全局的,则g_Data在数据段中(却省条件下),
buffer是对g_Data的引用,与foo 结构无关。
DeviceIoControl传递了dataLen字节.
 

afoo.buffer并不是不可用,而是要在driver中先lock后,再用。

所以,1、2、3皆可。

但如果要传大量的数据,还是用1好,速度快。若用2、3,而又要速度快,就应该用direct方式。
天天coding-debugging中----超稀饭memory dump file ======================================================== [b]Windows Device Driver Development and Consulting Service[/b] [color=blue][url]http://www.ybwork.com[/url][/color] ========================================================
mihopaul
驱动牛犊
驱动牛犊
  • 注册日期2002-10-01
  • 最后登录2009-10-14
  • 粉丝0
  • 关注0
  • 积分32分
  • 威望13点
  • 贡献值0点
  • 好评度3点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2004-06-05 02:35
.
 [/quote]
afoo.buffer并不是不可用,而是要在driver中先lock后,再用。

AllenZh
驱动老牛
驱动老牛
  • 注册日期2001-08-19
  • 最后登录2015-11-27
  • 粉丝19
  • 关注10
  • 积分1316分
  • 威望2387点
  • 贡献值7点
  • 好评度321点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2004-06-05 15:10
[quote
afoo.buffer并不是不可用,而是要在driver中先lock后,再用。

所以,1、2、3皆可。

但如果要传大量的数据,还是用1好,速度快。若用2、3,而又要速度快,就应该用direct方式。 [/quote]
lock后并且同步使用当然没有问题
如何一个地址空间(ring0或ring3)都可读写,包括代码段,只是你需要处理一下而已(当然写代码段写的不好会使系统崩溃)
1,承接Windows下驱动/应用开发 2,本人原创虚拟鼠标/键盘,触摸屏,虚拟显卡,Mirror驱动,XP无盘的SCSI虚拟磁盘驱动等 3,windows下有尝技术服务(包括BUG调试,员工培训等) 欢迎深圳和海外企业联系.msn:mfczmh@sina.com
mihopaul
驱动牛犊
驱动牛犊
  • 注册日期2002-10-01
  • 最后登录2009-10-14
  • 粉丝0
  • 关注0
  • 积分32分
  • 威望13点
  • 贡献值0点
  • 好评度3点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2004-06-07 09:49

lock后并且同步使用当然没有问题
如何一个地址空间(ring0或ring3)都可读写,包括代码段,只是你需要处理一下而已(当然写代码段写的不好会使系统崩溃)

wwjmaomao
驱动牛犊
驱动牛犊
  • 注册日期2003-07-07
  • 最后登录2004-06-07
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2004-06-07 10:09
[quote]
此外 栈中分配和堆中分配,呃原文意柳是指??


等解
mihopaul
驱动牛犊
驱动牛犊
  • 注册日期2002-10-01
  • 最后登录2009-10-14
  • 粉丝0
  • 关注0
  • 积分32分
  • 威望13点
  • 贡献值0点
  • 好评度3点
  • 原创分0分
  • 专家分0分
11楼#
发布于:2004-06-07 18:49
栈--STACK ,堆---HEAP

台海局势现在如何了? :D

================================================
著著你的答覆

台海??  
AllenZh
驱动老牛
驱动老牛
  • 注册日期2001-08-19
  • 最后登录2015-11-27
  • 粉丝19
  • 关注10
  • 积分1316分
  • 威望2387点
  • 贡献值7点
  • 好评度321点
  • 原创分0分
  • 专家分0分
12楼#
发布于:2004-06-08 00:54
使用MmMapLockedPages等函数
1,承接Windows下驱动/应用开发 2,本人原创虚拟鼠标/键盘,触摸屏,虚拟显卡,Mirror驱动,XP无盘的SCSI虚拟磁盘驱动等 3,windows下有尝技术服务(包括BUG调试,员工培训等) 欢迎深圳和海外企业联系.msn:mfczmh@sina.com
mihopaul
驱动牛犊
驱动牛犊
  • 注册日期2002-10-01
  • 最后登录2009-10-14
  • 粉丝0
  • 关注0
  • 积分32分
  • 威望13点
  • 贡献值0点
  • 好评度3点
  • 原创分0分
  • 专家分0分
13楼#
发布于:2004-06-08 11:55
使用MmMapLockedPages等函数


arthurtu
驱动巨牛
驱动巨牛
  • 注册日期2001-11-08
  • 最后登录2020-12-19
  • 粉丝0
  • 关注0
  • 积分26分
  • 威望161点
  • 贡献值0点
  • 好评度35点
  • 原创分0分
  • 专家分0分
  • 社区居民
14楼#
发布于:2004-06-08 20:58
是指lock住afoo.buffer指向的一段长afoo.dataLen的内存,因为是ring3的地址,不lock基本不可用
mihopaul
驱动牛犊
驱动牛犊
  • 注册日期2002-10-01
  • 最后登录2009-10-14
  • 粉丝0
  • 关注0
  • 积分32分
  • 威望13点
  • 贡献值0点
  • 好评度3点
  • 原创分0分
  • 专家分0分
15楼#
发布于:2004-06-09 10:30
是指lock住afoo.buffer指向的一段长afoo.dataLen的内存,因为是ring3的地址,不lock基本不可用


AllenZh
驱动老牛
驱动老牛
  • 注册日期2001-08-19
  • 最后登录2015-11-27
  • 粉丝19
  • 关注10
  • 积分1316分
  • 威望2387点
  • 贡献值7点
  • 好评度321点
  • 原创分0分
  • 专家分0分
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,否则,嘿嘿蓝屏可能发生

1,承接Windows下驱动/应用开发 2,本人原创虚拟鼠标/键盘,触摸屏,虚拟显卡,Mirror驱动,XP无盘的SCSI虚拟磁盘驱动等 3,windows下有尝技术服务(包括BUG调试,员工培训等) 欢迎深圳和海外企业联系.msn:mfczmh@sina.com
游客

返回顶部