Возникла такая проблема: когда моя прога для мониторинга производительности работает на P4 с включенным hyperthreading то драйвер и программа которая им управляет иногда работают на разных процах и поскольку драйвер разрешает программе считывать счетчики через CR4 то он разрешает это "не в том CR4" так как он у каждой нити свой... Глюк получается не всегда, но довольно часто. Я точно не уверен, но кажется проблема именно в этом так как "privileged instruction" вылетает на RDPMC. Если HT отключить то все ОК. Я не большой спец по windows, так что если кто знает как это вылечить, поделитесь плиз
Попробуй привязать свою прогу к конкретному процессору. В Task Manager должна быть менюшка "Set Affinity". Не уверен, правда, что это работает для логических процессоров. Если заработает, то см. функцию SetProcessAffinityMask и гугли по "processor affinity mask".
Привязка к процессору - не 100% решение, так как она устанавливает предпочтительный процессор, но не всегда его придерживается. Чтобы код 100% не перебросило на другой процессор нужно просто поднять irql до DISPATCH_LEVEL, или можно просто запретить прерывания. Если нужно исполнить код на определенном процессоре, то следует использовать DPC. Свой модуль для работы с мультипроцессорными системами я уже атачил в каком-то топике.
SetProcessAffinityMask, SetThreadAffinityMask работает на ура. Не надо "ляля". Были проблемы с многопроцессорной машиной. Дедлоки в непонятных местах. Это проблему решило полностью. Эти функции ГАРАНТИРУЮТ, что процесс будет на одном процессоре только выполняться.
Нифига, есть экспериментальные данные, по которым несмотря на AffinityMask исполнение шло на другом процессоре, что проявлялось на 4 процессорном сервере с Windows XP. Причем проявлялось крайне редко, и только в моменты сильной загрузки сервера. Самое "прямое" решение этой проблемы - KeRaiseIrqlToDpcLevel/KeLowerIrql.
Всем спасибо, буду дальше разбираться. Кстати, KeRaiseIrqlToDpcLevel должна вызываться только из драйвера, то есть тогда, когда и прога и драйвер уже работают, а если уже работают с самого начала на разных процах то автоматически станут работать на одном? Просто CR4 модифицируется один раз в DriverEntry, потом уже неважно где и кто работает, важно чтобы в момент вызова driver entry все было на одном проце.
В таком случае самым простым решением будет задать AffinityMask, но лучшее решение тут - модифицировать cr4 на всех процессорах. Модуль для работы с мультипроцессорными системами в атаче, он позволяет выполнить код на всех процессорах (функция CallToAllProcessors). Калбэк будет вызываться на DISPATCH_LEVEL. 1457923914__processor.rar
Dark_Master а еще лучше поройся в PE заголовке проги и драйвера, видел я там то, что позволит привязать потоки процесса к определенному процессору