| | 457 | static virt_alloc* initVirtualAlloc() |
| | 458 | { |
| | 459 | virt_alloc *first = NULL; |
| | 460 | virt_alloc *prev = NULL; |
| | 461 | |
| | 462 | #if __linux__ |
| | 463 | FILE *f; |
| | 464 | char mapsfile[6+10+5+1]; /* /proc/nnn/maps, 32 bit nnn */ |
| | 465 | snprintf(mapsfile, sizeof(mapsfile), "/proc/%d/maps", getpid()); |
| | 466 | f = fopen( mapsfile, "r" ); |
| | 467 | if (f) |
| | 468 | { |
| | 469 | char buffer[256]; |
| | 470 | |
| | 471 | while (fgets( buffer, sizeof(buffer), f )) |
| | 472 | { |
| | 473 | char *map_start; |
| | 474 | char *map_end; |
| | 475 | if (sscanf( buffer, "%08x-%08x ", (unsigned int*)&map_start, (unsigned int*)&map_end )) |
| | 476 | { |
| | 477 | map_start = (char*)((unsigned long)map_start & ~0xffff); |
| | 478 | map_end = (char*)(((unsigned long)map_end+0xffff) & ~0xffff); |
| | 479 | #define INIT_MAPPING_EXTRA (1024*1024) /* Allow for some growth...how much? */ |
| | 480 | if (prev && prev->address+prev->mapping_size > map_start) |
| | 481 | prev->mapping_size = map_end-prev->address+INIT_MAPPING_EXTRA; |
| | 482 | else |
| | 483 | { |
| | 484 | virt_alloc *new_vm = (virt_alloc*) malloc(sizeof(virt_alloc)); |
| | 485 | new_vm->mapping_size=map_end-map_start+INIT_MAPPING_EXTRA; |
| | 486 | new_vm->address=map_start; |
| | 487 | new_vm->prev=prev; |
| | 488 | new_vm->state=2; |
| | 489 | if (prev) |
| | 490 | prev->next=new_vm; |
| | 491 | else |
| | 492 | first=new_vm; |
| | 493 | prev=new_vm; |
| | 494 | } |
| | 495 | } |
| | 496 | } |
| | 497 | fclose( f ); |
| | 498 | } |
| | 499 | #endif |
| | 500 | |
| | 501 | if (!prev) |
| | 502 | { |
| | 503 | /* If all else fails, just protect one arbitrary segment. */ |
| | 504 | virt_alloc *new_vm = (virt_alloc*) malloc(sizeof(virt_alloc)); |
| | 505 | new_vm->mapping_size=0x10000; |
| | 506 | new_vm->address=(char*)((unsigned long)&vm & ~0xffff); |
| | 507 | new_vm->prev=prev; |
| | 508 | new_vm->state=2; |
| | 509 | first=new_vm; |
| | 510 | prev=new_vm; |
| | 511 | } |
| | 512 | |
| | 513 | prev->next=0; |
| | 514 | return first; |
| | 515 | } |
| | 516 | |