petz
禁止发言
禁止发言
  • 注册日期2001-03-23
  • 最后登录2015-12-19
  • 粉丝0
  • 关注0
  • 积分-22276分
  • 威望15点
  • 贡献值0点
  • 好评度4点
  • 原创分0分
  • 专家分0分
阅读:4756回复:6

如何在内核态与用户态之间共享内存?

楼主#
更多 发布于:2001-05-21 10:13
用户被禁言,该主题自动屏蔽!

最新喜欢:

juventusjuvent... cyliucyliu
petz
禁止发言
禁止发言
  • 注册日期2001-03-23
  • 最后登录2015-12-19
  • 粉丝0
  • 关注0
  • 积分-22276分
  • 威望15点
  • 贡献值0点
  • 好评度4点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2001-05-21 10:44
用户被禁言,该主题自动屏蔽!
petz
禁止发言
禁止发言
  • 注册日期2001-03-23
  • 最后登录2015-12-19
  • 粉丝0
  • 关注0
  • 积分-22276分
  • 威望15点
  • 贡献值0点
  • 好评度4点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2001-05-22 16:32
用户被禁言,该主题自动屏蔽!
softice
驱动牛犊
驱动牛犊
  • 注册日期2001-05-09
  • 最后登录2009-07-30
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2001-06-01 09:46
SysBuffer = ExAllocatePoolWithTag (NonPagedPool,MAXMODNUM*sizeof(*SysBuffer),0x206B6444);
if(!SysBuffer)
KdPrint( ("HookTdi: Allocate SysBuffer fail!\n") );
else
{
//Map into Userspace
pMDL = ExAllocatePoolWithTag(NonPagedPool,
MmSizeOfMdl(SysBuffer,MAXMODNUM*sizeof(*SysBuffer)),
0x206B6444);
if(!pMDL)
           KdPrint( ("HookTdi: No enough Mem for MDL!\n") );
           else
{
pMDL = MmCreateMdl (pMDL,SysBuffer,MAXMODNUM*sizeof(*SysBuffer));
            MmBuildMdlForNonPagedPool(pMDL);
            UserBuffer = MmMapLockedPages(pMDL,1);
}
   
}
地方太窄了,贴不下代码!各位凑活看吧。将SysBuffer映射到用户空间(SysBuffer&UserBuffer系指向同一物理页面,但访问权限不同),前者在2G以上且仅对系统可见,后者则对用户可读写。
zgc
zgc
驱动牛犊
驱动牛犊
  • 注册日期2001-05-23
  • 最后登录
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2001-08-02 13:02
请教楼上大虾,用户态程序通过什么函数得到UserBuffer地址。
dazzy
驱动中牛
驱动中牛
  • 注册日期2001-03-23
  • 最后登录2008-08-12
  • 粉丝1
  • 关注0
  • 积分0分
  • 威望10点
  • 贡献值1点
  • 好评度10点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2001-08-02 15:51
用DeviceIoControl():
在app里:
unsigned char *Buffer;
HANDLE hDevice;
hDevice = CreateFile("\\\\.\\mapmem",
GENERIC_READ | GENERIC_WRITE,
FILE_SHARE_READ | FILE_SHARE_WRITE, NULL,
OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);

if (hDevice == INVALID_HANDLE_VALUE)
{
printf("Error opening wdj Driver (%d)\n", GetLastError());
return;
}
//取得userbuffer
if (!DeviceIoControl(driver, (DWORD)IOCTL_MEM_MAP,
     NULL, 0, (LPBYTE)&Buffer,sizeof(PVOID),
     &size, NULL))
{
  printf("IOCTL_MEM_MAP, Error %d\n", GetLastError());
  return;
}
............

在sys:
ioBuffer  = Irp->AssociatedIrp.SystemBuffer;
......
case IOCTL_MEM_MAP:
deviceExt->SysAddress = ExAllocatePool(NonPagedPool,1024);

phyaddr = MmGetPhysicalAddress(deviceExt->SysAddress);
deviceExt->Mdl = IoAllocateMdl(deviceExt->SysAddress,
                  1024,
                  FALSE, FALSE, NULL);
if (deviceExt->Mdl == NULL) {
   ExRaiseStatus(STATUS_INSUFFICIENT_RESOURCES);
}
MmBuildMdlForNonPagedPool(deviceExt->Mdl);
VirtualAddress = MmMapLockedPages(deviceExt->Mdl,UserMode);
*(PVOID*)ioBuffer = VirtualAddress;
deviceExt->VirtualAddress = VirtualAddress;
Irp->IoStatus.Information = sizeof(PVOID);

释放资源:
MmUnmapLockedPages(deviceExt->VirtualAddress,deviceExt->Mdl);
IoFreeMdl(deviceExt->Mdl);
ExFreePool(deviceExt->SysAddress);
deviceExt->Mdl = NULL;
cb615cb
驱动牛犊
驱动牛犊
  • 注册日期2002-08-18
  • 最后登录2005-01-25
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2003-09-21 16:28
dazzy:
DS下可以这样用吗?DS下怎么样用?我在WDM,DS下怎么也不能实现共享。
 
 
游客

返回顶部