1277
1277
size = ROUND_SIZE( sec->VirtualAddress, sec->SizeOfRawData );
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;
1283
1283
/* Dumb game crack lets the AOEP point into a data section. Adjust. */
1395
1395
/***********************************************************************
1396
1396
* virtual_create_system_view
1398
NTSTATUS virtual_create_system_view( void *base, SIZE_T size, DWORD vprot )
1398
NTSTATUS virtual_create_builtin_view( void *module )
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;
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 );
1417
if (status) return status;
1419
sec = (IMAGE_SECTION_HEADER *)((char *)&nt->OptionalHeader + nt->FileHeader.SizeOfOptionalHeader);
1420
for (i = 0; i < nt->FileHeader.NumberOfSections; i++)
1422
DWORD flags = VPROT_SYSTEM | VPROT_IMAGE | VPROT_COMMITTED;
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 );