Какой ресурс ждёт поток, а каким владеет?
От: kd_starov  
Дата: 18.01.10 21:35
Оценка:
Ищу любую информацию по поводу того, как узнать сигнальное состояние какого объект ждёт поток (это могу узнать только на уровне ядра),
и какой поток владеет этим объектом, т.е. может перевести его в сигнальное состояние. Главный вопрос — как узнать, какие потоки владеют ресурсами семафора? сколько у него ресурсов? Можно ли это узнать на уровне пользователя?

За ранее — спасибо!
Re: Какой ресурс ждёт поток, а каким владеет?
От: ononim  
Дата: 19.01.10 11:59
Оценка:
_>Ищу любую информацию по поводу того, как узнать сигнальное состояние какого объект ждёт поток (это могу узнать только на уровне ядра),
_>и какой поток владеет этим объектом, т.е. может перевести его в сигнальное состояние. Главный вопрос — как узнать, какие потоки владеют ресурсами семафора? сколько у него ресурсов? Можно ли это узнать на уровне пользователя?

Потоки "могут" владеть только мутексом. У остальных объектов синхронизации нету вообще такого понятия как "владелец".
Что касается как узнать кто владеет мутантом:

lkd> dt nt!_KMUTANT
+0x000 Header : _DISPATCHER_HEADER
+0x010 MutantListEntry : _LIST_ENTRY
+0x018 OwnerThread : Ptr32 _KTHREAD
+0x01c Abandoned : UChar
+0x01d ApcDisable : UChar



что касается того какими мутантами владеет поток, дык:

lkd> dt nt!_KTHREAD
+0x000 Header : _DISPATCHER_HEADER
+0x010 MutantListHead : _LIST_ENTRY
+0x018 InitialStack : Ptr32 Void
+0x01c StackLimit : Ptr32 Void
+0x020 Teb : Ptr32 Void
............


что касается того, кто ждет указанного объекта:

lkd> dt nt!_KTHREAD
....
+0x05b WaitReason : UChar
+0x05c WaitBlockList : Ptr32 _KWAIT_BLOCK
+0x060 WaitListEntry : _LIST_ENTRY
+0x060 SwapListEntry : _SINGLE_LIST_ENTRY
...


lkd> dt nt!_DISPATCHER_HEADER
+0x000 Type : UChar
+0x001 Absolute : UChar
+0x002 Size : UChar
+0x003 Inserted : UChar
+0x004 SignalState : Int4B
+0x008 WaitListHead : _LIST_ENTRY



ЗЫ Все эти структуры недокументированны, поля, их назначение и смещения могут меняться (и менялись) от версии к версии и даже от хотфикса к хотфиксу. Документированных путей достать эту информацию боюсь нету.
Как много веселых ребят, и все делают велосипед...
Re[2]: Какой ресурс ждёт поток, а каким владеет?
От: Caracrist https://1pwd.org/
Дата: 19.01.10 13:45
Оценка:
Здравствуйте, ononim, Вы писали:

O>ЗЫ Все эти структуры недокументированны, поля, их назначение и смещения могут меняться (и менялись) от версии к версии и даже от хотфикса к хотфиксу. Документированных путей достать эту информацию боюсь нету.


а нельзя проводить "настройку" тестовой апликацией... запустить все интересующие конфигурации ожиданий, и посмoтреть что куда записалось...
~~~~~
~lol~~
~~~ Single Password Solution
Re[3]: Какой ресурс ждёт поток, а каким владеет?
От: ononim  
Дата: 19.01.10 14:31
Оценка: +1
O>>ЗЫ Все эти структуры недокументированны, поля, их назначение и смещения могут меняться (и менялись) от версии к версии и даже от хотфикса к хотфиксу. Документированных путей достать эту информацию боюсь нету.
C>а нельзя проводить "настройку" тестовой апликацией... запустить все интересующие конфигурации ожиданий, и посмoтреть что куда записалось...
Проще и надежнее стянуть с микрософта символы и по ним все определить.
Как много веселых ребят, и все делают велосипед...
Re[2]: Какой ресурс ждёт поток, а каким владеет?
От: kd_starov  
Дата: 19.01.10 15:27
Оценка:
Здравствуйте, ononim, Вы писали:

