예제 #1
0
static uintptr_t
get_rusage_data_via_iterator (void)
{
# if ((defined _WIN32 || defined __WIN32__) && !defined __CYGWIN__) || defined __BEOS__ || defined __HAIKU__
  /* On native Windows, there is no sbrk() function.
     On Haiku, sbrk(0) always returns 0.  */
  static void *brk_value;

  if (brk_value == NULL)
    {
      brk_value = malloc (1);
      if (brk_value == NULL)
        return 0;
    }
# else
  void *brk_value;

  brk_value = sbrk (0);
  if (brk_value == (void *)-1)
    return 0;
# endif

  {
    struct locals l;

    l.brk_value = (uintptr_t) brk_value;
    l.data_segment_size = 0;
    vma_iterate (vma_iterate_callback, &l);

    return l.data_segment_size;
  }
}
예제 #2
0
static uintptr_t
get_rusage_as_via_iterator (void)
{
  uintptr_t total = 0;

  vma_iterate (vma_iterate_callback, &total);

  return total;
}
int
main ()
{
  vma_iterate (vma_iterate_callback, NULL);

  /* Let the user interactively look at the /proc file system.  */
  sleep (10);

  return 0;
}
예제 #4
0
SIZE_T WINAPI VirtualQuery(LPCVOID lpAddress,PMEMORY_BASIC_INFORMATION lpBuffer,SIZE_T dwLength) 
{
	#ifdef OS_UNIX_STRUCT
                SIZE_T returnValue=0;
		static BOOL HAVE_PAGE_SIZE = FALSE;
#if defined(USE_NEW_SBRK_ADDRESS_ALGO) && defined(OS_UNIX_STRUCT)
		static void * LAST_END_ADDRESS = NULL;
		if(LAST_END_ADDRESS == NULL)
		{
			LAST_END_ADDRESS = GET_VIRTUAL_END_ADDRESS();
		}
#endif
		if(HAVE_PAGE_SIZE == FALSE)
		{
			HAVE_PAGE_SIZE = MY_HAS_PAGE_SIZE();
			if(HAVE_PAGE_SIZE==FALSE) {
				returnValue=0;
				return returnValue;
			}
		}
		if(lpAddress==NULL&&lpBuffer==NULL||dwLength<=0)
		{
			returnValue=0;
			return returnValue;
		}
#if defined(OS_UNIX_STRUCT) && defined(USE_UNIX_IMAGE_EXTENSION_VQ)
		BOOL is_imaged = (lpBuffer->Type==MEM_IMAGE)?(TRUE):(FALSE);
#endif
		unsigned char free_mem=(lpBuffer->State==MEM_FREE&&lpBuffer->AllocationProtect==PAGE_WRITECOPY)?1:0;
		memset((void*)lpBuffer,0,sizeof(MEMORY_BASIC_INFORMATION));
                unsigned long long pagesize=MY_GET_SYSTEM_PAGE_SIZE();
		vma_it_func zz;
		int x=0;
		int y=0;
		int errno_ = 0;
		void * address=NULL;
		void * test_address=NULL;
		unsigned long long nsize_ = MY_ROUND_UP_PAGE_SIZE((unsigned long long)dwLength);
		unsigned  long long psp = 0;
		unsigned  long long rpsp = 0;
		address = (void*)MY_ROUND_DOWN_PAGE_SIZE((unsigned long long)lpAddress);
		if(free_mem==1&&vma_last_resolve((unsigned long long)address,(unsigned long long)nsize_,&zz)==1)
                {
                        goto VMA_RESOLVE_FUNC_LABEL;
                }
                void * testx_address = NULL;
		BOOL reassign_address = FALSE;
#if defined(USE_NEW_SBRK_ADDRESS_ALGO) && defined(OS_UNIX_STRUCT)
		testx_address=__VOID__POINTER__PROTECTOR((__SBRK__WRAPPER(0)));
		if(LAST_END_ADDRESS!=NULL&&testx_address!=NULL)
		{
			if((((unsigned long long)(testx_address))+((unsigned long long)nsize_)<((unsigned long long)(LAST_END_ADDRESS)))
			{
				reassign_address=TRUE;
			}
		}
#endif
		if(reassign_address==TRUE)
		{
			zz.complete_free_region=1;
		} else {
			x = msync(address, (size_t)(nsize_), 0);
			errno_=errno;
			if(x==-1&&errno_==ENOMEM)
			{
				zz.complete_free_region=1;
			} else {
				zz.complete_free_region=0;
			}
		}
		if(zz.complete_free_region==0)
		{
			x = 0;
			zz.start_address=(unsigned long long)lpAddress;
			zz.end_address=(unsigned long long)lpAddress;
			zz.base_start_address=0;
			zz.base_end_address=0;
			zz.ret=0;
#if defined(OS_UNIX_STRUCT) && defined(USE_UNIX_IMAGE_EXTENSION_VQ)
			if(is_imaged==TRUE)
			{
				vma_iterate(((vma_iterate_callback_fn)&vma_iterate_image_func),(void*)&zz);
				if(zz.ret!=2&&zz.ret!=1)
				{
					zz.ret=0;
				} else {
					zz.ret=1;
				}
			}
		
			if(zz.ret==0)
			{
#endif
			vma_iterate(((vma_iterate_callback_fn)&vma_iterate_func),(void*)&zz);
			if(zz.ret!=1)
			{
				zz.ret=0;
				vma_iterate(((vma_iterate_callback_fn)&vma_iterate_full_addressing_func),(void*)&zz);
				if(zz.ret!=0)
				{
						returnValue=0;
						return returnValue;
				}
				x=1;
				
			}
#if defined(OS_UNIX_STRUCT) && defined(USE_UNIX_IMAGE_EXTENSION_VQ)

			}
#endif
			if(x==1)
			{
				zz.start_address=(unsigned long long)address;
				zz.end_address=(unsigned long long)(address+nsize_-1);
				zz.size=(unsigned long long)dwLength;
				zz.page_size=pagesize;
				zz.page_alignment_size=nsize_;
				zz.free_pages=0;
				zz.free_pages_size=0;
				zz.reserved_pages_size=nsize_;
				zz.reserved_pages=(zz.reserved_pages_size/zz.page_size);
			} else {
				/*
			    test_address=(void*)zz.base_start_address;
				for(rpsp = 0; rpsp < nsize_; rpsp+=pagesize)
				{
					x = msync(test_address, (size_t)(rpsp+pagesize), 0);
					errno_=errno;
					if(x==-1&&errno_=ENOMEM)
					{
						break;
					} else {
						continue;
					}
				}
				test_address=(void*)(((unsigned long long)test_address)+rpsp);
				for(psp = 0; psp < nsize_; psp+=pagesize)
				{
					x = msync(test_address, (size_t)(psp+pagesize), 0);
					errno_=errno;
					if(x=-1&&errno_=ENOMEM)
					{
						continue;
					} else {
						break;
					}
				}
			}
			
				int partwise_free=0;
				if(rpsp==0)
				{
					partwise_free=1;
				} else {
					partwise_free=0;
				}*/
				if(zz.base_end_address<=zz.base_start_address)
				{
					returnValue=0;
					return returnValue;
				}
				psp=(zz.base_end_address-zz.base_start_address);
				psp=MY_ROUND_DOWN_PAGE_SIZE((unsigned long long)psp);
				//vma_it_func zz;
				zz.start_address=(unsigned long long)(zz.base_start_address);
				zz.end_address=(unsigned long long)(zz.base_end_address-1);
				zz.size=(unsigned long long)dwLength;
				zz.page_size=pagesize;
				zz.page_alignment_size=psp;
				zz.free_pages=0;
				zz.free_pages_size=0;
				zz.reserved_pages_size=psp;
				zz.reserved_pages=(zz.reserved_pages_size/zz.page_size);
			}
		} else {
			zz.start_address=(unsigned long long)address;
			zz.end_address=(unsigned long long)(address+nsize_-1);
			zz.size=(unsigned long long)dwLength;
			zz.page_alignment_size=nsize_;
VMA_RESOLVE_FUNC_LABEL: ;
			zz.page_size=pagesize;
			zz.free_pages=(zz.page_alignment_size/zz.page_size);
			zz.free_pages_size=zz.page_alignment_size;
			zz.reserved_pages_size=0;
			zz.reserved_pages=0;
		}
		/*int y = vma_iterate((void*)&zz,&vma_iterate_func);
		x = msync(address, (size_t)(nsize_), 0);
		errno_=errno;
		if(x==-1&&errno_=ENOMEM)
		{
			zz.complete_free_region=1;
		} else {
			zz.complete_free_region=0;
		}
		if(zz.complete_free_region==1)
		{
			lpBuffer->BaseAddress=zz.base_start_address;
			lpBuffer->RegionSize=nsize_;
			lpBuffer->State=MEM_FREE;
			
		} else if(free_pages_size>0)
		{
			
		}*/
		int flags=zz.base_flags;
		int cflags=VMA_GET_PERMS(flags);
		unsigned char is_found=0;
		fpi_s * fp;
		if(zz.complete_free_region==1)
		{
			lpBuffer->BaseAddress=(void*)zz.start_address;
			lpBuffer->AllocationBase=(void*)zz.start_address;
			lpBuffer->RegionSize=zz.page_alignment_size;
			lpBuffer->State=MEM_FREE;
			//FREE_REGION_MANAGE_EX((unsigned long long)lpBuffer->BaseAddress,(unsigned long long)lpBuffer->RegionSize,1,(FRM_SEARCH_ADDRESS|FRM_SEARCH_SIZE|FRM_SEARCH_REMOVE),&is_found,&fp);
			//FREE_REGION_MANAGE_EX((unsigned long long)lpBuffer->BaseAddress,(unsigned long long)lpBuffer->RegionSize,3,(FRM_SEARCH_FREE|FRM_SEARCH_ADDRESS|FRM_SEARCH_REMOVE),&is_found,&fp);
			//printf("fffcccc %d\n",is_found);
		} else {
			lpBuffer->BaseAddress=(void*)zz.start_address;
			lpBuffer->AllocationBase=(void*)zz.base_start_address;
			//int is_free=FREE_REGION_MANAGE_EX((unsigned long long)lpBuffer->BaseAddress,(unsigned long long)lpBuffer->RegionSize,3,(FRM_SEARCH_ADDRESS|FRM_SEARCH_SIZE),&is_found,&fp);
			//if(is_found==1&&is_free==1)
			//{
			//	lpBuffer->AllocationBase=(void*)zz.start_address;
			//	lpBuffer->State=MEM_FREE;
			//	return sizeof(MEMORY_BASIC_INFORMATION);
			//}
			if(VMA_PAGE_EXECUTE_READWRITE==cflags)
			{
				lpBuffer->AllocationProtect=PAGE_EXECUTE_READWRITE;
			} else if(VMA_PAGE_EXECUTE_READ==cflags)
			{
				lpBuffer->AllocationProtect=PAGE_EXECUTE_READ;
			} else if(VMA_PAGE_READWRITE==cflags)
			{
				lpBuffer->AllocationProtect=PAGE_READWRITE;
			} else if(VMA_PAGE_READONLY==cflags)
			{
				lpBuffer->AllocationProtect=PAGE_READONLY;
			} else if(cflags==VMA_PAGE_EXECUTE)
			{
				lpBuffer->AllocationProtect=PAGE_EXECUTE;
			} else if(flags > 0) {
				lpBuffer->AllocationProtect=PAGE_READWRITE;
			} else {
				lpBuffer->AllocationProtect=PAGE_NOACCESS;
			}
			lpBuffer->RegionSize=zz.page_alignment_size;
			lpBuffer->State=(flags&VMA_PRIVATE)?MEM_RESERVE:MEM_COMMIT;
			lpBuffer->Type=(flags&VMA_PRIVATE)?MEM_PRIVATE:MEM_MAPPED;
#if defined(OS_UNIX_STRUCT) && defined(USE_UNIX_IMAGE_EXTENSION_VQ)
			if(is_imaged==TRUE)
			{
				int image_flags=0;
				if(lpBuffer->AllocationProtect==PAGE_EXECUTE_READRITE)
					image_flags = MY_PAGE_EXECUTE_READWRITE;
				else if(lpBuffer->AllocationProtect==PAGE_EXECUTE_READ)
					image_flags = MY_PAGE_EXECUTE_READ;
				else if(lpBuffer->AllocationProtect==PAGE_READWRITE)
					image_flags = MY_PAGE_READWRITE;
				else if(lpBuffer->AllocationProtect==PAGE_EXECUTE)
					image_flags = MY_PAGE_EXECUTE;
				else if(lpBuffer->AllocationProtect==PAGE_READONLY)
					image_flags = MY_PAGE_READONLY;
				else if(lpBuffer->AllocationProtect==PAGE_NOACCESS)
					image_flags = MY_PAGE_NOACCESS;
                        	int image_ret = mprotect((void*)lpBuffer->AllocationBase,(size_t)lpBuffer->RegionSize,image_flags);
				if(image_ret==-1)
				{
					returnValue=0;
					return returnValue;
				}
			}
#endif
		}
		returnValue=(SIZE_T)sizeof(MEMORY_BASIC_INFORMATION);
		return returnValue;
	#endif
}