Не нашел ответа на вопрос, можно ли к \Device\PhysicalMemory обратиться из ring3? Код (Text): HANDLE hPM = CreateFile(L"\\??\\Device\\PhysicalMemory",FILE_READ_ATTRIBUTES| FILE_READ_DATA,FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL); if (hPM == INVALID_HANDLE_VALUE) { return GetLastError(); } получаю ошибку 3. Видел, что в ядре используют, NtOpenSection в ring3 какой ее аналог?
drem1lin Это секция, открывайте через NtOpenSection. Для этого сервиса пользовательский аналог OpenFileMapping().
d2k9 Прикрыта.. на XP работает. Вы плохо осведамлены. Помню когдато аверы директорию не проверяли, тупо сравнивали по имени секцию, этим можно было их обойти. Вобщем функционал кошерный, открывает всё ядро для юзермода, не смотря на палевность.
Это просто задание такое, надо считать ОП с определенного адреса, определенного размера, вот и разбираюсь, что и как
Уважаемый Clerk видимо забыл, что ХР в линейке виндов стоит левее 2003 (имхо, раньше вышла), так что d2k9 хорошо осведомлен
gorodon Не забыл. Просто сказал что в XP работает. Разумеется это чисто теоретический интерес представляет, практически подобные манипуляции не нужны(из юзермода).
drem1lin Во первых тут раздел про ринг3. Во вторых что есть "ОП" - предположу что имелось ввиду адресное пространство. MmMapIoSpace() отображает определённый регион физической памяти в системное ап.
2 drem1lin (по поводу \Device\PhysicalMemory): Код (Text): HANDLE hSection; OBJECT_ATTRIBUTES ObjectAttributes; NTSTATUS status; DWORD Size = 0x00002000; void *pPointer = (void*)0x000FE000;//адрес, с которого надо начать чтение // // _UNICODE_STRING strObjName; strObjName.Buffer = (PWSTR)L"\\Device\\PhysicalMemory"; strObjName.Length = wcslen(strObjName.Buffer)*sizeof(WCHAR); strObjName.MaximumLength = strObjName.Length + sizeof(WCHAR); // ObjectAttributes.uLength = sizeof( OBJECT_ATTRIBUTES ); ObjectAttributes.hRootDirectory = NULL; ObjectAttributes.pObjectName = &strObjName; ObjectAttributes.uAttributes = OBJ_CASE_INSENSITIVE; ObjectAttributes.pSecurityDescriptor = NULL; ObjectAttributes.pSecurityQualityOfService = NULL; // status = pNtOpenSection(&hSection,SECTION_MAP_READ,&ObjectAttributes); // if(status == STATUS_SUCCESS) { PBYTE pbFile = (PBYTE) MapViewOfFile(hSection, SECTION_MAP_READ, 0, (DWORD)pPointer, Size); if(pbFile != NULL) ;//здесь копируем с адреса pbFile, размер Size else printf("MapViewOfFile error!\n"); // UnmapViewOfFile(pbFile); // pNtClose(hSection); } else { printf("NtOpenSection return Error %08X\n",status); } Rel Так расскажите про альтернативные способы...