Subversion Repositories Kolibri OS

Rev

Rev 908 | Rev 1066 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 908 Rev 914
Line 38... Line 38...
38
};
38
};
39
 
39
 
Line 40... Line 40...
40
int __stdcall strncmp(const char *s1, const char *s2, size_t n);
40
int __stdcall strncmp(const char *s1, const char *s2, size_t n);
Line 41... Line -...
41
 
-
 
42
void __export create_image(addr_t img_base, addr_t raw) asm ("CreateImage");
41
 
Line 43... Line 42...
43
bool link_image(addr_t img_base);
42
bool link_image(addr_t img_base);
Line 44... Line 43...
44
 
43
 
Line 57... Line 56...
57
    return NULL;
56
    return NULL;
58
};
57
};
59
*/
58
*/
Line 60... Line 59...
60
 
59
 
61
bool validate_pe(void *raw, size_t raw_size)
60
bool validate_pe(void *raw, size_t raw_size, bool is_exec)
62
{
61
{
63
    PIMAGE_DOS_HEADER     dos;
62
    PIMAGE_DOS_HEADER     dos;
Line 64... Line 63...
64
    PIMAGE_NT_HEADERS32   nt;
63
    PIMAGE_NT_HEADERS32   nt;
Line 78... Line 77...
78
 
77
 
Line 79... Line 78...
79
    if(nt->Signature != IMAGE_NT_SIGNATURE)
78
    if(nt->Signature != IMAGE_NT_SIGNATURE)
80
        return false;
79
        return false;
Line -... Line 80...
-
 
80
 
-
 
81
    if(nt->FileHeader.Machine != IMAGE_FILE_MACHINE_I386)
-
 
82
        return false;
-
 
83
 
-
 
84
    if(is_exec && (nt->FileHeader.Characteristics & IMAGE_FILE_DLL))
-
 
85
        return false;
81
 
86
 
82
    if(nt->OptionalHeader.Magic != IMAGE_NT_OPTIONAL_HDR32_MAGIC)
87
    if(nt->OptionalHeader.Magic != IMAGE_NT_OPTIONAL_HDR32_MAGIC)
Line -... Line 88...
-
 
88
        return false;
-
 
89
 
-
 
90
    if( is_exec && nt->OptionalHeader.ImageBase != 0)
83
        return false;
91
        return false;
84
 
92
 
85
    if(nt->OptionalHeader.SectionAlignment < PAGE_SIZE)
93
    if(nt->OptionalHeader.SectionAlignment < PAGE_SIZE)
86
	{
94
	{
87
        if(nt->OptionalHeader.FileAlignment != nt->OptionalHeader.SectionAlignment)
95
        if(nt->OptionalHeader.FileAlignment != nt->OptionalHeader.SectionAlignment)
Line 125... Line 133...
125
        DBG("file not found: %s\n", path);
133
        DBG("file not found: %s\n", path);
126
        return NULL;
134
        return NULL;
127
    };
135
    };
128
 
136
 
Line 129... Line 137...
129
    if( ! validate_pe(raw, raw_size) )
137
    if( ! validate_pe(raw, raw_size, false) )
130
	{
138
	{
131
        DBG("invalid pe file %s\n", path);
139
        DBG("invalid pe file %s\n", path);
132
        mem_free(raw);
140
        mem_free(raw);
133
            return NULL;
141
            return NULL;
134
	}
142
	}
Line 148... Line 156...
148
    };
156
    };
149
 
157
 
Line 150... Line 158...
150
    img_base = img_md->base;
158
    img_base = img_md->base;
Line 151... Line 159...
151
 
159
 
Line 152... Line 160...
152
    create_image(img_base, (addr_t)raw);
160
    create_image(img_base, (addr_t)raw, true);
Line 153... Line 161...
153
 
161
 
154
    mem_free(raw);
162
    mem_free(raw);
Line 188... Line 196...
188
};
196
};
189
*/
197
*/
190
 
198
 
Line 191... Line 199...
191
 
199
 
192
void create_image(addr_t img_base, addr_t raw)
200
void create_image(addr_t img_base, addr_t raw, bool force_clear)
193
{
201
{
194
    PIMAGE_DOS_HEADER     dos;
202
    PIMAGE_DOS_HEADER     dos;
195
    PIMAGE_NT_HEADERS32   nt;
203
    PIMAGE_NT_HEADERS32   nt;
Line 221... Line 229...
221
 
229
 
Line 222... Line 230...
222
        if(img_sec->SizeOfRawData)
230
        if(img_sec->SizeOfRawData)
223
            sec_copy(dest_ptr, src_ptr, img_sec->SizeOfRawData);
231
            sec_copy(dest_ptr, src_ptr, img_sec->SizeOfRawData);
Line -... Line 232...
-
 
232
 
-
 
233
        if(force_clear)
224
 
234
        {
Line 225... Line 235...
225
        sec_size = (img_sec->Misc.VirtualSize + sec_align -1) & -sec_align;
235
        sec_size = (img_sec->Misc.VirtualSize + sec_align -1) & -sec_align;
226
 
236
 
227
        if(sec_size > img_sec->SizeOfRawData)
237
        if(sec_size > img_sec->SizeOfRawData)
-
 
238
            sec_clear(dest_ptr + img_sec->SizeOfRawData,
228
            sec_clear(dest_ptr + img_sec->SizeOfRawData,
239
                      sec_size - img_sec->SizeOfRawData);
229
                      sec_size - img_sec->SizeOfRawData);
240
        };
Line 230... Line 241...
230
        img_sec++;
241
        img_sec++;
231
    }
242
    };
232
 
243