Example #1
0
	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 (;;);
}
Example #3
0
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 (;;);
}