Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Системное программирование и WinAPI > как повесить процесс ????


Автор: Syberex 19.4.2007, 15:41
я изучаю поведение процессов и потоков , и вот возникла необходимость поменять состояние программы на (висит,не висит(ну та что уже висит на не висит)) ну чтоб диспечер задач видел и отображал , что программа не отвечает , как это сделать, хендл главного окна могу получить а дальше как? Функция IsHungAppWindow(hWnd) показывает висит или нет, мож есть на подобе чтоб поменять состояние??? пишу на Borland Developer Studio 2006 c++ 

Автор: _hunter 19.4.2007, 16:16
есть способ -- нужно тупо не обрабатывать (не вызывать PeekMessage) приходящие сообщения.

Автор: Syberex 19.4.2007, 16:23
а пример кода есть?

Автор: _hunter 19.4.2007, 17:05
if (!hangup)
PeekMessage(...);
как-то так (это если приложение твое)
если не твое -- придется оконную процедуру подменять...

Автор: Syberex 20.4.2007, 07:43
Код

MSG *PMSG;
HWND hWnd = FindWindow(NULL, _T("Калькулятор"));

PeekMessage(PMSG,hWnd,0,0,PM_NOREMOVE);


на подобе такого? но как поменять , чё то не получается???? программа не моя, хочу "повесить"  калькулятор.

Автор: ama_kid 20.4.2007, 10:18
Syberex
Цитата
программа не моя, хочу "повесить"  калькулятор.
Вот тебе цитата из МСДН (если ты не поверил _hunter'у):
Цитата
PeekMessage does not retrieve messages for windows that belong to OTHER threads.
Могу дать совет - вешай глобальный хук с помощью http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winui/winui/windowsuserinterface/windowing/hooks/hookreference/hookfunctions/setwindowshookex.asp на  http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winui/winui/windowsuserinterface/windowing/hooks/hookreference/hookfunctions/getmsgproc.asp и отлавливай сообщения себе на здоровье. Для заданного окна (Калькулятор) - просто не отдавай ему сообщения (отдавай только WM_CLOSE, если хочешь, чтобы была возможность его закрыть). За подробностями - милости прошу по ссылкам или в поиск...

_hunter
Цитата
если не твое -- придется оконную процедуру подменять...
Мне кажется, так просто не прокатит, ибо сказано в http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winui/winui/windowsuserinterface/windowing/windowclasses/windowclassreference/windowclassfunctions/setwindowlong.asp:
Цитата
GWL_WNDPROC
Sets a new address for the window procedure.
Windows NT/2000/XP: You cannot change this attribute if the window does not belong to the same process as the calling thread.
Или как-то все-таки можно? Очень интересно было бы узнать (хотя бы направление)...  smile 

Автор: _hunter 20.4.2007, 10:50
Цитата(ama_kid @  20.4.2007,  10:18 Найти цитируемый пост)
Или как-то все-таки можно? Очень интересно было бы узнать (хотя бы направление)...

это делается путем внедрения в чужой процесс своего кода...
в принципе такие темы уже поднимались:
http://forum.vingrad.ru/topic-108238.html

Автор: ama_kid 20.4.2007, 11:02
_hunter
А... ну я понял, я просто подумал о подмене без внедрения кода... Де-факто, мы говорим об одном и том же...  smile 

Автор: Syberex 20.4.2007, 11:40
а реальный пример кода  у когото есть, ну чтоб поюзать можно было smile ? я не хочу внедряться свой код в чёжой процесс, я просто хочу чтоб винда видела состояние например калькулятора как будто он висит(а на сомом деле он чёдестно работает).

Автор: _hunter 20.4.2007, 11:50
Цитата(Syberex @  20.4.2007,  11:40 Найти цитируемый пост)
я просто хочу чтоб винда видела состояние например калькулятора как будто он висит(а на сомом деле он чёдестно работает).

а это вообще маловероятно...

Автор: Syberex 20.4.2007, 12:00
там что мне делать?? как же быть, ну как же тогда просто повесить реально его, испортить его код в памяти что-ли, ну так он закроется  smile , а  я хочу чтоб висел  smile 

Автор: _hunter 20.4.2007, 12:21
я же сказал -- подменяй оконную процедуру. или хук вешай (как ama_kid советовал) и не пропускай сообщения к этому окну.

Автор: dumb 20.4.2007, 12:25
бред какой, пардон. не подобралось другого слова...
для реализации этого бреда нужно перехватить IsHungAppWindow и на нужный процесс возвращать статус "висящего"...

Автор: Syberex 20.4.2007, 13:56
Цитата(dumb @ 20.4.2007,  12:25)
бред какой, пардон. не подобралось другого слова...
для реализации этого бреда нужно перехватить IsHungAppWindow и на нужный процесс возвращать статус "висящего"...

и как сделать? дай примерчик  smile 

Автор: W4FhLF 20.4.2007, 15:23
Никакого перехвата и хуков не надо, проявите фантазиюsmile Я вижу по-меньшей мере 3 способа без всяких хуков, самый простой:

Код

#include <iostream>
#include <windows.h>


extern "C" {
    typedef HANDLE (__stdcall *OpenThread)(DWORD, BOOL, DWORD);
}

void EnableDebugPrivilege(bool fEnable)
{ 
 HANDLE hToken; 
 if (OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES, &hToken)) 
 { 
  TOKEN_PRIVILEGES tp; 
  tp.PrivilegeCount = 1; 
  LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &tp.Privileges[0].Luid); 
  tp.Privileges[0].Attributes = fEnable ? SE_PRIVILEGE_ENABLED : 0; 
  AdjustTokenPrivileges(hToken, false, &tp, sizeof(tp), NULL, NULL); 
  CloseHandle(hToken); 
 } 
}

