Как узнать количество ядер на процессор?

Тема в разделе "WASM.NT.KERNEL", создана пользователем The_GorYnycH, 27 мар 2009.

  1. The_GorYnycH

    The_GorYnycH New Member

    Публикаций:
    0
    Регистрация:
    15 фев 2008
    Сообщения:
    32
    билд под виста х64
    Собственно, как это сделать? ddk-шных функций не нашел.
    __cpuid вроде как не поддерживается ddk компилятором.
    Использовать GetLogicalProcessorInformation не получилось. Подключил Kernel32.lib, но если инклюдить файл windows.h, при компиляции много ошибок. Если самому написать прототип, то компилит и линкит нормально, но драйвер не грузится, и отладчиком прицепиться не получается. Можно ли вообще вызывать WINAPI функции в режиме ядра?
    Ткните носом пожалуйста.
     
  2. Zufyxe

    Zufyxe New Member

    Публикаций:
    0
    Регистрация:
    13 авг 2004
    Сообщения:
    137
    Адрес:
    Russia
    ZwQuerySystemInformation, класс SystemLogicalProcessorInformation.
     
  3. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Не будет грузиться драйвер с импортом из винапи, это не разрешается. Только импорт из ядра, хала, драйверов и всяких ядерных bootvid.dll и тп.
    Это был на вопрос принципиальный о загрузке.
    А как сделать правильно уже написали
     
  4. The_GorYnycH

    The_GorYnycH New Member

    Публикаций:
    0
    Регистрация:
    15 фев 2008
    Сообщения:
    32
    Всем большое спасибо:)
    Попробовал использовать. Видимо руки не из того места растут, не получилось:dntknw:
    Создал *.h файлик, куда занес объявление энума в котором живет SystemLogicalProcessorInformation функции ZwQuerySystemInformation. Компилирую - не линкуется, ругается на unresolved external ZwQuerySystemInformation. Подключил в source-файле ntdll.lib, опять не линкуется. что делать - то? можно поподробнее описать, как её использовать?
    Да, кстати, с extern "C" линкуется, но драйвер не грузится.
     
  5. The_GorYnycH

    The_GorYnycH New Member

    Публикаций:
    0
    Регистрация:
    15 фев 2008
    Сообщения:
    32
    дык... вроде получилось запустить. Интересно вот что, погуглив нашел два варианта SYSTEM_INFORMATION_CLASS. Один поменьше, другой побольше. В котором побольше было объявление SystemLogicalProcessorInformation. Вот только ZwQuerySystemInformation с первым параметром SYSTEM_INFORMATION_CLASS::SystemLogicalProcessorInformation возвращает аж 0х900 байт, и что делать с ними вообще непонятно. Мне кажется, или чтоб в ядре получить количество ядер на процессор надо себе голову сломать?
     
  6. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Код (Text):
    1.     mov eax,1
    2.     cpuid
    3.     shr ebx,16
    4.     and ebx,11111111b
     
  7. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Да блин я же говорю нельзя с юзермодными длл линковать в том числе с ntdll
     
  8. The_GorYnycH

    The_GorYnycH New Member

    Публикаций:
    0
    Регистрация:
    15 фев 2008
    Сообщения:
    32
    мдя... сначала думал, что чтоб заюзать ZwQueryS?stemInformation надо явно слинковать ntdll.lib:) потом понял свой косяк и драйвер загрузился. но счастья все равно нет... хотелось бы разобраться до конца.
    Не знаешь почему существует два варианта SYSTEM_INFORMATION_CLASS? Как интерпретировать полученные из функции данные? видимо, нужно объявление некой структуры, описывающей процессор, которой у меня нет, где ее взять?
    большое спасибо за ответы.
     
  9. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    The_GorYnycH
    На твоём месте я бы у Грита такие мелочи не спрашивал..
    Неужеле в гугле трудно посмотреть http://www.google.ru/search?hl=ru&q=SYSTEM_INFORMATION_CLASS&lr=&aq=f&oq=
    И есчо, можно асм-вставки делать.
     
  10. SashaTalakin

    SashaTalakin New Member

    Публикаций:
    0
    Регистрация:
    15 дек 2008
    Сообщения:
    261
    Научи как в х64
     
  11. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    SashaTalakin
    Походу также, как и в x32. Если нет инлайн асма, компилятор фтопку.
    А лично для вас, судя по числу постов где упоминается x64 уточню - большинству апсолютно пофиг будет работать код на x64, или не будет. Для меня это тоже не имеет значения.
     
  12. The_GorYnycH

    The_GorYnycH New Member

    Публикаций:
    0
    Регистрация:
    15 фев 2008
    Сообщения:
    32
    ога, нетрудно. я за несколько часов поиска не нашел ответов на свои вопросы, вот и спросил. Может ты знаешь?
     
  13. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Код (Text):
    1. typedef struct _SYSTEM_BASIC_INFORMATION {
    2.     ULONG Reserved;
    3.     ULONG TimerResolution;
    4.     ULONG PageSize;
    5.     SYSINF_PAGE_COUNT NumberOfPhysicalPages;
    6.     SYSINF_PAGE_COUNT LowestPhysicalPageNumber;
    7.     SYSINF_PAGE_COUNT HighestPhysicalPageNumber;
    8.     ULONG AllocationGranularity;
    9.     ULONG_PTR MinimumUserModeAddress;
    10.     ULONG_PTR MaximumUserModeAddress;
    11.     ULONG_PTR ActiveProcessorsAffinityMask;
    12.     CCHAR NumberOfProcessors;
    13. } SYSTEM_BASIC_INFORMATION, *PSYSTEM_BASIC_INFORMATION;
    Смещение NumberOfProcessors от начала структуры 4*10. Но не все процессоры могут работать, поэтому предыдущее поле также нужно учитывать. Но это для x32 систем, для x64 хз какой размер полей.
     
  14. SashaTalakin

    SashaTalakin New Member

    Публикаций:
    0
    Регистрация:
    15 дек 2008
    Сообщения:
    261
    Думаю тут недооценка того сколько людей уже работают на 64битных операционных системах
     
  15. The_GorYnycH

    The_GorYnycH New Member

    Публикаций:
    0
    Регистрация:
    15 фев 2008
    Сообщения:
    32
    попробовал как ты написал.
    ZwQuerySystemInformation возвратила все те же 0х40 байт, так что смело заюзал приведенную тобой структуру. вот результат:
    ... тут пурга,
    ActivProcesssors 0
    NumberProcessors 0xff
    налицо херня
    хотя тот же самый AllocationGranularity - 0х10000 вполне валиден.
    Если надо, могу код выложить, хотя смысла в этом мало.

    По поводу программирования под х32 и х64 - не мы выбираем, нас выбирают:)
    В общем много тут уже было сказано, по делу и не очень, но ответа на вопрос, как узнать количество процов я так и не получил.
     
  16. SashaTalakin

    SashaTalakin New Member

    Публикаций:
    0
    Регистрация:
    15 дек 2008
    Сообщения:
    261
    KeQueryActiveProcessorCount()?
     
  17. SashaTalakin

    SashaTalakin New Member

    Публикаций:
    0
    Регистрация:
    15 дек 2008
    Сообщения:
    261
    Да кстати, см. первое предложение топика:
     
  18. Zufyxe

    Zufyxe New Member

    Публикаций:
    0
    Регистрация:
    13 авг 2004
    Сообщения:
    137
    Адрес:
    Russia
    - Колическтво каких процов ты хочешь узнать?

    Логических?
    - KeNumberProcessors

    Физических?
    - ответил тебе во втором посте
     
  19. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    SashaTalakin
    Используй интринсики, отдельные .asm файлы.
     
  20. The_GorYnycH

    The_GorYnycH New Member

    Публикаций:
    0
    Регистрация:
    15 фев 2008
    Сообщения:
    32
    ну допустим... тогда уточняющий вопрос: я передаю в ZwQuerySystemInformation в первом параметре SystemLogicalProcessorInformation. возвращается мне 0х900 байт в буфере. как их интерпретировать? можно уточнить определение структуры?