source: dev/trunk/abdev/BasicCompiler_Common/PESchedule.cpp@ 266

Last change on this file since 266 was 266, checked in by dai_9181, 17 years ago

BasicSourceのシリアライズがうまくいっていない

File size: 5.1 KB
Line 
1#include "stdafx.h"
2
3#include <Compiler.h>
4
5#include "../BasicCompiler_Common/common.h"
6
7#ifdef _AMD64_
8#include "../BasicCompiler64/opcode.h"
9#else
10#include "../BasicCompiler32/opcode.h"
11#endif
12
13extern HANDLE hHeap;
14
15/////////////////////////////////////////////
16// 再配置スケジュール
17//
18// メモリの再配置は.textセクション、または.dataセクションに行われることが予想される。
19// .textセクション … セクションデータへのポインタ
20// .dataセクション … vtblの再配置
21/////////////////////////////////////////////
22
23CReloc *pobj_Reloc;
24
25CReloc::CReloc(){
26 buffer=0;
27 length=0;
28 NowPageRVAToReloc=0;
29}
30CReloc::~CReloc(){
31 AllFree();
32}
33void CReloc::AllFree(void){
34 if(buffer){
35 HeapDefaultFree(buffer);
36 buffer=0;
37 }
38}
39void CReloc::copy(CReloc *por){
40 AllFree();
41
42 if(por->buffer){
43 buffer=(char *)HeapReAlloc(hHeap,0,buffer,por->length);
44 memcpy(buffer,por->buffer,por->length);
45 }
46 else buffer=0;
47
48 length=por->length;
49
50 NowPageRVAToReloc=por->NowPageRVAToReloc;
51 NowCountAddrToReloc=por->NowCountAddrToReloc;
52
53 codeSectionAddresses = por->codeSectionAddresses;
54
55 dataSectionAddresses = por->dataSectionAddresses;
56}
57
58void CReloc::AddSchedule_CodeSection(DWORD addr){
59 if( !compiler.IsDll() ) return;
60
61 codeSectionAddresses.push_back( addr );
62}
63void CReloc::AddSchedule_DataSection(DWORD addr){
64 if( !compiler.IsDll() ) return;
65
66 dataSectionAddresses.push_back( addr );
67}
68
69void CReloc::__add(DWORD addr){
70 if( !compiler.IsDll() ) return;
71
72 BOOL sw;
73 sw=0;
74 while((addr-(addr%MEM_ALIGNMENT))>NowPageRVAToReloc){
75 NowPageRVAToReloc+=MEM_ALIGNMENT;
76 sw=1;
77 }
78
79 if(sw){
80 //ページを増やす
81 while(length%4){
82 buffer=(char *)HeapReAlloc(hHeap,0,buffer,length+sizeof(WORD));
83 (*(WORD *)(buffer+length))=0;
84 length+=2;
85
86 (*(DWORD *)(buffer+NowCountAddrToReloc))+=sizeof(WORD);
87 }
88
89 buffer=(char *)HeapReAlloc(hHeap,0,buffer,
90 length+
91 sizeof(DWORD)+
92 sizeof(DWORD));
93
94 //Page RVA
95 *(DWORD *)(buffer+length)=NowPageRVAToReloc;
96 length+=sizeof(DWORD);
97
98 NowCountAddrToReloc=length;
99
100 //Block size
101 *(DWORD *)(buffer+length)=sizeof(DWORD)*2;
102 length+=sizeof(DWORD);
103 }
104
105 //リロケーション情報の追加
106 buffer=(char *)HeapReAlloc(hHeap,0,buffer,length+sizeof(WORD));
107 buffer[length]=0;
108 buffer[length+1]=0x30; //=IMAGE_REL_BASED_HIGHLOW
109 (*(WORD *)(buffer+length))|=addr&0x0FFF;
110 length+=2;
111
112 (*(DWORD *)(buffer+NowCountAddrToReloc))+=sizeof(WORD);
113}
114void CReloc::ResetRelocBuffer(void){
115 if(buffer) HeapDefaultFree(buffer);
116
117 buffer=(char *)HeapAlloc(hHeap,0,1);
118 length=0;
119 NowPageRVAToReloc=0;
120
121 BOOST_FOREACH( DWORD addr, codeSectionAddresses )
122 {
123 extern int MemPos_CodeSection;
124 __add(MemPos_CodeSection + addr);
125 }
126
127 BOOST_FOREACH( DWORD addr, dataSectionAddresses )
128 {
129 extern int MemPos_DataSection;
130 __add(MemPos_DataSection + addr);
131 }
132}
133
134
135
136
137//////////////////////////
138// 一般スケジュール
139//////////////////////////
140
141CSchedule::CSchedule(){
142 pObpValues=(int *)HeapAlloc(hHeap,0,1);
143 num=0;
144
145 this->flag=0;
146}
147CSchedule::~CSchedule(){
148 HeapDefaultFree(pObpValues);
149}
150void CSchedule::SetFlag(int flag){
151 this->flag=flag;
152}
153void CSchedule::add(){
154 pObpValues=(int *)HeapReAlloc(hHeap,0,pObpValues,(num+1)*sizeof(int));
155 extern int obp;
156 pObpValues[num]=obp;
157 num++;
158
159 if(flag&SCHEDULE_FLAG_RELOC){
160 //リロケーション情報を追加する
161 pobj_Reloc->AddSchedule_CodeSection(obp);
162 }
163}
164void CSchedule::move(int iStartPos,int iSize,int offset){
165 int i;
166 for(i=0;i<num;i++){
167 if(iStartPos<=pObpValues[i] && pObpValues[i]<iStartPos+iSize){
168 pObpValues[i]+=offset;
169 }
170 }
171}
172
173//データテーブルスケジュール
174CSchedule *pobj_DataTableSchedule;
175
176//グローバル変数アドレススケジュール
177CSchedule *pobj_GlobalVarSchedule;
178
179
180
181/////////////////////////////////////////
182// インポート アドレス スケジューリング
183/////////////////////////////////////////
184
185CImportAddrSchedule::CImportAddrSchedule(){
186 ppdi=(const DllProc **)HeapAlloc(hHeap,0,1);
187}
188CImportAddrSchedule::~CImportAddrSchedule(){
189 HeapDefaultFree(ppdi);
190}
191
192void CImportAddrSchedule::add(const DllProc *pDllProc){
193 ppdi=(const DllProc **)HeapReAlloc(hHeap,0,ppdi,(num+1)*sizeof(DllProc *));
194 ppdi[num]=pDllProc;
195
196 CSchedule::add();
197}
198
199CImportAddrSchedule *pobj_ImportAddrSchedule;
200
201
202
203
204/////////////////////////////////////////
205// プロシージャ アドレス スケジューリング
206/////////////////////////////////////////
207
208CSubAddrSchedule::CSubAddrSchedule(){
209 ppsi=(const UserProc **)HeapAlloc(hHeap,0,1);
210 pbCall=(BOOL *)HeapAlloc(hHeap,0,1);
211}
212CSubAddrSchedule::~CSubAddrSchedule(){
213 HeapDefaultFree(ppsi);
214 HeapDefaultFree(pbCall);
215}
216
217void CSubAddrSchedule::add(const UserProc *pUserProc,BOOL bCall){
218 if(!pUserProc) return;
219
220 ppsi=(const UserProc **)HeapReAlloc(hHeap,0,ppsi,(num+1)*sizeof(UserProc *));
221 ppsi[num]=pUserProc;
222 pbCall=(BOOL *)HeapReAlloc(hHeap,0,pbCall,(num+1)*sizeof(BOOL));
223 pbCall[num]=bCall;
224
225 CSchedule::add();
226
227 if(!bCall){
228 //リロケーション情報を追加する
229 extern int obp;
230 pobj_Reloc->AddSchedule_CodeSection(obp);
231 }
232}
233
234CSubAddrSchedule *pobj_SubAddrSchedule;
Note: See TracBrowser for help on using the repository browser.