Пожалуйста, уважайте коллег и не допускайте излишнего цитирования. Для неуважающих напомню, что есть праавила форума и ресурса + санкции за несоблюдение оных. Модератор

O>ЗЫ Все эти структуры недокументированны, поля, их назначение и смещения могут меняться (и менялись) от версии к версии и даже от хотфикса к хотфиксу. Документированных путей достать эту информацию боюсь нету.

Спасибо, получил много полезной информации. Но вопрос частично остался:
Я могу получить объект, который ждёт поток. Но мне ещё надо выяснить, какой поток(процесс) может освободить этот объект.
Т.е., если это будет Event — его может выставить любой поток имеющий на это право (т.е. открыть Event, если его хэндла нет и выполнить SetEvent), а если это считающий семафор — нужно узнать, какие потоки заняли его — и соответственно один из них может его освободить...
Хотелось бы увидеть Ваши советы, спасибо
Re[3]: Какой ресурс ждёт поток, а каким владеет?
От: ononim  
Дата: 19.01.10 16:52
Оценка:
_>Я могу получить объект, который ждёт поток. Но мне ещё надо выяснить, какой поток(процесс) может освободить этот объект.
_>Т.е., если это будет Event — его может выставить любой поток имеющий на это право (т.е. открыть Event, если его хэндла нет и выполнить SetEvent), а если это считающий семафор — нужно узнать, какие потоки заняли его — и соответственно один из них может его освободить...
_>Хотелось бы увидеть Ваши советы, спасибо
У семафора нету понятия "поток-владелец", сделать ReleaseSemaphore может совершенно любой поток, включая те, которые его не Wait'тили.
Как много веселых ребят, и все делают велосипед...
Re[4]: Какой ресурс ждёт поток, а каким владеет?
От: kd_starov  
Дата: 19.01.10 18:18
Оценка:
Здравствуйте, ononim, Вы писали:

_>>Я могу получить объект, который ждёт поток. Но мне ещё надо выяснить, какой поток(процесс) может освободить этот объект.

_>>Т.е., если это будет Event — его может выставить любой поток имеющий на это право (т.е. открыть Event, если его хэндла нет и выполнить SetEvent), а если это считающий семафор — нужно узнать, какие потоки заняли его — и соответственно один из них может его освободить...
_>>Хотелось бы увидеть Ваши советы, спасибо
O>У семафора нету понятия "поток-владелец", сделать ReleaseSemaphore может совершенно любой поток, включая те, которые его не Wait'тили.


Точно, понял. Но любые потоки, если им разрешено?
И ещё — а как тогда представляются критические секции, ведь они не являются объектами ядра?
И можешь детальнее написать как получить структуру KMUTANT?

Спаибо большое, думаю это всё
Re[5]: Какой ресурс ждёт поток, а каким владеет?
От: ononim  
Дата: 19.01.10 18:48
Оценка:
O>>У семафора нету понятия "поток-владелец", сделать ReleaseSemaphore может совершенно любой поток, включая те, которые его не Wait'тили.
_>Точно, понял. Но любые потоки, если им разрешено?
Всмысле разрешено? Есть хэндл на семафор — можно делать с ним все что разрешено этим хэндлом.

_>И ещё — а как тогда представляются критические секции, ведь они не являются объектами ядра?

lkd> dt ntdll!_RTL_CRITICAL_SECTION
+0x000 DebugInfo : Ptr32 _RTL_CRITICAL_SECTION_DEBUG
+0x004 LockCount : Int4B
+0x008 RecursionCount : Int4B
+0x00c OwningThread : Ptr32 Void
+0x010 LockSemaphore : Ptr32 Void
+0x014 SpinCount : Uint4B
lkd> dt ntdll!_RTL_CRITICAL_SECTION_DEBUG
+0x000 Type : Uint2B
+0x002 CreatorBackTraceIndex : Uint2B
+0x004 CriticalSection : Ptr32 _RTL_CRITICAL_SECTION
+0x008 ProcessLocksList : _LIST_ENTRY
+0x010 EntryCount : Uint4B
+0x014 ContentionCount : Uint4B
+0x018 Spare : [2] Uint4B


