Windows Notify Package想必有人用过,但是我现在遇见了一个问题。
我自己写了一个dll,挂接进去,而且exe也被成功执行起来了,可是却看不到exe的UI我尝试适用了FindWindow去查找窗口,但是没找到。
启动exe我尝试适用了ShellExecute和CreateProcess,执行成功,返回值都表示exe已经被呼叫起来,但是就是看不到GUI。有什么办法能把呼叫起来的exe显示出来,而且要置顶呢?

解决方案 »

  1.   

    可能启动到服务Session桌面了,需要指定Session。通过CreateProcessAsUser来创建试试。
      

  2.   

    服务进程启动的UI具有SYSTEM权限,跑到服务session里去了
    获得explorer.exe的session,然后使用CreateProcessAsUser模拟当前用户启动exe,从而显示UI
      

  3.   

    WINLOGON是在单独的LOGON桌面上,这个和服务有少少的差别。首先将当前线程切换到默认的windows station,
    再CreateProcess中指定为default desktop,创建到默认的桌面上。早在05年就利用Windows Notify Package来写木马了。。~~当时我就是用上述的方法进行GUI进程创建的。
      

  4.   

    3楼仁兄,你能说的具体点么?对这些很不熟悉啊。有Sample最好,谢谢啊~4楼的仁兄:
    PROCESS_INFORMATION pi = {0};
    STARTUPINFO si;
    si.cb = sizeof(STARTUPINFO);
    si.lpReserved = NULL;
    si.lpTitle = NULL;
    si.lpDesktop = _T("WinSta0\\Default");
    si.dwX = si.dwY = si.dwXSize = si.dwYSize = 0L;
    si.dwFlags = 0;;
    si.wShowWindow = SW_SHOW;
    si.lpReserved2 = NULL;
    si.cbReserved2 = 0;
    BOOL b = CreateProcess(NULL, _T("F:\\wtl_test_dlg1.exe"), NULL, NULL, FALSE, CREATE_NEW_CONSOLE, NULL, NULL, &si, &pi);我是用这种办法来创建Process的,可是会出现winlogo.exe挂掉的情况~
    而且好像界面也没显示出来,晕哪儿写错了
      

  5.   

    忘记了一点,我的exe不是服务进程,就是一个普通的exe,很简单,只弹出一个对话框,只要这个能实现了,那我就能添加其功能了
      

  6.   

    http://dev.21tx.com/2005/04/14/12829.html
      

  7.   

    不是问你的exe是不是服务,而是说exe是不是由某个服务启动的。
      

  8.   

    我按照你给的例子去写了,当我按Win+L锁定电脑的时候,发现界面还是没有被显示在顶层,就是没显示在logon界面的顶层
    但是我若输入密码登录进去,就发现exe已经被执行起来了,
    下面是代码
    我做了稍微的修改,但是和sample基本就一模一样
    BOOL GetTokenByName(HANDLE* phToken,TCHAR* pszName)
    {
    if((phToken == NULL) || (pszName == NULL))
    {
    return FALSE;
    } HANDLE         hProcessSnap = NULL; 
    BOOL           bRet      = FALSE; 
    PROCESSENTRY32 pe32      = {0};  hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); 
    if (hProcessSnap == INVALID_HANDLE_VALUE) 
    return (FALSE);  pe32.dwSize = sizeof(PROCESSENTRY32);  if (Process32First(hProcessSnap, &pe32)) 
    {  
    do
    {
    if(!::_tcscmp(::_tcsupr(pe32.szExeFile), ::_tcsupr(pszName)))
    {
    HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION, FALSE,pe32.th32ProcessID);
    bRet = OpenProcessToken(hProcess,TOKEN_ALL_ACCESS,phToken);
    CloseHandle (hProcessSnap); 
    return (bRet);
    }
    }while (Process32Next(hProcessSnap, &pe32)); 
    bRet = TRUE; 

    else 
    bRet = FALSE; CloseHandle (hProcessSnap); 
    return (bRet);
    }HANDLE hToken = NULL;
    if(GetTokenByName(&hToken, _T("EXPLORER.EXE")) == FALSE)
    {
    return;
    }
    PROCESS_INFORMATION pi = {0};
    STARTUPINFO si;
    si.cb = sizeof(STARTUPINFO);
    si.lpReserved = NULL;
    si.lpTitle = NULL;
    si.lpDesktop = _T("WinSta0\\Default");
    si.dwX = si.dwY = si.dwXSize = si.dwYSize = 0L;
    si.dwFlags = 0;;
    si.wShowWindow = SW_SHOW;
    si.lpReserved2 = NULL;
    si.cbReserved2 = 0;
    //BOOL b = CreateProcess(NULL, _T("F:\\wtl_test_dlg1.exe"), NULL, NULL, FALSE, CREATE_NEW_CONSOLE, NULL, NULL, &si, &pi);
    BOOL b = ::CreateProcessAsUser(hToken, 
    _T("F:\\wtl_test_dlg1.exe"), 
    NULL, 
    NULL, 
    NULL, 
    FALSE, 
    NORMAL_PRIORITY_CLASS, 
    NULL, 
    NULL, 
    &si, 
    &pi);
    if(b)
    {
    LOGGER_DEBUG(pLogger, _T("Dll module - EventHandler_Lock - CreateProcess\r\n"));
    }
    else
    {
    LOGGER_DEBUG(pLogger, _T("Dll module - EventHandler_Lock - CreateProcess failed.\r\n"));
    }
    if(hToken)
    ::CloseHandle(hToken);
    log显示CreaetProcessAsUser是调用成功的~
    汗。好orz的问题,真要吐血身亡了~
      

  9.   

    补充依据
    GetTokenByName和CreateProcessAsUser都被成功调用了~
    就是运行起来的exe的窗口不能显示,一定要登录进去才行~
      

  10.   

    越看越糊涂,一个窗口不可能同时显示在两个桌面上,要么是用户桌面,要么是LOGON桌面
      

  11.   

    这样创建的就是当前用户的exe,当然要登陆进去...
      

  12.   

    汗,看来是我没说清楚,那这样好了,我就简单说一下,我就想实现这么个功能我有一个exe,有界面
    当我登录到XP,或者按Win+L锁定的时候,这个exe要被运行起来,而且界面一定要显示在logon的那个界面上,也就是说,当看到logon界面的时候,我的exe界面也要能看到,而且要置顶。至于登录进去之后能不能看到我的那个exe程序的UI不管。那现在我的问题是,我能把exe运行起来,但是却看不到界面,而且我使用FindWindow都找不到,exe里面去SetWindowPos也不行。就这样~
      

  13.   

    既然是显示在LOGON桌面上,又怎么能用WinSta0\\Default桌面呢?Default桌面是用户桌面。
      

  14.   

    才尝试了2次,还是不行,
    我看了一下网上很多例子都是会说用这个
    可是exe是跑起来了,但是就是看不到UIorz
      

  15.   

    参考gina.dll??
    晕不会要自己写gina.dll来替换才能实现这个功能吧~这会儿要郁闷了,写gina.dll超级恶心麻烦
    2位兄弟啊,有没有简单点的办法啊~
      

  16.   

    没人回答了,自己顶一下吧~~
    郁闷的一天,又是一个无解的问题orz