⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 alloc.c

📁 一个Windows下的Linux专用虚拟机
💻 C
字号:
/* * This source code is a part of coLinux source package. * * Dan Aloni <da-x@colinux.org>, 2003 (c) * * The code is licensed under the GPL. See the COPYING file at * the root directory. * */#include <asm/page.h>#include "../ddk.h"#include <colinux/os/alloc.h>#include <colinux/os/kernel/alloc.h>#ifdef DEBUG_CO_OS_ALLOCstatic int allocs;#endifvoid *co_os_alloc_pages(unsigned long pages){	void *ret;	if (pages == 0)		KeBugCheck(0x11117777);	ret = MmAllocateNonCachedMemory(pages * PAGE_SIZE);#ifdef DEBUG_CO_OS_ALLOC			if (ret) {		allocs++;		co_debug("%d(%d)->%x", allocs, pages, ret);	}#endif	return ret;}void co_os_free_pages(void *ptr, unsigned long pages){	if (ptr == 0)		KeBugCheck(0x11117777 + 1);	if (pages == 0)		KeBugCheck(0x11117777 + 2);#ifdef DEBUG_CO_OS_ALLOC			co_debug("%d(%x,%d)", allocs, ptr, pages);	allocs--;#endif	MmFreeNonCachedMemory(ptr, pages * PAGE_SIZE);}#define CO_OS_POOL_TAG (('c' << 0) | ('o' << 8) |  ('l' << 16) | ('x' << 24))void *co_os_malloc(unsigned long bytes){	void *ret;	if (bytes == 0)		KeBugCheck(0x11117777 + 3);	ret = ExAllocatePoolWithTag(NonPagedPool, bytes, CO_OS_POOL_TAG);	#ifdef DEBUG_CO_OS_ALLOC			if (ret) {		allocs++;		co_debug("%d(%d)->%x", allocs, bytes, ret);	}#endif	return ret;}void co_os_free(void *ptr){#ifdef DEBUG_CO_OS_ALLOC			co_debug("%d(%x)", allocs, ptr);	allocs--;#endif	if (ptr == 0)		KeBugCheck(0x11117777 + 4);	ExFreePoolWithTag(ptr, CO_OS_POOL_TAG);}co_rc_t co_os_userspace_map(void *address, unsigned long pages, void **user_address_out, void **handle_out){	void *user_address;	unsigned long memory_size = pages << CO_ARCH_PAGE_SHIFT;	PMDL mdl;	mdl = IoAllocateMdl(address, memory_size, FALSE, FALSE, NULL);	if (!mdl) 		return CO_RC(ERROR);		MmBuildMdlForNonPagedPool(mdl);	user_address = MmMapLockedPagesSpecifyCache(mdl, UserMode, MmCached, NULL, FALSE, HighPagePriority);	if (!user_address) {		IoFreeMdl(mdl);		return CO_RC(ERROR);	}		*handle_out = (void *)mdl;	*user_address_out = PAGE_ALIGN(user_address) + MmGetMdlByteOffset(mdl);		return CO_RC(OK);}void co_os_userspace_unmap(void *user_address, void *handle, unsigned long pages){	PMDL mdl = (PMDL)handle;		if (user_address)		MmUnmapLockedPages(user_address, mdl); 	IoFreeMdl(mdl);}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -