(经过试验)我的驱动和程序共享内存代码

来源:互联网 发布:哈萨克歌软件 编辑:程序博客网 时间:2024/06/05 02:29

网上例子很多,最开始始终找不到为撒共享不起的原因,先总结如下。

// NOTE: 如果控制界面还未启动而此时映射到用户空间

//       等到控制界面启动时再来获取该映射地址则会出错
//       因为该映射地址所在的进程环境不是控制界面的进程环境

//       因此该映射地址对控制界面来说不可用

驱动关键代码:

PMDL Mdl;
PVOID UserVAToReturn;//返回的用户地址
PVOID pSMToResturn;//返回的共享内存地址(内核层)
PHYSICAL_ADDRESSLowAddress; //指示物理地址范围的最小值
PHYSICAL_ADDRESSHighAddress; //指示物理地址范围的最大值
NTSTATUS status;
DEVICE_EXTENSION*device_extension;


device_extension = (DEVICE_EXTENSION *)pDeviceObject->DeviceExtension;
//分配内存
if (device_extension->pShareMemory == NULL){
pSMToResturn = ExAllocatePool(NonPagedPool, TotalBytes);
if (!pSMToResturn)
{
KdPrint(("Allocate the memory failed!\n"));
status = STATUS_INSUFFICIENT_RESOURCES;
goto quit_flag;
}




//将内存组织为MDL传递给用户层使用
Mdl = IoAllocateMdl(pSMToResturn, 
TotalBytes,
FALSE,
FALSE,
NULL);
if (!Mdl)
{
status = STATUS_INSUFFICIENT_RESOURCES;
KdPrint(("Allocate MDL failed\n"));
goto quit_flag;
}


//将MDL描述的物理页面集合映射到系统地址空间
MmBuildMdlForNonPagedPool(Mdl);
}
else{
Mdl = device_extension->pMdl;
pSMToResturn = device_extension->pShareMemory;
}


//映射物理页到虚拟内存地址(用户态)可以被使用
UserVAToReturn = MmMapLockedPagesSpecifyCache(Mdl,
UserMode,
MmCached,
NULL,
FALSE,
NormalPagePriority);


if (!UserVAToReturn)
{
KdPrint(("Map MDL address failed!\n"));
IoFreeMdl(Mdl); 
Mdl = NULL;
ExFreePool(pSMToResturn);
pSMToResturn = NULL;
status = STATUS_INSUFFICIENT_RESOURCES;
goto quit_flag;
}
//返回得到的MDL和用户层虚拟地址
*pShareMemory = pSMToResturn;
*pUserAddress = UserVAToReturn;
*PMemMdl = Mdl;

status = STATUS_SUCCESS;
quit_flag:
return status;



程序关键代码:

//获取驱动的共享内存
if (!DeviceIoControl(
Device,
IOCTL_FILE_DISK_GET_SHARE_MEMORY,
NULL,
0,
&userVA,
sizeof(ULONG_PTR),
&retBytes,
NULL
))
{
sprintf_s(log_msg, sizeof(log_msg), "Get the share memory failed [%d]", GetLastError());
cout<<log_msg<<endl;
cout<<"read:"<<retBytes<<endl;
return -1;
}

pShareMemory = (SHARE_MEMORY *)userVA;

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 亲人欠网贷还不上现在病重怎么办 亲人欠网贷现在病重怎么办 小孩子大嘴巴病怎么办 小孩子有心胀病怎么办 小孩子有胃痛病怎么办 大修基金用完了怎么办 基金买错了怎么办 基金公司倒闭了怎么办 桔子分期有风险怎么办 想买vivox21没钱怎么办 中介收钱不办事怎么办 手机应用程序几个运行怎么办 网上彩票是骗局怎么办 辞职后不想辞职怎么办 口头辞职后悔了怎么办 纸质承兑丢了怎么办 天天利财倒闭怎么办 网络理财平台诈骗怎么办 银行理财产品到期后怎么办 30岁没工作怎么办 理财投资被骗了怎么办 支付宝不想收钱怎么办 信融财富逾期怎么办 拼多多砍价上限怎么办 肺功能只有50%怎么办 办小商店营业执照怎么办 悉尼退税未到账怎么办 筋斗云钱包余额怎么办 在监狱得了癌症怎么办 国外客户不付款怎么办 日上免税店超额怎么办 淘宝评价被删怎么办 个人集资不还怎么办 淘宝达人扣54分怎么办? 微信声音关不掉怎么办 微信头像换不掉怎么办 快件到了不签收怎么办 收货地址改不了怎么办 牛排解冻出血水怎么办 有混合型眼袋怎么办 眼睛疼眼袋肿怎么办