Windows Vista IE 7保护模式开发者生存指南
2008-08-22 17:24:11 来源:WEB开发网如果因为某些原因IESaveFile()的调用未完成,例如在写临时文件时发生错误,那就必须清理HANDLE及IEShowSaveFileDialog()中分配的临时空间,这由IECancelSaveFile()来完成。
if ( SUCCEEDED(hr) )
{
// 如果写文件成功,IE就会把数据保存在用户选择的路径中
hr = IESaveFile ( hState, T2CW(szTempFile) );
// 清理临时文件
DeleteFile ( szTempFile );
}
else
{
// 未完成保存操作,那就只有取消它了
IECancelSaveFile ( hState );
}
在插件与其他程序间通讯
前面介绍的内容都是与文件系统及注册表相关的,其限制IE调用某些API对系统造成损害,下面涉及到一些更复杂的内容,与其他运行在更高完整性级别中程序的进程间通讯(IPC),这又分为两种类型:内核对象及窗口消息。
一、创建IPC对象
插件与单独进程的进程间通讯,涉及到NT安全API及强制完整性级别检查,默认状态下,会阻止插件到单独进程的通讯,因为外部程序运行在比IE更高的完整性级别中。
如果外部程序要创建一个插件可使用的内核对象(如event或mutex),那就必须降低这个对象的完整性级别,以便插件可以访问它。外部程序可使用安全API,通过修改对象的ACL来降低其完整性级别,下面的代码来自MSDN,接受一个内核对象的HANDLE作为参数,并设置其完整性级别为低:
// LABEL_SECURITY_INFORMATION SDDL SACL被设为低完整性级别
LPCWSTR LOW_INTEGRITY_SDDL_SACL_W = L"S:(ML;;NW;;;LW)";
bool SetObjectToLowIntegrity(
HANDLE hObject, SE_OBJECT_TYPE type = SE_KERNEL_OBJECT)
{
bool bRet = false;
DWORD dwErr = ERROR_SUCCESS;
PSECURITY_DESCRIPTOR pSD = NULL;
PACL pSacl = NULL;
BOOL fSaclPresent = FALSE;
BOOL fSaclDefaulted = FALSE;
if ( ConvertStringSecurityDescriptorToSecurityDescriptorW (
LOW_INTEGRITY_SDDL_SACL_W, SDDL_REVISION_1, &pSD, NULL ) )
{
if ( GetSecurityDescriptorSacl (
pSD, &fSaclPresent, &pSacl, &fSaclDefaulted ) )
{
dwErr = SetSecurityInfo (
hObject, type, LABEL_SECURITY_INFORMATION,
NULL, NULL, NULL, pSacl );
bRet = (ERROR_SUCCESS == dwErr);
}
LocalFree ( pSD );
}
return bRet;
}
更多精彩
赞助商链接