В моей программе на С++ (в Windows) я выделяю блок памяти и могу убедиться, что он остается заблокированным (несвязанным и непрерывным) в физической памяти (т.е. используя VirtualAllocEx(), MapUserPhysicalPages() и т.д.).
В контексте моего процесса я могу получить адрес виртуальной памяти этого блока, , но мне нужно узнать адрес PHYSICAL памяти, чтобы передать его на какое-то внешнее устройство.
1. Есть ли способ перевести виртуальный адрес на физический в моей программе в режиме USER?
2. Если нет, я могу узнать это виртуальное физическое отображение только в режиме KERNEL. Думаю, это означает, что я должен написать драйвер, чтобы сделать это...? Знаете ли вы о каком-либо легко доступном драйвере /DLL/API, который я могу использовать, чтобы мое приложение (программа) взаимодействовало с тем, чтобы сделать перевод?
3. В случае, если мне придется самому написать драйвер, как мне сделать этот перевод? какие функции я использую? Это mmGetPhysicalAddress()? Как его использовать?
4. Кроме того, если я правильно понимаю, mmGetPhysicalAddress() возвращает физический адрес виртуального базового адреса, который находится в контексте вызывающего процесса. Но если вызывающий процесс является драйвером, и я использую свое приложение для вызова драйвера для этой функции, я меняю контексты, и я больше не в контексте приложения, когда вызывается процедура mmGetPhysicalAddress... поэтому как перевести виртуальный адрес в пространство приложения (пользовательский режим), а не драйвер?
Любые ответы, советы и выдержки из кода будут очень благодарны!
Спасибо