Advertisement
Ladies_Man

#OS lab_3-4 (FINALE) driver

Jun 7th, 2015
652
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 5.22 KB | None | 0 0
  1. // READ THIS
  2. // ALL THIS CODE IS ORIGINALLY MADE BY IVAN.M OF ICS9(C)
  3. // ALL RIGHTS RESERVED
  4. // JUNE 2015
  5.  
  6. //OS lab3
  7. //Разработать загружаемый модуль ядра (драйвер), который выводит в отладочный лог список процессов в системе.
  8. //I. ReactOS.
  9. //В созданном в лабораторной работе № 2 драйвере, совместимым с операционными системами Windows NT / ReactOS реализовать получения списка всех процессов в системе и вывод их в отладочный лог. Драйвер //должен загружаться и выгружаться динамически с помощью утилит, идущих в комплекте поставки ОС ReactOS и Windows.
  10.  
  11. //OS lab4
  12. //Разработать загружаемый модуль ядра (драйвер), работающий с виртуальной памятью.
  13. //Используя созданный в лабораторной работе № 2 минимальный драйвер, совместимый с операционными системами Windows NT / ReactOS, реализовать следующее:
  14. //Зарезервировать 10 страниц виртуальной памяти, используя ZwAllocateVirtualMemory(NtCurrentProcess(), MEM_RESERVE, …)
  15. //Обеспечить 5 первых страниц из выделенных 10-ти физическими страницами памяти, используя ZwAllocateVirtualMemory(NtCurrentProcess(), MEM_COMMIT, …)
  16. //Вывести физические адреса и значения PTE для этих 5 страниц.
  17. //Освободить выделенную память.
  18. //Драйвер должен загружаться и выгружаться динамически с помощью утилит, идущих в комплекте поставки ОС ReactOS и Windows.
  19.  
  20. #include <ntifs.h>
  21. #include <exfuncs.h>
  22. #include <mmtypes.h>
  23.  
  24. #define NDEBUG
  25. #include <debug.h>
  26.  
  27. DRIVER_UNLOAD LabUnload;
  28.  
  29. VOID NTAPI LabUnload(IN PDRIVER_OBJECT DriverObject)
  30. {
  31. }
  32.  
  33. NTSTATUS NTAPI DriverEntry(IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING RegPath)
  34. {
  35.     NTSTATUS Status;
  36.     SIZE_T Size = PAGE_SIZE * 10, i, EquestriedSize;
  37.     PVOID BaseAddress = NULL;
  38.     PSYSTEM_PROCESS_INFORMATION ProcessInformation = NULL;
  39.     PHARDWARE_PTE_X86 PPTE = NULL;
  40.     DriverObject->DriverUnload = LabUnload;
  41.     DPRINT1("Ivan.M\n");
  42.  
  43.     DPRINT1("Start allocation\n");
  44.     if (!(Status = NT_SUCCESS(ZwAllocateVirtualMemory(NtCurrentProcess(),
  45.         &BaseAddress,
  46.         0,
  47.         &Size,
  48.         MEM_RESERVE,
  49.         PAGE_READWRITE)))) {
  50.         DPRINT1("Error due to allocation\n");
  51.         return Status;
  52.     }
  53.     Size = PAGE_SIZE * 5;
  54.     if (!(Status = NT_SUCCESS(ZwAllocateVirtualMemory(NtCurrentProcess(),
  55.         &BaseAddress,
  56.         0,
  57.         &Size,
  58.         MEM_COMMIT,
  59.         PAGE_READWRITE)))) {
  60.         DPRINT1("Error due to allocation\n");
  61.         return Status;
  62.     }
  63.     DPRINT1("Memory allocated... I guess\n");
  64.  
  65.  
  66.     DPRINT1("Trying to get list of processes\n");
  67.     ProcessInformation = BaseAddress;
  68.     if (!(Status = NT_SUCCESS(ZwQuerySystemInformation(SystemProcessInformation,
  69.         ProcessInformation, PAGE_SIZE, &EquestriedSize)))) {
  70.         if (EquestriedSize > PAGE_SIZE * 5) {
  71.             DPRINT1("Not enough memory\n");
  72.             return STATUS_NO_MEMORY;
  73.         }
  74.         if (!(Status = NT_SUCCESS(ZwQuerySystemInformation(SystemProcessInformation,
  75.             ProcessInformation, EquestriedSize, NULL)))) {
  76.             DPRINT1("Error due to listing\n");
  77.             return Status;
  78.         }
  79.     }
  80.     while (ProcessInformation->NextEntryOffset) {
  81.         DPRINT1("ImageName: %S\n", ProcessInformation->ImageName.Buffer);
  82.         ProcessInformation = (PSYSTEM_PROCESS_INFORMATION)((ULONG_PTR)ProcessInformation + ProcessInformation->NextEntryOffset);
  83.     }
  84.     DPRINT1("Done!\n");
  85.  
  86.  
  87.     PPTE = (PHARDWARE_PTE_X86)((ULONG)0xC0000000 + (((ULONG)BaseAddress & 0x003FFFFF) >> 10));
  88.     for (i = 0; i < 5; i++) {
  89.         EquestriedSize = *(PSIZE_T)((ULONG)BaseAddress + PAGE_SIZE*i);
  90.         DPRINT1("PTE for page %d:\n", i);
  91.         DPRINT1("   Physical address: %d\n", (PPTE->PageFrameNumber)<<12);
  92.         DPRINT1("   Valid: %d\n", PPTE->Valid);
  93.         DPRINT1("   Write: %d\n", PPTE->Write);
  94.         DPRINT1("   Owner: %d\n", PPTE->Owner);
  95.         DPRINT1("   WriteThrough: %d\n", PPTE->WriteThrough);
  96.         DPRINT1("   CacheDisable: %d\n", PPTE->CacheDisable);
  97.         DPRINT1("   Accessed: %d\n", PPTE->Accessed);
  98.         DPRINT1("   Dirty: %d\n", PPTE->Dirty);
  99.         DPRINT1("   LargePage: %d\n", PPTE->LargePage);
  100.         DPRINT1("   Global: %d\n", PPTE->Global);
  101.         DPRINT1("   CopyOnWrite: %d\n", PPTE->CopyOnWrite);
  102.         DPRINT1("   Prototype: %d\n", PPTE->Prototype);
  103.         DPRINT1("   reserved: %d\n", PPTE->reserved);
  104.         PPTE = (PHARDWARE_PTE_X86)((ULONG)PPTE + sizeof(PHARDWARE_PTE_X86));
  105.     }
  106.  
  107.  
  108.     DPRINT1("Let's free!\n");
  109.     if (!(Status = NT_SUCCESS(ZwFreeVirtualMemory(NtCurrentProcess(),
  110.         &BaseAddress,
  111.         &Size,
  112.         MEM_DECOMMIT)))) {
  113.         DPRINT1("Error due to releasing\n");
  114.         return Status;
  115.     }
  116.     Size = 0;
  117.     if (!(Status = NT_SUCCESS(ZwFreeVirtualMemory(NtCurrentProcess(),
  118.         &BaseAddress,
  119.         &Size,
  120.         MEM_RELEASE)))) {
  121.         DPRINT1("Error due to releasing\n");
  122.         return Status;
  123.     }
  124.     DPRINT1("Successfully freed!\n");
  125.     return STATUS_SUCCESS;
  126. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement