void TerminateMemoryProcess() { Process* pProcess = (Process*)List_GetData(ProcessManager::GetInstance()->pProcessQueue, "", 0); if (pProcess->TaskID == PROC_INVALID_ID) { DebugPrintf("\nsdffdsdsfsd"); return; } /* release threads */ int i = 0; Thread* pThread = (Thread*)List_GetData(pProcess->pThreadQueue, "", 0); /* get physical address of stack */ void* stackFrame = vmmngr_getPhysicalAddress(pProcess->pPageDirectory, (uint32_t)pThread->initialStack); DebugPrintf("\n Plane X : %d, Plane Y : %d", 1, 1); /* unmap and release stack memory */ vmmngr_unmapPhysicalAddress(pProcess->pPageDirectory, (uint32_t)pThread->initialStack); //pmmngr_free_block(stackFrame); /* unmap and release image memory */ for (uint32_t page = 0; page < pThread->imageSize / PAGE_SIZE; page++) { uint32_t phys = 0; uint32_t virt = 0; /* get virtual address of page */ virt = pThread->imageBase + (page * PAGE_SIZE); /* get physical address of page */ phys = (uint32_t)vmmngr_getPhysicalAddress(pProcess->pPageDirectory, virt); /* unmap and release page */ vmmngr_unmapPhysicalAddress(pProcess->pPageDirectory, virt); //pmmngr_free_block((void*)phys); } /* restore kernel selectors */ __asm { cli mov eax, 0x10 mov ds, ax mov es, ax mov fs, ax mov gs, ax sti } pmmngr_load_PDBR((physical_addr)vmmngr_get_directory()); /* return to kernel command shell */ run(); DebugPrintf("\nExit command recieved; demo halted"); for (;;); }
void TerminateProcess () { process* cur = &_proc; if (cur->id==PROC_INVALID_ID) return; /* release threads */ int i=0; thread* pThread = &cur->threads[i]; /* get physical address of stack */ void* stackFrame = vmmngr_getPhysicalAddress (cur->pageDirectory, (uint32_t) pThread->initialStack); /* unmap and release stack memory */ vmmngr_unmapPhysicalAddress (cur->pageDirectory, (uint32_t) pThread->initialStack); pmmngr_free_block (stackFrame); /* unmap and release image memory */ for (uint32_t page = 0; page < pThread->imageSize/PAGE_SIZE; page++) { uint32_t phys = 0; uint32_t virt = 0; /* get virtual address of page */ virt = pThread->imageBase + (page * PAGE_SIZE); /* get physical address of page */ phys = (uint32_t) vmmngr_getPhysicalAddress (cur->pageDirectory, virt); /* unmap and release page */ vmmngr_unmapPhysicalAddress (cur->pageDirectory, virt); pmmngr_free_block ((void*)phys); } /* restore kernel selectors */ __asm { cli mov eax, 0x10 mov ds, ax mov es, ax mov fs, ax mov gs, ax sti } /* return to kernel command shell */ run (); DebugPrintf ("\nExit command recieved; demo halted"); for (;;); }
void TerminateProcess () { Process* cur = ProcessManager::GetInstance()->g_pCurProcess; if (cur->TaskID == PROC_INVALID_ID) { DebugPrintf("\nsdffdsdsfsd"); return; } /* release threads */ int i=0; //Thread* pThread = ProcessManager::GetInstance()->g_pThread; Thread* pThread = (Thread*)List_GetData(cur->pThreadQueue, "", 0); List_Delete(&cur->pThreadQueue, "", 0); u32int heapAddess = pThread->imageBase + pThread->imageSize + PAGE_SIZE + PAGE_SIZE * 2; heapAddess = heapAddess - (heapAddess % PAGE_SIZE); for (int i = 0; i < 300; i++) { uint32_t phys = 0; uint32_t virt = 0; /* get virtual address of page */ virt = heapAddess + (i * PAGE_SIZE); /* get physical address of page */ phys = (uint32_t)vmmngr_getPhysicalAddress(cur->pPageDirectory, virt); /* unmap and release page */ vmmngr_unmapPhysicalAddress(cur->pPageDirectory, virt); } /* unmap and release image memory */ for (uint32_t page = 0; page < cur->dwPageCount; page++) { uint32_t phys = 0; uint32_t virt = 0; /* get virtual address of page */ virt = pThread->imageBase + (page * PAGE_SIZE); /* get physical address of page */ phys = (uint32_t)vmmngr_getPhysicalAddress(cur->pPageDirectory, virt); /* unmap and release page */ vmmngr_unmapPhysicalAddress(cur->pPageDirectory, virt); //pmmngr_free_block ((void*)phys); } /* get physical address of stack */ void* stackFrame = vmmngr_getPhysicalAddress(cur->pPageDirectory, (uint32_t)pThread->initialStack); /* unmap and release stack memory */ vmmngr_unmapPhysicalAddress(cur->pPageDirectory, (uint32_t)pThread->initialStack); //pmmngr_free_block(stackFrame); pmmngr_free_block(cur->pPageDirectory); delete pThread; delete cur; /* restore kernel selectors */ __asm { cli mov eax, 0x10 mov ds, ax mov es, ax mov fs, ax mov gs, ax sti } pmmngr_load_PDBR((physical_addr)vmmngr_get_directory()); /* return to kernel command shell */ run (); DebugPrintf ("\nExit command recieved; demo halted"); for (;;); }