windows – 为什么调用ProcessGroupPolicyEx回调会导致访问冲突
我正在尝试帮助一位同事在客户端扩展中使用一些代码.由于添加了对回调的调用,该函数似乎完成正常,但
Windows事件日志中的事件在处理组策略对象时会抱怨访问冲突.
删除现有代码后,只需添加对回调的调用,它仍会报告此访问冲突. 你能帮忙找出我们可能缺少的东西吗? // // Entry point for processing group policy objects. // // For full details,see http://msdn.microsoft.com/en- us/library/windows/desktop/aa374383(v=vs.85).aspx. // extern "C" DWORD CALLBACK ProcessGroupPolicyEx ( __in DWORD dwFlags,__in HANDLE hToken,__in HKEY hKeyRoot,__in PGROUP_POLICY_OBJECT pDeletedGPOList,__in PGROUP_POLICY_OBJECT pChangedGPOList,__in ASYNCCOMPLETIONHANDLE pHandle,__in BOOL *pbAbort,__in PFNSTATUSMESSAGECALLBACK pStatusCallback,__in IWbemServices *pWbemServices,__out HRESULT *pRsopStatus) { if(pStatusCallback) pStatusCallback (FALSE,L"Aaaaargh!"); return (0); } 这个代码已经尝试使用静态字符串,堆栈上的字节数组,一个新的并且故意泄漏的字节数组 – 以防该方法取得内存的所有权.也是CoTaskMemAlloc’d,以防万一.都产生了同样的问题. 事件日志中的(编辑)错误是: Windows无法处理组策略客户端扩展异常0xc0000005. 为了让事情变得有趣,这只是在一些操作系统上,完全修补的XP 32bit是一个明确的问题. 2008R2工作正常. 是的 – 我们需要它在XP 32bit上运行. 可能与此有关的其他奇怪行为: 解决方法
看起来我们已经发现了这个问题.
问题是需要使用__stdcall调用约定来进行回调. 根本问题是UserEnv.h定义了这样的回调: typedef DWORD (*PFNSTATUSMESSAGECALLBACK)(__in BOOL bVerbose,__in LPWSTR lpMessage); 这是一个奇怪的定义.所有其他Windows回调定义如下: typedef INT_PTR (CALLBACK* DLGPROC)(HWND,UINT,WPARAM,LPARAM); CALLBACK很重要,它扩展如下: #define CALLBACK __stdcall 这意味着默认情况下,由于某种原因,所有窗口回调都被定义为使用__stdcall调用约定,除此之外. 如果我们创建自己的回调定义: typedef DWORD (CALLBACK *PFNSTATUSMESSAGECALLBACK_STDCALL)(__in BOOL bVerbose,__in LPWSTR lpMessage); 并将我们的函数指针指向它: PFNSTATUSMESSAGECALLBACK_STDCALL pStatusCallback = (PFNSTATUSMESSAGECALLBACK_STDCALL)pRawStatusCallback; 然后我们可以将pStatusCallback函数指针与__stdcall调用约定一起使用,并使事情正常工作. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- 【windows】windows server 系统管理的快捷命令
- 由于iSCSI连接导致Windows重新启动时间过长
- msbuild调用Windows 7下的powershell脚本获取签名错误
- windows – 如何从内置PC扬声器启动系统“嘟嘟”,使用批处理
- 如何在Windows上获取磁盘标识符?
- windows – inno setup需要有关开始菜单下图标组的帮助
- Windows Vista是否具有应用级别的远程处理或者我是否产生幻
- 使用Rundll32.exe执行DLL导出的函数
- windows-server-2008 – winlogon / LogonUI定期尖峰CPU使用
- 在Windows更新10月2日之后,azure角色不会启动