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

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