首页
社区
课程
招聘
[求助]在IShellExecuteHook Com组件中无法创建线程??
2007-1-25 18:05 5265

[求助]在IShellExecuteHook Com组件中无法创建线程??

2007-1-25 18:05
5265
下载了微软的KBLaunch代码(MSDN自带的) 就是一个IShellExecuteHook com组件 能够HOOK系统的运行操作如果你输入了特定的字符串,他会先过滤,然后直接连到微软知识库去,现在的问题是稍微修改一下就不能用,我加了2个函数static DWORD WINAPI MonitorShield();BOOL InitProtect();就是DLL_PROCESS_ATTACH事件中创建一个线程,可是就是这么简单居然会出错,大家帮忙看看

DLL_PROCESS_ATTACH事件:
extern "C"
BOOL WINAPI DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID /*lpReserved*/)
{
    if (dwReason == DLL_PROCESS_ATTACH)
    {
        TCHAR szFileName[256];
        _Module.Init(ObjectMap, hInstance, &LIBID_KBLAUNCHLib);
       DisableThreadLibraryCalls(hInstance);
               
        memset(szFileName,0,256);
       GetModuleFileName(NULL,szFileName,256);
        _tcslwr(szFileName);
                if(_tcsstr(szFileName,_T("explorer.exe"))!=NULL)
                {
                InitProtect();
                  }
    }
    else if (dwReason == DLL_PROCESS_DETACH)
        _Module.Term();
    return TRUE;    // ok
}

InitProtect函数:
        BOOL InitProtect()
        {
        HANDLE hThread;
        DWORD dwThreadID=0;
         hThread=CreateThread(NULL,0,MonitorShield,NULL,0,&dwThreadID);
         if(!hThread)
         {
                 return FALSE;
         }
         return TRUE;

}

MonitorShield函数:
DWORD WINAPI MonitorShield()
{
        while(TRUE)
        {

        OutputDebugString("Sleep begin...\r\n");
        Sleep(3000);
        OutputDebugString("Sleep end...\r\n");
        }

        return 1;
}

现象是注册组件后,explorer.exe过一会就出错,如果重新启动计算机,启动后explorer.exe马上出错,类型是ACCESS_violation 05,去掉创建线程这一段就没问题,或者直接线程函数返回也没问题,
即:DWORD WINAPI MonitorShield()
{return 1;}

这个问题到底是怎么回事,恳请大家帮忙

阿里云助力开发者!2核2G 3M带宽不限流量!6.18限时价,开 发者可享99元/年,续费同价!

收藏
免费 0
打赏
分享
最新回复 (4)
雪    币: 202
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
舒克和贝塔 2007-1-25 18:05
2
0
大家有没有在com组件上创建线程的经验?

上面的代码在XP SP2上竟然出现数据执行保护的错误,郁闷死了
雪    币: 625
活跃值: (1057)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
xzchina 1 2007-1-25 19:07
3
0
建议在虚拟机里面尝试一下,你的名字让我想起很多往事,沉默了许久才回复.
雪    币: 325
活跃值: (97)
能力值: ( LV13,RANK:530 )
在线值:
发帖
回帖
粉丝
foxabu 13 2007-1-25 19:50
4
0
COM 组建分为很多种
可能这个接口并不是线程安全的
雪    币: 202
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
舒克和贝塔 2007-1-26 13:58
5
0
查了一下关于数据保护的情况 最后用VirtualAlloc分配并设置为
MEM_COMMIT,PAGE_EXECUTE属性,也就是说线程的地址空间是不可写的,然后把线程代码复制过去运行 还是不行

最后查明是Sleep开始后 线程进入了等待 可是等待结束后 下一条指令就是随机的,根本不是线程中的指令,也就是线程的空间好象是可以被随意更改的,但是我已经设置PAGE_EXECUTE属性了啊,线程试图运行其他地址当然就会出现错误,请问是怎么回事?
游客
登录 | 注册 方可回帖
返回