OpenEvent返回内存无法访问、共享内存无法使用

2023-11-11

 

转载请标明是引用于 http://blog.csdn.net/chenyujing1234 

欢迎大家拍砖

 一、OpenEvent返回内存无法访问

1、问题描述

在winlogon.exe调用的gina.dll里创建一个线程,在线程里创建事件:

DWORD WINAPI CXRedGinaApp::XRedMonitorProc(LPVOID pParam) 
{
	HWND  hForgroundWindow = NULL;

	LDB(L"==>XRedMonitorProc");
	// 循环等待得到事件句柄,此句柄在XLogon.dll加载时创建
	while (true)
	{
		//g_CXRedGinaApp.m_RequestEvent = ::OpenEvent(EVENT_ALL_ACCESS, FALSE, XRED_REQUEST_EVENT);
		g_CXRedGinaApp.m_RequestEvent = CreateEvent(NULL, FALSE, FALSE, XRED_REQUEST_EVENT);  
		if (NULL != g_CXRedGinaApp.m_RequestEvent && INVALID_HANDLE_VALUE != g_CXRedGinaApp.m_RequestEvent)
		{
			//g_CXRedGinaApp.m_RequestedEvent = ::OpenEvent(EVENT_ALL_ACCESS, FALSE, XRED_REQUESTED_EVENT);
			g_CXRedGinaApp.m_RequestedEvent	= CreateEvent(NULL, FALSE, FALSE, XRED_REQUESTED_EVENT);  
			if (NULL != g_CXRedGinaApp.m_RequestedEvent && INVALID_HANDLE_VALUE != g_CXRedGinaApp.m_RequestedEvent)
			{
				break;
			}
			else
			{
				CloseHandle(g_CXRedGinaApp.m_RequestEvent);
			}
		}


然后在开机会用另一应用程序去OpenEvent,结果返回“内存无法访问

 

2、解决方法

改为在winlogon.exe调用的gina.dll里创建一个线程,在线程里打开事件:

DWORD WINAPI CXRedGinaApp::XRedMonitorProc(LPVOID pParam) 
{
	HWND  hForgroundWindow = NULL;

	LDB(L"==>XRedMonitorProc");
	// 循环等待得到事件句柄,此句柄在XLogon.dll加载时创建
	while (true)
	{
		g_CXRedGinaApp.m_RequestEvent = ::OpenEvent(EVENT_ALL_ACCESS, FALSE, XRED_REQUEST_EVENT);
		//g_CXRedGinaApp.m_RequestEvent = CreateEvent(NULL, FALSE, FALSE, XRED_REQUEST_EVENT);  
		if (NULL != g_CXRedGinaApp.m_RequestEvent && INVALID_HANDLE_VALUE != g_CXRedGinaApp.m_RequestEvent)
		{
			g_CXRedGinaApp.m_RequestedEvent = ::OpenEvent(EVENT_ALL_ACCESS, FALSE, XRED_REQUESTED_EVENT);
			//g_CXRedGinaApp.m_RequestedEvent	= CreateEvent(NULL, FALSE, FALSE, XRED_REQUESTED_EVENT);  
			if (NULL != g_CXRedGinaApp.m_RequestedEvent && INVALID_HANDLE_VALUE != g_CXRedGinaApp.m_RequestedEvent)
			{
				break;
			}
			else
			{
				CloseHandle(g_CXRedGinaApp.m_RequestEvent);
			}
		}


然后在开机会用另一应用程序去CreateEvent,成功。

扩展解决方法(实现证明此方法是可行的):

在winlogon.exe调用的gina.dll里创建一个线程,在线程里创建事件时在事件名前加Global\\。

此时createEvent返回3 ,即"系统找不到指定的路径".

这是什么原因呢?查证后才知是global的第一个G要大写的,改正后试看看,成功了。

 

二、共享内存无法使用

在做win7下的登录凭证时用到应用层与CredentialProvider.dll的通信(CredentialProvider.dll被logonUI.exe调用),在两边通过文件映射传递数据。

1、问题描述

两边都映射文件成功了,可是在应用层写入数据,在CredentialProvider里却读不到数据。

// 共享数据段名称
#define  XERD_LOGON_SHARE_DATA     TEXT("XRED_LOGON_SHARE_DATA")

 

bool CShareData::Init(bool bInitData)
{
	bool bReturn = true;

	m_hFileMapping = CreateFileMapping(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE|SEC_COMMIT, 0, sizeof(XRED_SHAREDATA_T), XERD_LOGON_SHARE_DATA);
	if (NULL != m_hFileMapping)
	{
		if(NULL == (m_lpShareData = (LPXRED_SHAREDATA_T)MapViewOfFile(m_hFileMapping, FILE_MAP_ALL_ACCESS, 0, 0, 0)))
		{
			CloseHandle(m_hFileMapping); 
			m_hFileMapping = NULL;
			bReturn = false;
		}
	}
	else 
	{
		bReturn = false;
	}

	if (bInitData)
	{
		ZeroMemory(m_lpShareData, sizeof(XRED_SHAREDATA_T));
	}

	return bReturn;
}


 

2、解决方法:

在文件映射的名称前加Global\\

// 共享数据段名称
#define		XERD_LOGON_SHARE_DATA					TEXT("Global\\XRED_LOGON_SHARE_DATA")

3、原因

 通常使用CreateFileMapping建立共享内存时名称中没有加入"Global\\",这使得共享的内存只能在当前用户下被另一个或多个进程访问,例如:

  CreateFileMapping(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE | SEC_COMMIT, 0, 1024, TEXT("MyShare"));

  当把程序放到服务器上并运行,然后用远程桌面连接服务器时的用户身份作为了另一用户,这时运行访问共享内存的程序将产生错误[代码是2]。根据错误代码认为是权限问题,通常会去添加安全描述符,也就是设置CreateFileMapping的LPSECURITY_ATTRIBUTES参数,会这样做:

  SECURITY_DESCRIPTORSECURITY_DESCRIPTOR secutityDese;

  InitializeSecurityDescriptor(&secutityDese, SECURITY_DESCRIPTOR_REVISION);

  SetSecurityDescriptorDacl(&secutityDese,TRUE,NULL,FALSE);

  SECURITY_ATTRIBUTES securityAttr;

  SECURITY_ATTRIBUTESsecurityAttr.nLength = sizeof(SECURITY_ATTRIBUTES);

  securityAttr.bInheritHandle = FALSE;

  securityAttr.lpSecurityDescriptor = &secutityDese;

  CreateFileMapping(INVALID_HANDLE_VALUE, &securityAttr, PAGE_READWRITE | SEC_COMMIT, 0, 1024, TEXT("MyShare"));

  既使我们这样做发现没有任何效果,错误依旧!

 Global\\*** 可以保证:在创建命名时间对象时指定名字是全局的,使用全局名称创建的内核对象无论出于服务,还是内核中,应用层都可以打开并使用这个内核对象。

  然后改为使用全局名称,用远程桌面登陆到服务器在不同的用户下就能够运行访问共享内存的程序了!

  CreateFileMapping(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE | SEC_COMMIT, 0, 1024, TEXT("Global\\MyShare"));

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

OpenEvent返回内存无法访问、共享内存无法使用 的相关文章

随机推荐

  • JSON.stringify 语法实例讲解

    语法 JSON stringify value replacer space value 是必选字段 就是你输入的对象 比如数组 类等 replacer 这个是可选的 它又分为2种方式 一种是数组 第二种是方法 情况一 replacer为数
  • 给打包文件的加上时间或者版本号

    const Version new Date getTime output path config build assetsRoot publicPath http www baidu com 修改 https iv admin 这部分为你
  • python运行代码不显示warning输出

    两种方法可以在python运行代码的时候不显示warning输出 方法1 import warnings warnings filterwarnings ignore 方法2 python W ignore run py
  • CGAL 快速构建三维凸包

    目录 一 三维凸包 二 代码实现 三 结果展示 四 结论 一 三维凸包 和二维凸包类似 给定一堆三维空间中的点 包含它们的最小凸多面体称为这些点的凸包 二 代码实现 include
  • java求两个数的最大公约数和最小公倍数

    解题思路 1 求最大公约数用辗转相除法 将较大的那个数对较小的那个数取余 如果a gt b 那就a b 取余得出的结果为下次运算的除数 上面较小的那个数将作为被除数 直到运算到较小为0时 返回较大的数 这个数就是最大公约数 2 最小公倍数就
  • 二十九、springBoot的监控和管理

    Spring Boot包含很多其他的特性 它们可以帮你监控和管理发布到生产环境的应用 你可以选择使用HTTP端点 JMX或远程shell SSH或Telnet 来管理和监控应用 审计 Auditing 健康 health 和数据采集 met
  • Linux——UDP协议及其编程流程

    UDP协议的特点 UDP 不提供可靠性的传输 它只是把应用程序传给 IP 层的数据报发送出去 但是并不能保证它们能到达目的地 由于 UDP 在传输数据报前不用在客户和服务器之间建立一个连接 且没有超时重发等机制 故而传输速度很快 无连接 不
  • 计算机网络-传输层(TCP协议特点和TCP报文段格式,TCP连接管理)

    文章目录 1 TCP协议特点 报文段格式 2 TCP连接管理 1 TCP协议特点 报文段格式 TCP是面向连接 虚连接 的传输层协议 每一条TCP连接只能有两个端点 每一条TCP连接只能是点对点的 TCP提供可靠交付的服务 无差错 不丢失
  • C++中的vector 利用swap去除多余容量

    以下内容主要参考博客 https baijiahao baidu com s id 1610227871099894962 wfr spider for pc 摘抄博客内容 如下 在使用C 中的 vector的时候 vector的申请的内存
  • CSS 样式的 initial(默认)和 inherit(继承)以及 unset

    经常会碰到 问一个 CSS 属性 例如 position 有多少取值 通常的回答是 static relative absolute 和 fixed 当然 还有一个极少人了解的 sticky 其实 除此之外 CSS 属性通常还可以设置下面几
  • 今天开始维护个人技术博客

    快下班了才写 从零开始 不管以后技术做到哪种程度 有个记录的习惯总是好的 一起加油 April
  • 1.cJSON使用的API简介笔记

    JSON JavaScript Object Notation JS 对象简谱 是一种轻量级的数据交换格式 它基于 ECMAScript 欧洲计算机协会制定的js规范 的一个子集 采用完全独立于编程语言的文本格式来存储和表示数据 简洁和清晰
  • 使用 cli(脚手架)构建一个vue.js程序

    1 通过cli工具初始化一个以Webpack为模板 项目名称为demo view的项目 2 通过上面步骤生成了项目结构 通过cd命令进入该项目的根目录 然后使用npm install命令安装项目需要的插件 3 使用npm run dev命令
  • 最好用的 6 款 Vue 实时消息提示通知(Message/Notification)组件推荐与测评

    本文完整版 最好用的 6 款 Vue 实时消息提示通知 Message Notification 组件推荐与测评 Vue 实时消息提示通知 Vue notification 专注实时消息提示 各类样式随意修改 你想要的它都有 SweetAl
  • MySQL 数据量太大怎么提升查询性能?

    比如随着业务的发展 订单表的数据量越来越大 这个时候查询变慢了 我们可以采取什么措施来提升查询性能呢 1 存档历史数据 当单表的订单数据太多 多到影响性能的时候 首选的方案是 归档历史订单 所谓归档 其实也是一种拆分数据的策略 简单地说 就
  • JS 点击气泡卡片自身外的区域自动关闭的代码逻辑

    Vue HTML
  • 华为OD机试 - 字符串化繁为简 (c++并查集)

    include
  • 指针-初阶

    了解过了数组 我们还需要知道和数组一起使用的指针 目录 1 指针是什么 2 指针与指针类型 2 1指针 整数 2 2指针的解引用操作 3 野指针 3 1野指针的形成 3 2如何避免野指针问题 4 指针运算 4 1 指针 整 4 2指针 指针
  • 特征工程的概述

    在建立模型的时候 最终是希望模型有较好的预测能力 但是在另一方面 也希望模型不要太复杂 以至于能有较好的解释性和适用性 1 定义 定义 在机器学习或者统计学中 又称为变量选择 属性选择或者变量子集选择 是在模型构建中 选择相关特征并构成特征
  • OpenEvent返回内存无法访问、共享内存无法使用

    转载请标明是引用于 http blog csdn net chenyujing1234 欢迎大家拍砖 一 OpenEvent返回内存无法访问 1 问题描述 在winlogon exe调用的gina dll里创建一个线程 在线程里创建事件 D