Задача: читать и писать (для начала хотябы читать) в физическую память по любому валидному адресу (в кернеле). Для этого мне надо знать сколько вообще памяти на компе. Как узнать из кернела сколько именно физической памяти есть? И надо читать сию память. Нарыл здесь на форуме и на майкрософте следующую инфу: есть секция: \Device\PhysicalMemory, вот сампл по ее использованию: http://msdn.microsoft.com/en-us/library/aa479067.aspx Код (Text): UNICODE_STRING UnicodeString; // Name of the section object OBJECT_ATTRIBUTES ObjectAttributes; // Description for the section object HANDLE hPhysicalMemoryHandle; // Handle to the section object PHYSICAL_ADDRESS MappedLength; // Length of the frame buffer PHYSICAL_ADDRESS MappedBase; // Base physical address (CPU-relative) // of the frame buffer // Allocate a variable to receive the base virtual address of the view. // Set it to NULL for input to ZwMapViewOfSection, to specify that the memory // manager (rather than the caller) should determine the base virtual address. PVOID pViewBase = NULL; RtlInitUnicodeString(&UnicodeString, L"\\Device\\PhysicalMemory"); InitializeObjectAttributes( &ObjectAttributes, &UnicodeString, OBJ_CASE_INSENSITIVE | OBJ_KERNEL_HANDLE, (HANDLE) NULL, (PSECURITY_DESCRIPTOR) NULL); // Open a handle to the physical-memory section object. ntStatus = ZwOpenSection(&hPhysicalMemoryHandle, SECTION_ALL_ACCESS, &ObjectAttributes); if(NT_SUCCESS(ntStatus)) { ntStatus = ZwMapViewOfSection( hPhysicalMemoryHandle, NtCurrentProcess(), &pViewBase, 0L, (ULONG_PTR)MappedLength.QuadPart, &MappedBase, (PULONG_PTR)(&(MappedLength.QuadPart)), ViewUnmap, 0, PAGE_READWRITE | PAGE_WRITECOMBINE); if(NT_SUCCESS(ntStatus)) { // pViewBase holds the base virtual address of the view. } // Close the handle to the physical-memory section object. ZwClose(hPhysicalMemoryHandle); } но там же нашел следующее: http://support.microsoft.com/kb/189327 А под ХР мне больше всего и надо... Так вот! Взываю к вам, о боги кернела. Просветите вашего скромного поклонника... Задача-то уверен решалась до меня и не раз. Если будете меня отсылать в МСДН или еще в какие доки -- то будьте любезны тыкать мордой в конкретное го.в.но в виде ссылок на нужную инфу. Я оттудава не вылажу в данный момент и буду продолжать не вылазить, но пока все что нарыл...
А можно более подробно порядок вызова апишек? а то тупо заменить вызов ZwMapViewOfSection на MmMapIoSpace не получается по причине разности параметров: Код (Text): NTSTATUS NTAPI ZwMapViewOfSection( IN HANDLE SectionHandle, IN HANDLE ProcessHandle, IN OUT PVOID *BaseAddress, IN ULONG ZeroBits, IN ULONG CommitSize, IN OUT PLARGE_INTEGER SectionOffset OPTIONAL, IN OUT PSIZE_T ViewSize, IN SECTION_INHERIT InheritDisposition, IN ULONG AllocationType, IN ULONG Protect ); PVOID MmMapIoSpace ( IN PHYSICAL_ADDRESS PhysicalAddress, IN SIZE_T NumberOfBytes, IN MEMORY_CACHING_TYPE CacheType ); или мне тупо в цикле вызвать MmMapIoSpace для всех адресов. Ну типа того: Код (Text): offset = 0; while (offset < AllMemorySize) { MmMapIoSpace ( 0 + offset, size, "какой-то тип кеширования..."); offset += size; } ???
Забудь про секции вообще. LARGE_INTEGER Physaddr = { 0xB8000, 0 }; // physical address 0x000b8000 PVOID ptr = MmMapIoSpace (Physaddr, 0x10000, MmNonCached) по виртуальному адресу ptr получишь 0x10 спроецированных физ страниц с физадреса B8000 к примеру.
Ну супер. Тока вот как проверить что читается именно физ. память? Как создать буфер какой-нить с кодовой строкой скажем и потом его найти сканом? Ведь винда все могет сбросить в своп и досвидания...
sasha_s Проекция находится в невыгружаемой памяти. Странные у тебя вопросы, что проверять, если ты сам физический адрес задаёшь..