Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.149.255.162] |
|
Сообщ.
#1
,
|
|
|
Замыслил я значит написать небольшую прогу чтобы искала какой процесс открыл определенный файл. Ну как в Process Explorer или Handles например. Получил список открытых хендлов
NtQuerySystemInformation(SystemHandleInformation,... Ну а дальше мои пути с sysinternals разошлись Они там через дрова как то делали а я копировал хендлы чужих процессов в свой и затем получал их имя hpr=OpenProcess(PROCESS_DUP_HANDLE,... DuplicateHandle(hpr,... NtQueryObject(htemp_handle, ObjectNameInformation,... Все шло хорошо пока я не трогал сервисы. Когда же я довавил своей проге SeDebugPrivilege вылез прикол - на очередном хендле процесса services.exe функция NtQueryObject крепко зависает, так что потом с прогой ниче не сделаешь, только комп ребутать. Очень хотелось бы узнать были ли у кого такие траблы и как решались? |
Сообщ.
#2
,
|
|
|
Там есть какие-то специальные именованные пайпы, так вот при попытке их имена прочитать поток блокируется - это общеизвестно. Общеизвестный метод - запускать это в отдельный поток и ждать пару секунд, потом поток килять
|
Сообщ.
#3
,
|
|
|
Интересно!!! возможно это связано с RPC - известным больным местом виндов. Возможно, это такая попытка защиты?
|
Сообщ.
#4
,
|
|
|
Врядли, это скорее баг
Я так и не нашел способа его обойти, разве что использовать драйвер... |
Сообщ.
#5
,
|
|
|
Цитата HOMO_PROGRAMMATIS, 26.08.04, 11:27 Там есть какие-то специальные именованные пайпы, так вот при попытке их имена прочитать поток блокируется - это общеизвестно. Общеизвестный метод - запускать это в отдельный поток и ждать пару секунд, потом поток килять Ну это классно что все уже общеизвестно и опробовано. Но и тут засада! Значит так. Создаем поток: hmutex=CreateMutex(NULL, TRUE, "sfu_mutex0"); hth=CreateThread(NULL, 0, ThreadProc,... Вот с таким кодом: DWORD WINAPI ThreadProc(LPVOID lpParameter){ HANDLE hmutex=OpenMutex(SYNCHRONIZE, FALSE, "sfu_mutex0"); for(;;){ WaitForSingleObject(hmutex, INFINITE); NtQueryObject(... ReleaseMutex(hmutex); } return 0; } Ну и где то в коде основного потока: ReleaseMutex(hmutex); if(WaitForSingleObject(hmutex, 1000)!=WAIT_OBJECT_0){ TerminateThread(hth, 1); CloseHandle(hth); if(WaitForSingleObject(hmutex, 1000)==WAIT_ABANDONED_0) hth=CreateThread(NULL, 0, ThreadProc,... // создаем новый else // report error } Что же получается? TerminateThread возвращает 1, то есть вроде бы все ок. Но на самом деле поток не завершается (ну и мьютекс ясно дело не теряется). Завершаем отладку и процесс остается висеть в памяти, с одним потоком (главный то завершается). Зато если в коде вспомогательного потока вместо вызова NtQueryObject поставить какой нить Sleep(100000), то все работает как часы. Так и в чем же дело??? |
Сообщ.
#6
,
|
|
|
или бросить это неблагодарное дело и сделать через дрова?
|
Сообщ.
#7
,
|
|
|
Так NtQueryObject() все и вешает, и ничто иное. Кстати, у меня тоже та же фигня получалась - неубиваемый поток... Я так и не понял что неправильно. У меня был чуть измененный сорс, так вот оригинал работал а мой нет...
|