阅读:1778回复:10
mirror问题
我在ddk的mirror例子中,加了一个DrvEscape函数,但我一在这个函数中用ExAllocatePoolWithTag或ExAllocatePool分配了一片内存,无论多大,整个驱动就起不来了。但我去掉这些分配内存空间代码就起来了
:( |
|
沙发#
发布于:2005-01-27 16:58
为什么在这里分呀,
你分内存来干什么? 可能是别的问题,可能是你代码有问题 |
|
|
板凳#
发布于: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] |
|
地板#
发布于:2005-01-27 17:59
建议在DrvEnablePDEV内分配内存
|
|
|
地下室#
发布于:2005-01-28 11:47
好像还是不行,是不是什么地方
没实现,不好意思,本人刚入这一行 |
|
5楼#
发布于:2005-01-28 17:04
奇怪你能编译通过吗???
MIRROR属于GDI DRIVER只能连接WIN32K,SYS里的函数不能直接使用NTOSKRNL的函数,你需要象VNCHELP.DLL那样自己通过一个核心DLL来执行该功能,把结果传到MIRROR中..... |
|
|
6楼#
发布于:2005-01-28 21:04
Mirror不能用全局变量吧。 |
|
|
7楼#
发布于:2005-01-28 21:25
奇怪你能编译通过吗??? 编译是能通过的,但就是死机, 原因是不能直接调用那些WIN32K,SYS以外的函数, 建议单独写个dll实现上述功能, 然后用EngLoadImage,EngFindImageProcAddress进行隐式调用 |
|
|
8楼#
发布于:2005-01-31 11:47
我在ddk的mirror例子中,加了一个DrvEscape函数,但我一在这个函数中用ExAllocatePoolWithTag或ExAllocatePool分配了一片内存,无论多大,整个驱动就起不来了。但我去掉这些分配内存空间代码就起来了 显卡有专门的分配内存的函数,你为什么要调用ntoskernl中的函数? |
|
|
9楼#
发布于:2005-01-31 14:40
问题已解决,在此要特别感谢snowStart和wowocock,不仅指出错误,还指出了解决方法
|
|
10楼#
发布于:2005-01-31 18:14
哈哈,恭喜
|
|
|