Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // READ THIS
- // ALL THIS CODE IS ORIGINALLY MADE BY IVAN.M OF ICS9(C)
- // ALL RIGHTS RESERVED
- // JUNE 2015
- //OS lab3
- //Разработать загружаемый модуль ядра (драйвер), который выводит в отладочный лог список процессов в системе.
- //I. ReactOS.
- //В созданном в лабораторной работе № 2 драйвере, совместимым с операционными системами Windows NT / ReactOS реализовать получения списка всех процессов в системе и вывод их в отладочный лог. Драйвер //должен загружаться и выгружаться динамически с помощью утилит, идущих в комплекте поставки ОС ReactOS и Windows.
- //OS lab4
- //Разработать загружаемый модуль ядра (драйвер), работающий с виртуальной памятью.
- //Используя созданный в лабораторной работе № 2 минимальный драйвер, совместимый с операционными системами Windows NT / ReactOS, реализовать следующее:
- //Зарезервировать 10 страниц виртуальной памяти, используя ZwAllocateVirtualMemory(NtCurrentProcess(), MEM_RESERVE, …)
- //Обеспечить 5 первых страниц из выделенных 10-ти физическими страницами памяти, используя ZwAllocateVirtualMemory(NtCurrentProcess(), MEM_COMMIT, …)
- //Вывести физические адреса и значения PTE для этих 5 страниц.
- //Освободить выделенную память.
- //Драйвер должен загружаться и выгружаться динамически с помощью утилит, идущих в комплекте поставки ОС ReactOS и Windows.
- #include <ntifs.h>
- #include <exfuncs.h>
- #include <mmtypes.h>
- #define NDEBUG
- #include <debug.h>
- DRIVER_UNLOAD LabUnload;
- VOID NTAPI LabUnload(IN PDRIVER_OBJECT DriverObject)
- {
- }
- NTSTATUS NTAPI DriverEntry(IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING RegPath)
- {
- NTSTATUS Status;
- SIZE_T Size = PAGE_SIZE * 10, i, EquestriedSize;
- PVOID BaseAddress = NULL;
- PSYSTEM_PROCESS_INFORMATION ProcessInformation = NULL;
- PHARDWARE_PTE_X86 PPTE = NULL;
- DriverObject->DriverUnload = LabUnload;
- DPRINT1("Ivan.M\n");
- DPRINT1("Start allocation\n");
- if (!(Status = NT_SUCCESS(ZwAllocateVirtualMemory(NtCurrentProcess(),
- &BaseAddress,
- 0,
- &Size,
- MEM_RESERVE,
- PAGE_READWRITE)))) {
- DPRINT1("Error due to allocation\n");
- return Status;
- }
- Size = PAGE_SIZE * 5;
- if (!(Status = NT_SUCCESS(ZwAllocateVirtualMemory(NtCurrentProcess(),
- &BaseAddress,
- 0,
- &Size,
- MEM_COMMIT,
- PAGE_READWRITE)))) {
- DPRINT1("Error due to allocation\n");
- return Status;
- }
- DPRINT1("Memory allocated... I guess\n");
- DPRINT1("Trying to get list of processes\n");
- ProcessInformation = BaseAddress;
- if (!(Status = NT_SUCCESS(ZwQuerySystemInformation(SystemProcessInformation,
- ProcessInformation, PAGE_SIZE, &EquestriedSize)))) {
- if (EquestriedSize > PAGE_SIZE * 5) {
- DPRINT1("Not enough memory\n");
- return STATUS_NO_MEMORY;
- }
- if (!(Status = NT_SUCCESS(ZwQuerySystemInformation(SystemProcessInformation,
- ProcessInformation, EquestriedSize, NULL)))) {
- DPRINT1("Error due to listing\n");
- return Status;
- }
- }
- while (ProcessInformation->NextEntryOffset) {
- DPRINT1("ImageName: %S\n", ProcessInformation->ImageName.Buffer);
- ProcessInformation = (PSYSTEM_PROCESS_INFORMATION)((ULONG_PTR)ProcessInformation + ProcessInformation->NextEntryOffset);
- }
- DPRINT1("Done!\n");
- PPTE = (PHARDWARE_PTE_X86)((ULONG)0xC0000000 + (((ULONG)BaseAddress & 0x003FFFFF) >> 10));
- for (i = 0; i < 5; i++) {
- EquestriedSize = *(PSIZE_T)((ULONG)BaseAddress + PAGE_SIZE*i);
- DPRINT1("PTE for page %d:\n", i);
- DPRINT1(" Physical address: %d\n", (PPTE->PageFrameNumber)<<12);
- DPRINT1(" Valid: %d\n", PPTE->Valid);
- DPRINT1(" Write: %d\n", PPTE->Write);
- DPRINT1(" Owner: %d\n", PPTE->Owner);
- DPRINT1(" WriteThrough: %d\n", PPTE->WriteThrough);
- DPRINT1(" CacheDisable: %d\n", PPTE->CacheDisable);
- DPRINT1(" Accessed: %d\n", PPTE->Accessed);
- DPRINT1(" Dirty: %d\n", PPTE->Dirty);
- DPRINT1(" LargePage: %d\n", PPTE->LargePage);
- DPRINT1(" Global: %d\n", PPTE->Global);
- DPRINT1(" CopyOnWrite: %d\n", PPTE->CopyOnWrite);
- DPRINT1(" Prototype: %d\n", PPTE->Prototype);
- DPRINT1(" reserved: %d\n", PPTE->reserved);
- PPTE = (PHARDWARE_PTE_X86)((ULONG)PPTE + sizeof(PHARDWARE_PTE_X86));
- }
- DPRINT1("Let's free!\n");
- if (!(Status = NT_SUCCESS(ZwFreeVirtualMemory(NtCurrentProcess(),
- &BaseAddress,
- &Size,
- MEM_DECOMMIT)))) {
- DPRINT1("Error due to releasing\n");
- return Status;
- }
- Size = 0;
- if (!(Status = NT_SUCCESS(ZwFreeVirtualMemory(NtCurrentProcess(),
- &BaseAddress,
- &Size,
- MEM_RELEASE)))) {
- DPRINT1("Error due to releasing\n");
- return Status;
- }
- DPRINT1("Successfully freed!\n");
- return STATUS_SUCCESS;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement