Здравствуйте _dIAMOND_, Вы писали:
D>Предположим, я знаю физический адрес некоторой структуры, как мне ее считать/записать? Код должен выполняться под WinNT ring 0.
Надо делать ZwOpenSection на "\Device\PhysicalMemory" а потом мапить нужный адрес. Под подробности и готовый должен быть
на www.sysinternals.com. Асм скорее всего не понадобится. Но это только для администратора.
RM>Надо делать ZwOpenSection на "\Device\PhysicalMemory" а потом мапить нужный адрес. Под подробности и готовый должен быть RM>на www.sysinternals.com. Асм скорее всего не понадобится. Но это только для администратора.
не согласен. автор вопроса писал, что это дело должно работать в ring0, то есть в драйвере, то есть привилегии админа не нужны. кстати, в NT4 DDK есть пример драйвера mapmem. нам описано, как сделать тоже самое, не прибегая к NativeAPI.
RM>>Надо делать ZwOpenSection на "\Device\PhysicalMemory" а потом мапить нужный адрес. Под подробности и готовый должен быть RM>>на www.sysinternals.com. Асм скорее всего не понадобится. Но это только для администратора.
LD>не согласен. автор вопроса писал, что это дело должно работать в ring0, то есть в драйвере, то есть привилегии админа не нужны. кстати, в NT4 DDK есть пример драйвера mapmem. нам описано, как сделать тоже самое, не прибегая к NativeAPI.
В файле general\mapmem\sys\mapmem.c тоже используется ZwOpenSection на "\Device\PhysicalMemory"
//
// Get a pointer to physical memory...
//
// - Create the name
// - Initialize the data to find the object
// - Open a handle to the oject and check the status
// - Get a pointer to the object
// - Free the handle
//
RtlInitUnicodeString (&physicalMemoryUnicodeString,
L"\\Device\\PhysicalMemory");
InitializeObjectAttributes (&objectAttributes,
&physicalMemoryUnicodeString,
OBJ_CASE_INSENSITIVE,
(HANDLE) NULL,
(PSECURITY_DESCRIPTOR) NULL);
ntStatus = ZwOpenSection (&physicalMemoryHandle,
SECTION_ALL_ACCESS,
&objectAttributes);
if (!NT_SUCCESS(ntStatus))
{
MapMemKdPrint (("MAPMEM.SYS: ZwOpenSection failed\n"));
goto done;
}
только там еще добавлены вызовы ObReferenceObjectByHandle и HalTranslateBusAddress.
Я, конечно, не спициалист по драйверам для NT, но насколько я знаю драйвера официально могут использовать NativeAPI
в отличии от user-mode программ и к тому же для драйвером доступно несколько болшьше вызовов API, в том числе доступен
HAL-API.
Здравствуйте, _dIAMOND_, Вы писали:
D>Предположим, я знаю физический адрес некоторой структуры, как мне ее считать/записать? Код должен выполняться под WinNT ring 0.
DWORD MiMapPageInHyperSpace (DWORD BaseAddr,OUT PDWORD Irql);
В принципе, ничего не мешает сделать это вручную в ядре.
Здравствуйте, Murr, Вы писали:
M>Здравствуйте, _dIAMOND_, Вы писали:
D>>Предположим, я знаю физический адрес некоторой структуры, как мне ее считать/записать? Код должен выполняться под WinNT ring 0.
M>DWORD MiMapPageInHyperSpace (DWORD BaseAddr,OUT PDWORD Irql); M>В принципе, ничего не мешает сделать это вручную в ядре.
Посмотрел сейчас — в 2k уже этой функции нет. Есть некая MmGetVirtualForPhysical.
Здравствуйте, Аноним, Вы писали:
M>>Посмотрел сейчас — в 2k уже этой функции нет. Есть некая MmGetVirtualForPhysical.
А>MiMapPageInHyperSpace в Win2k есть — она просто не экспортируется из ntoskrnl.exe
Как я понимаю, MmGetVirtualForPhysical делает то же самое.
Вообще, политика M$ не писать Doc по таким функциях несколько удивляет.
В Linux я делаю kmap() и в ус не дую, а здесь рискую сломать %%пу.