~ubuntu-branches/ubuntu/oneiric/wine1.2/oneiric

« back to all changes in this revision

Viewing changes to dlls/ntdll/virtual.c

  • Committer: Bazaar Package Importer
  • Author(s): Scott Ritchie
  • Date: 2010-10-08 12:53:56 UTC
  • mto: This revision was merged to the branch mainline in revision 39.
  • Revision ID: james.westby@ubuntu.com-20101008125356-0jjjg46hvibih8ft
Tags: upstream-1.2.1
ImportĀ upstreamĀ versionĀ 1.2.1

Show diffs side-by-side

added added

removed removed

Lines of Context:
1277
1277
            size = ROUND_SIZE( sec->VirtualAddress, sec->SizeOfRawData );
1278
1278
 
1279
1279
        if (sec->Characteristics & IMAGE_SCN_MEM_READ)    vprot |= VPROT_READ;
1280
 
        if (sec->Characteristics & IMAGE_SCN_MEM_WRITE)   vprot |= VPROT_READ|VPROT_WRITECOPY;
 
1280
        if (sec->Characteristics & IMAGE_SCN_MEM_WRITE)   vprot |= VPROT_READ|VPROT_WRITE;
1281
1281
        if (sec->Characteristics & IMAGE_SCN_MEM_EXECUTE) vprot |= VPROT_EXEC;
1282
1282
 
1283
1283
        /* Dumb game crack lets the AOEP point into a data section. Adjust. */
1395
1395
/***********************************************************************
1396
1396
 *           virtual_create_system_view
1397
1397
 */
1398
 
NTSTATUS virtual_create_system_view( void *base, SIZE_T size, DWORD vprot )
 
1398
NTSTATUS virtual_create_builtin_view( void *module )
1399
1399
{
1400
 
    FILE_VIEW *view;
1401
1400
    NTSTATUS status;
1402
1401
    sigset_t sigset;
 
1402
    IMAGE_NT_HEADERS *nt = RtlImageNtHeader( module );
 
1403
    SIZE_T size = nt->OptionalHeader.SizeOfImage;
 
1404
    IMAGE_SECTION_HEADER *sec;
 
1405
    FILE_VIEW *view;
 
1406
    void *base;
 
1407
    int i;
1403
1408
 
1404
 
    size = ROUND_SIZE( base, size );
1405
 
    base = ROUND_ADDR( base, page_mask );
 
1409
    size = ROUND_SIZE( module, size );
 
1410
    base = ROUND_ADDR( module, page_mask );
1406
1411
    server_enter_uninterrupted_section( &csVirtual, &sigset );
1407
 
    status = create_view( &view, base, size, vprot );
 
1412
    status = create_view( &view, base, size, VPROT_SYSTEM | VPROT_IMAGE |
 
1413
                          VPROT_COMMITTED | VPROT_READ | VPROT_WRITECOPY | VPROT_EXEC );
1408
1414
    if (!status) TRACE( "created %p-%p\n", base, (char *)base + size );
1409
1415
    server_leave_uninterrupted_section( &csVirtual, &sigset );
 
1416
 
 
1417
    if (status) return status;
 
1418
 
 
1419
    sec = (IMAGE_SECTION_HEADER *)((char *)&nt->OptionalHeader + nt->FileHeader.SizeOfOptionalHeader);
 
1420
    for (i = 0; i < nt->FileHeader.NumberOfSections; i++)
 
1421
    {
 
1422
        DWORD flags = VPROT_SYSTEM | VPROT_IMAGE | VPROT_COMMITTED;
 
1423
 
 
1424
        if (sec[i].Characteristics & IMAGE_SCN_MEM_EXECUTE) flags |= VPROT_EXEC;
 
1425
        if (sec[i].Characteristics & IMAGE_SCN_MEM_READ) flags |= VPROT_READ;
 
1426
        if (sec[i].Characteristics & IMAGE_SCN_MEM_WRITE) flags |= VPROT_WRITE;
 
1427
        memset (view->prot + (sec[i].VirtualAddress >> page_shift), flags,
 
1428
                ROUND_SIZE( sec[i].VirtualAddress, sec[i].Misc.VirtualSize ) >> page_shift );
 
1429
    }
 
1430
 
1410
1431
    return status;
1411
1432
}
1412
1433