как определить на каком ядре выполняется код

Тема в разделе "WASM.NT.KERNEL", создана пользователем ratix, 11 окт 2007.

  1. ratix

    ratix New Member

    Публикаций:
    0
    Регистрация:
    13 окт 2005
    Сообщения:
    52
    Адрес:
    Kyrgyzstan
    Собсна сабж..

    вдух (или больше)-ядерный проц. драйвер (ring0) должен знать на каком ядре в данный момент выполняется код.
    Есть ли какое-то АПИ для этого? решение нужно как для Вин32 так и для Вин64 (х86-64)

    спасибо
     
  2. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    Код (Text):
    1.     oldAffinityMask = KeSetAffinityThread((PKTHREAD)PsGetCurrentThread(), 1);
    2.     KeSetAffinityThread((PKTHREAD)PsGetCurrentThread(), oldAffinityMask);
    oldAffinityMask - маска процессов на котором может исполнятся поток.
    можно еще процессор на котором код исполняется взять из структуры ETHREAD.
     
  3. ratix

    ratix New Member

    Публикаций:
    0
    Регистрация:
    13 окт 2005
    Сообщения:
    52
    Адрес:
    Kyrgyzstan
    а про это - можно поподробнее? где там эта инфа лежит и в каком виде?

    спасибо..
     
  4. rei3er

    rei3er maxim

    Публикаций:
    0
    Регистрация:
    15 янв 2007
    Сообщения:
    917
    Адрес:
    minsk
    еще можно Local APIC ID прочитать
     
  5. EP_X0FF

    EP_X0FF New Member

    Публикаций:
    0
    Регистрация:
    13 авг 2006
    Сообщения:
    450
    ТС воспользуйся этим.

    http://rku.nm.ru/System.rar
     
  6. ratix

    ratix New Member

    Публикаций:
    0
    Регистрация:
    13 окт 2005
    Сообщения:
    52
    Адрес:
    Kyrgyzstan
    нашел в одном месте определение текущего процессора таким образом:

    movzx eax, byte ptr fs:[51h]

    вроде для моего вдухядерника выдает то 0 то 1.. т.е. похоже работает.. что это за структура по этому адресу?
     
  7. Zufyxe

    Zufyxe New Member

    Публикаций:
    0
    Регистрация:
    13 авг 2004
    Сообщения:
    137
    Адрес:
    Russia
    ULONG KeGetCurrentProcessorNumber();
    :)
    только такую проверку имеет смысл делать на irql >= DISPATCH, чтобы нитка гарантированно не была вытеснена и перенесена на другой проц.
    Чтобы поставить thread на конкретный процессор можно использовать KeSetSystemAffinityThread.
     
  8. ratix

    ratix New Member

    Публикаций:
    0
    Регистрация:
    13 окт 2005
    Сообщения:
    52
    Адрес:
    Kyrgyzstan
    и если предыдущий код действительно возвращает текущий ЦПУ, какое смещение будет для вин х64?
     
  9. Zufyxe

    Zufyxe New Member

    Публикаций:
    0
    Регистрация:
    13 авг 2004
    Сообщения:
    137
    Адрес:
    Russia
    FS:[0] это Current PCR
    структура официально недокументирована, и может отличаться для разных систем, сервиспаков, и даже хотфиксов.
    Пользуй API, что я сказал.
     
  10. infern0

    infern0 New Member

    Публикаций:
    0
    Регистрация:
    7 окт 2003
    Сообщения:
    811
    Адрес:
    Russia
    ratix
    KeGetCurrentProcessorNumber используй, что за мания хардкодить смещения в недокументированные структуры...
     
  11. ratix

    ratix New Member

    Публикаций:
    0
    Регистрация:
    13 окт 2005
    Сообщения:
    52
    Адрес:
    Kyrgyzstan
    действительно.. определено как инлайн ф-ция.. (поэтому её даже в экспортах нет)

    FORCEINLINE
    ULONG
    NTAPI
    KeGetCurrentProcessorNumber(VOID)
    {
    __asm { movzx eax, _PCR KPCR.Number }
    }


    я так понимаю, теперь мне нужна DDK для х64 систем.. чтобы посомтреть как там реализована эта ф-ция..
     
  12. Zufyxe

    Zufyxe New Member

    Публикаций:
    0
    Регистрация:
    13 авг 2004
    Сообщения:
    137
    Адрес:
    Russia
    для х64:
    Код (Text):
    1. __forceinline ULONG KeGetCurrentProcessorNumber (VOID)
    2. {
    3.     return (ULONG)__readgsbyte(0x184);
    4. }
    для IA64:
    Код (Text):
    1. #define KeGetCurrentProcessorNumber() ((ULONG)(PCR->Number))
     
  13. ratix

    ratix New Member

    Публикаций:
    0
    Регистрация:
    13 окт 2005
    Сообщения:
    52
    Адрес:
    Kyrgyzstan
    Zufyxe
    спасибо.. то что нужно..

    я правильно понял, что в винде под х86-64 роль fs: выполняет теперь gs:?
     
  14. rei3er

    rei3er maxim

    Публикаций:
    0
    Регистрация:
    15 янв 2007
    Сообщения:
    917
    Адрес:
    minsk
    связано с появлением инструкции swapgs