Собсна сабж.. вдух (или больше)-ядерный проц. драйвер (ring0) должен знать на каком ядре в данный момент выполняется код. Есть ли какое-то АПИ для этого? решение нужно как для Вин32 так и для Вин64 (х86-64) спасибо
Код (Text): oldAffinityMask = KeSetAffinityThread((PKTHREAD)PsGetCurrentThread(), 1); KeSetAffinityThread((PKTHREAD)PsGetCurrentThread(), oldAffinityMask); oldAffinityMask - маска процессов на котором может исполнятся поток. можно еще процессор на котором код исполняется взять из структуры ETHREAD.
нашел в одном месте определение текущего процессора таким образом: movzx eax, byte ptr fs:[51h] вроде для моего вдухядерника выдает то 0 то 1.. т.е. похоже работает.. что это за структура по этому адресу?
ULONG KeGetCurrentProcessorNumber(); только такую проверку имеет смысл делать на irql >= DISPATCH, чтобы нитка гарантированно не была вытеснена и перенесена на другой проц. Чтобы поставить thread на конкретный процессор можно использовать KeSetSystemAffinityThread.
FS:[0] это Current PCR структура официально недокументирована, и может отличаться для разных систем, сервиспаков, и даже хотфиксов. Пользуй API, что я сказал.
ratix KeGetCurrentProcessorNumber используй, что за мания хардкодить смещения в недокументированные структуры...
действительно.. определено как инлайн ф-ция.. (поэтому её даже в экспортах нет) FORCEINLINE ULONG NTAPI KeGetCurrentProcessorNumber(VOID) { __asm { movzx eax, _PCR KPCR.Number } } я так понимаю, теперь мне нужна DDK для х64 систем.. чтобы посомтреть как там реализована эта ф-ция..
для х64: Код (Text): __forceinline ULONG KeGetCurrentProcessorNumber (VOID) { return (ULONG)__readgsbyte(0x184); } для IA64: Код (Text): #define KeGetCurrentProcessorNumber() ((ULONG)(PCR->Number))
Zufyxe спасибо.. то что нужно.. я правильно понял, что в винде под х86-64 роль fs: выполняет теперь gs:?