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 |
|
---|
11 | extern HANDLE hHeap;
|
---|
12 |
|
---|
13 | /////////////////////////////////////////////
|
---|
14 | // 再配置スケジュール
|
---|
15 | //
|
---|
16 | // メモリの再配置は.textセクション、または.dataセクションに行われることが予想される。
|
---|
17 | // .textセクション … セクションデータへのポインタ
|
---|
18 | // .dataセクション … vtblの再配置
|
---|
19 | /////////////////////////////////////////////
|
---|
20 |
|
---|
21 | CReloc *pobj_Reloc;
|
---|
22 |
|
---|
23 | CReloc::CReloc(){
|
---|
24 | buffer=0;
|
---|
25 | length=0;
|
---|
26 | NowPageRVAToReloc=0;
|
---|
27 | }
|
---|
28 | CReloc::~CReloc(){
|
---|
29 | AllFree();
|
---|
30 | }
|
---|
31 | void CReloc::AllFree(void){
|
---|
32 | if(buffer){
|
---|
33 | HeapDefaultFree(buffer);
|
---|
34 | buffer=0;
|
---|
35 | }
|
---|
36 | }
|
---|
37 | void 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 |
|
---|
56 | void CReloc::AddSchedule_CodeSection(DWORD addr){
|
---|
57 | extern BOOL bDll;
|
---|
58 | if(!bDll) return;
|
---|
59 |
|
---|
60 | codeSectionAddresses.push_back( addr );
|
---|
61 | }
|
---|
62 | void CReloc::AddSchedule_DataSection(DWORD addr){
|
---|
63 | extern BOOL bDll;
|
---|
64 | if(!bDll) return;
|
---|
65 |
|
---|
66 | dataSectionAddresses.push_back( addr );
|
---|
67 | }
|
---|
68 |
|
---|
69 | void 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 | }
|
---|
115 | void 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 |
|
---|
142 | CSchedule::CSchedule(){
|
---|
143 | pObpValues=(int *)HeapAlloc(hHeap,0,1);
|
---|
144 | num=0;
|
---|
145 |
|
---|
146 | this->flag=0;
|
---|
147 | }
|
---|
148 | CSchedule::~CSchedule(){
|
---|
149 | HeapDefaultFree(pObpValues);
|
---|
150 | }
|
---|
151 | void CSchedule::SetFlag(int flag){
|
---|
152 | this->flag=flag;
|
---|
153 | }
|
---|
154 | void 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 | }
|
---|
164 | void 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 | //データテーブルスケジュール
|
---|
174 | CSchedule *pobj_DataTableSchedule;
|
---|
175 |
|
---|
176 | //グローバル変数アドレススケジュール
|
---|
177 | CSchedule *pobj_GlobalVarSchedule;
|
---|
178 |
|
---|
179 |
|
---|
180 |
|
---|
181 | /////////////////////////////////////////
|
---|
182 | // インポート アドレス スケジューリング
|
---|
183 | /////////////////////////////////////////
|
---|
184 |
|
---|
185 | CImportAddrSchedule::CImportAddrSchedule(){
|
---|
186 | ppdi=(const DllProc **)HeapAlloc(hHeap,0,1);
|
---|
187 | }
|
---|
188 | CImportAddrSchedule::~CImportAddrSchedule(){
|
---|
189 | HeapDefaultFree(ppdi);
|
---|
190 | }
|
---|
191 |
|
---|
192 | void 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 |
|
---|
199 | CImportAddrSchedule *pobj_ImportAddrSchedule;
|
---|
200 |
|
---|
201 |
|
---|
202 |
|
---|
203 |
|
---|
204 | /////////////////////////////////////////
|
---|
205 | // プロシージャ アドレス スケジューリング
|
---|
206 | /////////////////////////////////////////
|
---|
207 |
|
---|
208 | CSubAddrSchedule::CSubAddrSchedule(){
|
---|
209 | ppsi=(const UserProc **)HeapAlloc(hHeap,0,1);
|
---|
210 | pbCall=(BOOL *)HeapAlloc(hHeap,0,1);
|
---|
211 | }
|
---|
212 | CSubAddrSchedule::~CSubAddrSchedule(){
|
---|
213 | HeapDefaultFree(ppsi);
|
---|
214 | HeapDefaultFree(pbCall);
|
---|
215 | }
|
---|
216 |
|
---|
217 | void 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 |
|
---|
233 | CSubAddrSchedule *pobj_SubAddrSchedule;
|
---|