Чтение физической памяти, x86 win7 IRQL>0

Тема в разделе "WASM.NT.KERNEL", создана пользователем DeRekX, 22 ноя 2010.

  1. DeRekX

    DeRekX New Member

    Публикаций:
    0
    Регистрация:
    21 июл 2007
    Сообщения:
    98
    Адрес:
    Russia
    Всем, привет.

    Нужно измерить время запроса к физической памяти.
    Задача - обратиться к физической памяти.

    Следующие способы чтения работают только на passive level:
    --ZwOpenSection(Device\PhysicalMemory) и ZwMapViewOfSection
    --MmMapIoSpace
    --ZwCreateFile(Device\PhysicalMemory) - не завёлся, см ниже.

    Код (Text):
    1. WCHAR  wc_physmem_mame[] = L"\\Device\\PhysicalMemory";
    2. InitializeObjectAttributes ( &attributes, &us_physmem_mame, OBJ_CASE_INSENSITIVE | OBJ_KERNEL_HANDLE, NULL, NULL );
    3. ...
    4. NTSTATUS nt_status = ZwCreateFile(&h_file, FILE_READ_EA, &attributes, &IoStatus, NULL, FILE_ATTRIBUTE_NORMAL, FILE_SHARE_READ|FILE_SHARE_WRITE,  FILE_OPEN, FILE_NON_DIRECTORY_FILE|FILE_WRITE_THROUGH,NULL, 0 );  
    5. /* -> nt_status = STATUS_OBJECT_TYPE_MISMATCH  */
    Поделитесь опытом, какие могут быть альтернативные способы чтения физической памяти?
    Хорошо бы найти способ, работающий на повышенном приоритете.
     
  2. x64

    x64 New Member

    Публикаций:
    0
    Регистрация:
    29 июл 2008
    Сообщения:
    1.370
    Адрес:
    Россия
    И не должен был, так нельзя делать в принципе.

    Ну тут вариантов как бы не шибко-то много. Например, есть MmAllocatePagesForMdl() с последующим проецированием на а.п. ядра через MmGetSystemAddressForMdlSafe() и обращениями через полученный виртуальный адрес. Дело в том, что это чуть ли не самый распространённый метод доступа к физической памяти, так что результат будет вполне актуальным. Но это смотря для чего тебе нужен результат, такой способ может и не подойти.
     
  3. DeRekX

    DeRekX New Member

    Публикаций:
    0
    Регистрация:
    21 июл 2007
    Сообщения:
    98
    Адрес:
    Russia
    x64 спасибо за ответ.

    Необходимо измерить время запроса к физической памяти.

    Прочитанные данные не рассматриваются.

    Время хорошо бы получать наиболее точно, по возможности на IRQL>0
     
  4. x64

    x64 New Member

    Публикаций:
    0
    Регистрация:
    29 июл 2008
    Сообщения:
    1.370
    Адрес:
    Россия
    Тебе нужно номинальное время или фактическое? Если фактическое, то предложенный выше способ для этих целей подойдёт. Если номинальное, то каким-то образом надо прочитать значения таймингов планок памяти (хотя, думаю, это не то, что тебе нужно всё же). Как именно это сделать - не знаю, пусть лучше железячники подскажут, возможно, как-то через WMI можно (например, что-то вроде Win32_PhysicalMemory).

    На Windows 7 указанные выше функции позволяют работать с физической памятью на повышенных IRQL.
     
  5. DeRekX

    DeRekX New Member

    Публикаций:
    0
    Регистрация:
    21 июл 2007
    Сообщения:
    98
    Адрес:
    Russia
    Нужно узнать время затрачиваемое системой на обращение к памяти. По твоей формулировке подходит фактическое.

    Функция MmAllocatePagesForMdl должна мне помочь, но есть ли способ обращения к физ. памяти без выделения доп. памяти (Mdl)?
    Существует ли для физической памяти аналог оператора разыменования как для виртуальной?
    Чем меньше будет лишнего в операции, тем точнее будет полученное время.

    Вот при bluescreen, как происходит дамп физической памяти?
     
  6. x64

    x64 New Member

    Публикаций:
    0
    Регистрация:
    29 июл 2008
    Сообщения:
    1.370
    Адрес:
    Россия
    Ты повторяешь эту фразу уже 3-ий раз, но она ничего не значит, на самом деле. О каком обращении идёт речь? В какой момент? Система большая и мест, где она обращается к физической памяти, немало.

    Нет.

    Почти все драйвера и сама система обращаются к физической памяти через виртуальную (MDL), так зачем тебе что-то ещё?

    Через проекцию на виртуальное а.п. ядра. Функции я уже приводил выше, и сама система делает так же.
     
  7. DeRekX

    DeRekX New Member

    Публикаций:
    0
    Регистрация:
    21 июл 2007
    Сообщения:
    98
    Адрес:
    Russia
    x64 благодарю за ответы

    Обращение к памяти и измерение затрачиваемого времени осуществляю сам.
    Постараюсь фразу пояснить кодом:

    Код (Text):
    1. for (...){
    2. t_start[i] = get_time();
    3. request_to_physical_memory(next_phys_addr);
    4. t_finish[i] = get_time();
    5. ...
    6. }...
    Функция get_time() у меня есть, необходимо найти функцию request_to_physical_memory().

    Для того, чтобы не измерить "среднюю температуру по больнице", функция request_to_physical_memory() должна выполнять по-меньше лишнего(1) и работать на повышенных приоритетах(2).

    Такой подход хочу использовать для идентификации режима работы компьютерной системы, а для этого, как я понимаю, нужно выполнение двух условий см. выше.