Код (Text): NTSTATUS DriverEntry(PDRIVER_OBJECT drv_obj, PUNICODE_STRING reg_path) { PCWSTR physicalMemoryCString = L"\\Device\\PhysicalMemory"; OBJECT_ATTRIBUTES objectAttribute = { '\0' }; UNICODE_STRING physicalMemoryString; NTSTATUS currentStatus = STATUS_SUCCESS; HANDLE memoryHandle = 0; unsigned long ssize = 0xffff; PHYSICAL_ADDRESS viewBaseAddress; unsigned long dwPAddress = 0; unsigned long baseAddres = 0x000F0000; DbgPrint("Started\n"); DbgPrint("Build time: "); DbgPrint(__TIME__); DbgPrint("\n"); RtlInitUnicodeString(&physicalMemoryString, physicalMemoryCString); InitializeObjectAttributes(&objectAttribute, &physicalMemoryString, OBJ_CASE_INSENSITIVE, 0, 0); currentStatus = ZwOpenSection(&memoryHandle, SECTION_MAP_READ, &objectAttribute); if(currentStatus == STATUS_SUCCESS) { DbgPrint("ZwOpenSection loaded successfully...\n"); } else { DbgPrint("ZwOpenSection FAILED...\n"); return currentStatus; } viewBaseAddress.HighPart = (ULONGLONG)0x00000000; viewBaseAddress.LowPart = (ULONGLONG)baseAddres; currentStatus = ZwMapViewOfSection(memoryHandle, NtCurrentProcess(), (PVOID)&dwPAddress, 0, ssize, &viewBaseAddress, &ssize, ViewShare, 0, PAGE_READONLY); if(currentStatus == STATUS_SUCCESS) { DbgPrint("ZwMapViewOfSection() SUCCESS\n"); DbgPrint("Physical memory starts at: %p\n", dwPAddress); } DbgPrint("Build time: %s\n", __TIME__); DbgPrint("Bios: %s\n", ((char *)0xFEC71)); ......... } В итоге в отладке вижу Код (Text): Bios: 00040000 а должно быть 000f0000. Никто не подскажет в чем проблема?
\wrk\base\ntos\inc\smbios.s, smbios.h WMI, там юзается MmMapIoSpace(), в которую физический адрес передаётся, далее проекция сканится на сигнатуру. SYSID_EPS_SEARCH_START 0x000e0000 Но какое значение передать в сервис незнаю, точнее не помню, чтото вроде 0xFEC00000. В ядре это без проблем.