Windows Vista IE 7保护模式开发者生存指南
2008-08-22 17:24:11 来源:WEB开发网DemoApp会从/h选项中读取句柄值,并用它来调用MapViewOfFile()完成数据读取,这也是使新进程自动接收到某个内核对象句柄的标准方法,但处于保护模式时,新进程实际上由代理进程启动,也正是因为IE进程不会直接启动新进程,所以句柄继承失效。
要突破这个限制,插件可为IPC对象使用一个预定义名,这样其他进程就能访问此对象了(因为这个对象为低完整性级别)。如果不想使用预定义名,也可在运行时生成一个“名字”(如为名字使用一个GUID),并把它传递给其他的单独进程。
//得到一个用作共享内存对象名的GUID
GUID guid = {0};
WCHAR wszGuid[64] = {0};
HRESULT hr;
CoCreateGuid( &guid );
StringFromGUID2( guid, wszGuid, _countof(wszGuid) );
//创建文件映射对象,因为句柄不可被继承,所以无需SECURITY_ATTRIBUTES结构
HANDLE hMapping;
hMapping = CreateFileMapping( INVALID_HANDLE_VALUE, NULL,
PAGE_READWRITE, 0, cbyData, CW2CT(wszGuid) );
//在此可把数据放在共享内存块中
//运行EXE并传递给它共享内存对象名
//注意CreateProcess()中的参数bInheritHandles为FALSE
CString sCommandLine;
BOOL bSuccess;
STARTUPINFO si = { sizeof(STARTUPINFO) };
PROCESS_INFORMATION pi = {0};
sCommandLine.Format( _T(""C:path oDemoApp.exe" /n:%ls"),
wszGuid );
bSuccess = CreateProcess(
NULL, sCommandLine.GetBuffer(0), NULL, NULL,
FALSE,// FALSE代表新的进程不继承句柄
NORMAL_PRIORITY_CLASS, NULL, NULL, &si, &pi );
更多精彩
赞助商链接