Ticket #12: mplayer-virtualalloc.patch

File mplayer-virtualalloc.patch, 2.4 KB (added by reimar, 22 years ago)

modifies VirtualAlloc

  • loader/ext.c

     
    454454#define MEM_COMMIT              0x00001000
    455455#define MEM_RESERVE             0x00002000
    456456
     457static 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
    457517LPVOID WINAPI VirtualAlloc(LPVOID address, DWORD size, DWORD type,  DWORD protection)
    458518{
    459519    void* answer;
    … …  
    468528    {
    469529    //check whether we can allow to allocate this
    470530        virt_alloc* str=vm;
     531        if (!str) str=vm=initVirtualAlloc();
    471532        while(str)
    472533        {
    473534            if((unsigned)address>=(unsigned)str->address+str->mapping_size)
    … …  
    534595    int answer;
    535596    while(str)
    536597    {
    537         if(address!=str->address)
     598        if(address!=str->address || str->state==2)
    538599        {
    539600            str=str->prev;
    540601            continue;