int main(int argc, char* argv[]) 
{
    HMODULE hModule = GetModuleHandle("kernel32.dll");
    OpenThread pOpenThread = (OpenThread)GetProcAddress(hModule, "OpenThread");


    CONTEXT cnx = {0};
    char shellcode[] = "\xEB\xFE";
    HWND hWnd = FindWindow(NULL, "Калькулятор");
    if (hWnd != 0) {
        DWORD ProcessID; 
        DWORD ThreadID = GetWindowThreadProcessId(hWnd, &ProcessID);
        PVOID hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, ProcessID);
        if (hProcess > ERROR_SUCCESS) {
            PVOID pMemory = VirtualAllocEx(hProcess, 0, 0x1000, MEM_COMMIT, PAGE_EXECUTE_READWRITE);
            DWORD pBytes = 0;
            WriteProcessMemory(hProcess, pMemory, &shellcode, 2, &pBytes);
            if (pBytes) {
                cnx.ContextFlags = CONTEXT_FULL;
                PVOID hThread = pOpenThread(THREAD_ALL_ACCESS, FALSE, (DWORD)ThreadID);
                EnableDebugPrivilege(TRUE);
                SuspendThread(hThread);
                GetThreadContext((PVOID)hThread, &cnx);
                cnx.Eip = (DWORD)pMemory;
                SetThreadContext((PVOID)hThread, &cnx);
                ResumeThread(hThread);
            }
            
        }
    }

    char ch;
    std::cin >> ch;
    return 0; 
}

Автор: Syberex 20.4.2007, 15:54
ругается на 

extern "C" {
    typedef HANDLE (__stdcall *OpenThread)(DWORD, BOOL, DWORD);
}

[C++ Error] demon.cpp(23): E2238 Multiple declaration for '__stdcall OpenThread(unsigned long,int,unsigned long)'
[C++ Error] winbase.h(2947): E2344 Earlier declaration of '__stdcall OpenThread(unsigned long,int,unsigned long)'

Автор: W4FhLF 20.4.2007, 15:56
Да просто у меня студия 6 и там нет в хедерах OpenThread, убери объявление прототипа и получение её адреса, просто вызывай функцию как обычно. 

Автор: dumb 20.4.2007, 16:31
W4FhLF,
Цитата(Syberex @  20.4.2007,  11:40 Найти цитируемый пост)
хочу чтоб винда видела состояние например калькулятора как будто он висит(а на сомом деле он чёдестно работает).

я про это говорил.

Автор: W4FhLF 20.4.2007, 16:34
Опа, прошу прощения за невнимательностьsmile Тогда dumb прав, перехват. 

PS Бредовая задача, если честно. Зачем такое может понадобиться?

Автор: HappyLife 20.4.2007, 16:37
W4FhLF, фигней страдать)

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)