Линковщик не видит функцию NtQuerySystemInformation

Тема в разделе "WASM.BEGINNERS", создана пользователем dZentle_man, 27 июл 2009.

  1. dZentle_man

    dZentle_man New Member

    Публикаций:
    0
    Регистрация:
    24 авг 2008
    Сообщения:
    414
    Вопрос, конечно, не совсем по профилю форума, потому как не ассемблер, а Си...

    Захотелось мне в общем написать свой собственный монитор загруженности процессора. В Microsoft PlatformSDK есть функция NtQuerySystemInformation, которая по идее может мне выдать нужную информацию. В общем я написал небольшой кусочек кода чтобы проверить ее работоспособность, но компилер выдает сообщение "unresolved external symbol _NtQuerySystemInformation...". Если совсем подробно:

    Заголовочный файл, указанный в SDK, подключил. Вот, собственно, код:
    Код (Text):
    1. #include <winternl.h>
    2.  
    3. main()
    4. {
    5.     int SPPI = 8; // Код, определяющий что функция должна выдать информацию по
    6.  
    7. производительности проца, подсмотрел в winternl.h
    8.     int SI [10]; // Буфер, в который должна пойти структура данных
    9.     int SIL = 10; // Размер буфера под структуру данных
    10.     int I; // Переменная, в которую функция выдаст информацию о результате
    11.  
    12. выполнения
    13.    
    14.     I = NtQuerySystemInformation(SPPI, SI, SIL);
    15. }
    Да, этот кусок кода не будет делать ничего полезного. Его написал только для того, чтобы проверить работоспособность функции - скомпилируется ли или выдаст тыщу ошибок.
     
  2. Freeman

    Freeman New Member

    Публикаций:
    0
    Регистрация:
    10 фев 2005
    Сообщения:
    1.385
    Адрес:
    Ukraine
    надо бы ntdll.lib прилинковать, иначе действительно откуда знать линкеру чо такое NtQuerySystemInformation
     
  3. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Си очень даже по ппрофилю форума)

    Тебе нужно объявить функцию как _stdcall, а у тебя судя по манглингу она _cdecl.
     
  4. dZentle_man

    dZentle_man New Member

    Публикаций:
    0
    Регистрация:
    24 авг 2008
    Сообщения:
    414
    Freeman
    Прописаны нужные пути к инклудам и либам DDK в vsvars32.bat.

    Great
    Это очень и очень радует)
    Я, конечно, пока еще нуб и все такое, но я думал что микрософтовские функции по _stdcall и вызываются. В любом случае, даже понятия не имею что мне нужно изменить, чтобы увериться что вызов идет по _stdcall...
     
  5. Freeman

    Freeman New Member

    Публикаций:
    0
    Регистрация:
    10 фев 2005
    Сообщения:
    1.385
    Адрес:
    Ukraine
    либо указать явно в прототипе функции, либо сказать компилеру /Gz вроде
     
  6. Vilco

    Vilco Vitaly

    Публикаций:
    0
    Регистрация:
    5 мар 2007
    Сообщения:
    190
    Адрес:
    Nsk, Russia
    Ага, в свойствах проекта (Configuration properties -> C/C++ -> Advanced -> Calling convention) есть выпадающий списочек даже
     
  7. dZentle_man

    dZentle_man New Member

    Публикаций:
    0
    Регистрация:
    24 авг 2008
    Сообщения:
    414
    Freeman
    Задал ключ при компиляции, все то же самое:
    Vilco
    Я в блокноте пишу, компилирую в командной строке.
     
  8. Forever

    Forever Виталий

    Публикаций:
    0
    Регистрация:
    12 апр 2008
    Сообщения:
    244
    Тогда передай параметры линкеру, что-то вроде cl /Gz procmon.c /link ntdll.lib
     
  9. dZentle_man

    dZentle_man New Member

    Публикаций:
    0
    Регистрация:
    24 авг 2008
    Сообщения:
    414
    Помогло. Спасибо!