andrei_tqf
驱动牛犊
驱动牛犊
  • 注册日期2004-11-04
  • 最后登录2007-03-15
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1778回复:10

mirror问题

楼主#
更多 发布于:2005-01-27 15:48
我在ddk的mirror例子中,加了一个DrvEscape函数,但我一在这个函数中用ExAllocatePoolWithTag或ExAllocatePool分配了一片内存,无论多大,整个驱动就起不来了。但我去掉这些分配内存空间代码就起来了
:(
snowStart
驱动老牛
驱动老牛
  • 注册日期2004-04-06
  • 最后登录2011-06-02
  • 粉丝0
  • 关注0
  • 积分95分
  • 威望19点
  • 贡献值177点
  • 好评度1点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2005-01-27 16:58
为什么在这里分呀,
你分内存来干什么?

可能是别的问题,可能是你代码有问题
学习,关注,交流中... [email=fengyu@163.com]Email:snowstarth@163.com[/email] [url]http://bbs.zndev.com/?a=snowStart[/url]
andrei_tqf
驱动牛犊
驱动牛犊
  • 注册日期2004-11-04
  • 最后登录2007-03-15
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2005-01-27 17:34
ULONG APIENTRY DrvEscape(
  IN SURFOBJ  *pso,
  IN ULONG  iEsc,
  IN ULONG  cjIn,
  IN PVOID  pvIn,
  IN ULONG  cjOut,
  OUT PVOID  pvOut
  )
{
//PGETCHANGESBUF pBuf = (PGETCHANGESBUF)pvOut;
DISPDBG((0,"DrvEscape\n"));

switch(iEsc){
case MAP1:
{
/* GETCHANGESBUF ch_buf;
PWSTR pwsDllName = L"vnchelp.dll";
HANDLE hIns = EngLoadImage(pwsDllName);
PCREATEMEM pF = (PCREATEMEM)EngFindImageProcAddress(hIns,"CreateMem");
pF(ch_buf.UserMDL,ch_buf.Userbuffer,&ch_buf);

*/
SIZE_T size,pages;
DISPDBG((0,"MAP1\n"));

size = sizeof(CHANGES_BUF);
pages = size/PAGE_SIZE+1;
globe_buf.buffer = (PCHANGES_BUF)ExAllocatePoolWithTag(NonPagedPool,pages*PAGE_SIZE,'MpaM');
if(!globe_buf.buffer) {
DISPDBG((0,"ExAlloc Fail!\n"));
return FALSE;
}

globe_buf.UserMDL = IoAllocateMdl((PVOID)globe_buf.buffer,pages*PAGE_SIZE,FALSE,FALSE,NULL);
if(!globe_buf.UserMDL){
DISPDBG((0,"IoAllocMdl Fail!\n"));
ExFreePool(globe_buf.buffer);
return FALSE;
}
MmBuildMdlForNonPagedPool(globe_buf.UserMDL);
globe_buf.Userbuffer = MmMapLockedPagesSpecifyCache((PVOID)globe_buf.UserMDL,UserMode,MmCached,NULL,FALSE,NormalPagePriority);
if(globe_buf.Userbuffer==NULL){
DISPDBG((0,"MmMap Fail!\n"));
IoFreeMdl(globe_buf.UserMDL);
ExFreePool(globe_buf.buffer);
return FALSE;
}
*/
//pBuf->Userbuffer = globe_buf.Userbuffer;
}
break;
case UNMAP1:
{
DISPDBG((0,"UNMAP1\n"));
MmUnmapLockedPages(globe_buf.Userbuffer,globe_buf.UserMDL);
IoFreeMdl(globe_buf.UserMDL);
ExFreePool(globe_buf.buffer);
}
break;
case TESTMAPPED:
//pBuf->buffer = (PCHANGES_BUF)globe_buf.Userbuffer;
break;
default:
DISPDBG((0,"default\n"));
break;
}
DISPDBG((0,"DrvEscape success\n"));
return TRUE;
}
globe_buf是一个全局变量,这是我的代码,主要试一下,可不可以再这分,为了以后App t通过EngEscape可以得到驱动分的内存


[编辑 -  1/27/05 by  andrei_tqf]
snowStart
驱动老牛
驱动老牛
  • 注册日期2004-04-06
  • 最后登录2011-06-02
  • 粉丝0
  • 关注0
  • 积分95分
  • 威望19点
  • 贡献值177点
  • 好评度1点
  • 原创分0分
  • 专家分0分
地板#
发布于:2005-01-27 17:59
建议在DrvEnablePDEV内分配内存
学习,关注,交流中... [email=fengyu@163.com]Email:snowstarth@163.com[/email] [url]http://bbs.zndev.com/?a=snowStart[/url]
andrei_tqf
驱动牛犊
驱动牛犊
  • 注册日期2004-11-04
  • 最后登录2007-03-15
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2005-01-28 11:47
好像还是不行,是不是什么地方
没实现,不好意思,本人刚入这一行
wowocock
VIP专家组
VIP专家组
  • 注册日期2002-04-08
  • 最后登录2016-01-09
  • 粉丝16
  • 关注2
  • 积分601分
  • 威望1651点
  • 贡献值1点
  • 好评度1227点
  • 原创分1分
  • 专家分0分
5楼#
发布于:2005-01-28 17:04
奇怪你能编译通过吗???
MIRROR属于GDI DRIVER只能连接WIN32K,SYS里的函数不能直接使用NTOSKRNL的函数,你需要象VNCHELP.DLL那样自己通过一个核心DLL来执行该功能,把结果传到MIRROR中.....
花开了,然后又会凋零,星星是璀璨的,可那光芒也会消失。在这样 一瞬间,人降生了,笑者,哭着,战斗,伤害,喜悦,悲伤憎恶,爱。一切都只是刹那间的邂逅,而最后都要归入死亡的永眠
shenming365
驱动牛犊
驱动牛犊
  • 注册日期2004-04-08
  • 最后登录2008-06-27
  • 粉丝0
  • 关注0
  • 积分157分
  • 威望18点
  • 贡献值0点
  • 好评度13点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2005-01-28 21:04

Mirror不能用全局变量吧。
www.software168.com
snowStart
驱动老牛
驱动老牛
  • 注册日期2004-04-06
  • 最后登录2011-06-02
  • 粉丝0
  • 关注0
  • 积分95分
  • 威望19点
  • 贡献值177点
  • 好评度1点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2005-01-28 21:25
奇怪你能编译通过吗???
MIRROR属于GDI DRIVER只能连接WIN32K,SYS里的函数不能直接使用NTOSKRNL的函数,你需要象VNCHELP.DLL那样自己通过一个核心DLL来执行该功能,把结果传到MIRROR中.....



编译是能通过的,但就是死机,

原因是不能直接调用那些WIN32K,SYS以外的函数,

建议单独写个dll实现上述功能,
然后用EngLoadImage,EngFindImageProcAddress进行隐式调用
学习,关注,交流中... [email=fengyu@163.com]Email:snowstarth@163.com[/email] [url]http://bbs.zndev.com/?a=snowStart[/url]
AllenZh
驱动老牛
驱动老牛
  • 注册日期2001-08-19
  • 最后登录2015-11-27
  • 粉丝19
  • 关注10
  • 积分1316分
  • 威望2387点
  • 贡献值7点
  • 好评度321点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2005-01-31 11:47
我在ddk的mirror例子中,加了一个DrvEscape函数,但我一在这个函数中用ExAllocatePoolWithTag或ExAllocatePool分配了一片内存,无论多大,整个驱动就起不来了。但我去掉这些分配内存空间代码就起来了
:(
 

显卡有专门的分配内存的函数,你为什么要调用ntoskernl中的函数?
1,承接Windows下驱动/应用开发 2,本人原创虚拟鼠标/键盘,触摸屏,虚拟显卡,Mirror驱动,XP无盘的SCSI虚拟磁盘驱动等 3,windows下有尝技术服务(包括BUG调试,员工培训等) 欢迎深圳和海外企业联系.msn:mfczmh@sina.com
andrei_tqf
驱动牛犊
驱动牛犊
  • 注册日期2004-11-04
  • 最后登录2007-03-15
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2005-01-31 14:40
问题已解决,在此要特别感谢snowStart和wowocock,不仅指出错误,还指出了解决方法
snowStart
驱动老牛
驱动老牛
  • 注册日期2004-04-06
  • 最后登录2011-06-02
  • 粉丝0
  • 关注0
  • 积分95分
  • 威望19点
  • 贡献值177点
  • 好评度1点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2005-01-31 18:14
哈哈,恭喜
学习,关注,交流中... [email=fengyu@163.com]Email:snowstarth@163.com[/email] [url]http://bbs.zndev.com/?a=snowStart[/url]
游客

返回顶部