У вас есть NtReadVirtualMemory, но в режиме ядра нет версии Zw *, что означает, что вам придется найти адрес самостоятельно (с помощью KeServiceDescriptorTable будет работать, но сканирование памяти также вариант).
Имейте в виду, что если вы хотите использовать какие-либо адреса в режиме ядра, вам нужно установить для PreviousMode текущего потока значение 0 (KernelMode), если вы выполняете его в контексте непоток ядра (например, в процедуре обратного вызова вы можете быть помещены в контекст другого процесса, отличного от NTOSKRNL).Это то, что подпрограммы Zw * будут делать для вас автоматически в режиме ядра, но, как я уже сказал, очевидно, что для режима NtReadVirtualMemory в режиме ядра не существует (Microsoft просто не хочет, чтобы вы использовали его, я думаю,).
Второй подход состоит в том, чтобы присоединить к контексту процесса, который вы хотите прочитать из памяти, и затем использовать для копирования память MmCopyMemory (задокументировано в MSDN).с адреса, действительного в процессе, который вы только что подключили, к вашему собственному буферу.Затем вы можете получить доступ к скопированной памяти из вашего собственного буфера.Не забудьте отключить.
В качестве альтернативы, вы можете выбрать путь, предложенный @RbMm.Лично я бы принял его предложение, потому что это документированный подход, и вы, вероятно, добьетесь большего успеха в его реализации (не говоря уже о том, что у вас будет меньше работы).