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

Last change on this file since 250 was 242, checked in by dai_9181, 17 years ago
File size: 5.0 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 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 pobj_Reloc->AddSchedule_CodeSection(obp);
230 }
231}
232
233CSubAddrSchedule *pobj_SubAddrSchedule;
Note: See TracBrowser for help on using the repository browser.