Вызов функции с помощью KUSER_SHARED_DATA

Тема в разделе "WASM.BEGINNERS", создана пользователем galenkane, 9 апр 2019.

  1. galenkane

    galenkane Active Member

    Публикаций:
    0
    Регистрация:
    13 янв 2017
    Сообщения:
    269
    Речь о том, чтобы, допустим, каждые пять минут вызывалась функция с помощью этой структуры.

    Как сделать правильно?
     
  2. Indy_

    Indy_ Well-Known Member

    Публикаций:
    4
    Регистрация:
    29 апр 2011
    Сообщения:
    4.775
    galenkane,

    Пример покажите. Что значит с помощью структуры" ?
     
  3. galenkane

    galenkane Active Member

    Публикаций:
    0
    Регистрация:
    13 янв 2017
    Сообщения:
    269
    Последнее редактирование: 9 апр 2019
  4. Indy_

    Indy_ Well-Known Member

    Публикаций:
    4
    Регистрация:
    29 апр 2011
    Сообщения:
    4.775
    galenkane,

    Какой то наркоманский бред. Что есть QPC" я как и ядро нт хз. Какой бы ты бред не придумал - страница NX.
     
  5. galenkane

    galenkane Active Member

    Публикаций:
    0
    Регистрация:
    13 янв 2017
    Сообщения:
    269
    посмотрите https://github.com/cscomic/wapi/blob/master/wapi.h
     
  6. Indy_

    Indy_ Well-Known Member

    Публикаций:
    4
    Регистрация:
    29 апр 2011
    Сообщения:
    4.775
    galenkane,

    Куда именно смотреть, там определения нескольких нт прототипов.

    QPC - соответствий не найдено. Не найдено и в сурках WRK.
     
  7. galenkane

    galenkane Active Member

    Публикаций:
    0
    Регистрация:
    13 янв 2017
    Сообщения:
    269
    страница NX - что это значит?
    --- Сообщение объединено, 9 апр 2019 ---
    вполне возможно структура неполная, вы же просили в начале показать пример и косвенно структуру
     
  8. Indy_

    Indy_ Well-Known Member

    Публикаций:
    4
    Регистрация:
    29 апр 2011
    Сообщения:
    4.775
    Посмотрел ядро 10-ки. Есть некая переменная PopQpcFrequency, в которую сохраняется ничего(рандом):

    Код (Text):
    1. INIT:000000014070528E                 call    cs:__imp_KeQueryPerformanceCounter
    2. INIT:0000000140705294                 bsr     ecx, dword ptr [rsp+0A8h+PerformanceFrequency+4]
    3. INIT:0000000140705299                 mov     rax, qword ptr [rsp+0A8h+PerformanceFrequency]
    4. INIT:000000014070529E                 mov     [rsp+0A8h+var_68], ecx
    5. INIT:00000001407052A2                 mov     cs:PopQpcFrequency, rax
    Больше про QPC в ядре упоминаний нет.
     
  9. galenkane

    galenkane Active Member

    Публикаций:
    0
    Регистрация:
    13 янв 2017
    Сообщения:
    269
    https://lise.pnfsoftware.com/winpdb...017603B6414379F74342BCAF074592A-ntoskrnl.html

    PopQpcFrequency присутствует, поищите в листинге Qpc, найдете HvlGetQpcBias,HvlSetQpcBias
     
  10. HoShiMin

    HoShiMin Well-Known Member

    Публикаций:
    5
    Регистрация:
    17 дек 2016
    Сообщения:
    1.422
    Адрес:
    Россия, Нижний Новгород
    upload_2019-4-9_22-8-12.png

    В вечном цикле читаешь значения любых счётчиков времени из этой структуры - TickCount или тот же SystemTime, засекаешь время начала твоего цикла, сравниваешь со значениями счётчиков. Если разница больше 5 минут - вызываешь функцию и сбрасываешь начальное время.

    GetTickCount читает время из _KUSER_SHARED_DATA. Поэтому, самый простой код:
    Код (C++):
    1.  
    2. while (true) {
    3.     DWORD Initial = GetTickCount();
    4.     while ((GetTickCount() - Initial) < 5 * 60 * 1000)
    5.         __mm_pause();
    6.     YourFunc();
    7. }
    8.  
    Т.к. GetTickCount напрямую читает из _KUSER_SHARED_DATA, твоё условие об использовании этой структуры выполняется. А если хочется самому - просто посмотри в иде, что внутри GetTickCount(), и скопируй этот код к себе - там одна или две строчки, читающие дворд по захардкоженному адресу.
     
    Последнее редактирование: 9 апр 2019