Ловушка на клаву но почему виснут проги, запущенные от другого юзера

Тема в разделе "LANGS.C", создана пользователем _Lamer, 19 ноя 2010.

  1. _Lamer

    _Lamer Petr

    Публикаций:
    0
    Регистрация:
    19 ноя 2010
    Сообщения:
    9
    Адрес:
    Vitebsk
    ***Задача***:
    пишется EXE-ник, который запускает проги на новом рабочем столе, это не терминал, а просто новый рабочий стол на той же станции (HWINSTA). Так же нужно переключение между рабочими столами.
    ***Реализация***:
    написан EXE-ник (RunApp.exe), который запускает проги на новом рабочем столе.
    написан EXE-ник (DesktopInit.exe), который подгружает HOOK.DLL и устанавливает ловушку на клавиатуру.
    написана DLL (HOOK.DLL), в которой реализована процедура "LRESULT CALLBACK KeyboardProc(...".
    запуск в следующем порядке:
    Сначала RunApp.exe подгружает HOOK.DLL и устанавливает ловушку на клавиатуру на основном Desktope,
    Затем RunApp.exe запускает на новом DESKTOP-e процесс DesktopInit.exe, который подгружает HOOK.DLL и устанавливает ловушку на клавиатуру на новом DESKTOPe.
    Затем RunApp.exe запускает на новом DESKTOPe любые приложения (согласно пареметрам коммандной строки RunApp.exe).
    Подгружать HOKK.DLL на обоих DESKTOP-ах нужно потому что все процессы при запуске привязаны к одному рабочему столу параметром lpDesktop структуры STARTUPINFO и ловушки срабатывают так же с привязкой к DESKTOP-у.

    ***ПРОБЛЕМА***
    на новом DESKTOPе можно запустить процесс (например notepad.exe) от имени другого пользователя, и при нажатии на клавиатуру все работатет. Нажмем условную комбинацию клавиш и переключемся на основной DESKTOP, А ТУТ ЗАСАДА, если запустить процес от имени другого юзера (на важно Admin или нет) то процес работает пока не нажмешь клавишу на кавиатуре(фокус клавиатуры на этом процессе). как тока нажал — ПРОЦЕСС ВИСНЕТ и все. А процессы запущенные от того же юзера — работают без нариканий, и по той же комбинации можно опять переключится на новый DESKTOP.
    Если RunApp.exe не запускает ни один процесс на новом Desktope, или запускает процессы на основном рабочем столе, и подгружает HOOK.DLL и устанавливает ловушку на клавиатуру, то на основном (единственном) рабочем столе ничего не виснет, под любым юзером, все красиво отрабатывается.

    ***ВОПРОС***:
    почему виснет и как избежать зависания !!!
    помогите разобраться, плиз.

    Запуск на новом раб. столе:
    код RunApp.exe:
    Код (Text):
    1. hWinstaSave = GetProcessWindowStation();
    2. if ( !hWinstaSave )
    3.     return bResult;
    4.  
    5. hWinsta = OpenWindowStation(WinSta, false, READ_CONTROL | WRITE_DAC);
    6. if ( !hWinsta )
    7.     return bResult;
    8.  
    9. if (!SetProcessWindowStation(hWinsta))
    10.     return bResult;
    11.  
    12. hDesk = OpenDesktop(Desktop, 0, false, dwAccessFlags);
    13. if (hDesk == 0) {
    14.     hDesk = CreateDesktop(Desktop, NULL, NULL, DF_ALLOWOTHERACCOUNTHOOK, dwAccessFlags, NULL);
    15.     if (hDesk == 0) return bResult;
    16. }
    17.  
    18. if (!SetProcessWindowStation(hWinstaSave))
    19.     return bResult;
    20.  
    21. ZeroMemory(&si, sizeof(si));
    22. si.cb = sizeof(si);
    23.  
    24. TCHAR strTmp[1024];
    25. _sntprintf_s(strTmp, 1023, _tcslen(WinSta) + _tcslen(Desktop) + 1, _T("%s\\%s"), WinSta, Desktop);
    26. si.lpDesktop = strTmp;
    27.  
    28. ZeroMemory(&pi, sizeof(pi));
    29. pi.hThread = pi.hProcess = INVALID_HANDLE_VALUE;
    30.  
    31. bResult = CreateProcess(NULL, lpCommandLine, lpp, lpt, bi, NORMAL_PRIORITY_CLASS | CREATE_NEW_CONSOLE,
    32. Env, CurDir, &si, &pi);
    33. .....
    в DLL:
    Код (Text):
    1. HINSTANCE gl_hInst;
    2. BOOL APIENTRY DllMain( HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved) {
    3. switch (ul_reason_for_call)
    4. {
    5. case DLL_THREAD_ATTACH:
    6.     break;
    7. case DLL_THREAD_DETACH:
    8.     break;
    9. case DLL_PROCESS_DETACH:
    10.     break;
    11. case DLL_PROCESS_ATTACH:
    12.     gl_hInst=(HINSTANCE)hModule;
    13. return TRUE;
    14. }
    Установка ловушки
    Код (Text):
    1. hKeyHook = SetWindowsHookEx(WH_KEYBOARD, &KeyboardProc, gl_hInst, 0);
    Виснет даже при такой реализации

    Код (Text):
    1. LRESULT CALLBACK KeyboardProc (int code, WPARAM wParam, LPARAM lParam) {
    2.     return CallNextHookEx(hKeyHook, code, wParam, lParam);
    3. }
     
  2. baldr

    baldr New Member

    Публикаций:
    0
    Регистрация:
    29 апр 2010
    Сообщения:
    327
    _Lamer,

    Пошагай в отладчике, м.б. стэк порушен.
     
  3. _Lamer

    _Lamer Petr

    Публикаций:
    0
    Регистрация:
    19 ноя 2010
    Сообщения:
    9
    Адрес:
    Vitebsk
    Засада гдето в RunApp
    Если RunApp.exe не запускает ни один процесс на новом Desktope, или запускает процессы на основном рабочем столе, и подгружает HOOK.DLL и устанавливает ловушку на клавиатуру, то на основном (единственном) рабочем столе ничего не виснет, под любым юзером, все красиво отрабатывается.

    я создал еще один тестовый прект по умолчанию Win32 (создает окно, процедуру обраб. сообщ. окна ...)
    запустил его из под VS под друзим юзером, нажал на клаву и процесс повис, я в отладчик жму на паузу
    а мне сообщение: "Процесс, по-видимому заблокирован (или не в состоянии выполнять код пользовательского режима). Все потоки остановлены."
    остановился на строке
    Код (Text):
    1. while (GetMessage(&msg, NULL, 0, 0))