_>И можешь детальнее написать как получить структуру KMUTANT?

Конкретно KMUTANT "получать" не надо. Она объявлена в DDK
Как много веселых ребят, и все делают велосипед...
Re[6]: Какой ресурс ждёт поток, а каким владеет?
От: Аноним  
Дата: 19.01.10 19:50
Оценка:
Здравствуйте, ononim, Вы писали:

Пожалуйста, уважайте коллег и не допускайте излишнего цитирования. Для неуважающих напомню, что есть праавила форума и ресурса + санкции за несоблюдение оных. Модератор
_>>И можешь детальнее написать как получить структуру KMUTANT?
O>Конкретно KMUTANT "получать" не надо. Она объявлена в DDK

Пасиба. Под "разрешено" я имел в виду, сможет ли поток из другого процесса открыть и использовать хэндл
Re[7]: Какой ресурс ждёт поток, а каким владеет?
От: ononim  
Дата: 19.01.10 19:53
Оценка:
_>>>И можешь детальнее написать как получить структуру KMUTANT?
O>>Конкретно KMUTANT "получать" не надо. Она объявлена в DDK
А>Пасиба. Под "разрешено" я имел в виду, сможет ли поток из другого процесса открыть и использовать хэндл
Если семафор именованный — другой процесс может, его открыть по имени если SECURITY_DESCRIPTOR семафора разрешает доступ к нему тому другому процессу.
Если у процесса имеются права на процесс- у которого есьт хэндл на семафор — OpenProcess/DuplicateHandle и вуаля.
Как много веселых ребят, и все делают велосипед...
Re[8]: Какой ресурс ждёт поток, а каким владеет?
От: kd_starov  
Дата: 20.01.10 19:23
Оценка:
Здравствуйте, ononim, Вы писали:

_>>>>И можешь детальнее написать как получить структуру KMUTANT?

O>>>Конкретно KMUTANT "получать" не надо. Она объявлена в DDK
А>>Пасиба. Под "разрешено" я имел в виду, сможет ли поток из другого процесса открыть и использовать хэндл
O>Если семафор именованный — другой процесс может, его открыть по имени если SECURITY_DESCRIPTOR семафора разрешает доступ к нему тому другому процессу.
O>Если у процесса имеются права на процесс- у которого есьт хэндл на семафор — OpenProcess/DuplicateHandle и вуаля.


А вот такой вопрос — как узнать, сколько времени будет поток ждать объект (т.е., с каким временным параметром было вызвано WaitForSingleObject) и с каким WaitType (all или any) в случае WaitForMultipleObject?
Re[9]: Какой ресурс ждёт поток, а каким владеет?
От: ononim  
Дата: 20.01.10 20:07
Оценка:
_>А вот такой вопрос — как узнать, сколько времени будет поток ждать объект (т.е., с каким временным параметром было вызвано WaitForSingleObject) и с каким WaitType (all или any) в случае WaitForMultipleObject?
вы бы лучше сказали что хотите сделать
вся эта информация легко достается дебагером из крэшдампов, гораздо легче чем то, что вы хотите сделать
Как много веселых ребят, и все делают велосипед...
Re[10]: Какой ресурс ждёт поток, а каким владеет?
От: kd_starov  
Дата: 20.01.10 22:18
Оценка:
Здравствуйте, ononim, Вы писали:

_>>А вот такой вопрос — как узнать, сколько времени будет поток ждать объект (т.е., с каким временным параметром было вызвано WaitForSingleObject) и с каким WaitType (all или any) в случае WaitForMultipleObject?

O>вы бы лучше сказали что хотите сделать
O>вся эта информация легко достается дебагером из крэшдампов, гораздо легче чем то, что вы хотите сделать


В общем, хочу написать приложение, которое бы отслеживало тупиковые ситуации связанные с объектами синхронизации. Думаю писать драйвер, чтобы периодически сканировать граф "потоки-ресурсы" и далее редуцировать его. В принципе, приложении более демонстрационное — сначало можно рассмотреть ожидание мьютексов, ожидание окончания других потоков — мне подходит для нужного графа.
Если я действительно иду очень сложным путём — прошу подсказать мне, где почитать и посмотреть полезную мне информацию
Заранее благодарен
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.