source: dev/trunk/abdev/BasicCompiler64/MakePeHdr.cpp@ 169

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

NamespaceScopesCollection::Importsをリファクタリング

File size: 55.2 KB
Line 
1#include <jenga/include/common/Environment.h>
2
3#include "../BasicCompiler_Common/common.h"
4#include "Opcode.h"
5
6
7////////////////////////////
8// 特殊関数の構造体ポインタ
9////////////////////////////
10
11// グローバル関数、静的メソッド
12UserProc
13 *pSub_System_StartupProgram,
14 *pSub_DebugSys_StartProc,
15 *pSub_DebugSys_EndProc,
16 *pSub_DebugSys_SaveContext,
17 *pSub_System_GetEip,
18 *pSub_System_InitDllGlobalVariables,
19 *pSub_System_InitStaticLocalVariables,
20 *pSub_System_Call_Destructor_of_GlobalObject,
21 *pSub_System_GetSp,
22 *pSub_pow,
23 *pSub_calloc,
24 *pSub_realloc,
25 *pSub_free,
26 *pSub_System_GC_malloc_ForObject,
27 *pSub_System_GC_malloc_ForObjectPtr,
28 *pSub_System_GC_free_for_SweepingDelete,
29 *pSubStaticMethod_System_TypeBase_InitializeUserTypes;
30
31// 動的メソッド
32UserProc
33 *pUserProc_System_CGarbageCollection_RegisterGlobalRoots;
34
35
36//////////////////////////////
37// 各セクションの位置とサイズ
38int FileSize_CodeSection,
39 FileSize_ExportSection,
40 FileSize_ImportSection,
41 FileSize_DataSection,
42 FileSize_RWSection,
43 FileSize_RSrcSection,
44 FileSize_RelocSection,
45 FileSize_DebugSection;
46int FilePos_CodeSection,
47 FilePos_ExportSection,
48 FilePos_ImportSection,
49 FilePos_DataSection,
50 FilePos_RWSection,
51 FilePos_RSrcSection,
52 FilePos_RelocSection,
53 FilePos_DebugSection;
54int MemSize_CodeSection,
55 MemSize_ExportSection,
56 MemSize_ImportSection,
57 MemSize_DataSection,
58 MemSize_RWSection,
59 MemSize_RSrcSection,
60 MemSize_RelocSection,
61 MemSize_DebugSection;
62int MemPos_CodeSection,
63 MemPos_ExportSection,
64 MemPos_ImportSection,
65 MemPos_DataSection,
66 MemPos_RWSection,
67 MemPos_RSrcSection,
68 MemPos_RelocSection,
69 MemPos_DebugSection;
70int bUse_CodeSection,
71 bUse_ExportSection,
72 bUse_ImportSection,
73 bUse_DataSection,
74 bUse_RWSection,
75 bUse_RSrcSection,
76 bUse_RelocSection,
77 bUse_DebugSection;
78
79
80void DebugVariable(void){
81 char temporary[255];
82 sprintf(temporary,"_DebugSys_dwThreadID[255]%c%cDWord",1,ESC_AS);
83 OpcodeDim(temporary,DIMFLAG_INITDEBUGVAR);
84 sprintf(temporary,"_DebugSys_ProcNum[255]%c%cDWord",1,ESC_AS);
85 OpcodeDim(temporary,DIMFLAG_INITDEBUGVAR);
86 sprintf(temporary,"_DebugSys_lplpObp[255]%c%c*ULONG_PTR",1,ESC_AS);
87 OpcodeDim(temporary,DIMFLAG_INITDEBUGVAR);
88 sprintf(temporary,"_DebugSys_lplpSpBase[255]%c%c*ULONG_PTR",1,ESC_AS);
89 OpcodeDim(temporary,DIMFLAG_INITDEBUGVAR);
90}
91
92void Compile(void){
93 extern HWND hMainDlg;
94 extern HWND hOwnerEditor;
95 extern HANDLE hHeap;
96 extern BOOL bDebugCompile;
97 extern BOOL bDll;
98 extern DWORD ImageBase;
99 extern int obp_AllocSize;
100 extern char *basbuf;
101 extern char OutputFileName[MAX_PATH];
102 int i,i2,i3,i4,i5;
103 char temporary[MAX_PATH],*temp2;
104 HANDLE hFile;
105
106
107 //コードセクションのメモリ上の位置
108 MemPos_CodeSection= 0x1000;
109
110 //データセクションのメモリ上の位置(仮定)
111 MemPos_DataSection= 0x10000000;
112
113
114 //エクスポート セクションを利用するかどうか
115 if(bDll) bUse_ExportSection=1;
116 else bUse_ExportSection=0;
117
118
119 //////////////////
120 // データテーブル
121 dataTable.Init();
122 if(bDebugCompile){
123 dataTable.Add( (long)0x00000002 );
124 }
125
126
127 //////////////////////
128 // コード生成前の準備
129 //////////////////////
130
131 //重複エラー情報管理のメモリを確保(グローバル領域コンパイル用)
132 extern char **SynonymErrorWords;
133 extern int SynonymErrorNum;
134 SynonymErrorNum=0;
135 SynonymErrorWords=(char **)HeapAlloc(hHeap,0,1);
136
137 //列挙体に関する情報の初期化
138 CEnumParent::InitEnum();
139
140 //列挙体からクラスコードを生成
141 char *temp;
142 temp=CEnumParent::GenerateCodes();
143 AddSourceCode(temp);
144 HeapDefaultFree(temp);
145
146 //関数ポインタ情報を初期化
147 Smoothie::meta.procPointers.clear();
148
149 // 名前空間情報を取得
150 NamespaceScopesCollection::CollectNamespaces(
151 Smoothie::Lexical::source.GetBuffer(),
152 Smoothie::meta.namespaceScopesCollection
153 );
154
155 //クラス名を取得(詳細情報はGetAllClassInfoで取得)
156 // GetSubInfo関数の中で参照されるオブジェクト名を事前に取得する。
157 // ※オブジェクトの内容までは取得しない
158 pobj_DBClass=new Classes();
159 pobj_DBClass->InitNames();
160
161 //TypeDef情報を初期化
162 Smoothie::meta.typeDefs.Init();
163
164 //定数情報を取得
165 GetConstInfo();
166
167 //サブルーチン(ユーザー定義、DLL関数)の識別子、アドレスを取得
168 pobj_CompilingClass=0;
169 GetSubInfo();
170
171 //クラス情報を取得(※注 - GetSubInfoの後に呼び出す)
172 pobj_DBClass->GetAllClassInfo();
173
174 //コードと行番号の関係
175 extern LINEINFO *pLineInfo;
176 extern int MaxLineInfoNum;
177 pLineInfo=(LINEINFO *)HeapAlloc(hHeap,0,1);
178 MaxLineInfoNum=0;
179
180
181 ///////////////////////////
182 // 最低限必要な関数を取得
183 ///////////////////////////
184 cp=-1;
185
186 if(pSub_System_StartupProgram=GetSubHash("_System_StartupProgram",1))
187 pSub_System_StartupProgram->Using();
188
189 if(pSub_DebugSys_StartProc=GetSubHash("_DebugSys_StartProc",1))
190 pSub_DebugSys_StartProc->Using();
191
192 if(pSub_DebugSys_EndProc=GetSubHash("_DebugSys_EndProc",1))
193 pSub_DebugSys_EndProc->Using();
194
195 if(pSub_DebugSys_SaveContext=GetSubHash("_DebugSys_SaveContext",1))
196 pSub_DebugSys_SaveContext->Using();
197
198 if(pSub_System_GetEip=GetSubHash("_System_GetEip",1)){
199 pSub_System_GetEip->Using();
200 pSub_System_GetEip->ThisIsSystemProc();
201 }
202
203 if(pSub_System_InitDllGlobalVariables=GetSubHash("_System_InitDllGlobalVariables",1)){
204 pSub_System_InitDllGlobalVariables->Using();
205 pSub_System_InitDllGlobalVariables->ThisIsSystemProc();
206 }
207
208 if(pSub_System_InitStaticLocalVariables=GetSubHash("_System_InitStaticLocalVariables",1)){
209 pSub_System_InitStaticLocalVariables->Using();
210 pSub_System_InitStaticLocalVariables->ThisIsSystemProc();
211 }
212
213 if(pSub_System_Call_Destructor_of_GlobalObject=GetSubHash("_System_Call_Destructor_of_GlobalObject",1)){
214 pSub_System_Call_Destructor_of_GlobalObject->Using();
215 pSub_System_Call_Destructor_of_GlobalObject->ThisIsSystemProc();
216 }
217
218 if(pSub_System_GetSp=GetSubHash("_System_GetSp",1)){
219 pSub_System_GetSp->Using();
220 pSub_System_GetSp->ThisIsSystemProc();
221 }
222
223 if(pSub_pow=GetSubHash("pow",1))
224 pSub_pow->Using();
225
226 if(pSub_calloc=GetSubHash("calloc",1))
227 pSub_calloc->Using();
228
229 if(pSub_realloc=GetSubHash("realloc",1))
230 pSub_realloc->Using();
231
232 if(pSub_free=GetSubHash("free",1))
233 pSub_free->Using();
234
235 if( pSub_System_GC_malloc_ForObject = GetSubHash( "_System_GC_malloc_ForObject",1 ) )
236 pSub_System_GC_malloc_ForObject->Using();
237
238 if( pSub_System_GC_malloc_ForObjectPtr = GetSubHash( "_System_GC_malloc_ForObjectPtr",1 ) )
239 pSub_System_GC_malloc_ForObjectPtr->Using();
240
241 if( pSub_System_GC_free_for_SweepingDelete = GetSubHash( "_System_GC_free_for_SweepingDelete",1 ) )
242 pSub_System_GC_free_for_SweepingDelete->Using();
243
244 if( pSubStaticMethod_System_TypeBase_InitializeUserTypes = GetSubHash( "ActiveBasic.Core._System_TypeBase.InitializeUserTypes",1 ) ){
245 pSubStaticMethod_System_TypeBase_InitializeUserTypes->Using();
246 pSubStaticMethod_System_TypeBase_InitializeUserTypes->ThisIsAutoGenerationProc();
247 }
248
249 if( pUserProc_System_CGarbageCollection_RegisterGlobalRoots = GetClassMethod( "_System_CGarbageCollection", "RegisterGlobalRoots" ) ){
250 pUserProc_System_CGarbageCollection_RegisterGlobalRoots->Using();
251 pUserProc_System_CGarbageCollection_RegisterGlobalRoots->ThisIsAutoGenerationProc();
252 }
253
254
255
256 //データテーブルスケジュール
257 pobj_DataTableSchedule=new CSchedule();
258 pobj_DataTableSchedule->SetFlag(SCHEDULE_FLAG_RELOC);
259
260 //インポートテーブルスケジュール
261 //※x64はRPI(実行中アドレス)からのオフセットになるため、再配置が不要
262 pobj_ImportAddrSchedule=new CImportAddrSchedule();
263
264 //プロシージャポインタスケジュール
265 pobj_SubAddrSchedule=new CSubAddrSchedule();
266
267 //グローバル変数アドレススケジュール
268 pobj_GlobalVarSchedule=new CSchedule();
269 pobj_GlobalVarSchedule->SetFlag(SCHEDULE_FLAG_RELOC);
270
271 //グローバル変数の初期バッファ
272 extern BYTE *initGlobalBuf;
273 initGlobalBuf=(BYTE *)HeapAlloc(hHeap,HEAP_ZERO_MEMORY,1);
274
275 //リロケーション情報
276 pobj_Reloc=new CReloc();
277
278 //一時スケジューリングポインタ
279 pobj_TempSchedule=new CTempSchedule();
280
281 obp_AllocSize=8192*2;
282 OpBuffer=(char *)HeapAlloc(hHeap,HEAP_ZERO_MEMORY,obp_AllocSize);
283 obp=0;
284
285 //レジスタのブロッキングを管理するためのオブジェクトを生成
286 pobj_BlockReg=new CBlockReg;
287
288 //レキシカルスコープ情報を初期化
289 obj_LexScopes.Init(obp);
290
291
292 /////////////////////////////////////////////////////////////////
293 // デバッグコンパイル用のログを生成する
294 /////////////////////////////////////////////////////////////////
295#ifdef _DEBUG
296 {
297 ofstream ofs("middle_code.txt");
298 ofs << basbuf << endl;
299 ofs.close();
300 }
301#endif
302
303
304 //////////////////////
305 // グローバル実行領域
306 //////////////////////
307
308 cp=-1;
309 UserProc::CompileStartForGlobalArea();
310
311 if(!bDll){
312 // 名前空間が初期化されているかをチェック
313 if( Smoothie::Lexical::liveingNamespaceScopes.size() ){
314 SetError();
315 }
316
317 //ラベル用のメモリを確保
318 extern LABEL *pLabelNames;
319 extern int MaxLabelNum;
320 pLabelNames=(LABEL *)HeapAlloc(hHeap,0,1);
321 MaxLabelNum=0;
322
323 //Gotoラベルスケジュール
324 extern GOTOLABELSCHEDULE *pGotoLabelSchedule;
325 extern int GotoLabelScheduleNum;
326 pGotoLabelSchedule=(GOTOLABELSCHEDULE *)HeapAlloc(hHeap,0,1);
327 GotoLabelScheduleNum=0;
328
329 //With情報のメモリを確保
330 extern WITHINFO WithInfo;
331 WithInfo.ppName=(char **)HeapAlloc(hHeap,0,1);
332 WithInfo.pWithCp=(int *)HeapAlloc(hHeap,0,1);
333 WithInfo.num=0;
334
335 //Continueアドレスを初期化
336 extern DWORD dwContinueAddress;
337 dwContinueAddress=-1;
338
339 //スタックフレーム管理用クラスを初期化
340 extern CStackFrame *pobj_sf;
341 pobj_sf=new CStackFrame();
342
343
344 //未完成
345 //OpBuffer[obp++]=(char)0xCC;
346
347 //sub rsp,スタックフレームサイズ
348 int StackFrameSchedule;
349 op_sub_rsp(0xFFFFFFFF);
350 StackFrameSchedule=obp-sizeof(long);
351
352 if(bDebugCompile){
353 //デバッグ用の変数を定義
354 DebugVariable();
355 }
356
357 //GC用の変数を定義
358 InitGCVariables();
359
360 //_System_StartupProgramの呼び出し
361 op_call(pSub_System_StartupProgram);
362
363 //クラスに属する静的メンバを定義
364 CMember::InitStaticMember();
365
366 //グローバル実行領域をコンパイル開始
367 CompileBuffer(0,0);
368
369 //ラベル用のメモリを解放
370 for(i=0;i<MaxLabelNum;i++){
371 if(pLabelNames[i].pName) HeapDefaultFree(pLabelNames[i].pName);
372 }
373 HeapDefaultFree(pLabelNames);
374
375 //Goto未知ラベルスケジュールを解放
376 for(i=0;i<GotoLabelScheduleNum;i++){
377 if(pGotoLabelSchedule[i].pName){
378 SetError(6,pGotoLabelSchedule[i].pName,pGotoLabelSchedule[i].now_cp);
379 HeapDefaultFree(pGotoLabelSchedule[i].pName);
380 }
381 else{
382 sprintf(temporary,"%d",pGotoLabelSchedule[i].line);
383 SetError(6,temporary,pGotoLabelSchedule[i].now_cp);
384 }
385 }
386 HeapDefaultFree(pGotoLabelSchedule);
387
388
389 ///////////////////////////////////////
390 // グローバル文字列変数の解放処理
391 ///////////////////////////////////////
392
393 //call _System_Call_Destructor_of_GlobalObject
394 extern UserProc *pSub_System_Call_Destructor_of_GlobalObject;
395 op_call(pSub_System_Call_Destructor_of_GlobalObject);
396
397
398 //add rsp,スタックフレームサイズ
399 op_add_RV(REG_RSP,pobj_sf->GetFrameSize());
400
401 //xor rax,rax(raxを0に初期化する)
402 op_zero_reg(REG_RAX);
403
404 //ret
405 op_ret();
406
407 //グローバル実行領域のコードサイズ
408 extern int GlobalOpBufferSize;
409 GlobalOpBufferSize=obp;
410
411 //スタックフレームスケジュール(subコマンドに渡す値)
412 *((long *)(OpBuffer+StackFrameSchedule))=pobj_sf->GetFrameSize();
413
414 //スタックフレームスケジュールを実行
415 pobj_sf->RunningSchedule();
416 delete pobj_sf;
417 pobj_sf=0;
418
419 //With情報のメモリを解放
420 for(i=0;i<WithInfo.num;i++){
421 SetError(22,"With",WithInfo.pWithCp[i]);
422 HeapDefaultFree(WithInfo.ppName[i]);
423 }
424 HeapDefaultFree(WithInfo.ppName);
425 HeapDefaultFree(WithInfo.pWithCp);
426
427 // 名前空間が正しく閉じられているかをチェック
428 if( Smoothie::Lexical::liveingNamespaceScopes.size() ){
429 SetError(63,NULL,-1);
430 }
431
432 }
433 else{
434 ////////////////
435 // DLLの場合
436 ////////////////
437
438
439 }
440
441 //重複エラー情報管理のメモリを解放(グローバル領域用)
442 for(i=0;i<SynonymErrorNum;i++) HeapDefaultFree(SynonymErrorWords[i]);
443 HeapDefaultFree(SynonymErrorWords);
444
445
446 StepCompileProgress();
447
448
449 /////////////////////
450 // ローカル実行領域
451 /////////////////////
452
453 //プロシージャをコンパイル開始
454 cp=0;
455 CompileLocal();
456
457 // 終了
458 ///////////////////////
459
460 StepCompileProgress();
461
462
463 //レジスタのブロッキングを管理するためのオブジェクトを破棄
464 delete pobj_BlockReg;
465
466 //ネイティブコード生成はここまで
467 //////////////////////////////////////////////////////////
468
469
470
471 ////////////////////////////////
472 // ここで一旦ログを取る
473 ////////////////////////////////
474 Diagnose();
475
476
477
478 ////////////////////////////////
479 // 使用するDLL関数のチェック
480 ////////////////////////////////
481 for(i=0;i<MAX_HASH;i++){
482 extern DllProc **ppDeclareHash;
483 const DllProc *pDllProc = ppDeclareHash[i];
484 while(pDllProc){
485 if( !pDllProc->IsUsing() ){
486 pDllProc=pDllProc->pNextData;
487 continue;
488 }
489/*
490 //エラーチェック
491 HINSTANCE hLib;
492 hLib=LoadLibrary( pDllProc->GetDllFileName().c_str() );
493 if(!hLib){
494 extern char OutputFileName[MAX_PATH];
495 char temp2[MAX_PATH],temp3[MAX_PATH];
496 _splitpath(OutputFileName,temp2,temp3,NULL,NULL);
497 lstrcat(temp2,temp3);
498 lstrcpy(temp3,pDllProc->GetDllFileName().c_str());
499 GetFullPath(temp3,temp2);
500 hLib=LoadLibrary(temp3);
501
502 if(!hLib){
503 SetError(-106,pDllProc->GetDllFileName().c_str(),pDllProc->GetCodePos());
504 }
505 }
506
507 if(hLib){
508 if(!GetProcAddress(hLib,pDllProc->GetAlias().c_str())){
509 FreeLibrary(hLib);
510 SetError(-107,pDllProc->GetAlias(),pDllProc->GetCodePos());
511 }
512 FreeLibrary(hLib);
513 }
514*/
515 pDllProc=pDllProc->pNextData;
516 }
517 }
518
519
520
521 /////////////////////////////
522 // リソースデータを読み込む
523 /////////////////////////////
524 extern char ResourceFileName[MAX_PATH];
525 GetResourceData(ResourceFileName);
526
527
528 //////////////////////////////
529 // エクスポート情報(DLLのみ)
530 //////////////////////////////
531 IMAGE_EXPORT_DIRECTORY ImageExportDirectory;
532 DWORD *lpdwExportAddressTable;
533 DWORD *lpdwExportNamePointerTable;
534 WORD *lpwExportOrdinalTable;
535 char lpExportNames[8192];
536 int ExportNamesLength;
537 int ExportNum;
538 int DllMain_EntryPoint;
539
540 DllMain_EntryPoint=-1;
541 ExportNum=0;
542 ExportNamesLength=0;
543 lpdwExportAddressTable=(DWORD *)HeapAlloc(hHeap,0,1);
544 lpdwExportNamePointerTable=(DWORD *)HeapAlloc(hHeap,0,1);
545 lpwExportOrdinalTable=(WORD *)HeapAlloc(hHeap,0,1);
546
547 if(bUse_ExportSection){
548 _splitpath(OutputFileName,NULL,NULL,lpExportNames,temporary);
549 lstrcat(lpExportNames,temporary);
550 ExportNamesLength=lstrlen(lpExportNames)+1;
551
552 extern GlobalProc **ppSubHash;
553 GlobalProc *pUserProc,*psi2;
554 while(1){
555 //辞書順にサーチ
556 temporary[0]=0;
557 for(i=0,psi2=0;i<MAX_HASH;i++){
558 pUserProc=ppSubHash[i];
559 while(pUserProc){
560 if(pUserProc->IsExport()){
561 if(temporary[0]=='\0'){
562 lstrcpy(temporary,pUserProc->GetName().c_str());
563 psi2=pUserProc;
564 }
565 else{
566 i3=lstrlen(temporary);
567 i4=(int)pUserProc->GetName().size();
568 if(i3<i4) i3=i4;
569 if(memcmp(temporary,pUserProc->GetName().c_str(),i3)>0){
570 lstrcpy(temporary,pUserProc->GetName().c_str());
571 psi2=pUserProc;
572 }
573 }
574 }
575 pUserProc=pUserProc->pNextData;
576 }
577 }
578 if(psi2==0) break;
579 pUserProc=psi2;
580
581 pUserProc->ExportOff();
582
583 if( pUserProc->GetName() == "DllMain" ){
584 DllMain_EntryPoint=pUserProc->beginOpAddress;
585 }
586
587 lpdwExportAddressTable=(DWORD *)HeapReAlloc(hHeap,0,lpdwExportAddressTable,(ExportNum+1)*sizeof(DWORD));
588 lpdwExportAddressTable[ExportNum]=pUserProc->beginOpAddress;
589
590 lpdwExportNamePointerTable=(DWORD *)HeapReAlloc(hHeap,0,lpdwExportNamePointerTable,(ExportNum+1)*sizeof(DWORD));
591 lpdwExportNamePointerTable[ExportNum]=ExportNamesLength;
592
593 lpwExportOrdinalTable=(WORD *)HeapReAlloc(hHeap,0,lpwExportOrdinalTable,(ExportNum+1)*sizeof(WORD));
594 lpwExportOrdinalTable[ExportNum]=ExportNum;
595
596 lstrcpy(lpExportNames+ExportNamesLength,pUserProc->GetName().c_str());
597 ExportNamesLength+=lstrlen(lpExportNames+ExportNamesLength)+1;
598
599 ExportNum++;
600 }
601 for(i=0;i<ExportNum;i++){
602 lpdwExportNamePointerTable[i]+=
603 sizeof(IMAGE_EXPORT_DIRECTORY)+ //エクスポートディレクトリテーブルを飛び越す
604 ExportNum*sizeof(DWORD)+ //エクスポート アドレス テーブルを飛び越す
605 ExportNum*sizeof(DWORD)+ //エクスポート名ポインタ テーブルを飛び越す
606 ExportNum*sizeof(WORD); //エクスポート序数テーブルを飛び越す
607 }
608
609 ImageExportDirectory.Characteristics=0;
610 ImageExportDirectory.TimeDateStamp=(DWORD)time(NULL);
611 ImageExportDirectory.MajorVersion=0;
612 ImageExportDirectory.MinorVersion=0;
613 ImageExportDirectory.Name=sizeof(IMAGE_EXPORT_DIRECTORY)+
614 ExportNum*sizeof(DWORD)+ //エクスポート アドレス テーブルを飛び越す
615 ExportNum*sizeof(DWORD)+ //エクスポート名ポインタ テーブルを飛び越す
616 ExportNum*sizeof(WORD); //エクスポート序数テーブルを飛び越す
617 ImageExportDirectory.Base=1;
618 ImageExportDirectory.NumberOfFunctions=ExportNum;
619 ImageExportDirectory.NumberOfNames=ExportNum;
620 ImageExportDirectory.AddressOfFunctions=sizeof(IMAGE_EXPORT_DIRECTORY);
621 ImageExportDirectory.AddressOfNames=ImageExportDirectory.AddressOfFunctions+ExportNum*sizeof(DWORD);
622 ImageExportDirectory.AddressOfNameOrdinals=ImageExportDirectory.AddressOfNames+ExportNum*sizeof(DWORD);
623 }
624
625
626 /////////////////////
627 //インポートDLL情報
628 /////////////////////
629 extern DllProc **ppDeclareHash;
630 DllProc *pDllProc;
631 char **ppDllNames;
632 int ImportDllNum;
633
634 /*
635 インポート アドレス テーブル(ルックアップと同じ内容だが、プログラム実行時に実行アドレスに書き換えられる)
636 ルックアップ テーブル(ヒントを示すRVA)
637 IMAGE_IMPORT_DESCRIPTOR1[size=0x14] インポートヘッダ
638 IMAGE_IMPORT_DESCRIPTOR2[size=0x14]
639 IMAGE_IMPORT_DESCRIPTOR3[size=0x14]
640 ...
641 Dll名1[size=0x10]
642 Dll名2[size=0x10]
643 Dll名3[size=0x10]
644 ...
645 ヒントテーブル(関数名を羅列したもの)
646 */
647
648 /*
649 IMAGE_IMPORT_DESCRIPTOR1[size=0x14] インポートヘッダ
650 IMAGE_IMPORT_DESCRIPTOR2[size=0x14]
651 IMAGE_IMPORT_DESCRIPTOR3[size=0x14]
652 ...
653 Dll名1[size=0x10]
654 Dll名2[size=0x10]
655 Dll名3[size=0x10]
656 ...
657 ルックアップ テーブル(ヒントを示すRVA)
658 ヒントテーブル
659 インポート アドレス テーブル(ルックアップと同じ内容だが、プログラム実行時に実行アドレスに書き換えられる)
660 */
661
662 ppDllNames=(char **)HeapAlloc(hHeap,0,1);
663
664 ImportDllNum=0;
665 for(i=0;i<MAX_HASH;i++){
666 const DllProc *pDllProc=ppDeclareHash[i];
667 while(pDllProc){
668 if( !pDllProc->IsUsing() ){
669 pDllProc=pDllProc->pNextData;
670 continue;
671 }
672
673 if( pDllProc->GetDllFileName().size() > 16 ){
674 SetError(7,NULL,cp);
675 break;
676 }
677 for(i2=0;i2<ImportDllNum;i2++){
678 if( pDllProc->GetDllFileName() == ppDllNames[i2] ){
679 break;
680 }
681 }
682 if(i2==ImportDllNum){
683 ppDllNames=(char **)HeapReAlloc(hHeap,0,ppDllNames,(ImportDllNum+1)*sizeof(char **));
684 ppDllNames[ImportDllNum]=(char *)HeapAlloc(hHeap,HEAP_ZERO_MEMORY,16);
685 lstrcpy(ppDllNames[ImportDllNum],pDllProc->GetDllFileName().c_str());
686 ImportDllNum++;
687 }
688
689 pDllProc=pDllProc->pNextData;
690 }
691 }
692
693 //IMAGE_IMPORT_DESCRIPTOR、及びルックアップ テーブル サイズの計算
694 IMAGE_IMPORT_DESCRIPTOR *pImportDescriptor;
695 int LookupSize;
696 LookupSize=0;
697 pImportDescriptor=(IMAGE_IMPORT_DESCRIPTOR *)HeapAlloc(hHeap,0,(ImportDllNum+1)*sizeof(IMAGE_IMPORT_DESCRIPTOR));
698 for(i=0;i<ImportDllNum;i++){
699 //IMAGE_IMPORT_DESCRIPTOR
700 pImportDescriptor[i].OriginalFirstThunk=LookupSize; //※すぐ下で再計算
701 pImportDescriptor[i].TimeDateStamp=0;
702 pImportDescriptor[i].ForwarderChain=0;
703 pImportDescriptor[i].Name=i*0x10; //※すぐ下で再計算
704 for(i2=0;i2<MAX_HASH;i2++){
705 pDllProc=ppDeclareHash[i2];
706 while(pDllProc){
707 if( !pDllProc->IsUsing() ){
708 pDllProc=pDllProc->pNextData;
709 continue;
710 }
711
712 if( pDllProc->GetDllFileName() == ppDllNames[i] ){
713 //ルックアップデータのサイズを追加
714 LookupSize+=sizeof(_int64);
715 }
716
717 pDllProc=pDllProc->pNextData;
718 }
719 }
720 LookupSize+=sizeof(_int64); //NULL用
721 }
722 memset(&pImportDescriptor[i],0,sizeof(IMAGE_IMPORT_DESCRIPTOR));
723 for(i=0;i<ImportDllNum;i++){
724 //インポートアドレステーブル分の差分を追加
725 pImportDescriptor[i].OriginalFirstThunk+=LookupSize;
726
727 //DLL名への差分を追加
728 pImportDescriptor[i].Name+=
729 LookupSize+ //インポート アドレス テーブル
730 LookupSize+ //ルックアップテーブル
731 (ImportDllNum+1)*sizeof(IMAGE_IMPORT_DESCRIPTOR); //IMAGE_IMPORT_DESCRIPTOR
732 }
733
734 //ルックアップ テーブル、ヒント テーブル
735 unsigned _int64 *pLookupTable;
736 pLookupTable=(unsigned _int64 *)HeapAlloc(hHeap,0,LookupSize*sizeof(_int64)+1);
737 char *pHintTable;
738 int HintSize,HintAllocSize;
739 HintSize=0;
740 HintAllocSize=128*2;
741 pHintTable=(char *)HeapAlloc(hHeap,0,HintAllocSize);
742 for(i=0,i5=0;i<ImportDllNum;i++){
743 for(i2=0;i2<MAX_HASH;i2++){
744 pDllProc=ppDeclareHash[i2];
745 while(pDllProc){
746 if( !pDllProc->IsUsing() ){
747 pDllProc=pDllProc->pNextData;
748 continue;
749 }
750
751 if( pDllProc->GetDllFileName() == ppDllNames[i] ){
752 //ルックアップの位置をセット(後にインポート アドレス テーブルにセットしなおされる)
753 pDllProc->SetLookupAddress( i5*sizeof(_int64) );
754
755 //ルックアップ テーブルの値をセット
756 pLookupTable[i5++]=
757 LookupSize+ //インポート アドレス テーブル
758 LookupSize+ //ルックアップテーブル
759 (ImportDllNum+1)*sizeof(IMAGE_IMPORT_DESCRIPTOR)+ //IMAGE_IMPORT_DESCRIPTOR
760 ImportDllNum*0x10+ //DLL名の羅列
761 HintSize; //ヒント名へのオフセット
762
763 //ヒント テーブル
764 pHintTable[HintSize++]=0;
765 pHintTable[HintSize++]=0;
766 lstrcpy(pHintTable+HintSize,pDllProc->GetAlias().c_str());
767 i4=(int)pDllProc->GetAlias().size();
768 HintSize+=i4+1;
769 if(i4%2==0) pHintTable[HintSize++]=0;
770
771 if(HintAllocSize<HintSize+128){
772 HintAllocSize+=128;
773 pHintTable=(char *)HeapReAlloc(hHeap,0,pHintTable,HintAllocSize);
774 }
775 }
776
777 pDllProc=pDllProc->pNextData;
778 }
779 }
780 pLookupTable[i5++]=0;
781 }
782
783
784 if(bDll){
785 //DLLの場合はリロケーション情報を仮生成
786 //※正式な生成は各セクションのメモリ上のサイズが決定してから再度行う。
787 pobj_Reloc->ResetRelocBuffer();
788 }
789
790
791
792 //グローバル変数情報を扱う構造体も初期バッファの有無による配置を行う
793 //(デバッグ情報で利用される)
794 extern int AllInitGlobalVarSize;
795 foreach( Variable *pVar, globalVars ){
796 if(pVar->offset&0x80000000){
797 pVar->offset=(pVar->offset&0x7FFFFFFF)+AllInitGlobalVarSize;
798 }
799 }
800
801
802
803 ////////////////////////////////////
804 // デバッグセクションを生成
805 ////////////////////////////////////
806
807 //機械語コードとBasicコードの関係を整理
808 extern LINEINFO *pLineInfo;
809 extern int MaxLineInfoNum;
810 int MinObp,MaxObp;
811 LINEINFO *pTempLineInfo;
812 pTempLineInfo=(LINEINFO *)HeapAlloc(hHeap,0,MaxLineInfoNum*sizeof(LINEINFO));
813 i2=0;
814 MaxObp=0;
815 while(1){
816 for(i3=0,MinObp=0x0FFFFFFF;i3<MaxLineInfoNum;i3++){
817 if(pLineInfo[i3].TopObp<MinObp&&MaxObp<pLineInfo[i3].TopObp){
818 MinObp=pLineInfo[i3].TopObp;
819 i4=i3;
820 }
821 }
822 if(MinObp==0x0FFFFFFF) break;
823 pTempLineInfo[i2]=pLineInfo[i4];
824 MaxObp=pTempLineInfo[i2].TopObp;
825 i2++;
826 }
827 HeapDefaultFree(pLineInfo);
828 pLineInfo=(LINEINFO *)HeapAlloc(hHeap,0,i2*sizeof(LINEINFO));
829 memcpy(pLineInfo,pTempLineInfo,i2*sizeof(LINEINFO));
830 MaxLineInfoNum=i2;
831 HeapDefaultFree(pTempLineInfo);
832
833 //デバッグセクションを生成
834 CDebugSection *pobj_DebugSection;
835 pobj_DebugSection=new CDebugSection();
836 extern BOOL bDebugCompile;
837 extern BOOL bError;
838 if(bDebugCompile&&bError==0){
839 pobj_DebugSection->make();
840 }
841
842
843
844 /////////////////////////////////////
845 // 各セクションの位置とサイズを計算
846 /////////////////////////////////////
847
848 //コードセッションのファイル上のサイズ
849 if(obp%FILE_ALIGNMENT) FileSize_CodeSection=obp+(FILE_ALIGNMENT-obp%FILE_ALIGNMENT);
850 else FileSize_CodeSection=obp;
851 if(FileSize_CodeSection) bUse_CodeSection=1;
852 else bUse_CodeSection=0;
853
854 //エクスポートセクションのファイル上のサイズ
855 i= sizeof(IMAGE_EXPORT_DIRECTORY)+ //エクスポートディレクトリテーブルを飛び越す
856 ExportNum*sizeof(DWORD)+ //エクスポート アドレス テーブルを飛び越す
857 ExportNum*sizeof(DWORD)+ //エクスポート名ポインタ テーブルを飛び越す
858 ExportNum*sizeof(WORD)+ //エクスポート序数テーブルを飛び越す
859 ExportNamesLength; //シンボル名バッファ
860 if(bUse_ExportSection){
861 if(i%FILE_ALIGNMENT) FileSize_ExportSection=i+(FILE_ALIGNMENT-i%FILE_ALIGNMENT);
862 else FileSize_ExportSection=i;
863 }
864 else FileSize_ExportSection=0;
865
866 //インポートセクションのファイル上のサイズ
867 i=
868 LookupSize+ //インポート アドレス テーブル
869 LookupSize+ //ルックアップテーブル
870 (ImportDllNum+1)*sizeof(IMAGE_IMPORT_DESCRIPTOR)+ //IMAGE_IMPORT_DESCRIPTOR
871 ImportDllNum*0x10+ //DLL名の羅列
872 HintSize; //ヒント名
873 if(i%FILE_ALIGNMENT) FileSize_ImportSection=i+(FILE_ALIGNMENT-i%FILE_ALIGNMENT);
874 else FileSize_ImportSection=i;
875 bUse_ImportSection=1; //インポートセクションは必ず存在する
876
877 //データセクションのファイル上のサイズ
878 if(dataTable.GetSize()%FILE_ALIGNMENT) FileSize_DataSection=dataTable.GetSize()+(FILE_ALIGNMENT-dataTable.GetSize()%FILE_ALIGNMENT);
879 else FileSize_DataSection=dataTable.GetSize();
880 if(FileSize_DataSection) bUse_DataSection=1;
881 else bUse_DataSection=0;
882
883 //リライタブルセクションのファイル上のサイズ(グローバル変数の初期情報のみを格納)
884 extern int AllInitGlobalVarSize;
885 if(AllInitGlobalVarSize%FILE_ALIGNMENT) FileSize_RWSection=AllInitGlobalVarSize+(FILE_ALIGNMENT-AllInitGlobalVarSize%FILE_ALIGNMENT);
886 else{
887 if(AllInitGlobalVarSize) FileSize_RWSection=AllInitGlobalVarSize;
888 else FileSize_RWSection=FILE_ALIGNMENT;
889 }
890 bUse_RWSection=1;
891
892 //リソースセクションのファイル上のサイズ
893 char *RSrcSectionBuffer;
894 int RSrcSectionSize;
895 RSrcSectionBuffer=GetRSrcSectionBuffer(&RSrcSectionSize);
896 if(RSrcSectionSize%FILE_ALIGNMENT) FileSize_RSrcSection=RSrcSectionSize+(FILE_ALIGNMENT-RSrcSectionSize%FILE_ALIGNMENT);
897 else FileSize_RSrcSection=RSrcSectionSize;
898 if(FileSize_RSrcSection) bUse_RSrcSection=1;
899 else bUse_RSrcSection=0;
900
901 //リロケーションセクションのファイル上のサイズ
902 if(pobj_Reloc->length%FILE_ALIGNMENT) FileSize_RelocSection=pobj_Reloc->length+(FILE_ALIGNMENT-pobj_Reloc->length%FILE_ALIGNMENT);
903 else FileSize_RelocSection=pobj_Reloc->length;
904 if(FileSize_RelocSection) bUse_RelocSection=1;
905 else bUse_RelocSection=0;
906
907 //デバッグセクションのファイル上のサイズ
908 if(pobj_DebugSection->length%FILE_ALIGNMENT) FileSize_DebugSection=pobj_DebugSection->length+(FILE_ALIGNMENT-pobj_DebugSection->length%FILE_ALIGNMENT);
909 else FileSize_DebugSection=pobj_DebugSection->length;
910 if(FileSize_DebugSection) bUse_DebugSection=1;
911 else bUse_DebugSection=0;
912
913
914 //各セッションのファイル上の位置
915 FilePos_CodeSection= EXE_HEADER_SIZE;
916 FilePos_ExportSection= FilePos_CodeSection+
917 FileSize_CodeSection;
918 FilePos_ImportSection= FilePos_ExportSection+
919 FileSize_ExportSection;
920 FilePos_DataSection= FilePos_ImportSection+
921 FileSize_ImportSection;
922 FilePos_RWSection= FilePos_DataSection+
923 FileSize_DataSection;
924 FilePos_RSrcSection= FilePos_RWSection+
925 FileSize_RWSection;
926 FilePos_RelocSection= FilePos_RSrcSection+
927 FileSize_RSrcSection;
928 FilePos_DebugSection= FilePos_RelocSection+
929 FileSize_RelocSection;
930
931 //コードセッションのメモリ上のサイズ
932 if(FileSize_CodeSection%MEM_ALIGNMENT) MemSize_CodeSection=FileSize_CodeSection+(MEM_ALIGNMENT-FileSize_CodeSection%MEM_ALIGNMENT);
933 else MemSize_CodeSection=FileSize_CodeSection;
934
935 //エクスポートセクションのメモリ上のサイズ
936 if(FileSize_ExportSection%MEM_ALIGNMENT) MemSize_ExportSection=FileSize_ExportSection+(MEM_ALIGNMENT-FileSize_ExportSection%MEM_ALIGNMENT);
937 else MemSize_ExportSection=FileSize_ExportSection;
938
939 //インポートセクションのメモリ上のサイズ
940 if(FileSize_ImportSection%MEM_ALIGNMENT) MemSize_ImportSection=FileSize_ImportSection+(MEM_ALIGNMENT-FileSize_ImportSection%MEM_ALIGNMENT);
941 else MemSize_ImportSection=FileSize_ImportSection;
942
943 //データセクションのメモリ上のサイズ
944 if(FileSize_DataSection%MEM_ALIGNMENT) MemSize_DataSection=FileSize_DataSection+(MEM_ALIGNMENT-FileSize_DataSection%MEM_ALIGNMENT);
945 else MemSize_DataSection=FileSize_DataSection;
946
947 //リライタブルセクションのメモリ上のサイズ
948 extern int AllGlobalVarSize;
949 i=AllInitGlobalVarSize+AllGlobalVarSize;
950 if(i%MEM_ALIGNMENT) MemSize_RWSection=i+(MEM_ALIGNMENT-i%MEM_ALIGNMENT);
951 else MemSize_RWSection=i;
952
953 //リソースセクションのメモリ上のサイズ
954 if(FileSize_RSrcSection%MEM_ALIGNMENT) MemSize_RSrcSection=FileSize_RSrcSection+(MEM_ALIGNMENT-FileSize_RSrcSection%MEM_ALIGNMENT);
955 else MemSize_RSrcSection=FileSize_RSrcSection;
956
957 //リロケーションセクションのメモリ上のサイズ
958 if(FileSize_RelocSection%MEM_ALIGNMENT) MemSize_RelocSection=FileSize_RelocSection+(MEM_ALIGNMENT-FileSize_RelocSection%MEM_ALIGNMENT);
959 else MemSize_RelocSection=FileSize_RelocSection;
960
961 //デバッグセクションのメモリ上のサイズ
962 if(FileSize_DebugSection%MEM_ALIGNMENT) MemSize_DebugSection=FileSize_DebugSection+(MEM_ALIGNMENT-FileSize_DebugSection%MEM_ALIGNMENT);
963 else MemSize_DebugSection=FileSize_DebugSection;
964
965
966 //各セッションのメモリ上の位置
967 if(bUse_ExportSection) MemPos_ExportSection= 0x1000+
968 MemSize_CodeSection;
969 else MemPos_ExportSection=0;
970 if(bUse_ImportSection) MemPos_ImportSection= 0x1000+
971 MemSize_CodeSection+
972 MemSize_ExportSection;
973 else MemPos_ImportSection=0;
974 if(bUse_DataSection) MemPos_DataSection= 0x1000+
975 MemSize_CodeSection+
976 MemSize_ExportSection+
977 MemSize_ImportSection;
978 else MemPos_DataSection=0;
979 if(bUse_RWSection) MemPos_RWSection= 0x1000+
980 MemSize_CodeSection+
981 MemSize_ExportSection+
982 MemSize_ImportSection+
983 MemSize_DataSection;
984 else MemPos_RWSection=0;
985 if(bUse_RSrcSection) MemPos_RSrcSection= 0x1000+
986 MemSize_CodeSection+
987 MemSize_ExportSection+
988 MemSize_ImportSection+
989 MemSize_DataSection+
990 MemSize_RWSection;
991 else MemPos_RSrcSection=0;
992 if(bUse_RelocSection) MemPos_RelocSection= 0x1000+
993 MemSize_CodeSection+
994 MemSize_ExportSection+
995 MemSize_ImportSection+
996 MemSize_DataSection+
997 MemSize_RWSection+
998 MemSize_RSrcSection;
999 else MemPos_RelocSection=0;
1000 if(bUse_DebugSection) MemPos_DebugSection= 0x1000+
1001 MemSize_CodeSection+
1002 MemSize_ExportSection+
1003 MemSize_ImportSection+
1004 MemSize_DataSection+
1005 MemSize_RWSection+
1006 MemSize_RSrcSection+
1007 MemSize_RelocSection;
1008 else MemPos_DebugSection=0;
1009
1010
1011
1012 /////////////////////////////
1013 // GC用の変数スケジュール
1014 /////////////////////////////
1015 PerformedGcVarSchedule();
1016
1017
1018 ////////////////////////////
1019 // エクスポート情報の再配置
1020 ////////////////////////////
1021 if(bUse_ExportSection){
1022 for(i=0;i<ExportNum;i++){
1023 lpdwExportAddressTable[i]+=MemPos_CodeSection;
1024 lpdwExportNamePointerTable[i]+=MemPos_ExportSection;
1025 }
1026
1027 ImageExportDirectory.Name+= MemPos_ExportSection;
1028 ImageExportDirectory.AddressOfFunctions+= MemPos_ExportSection;
1029 ImageExportDirectory.AddressOfNames+= MemPos_ExportSection;
1030 ImageExportDirectory.AddressOfNameOrdinals+= MemPos_ExportSection;
1031 }
1032
1033
1034 ////////////////////////////
1035 // インポート情報の再配置
1036 ////////////////////////////
1037 for(i=0,i5=0;i<ImportDllNum;i++){
1038 //IMAGE_IMPORT_DESCRIPTOR
1039 pImportDescriptor[i].OriginalFirstThunk+=MemPos_ImportSection;
1040 pImportDescriptor[i].Name+=MemPos_ImportSection;
1041
1042 //インポート アドレス テーブル(ルックアップ テーブルを差し引く)
1043 pImportDescriptor[i].FirstThunk=pImportDescriptor[i].OriginalFirstThunk-
1044 LookupSize; //ルックアップテーブル
1045
1046 for(i2=0;i2<MAX_HASH;i2++){
1047 const DllProc *pDllProc=ppDeclareHash[i2];
1048 while(pDllProc){
1049 if( !pDllProc->IsUsing() ){
1050 pDllProc=pDllProc->pNextData;
1051 continue;
1052 }
1053
1054 if( pDllProc->GetDllFileName() == ppDllNames[i] ){
1055 //ルックアップ テーブル
1056 pLookupTable[i5++]+=MemPos_ImportSection;
1057 }
1058
1059 pDllProc=pDllProc->pNextData;
1060 }
1061 }
1062 i5++;
1063 }
1064
1065
1066 ////////////////////////////////////////
1067 //仮想関数データテーブルスケジュール
1068 pobj_DBClass->ActionVtblSchedule(ImageBase,MemPos_CodeSection);
1069
1070
1071 //////////////////////////////
1072 // データテーブルスケジュール
1073 for(i=0;i<pobj_DataTableSchedule->num;i++){
1074 *((long *)(OpBuffer+pobj_DataTableSchedule->pObpValues[i]))+=ImageBase+MemPos_DataSection;
1075 }
1076 delete pobj_DataTableSchedule;
1077
1078
1079 //////////////////////////////////
1080 // インポートテーブルスケジュール(インポート アドレス テーブルを指し示させる)
1081 // ※x86はRVAからのオフセット。x64はRPI(実行中アドレス)からのオフセット
1082 for(i=0;i<pobj_ImportAddrSchedule->num;i++){
1083 DllProc *pDllProc;
1084 pDllProc=pobj_ImportAddrSchedule->ppdi[i];
1085 *((long *)(OpBuffer+pobj_ImportAddrSchedule->pObpValues[i]))=
1086 MemPos_ImportSection+
1087 pDllProc->GetLookupAddress()
1088 -(MemPos_CodeSection+pobj_ImportAddrSchedule->pObpValues[i]+sizeof(long));
1089 }
1090 delete pobj_ImportAddrSchedule;
1091
1092
1093 ////////////////////////////////////
1094 // プロシージャポインタスケジュール
1095 for(i=0;i<pobj_SubAddrSchedule->num;i++){
1096 if(pobj_SubAddrSchedule->ppsi[i]->beginOpAddress==0
1097 &&pobj_SubAddrSchedule->ppsi[i]->endOpAddress==0){
1098 SetError(300,NULL,-1);
1099 }
1100
1101 if(pobj_SubAddrSchedule->pbCall[i]){
1102 *((long *)(OpBuffer+pobj_SubAddrSchedule->pObpValues[i]))=
1103 pobj_SubAddrSchedule->ppsi[i]->beginOpAddress-(pobj_SubAddrSchedule->pObpValues[i]+sizeof(long));
1104 }
1105 else{
1106 *((long *)(OpBuffer+pobj_SubAddrSchedule->pObpValues[i]))=
1107 pobj_SubAddrSchedule->ppsi[i]->beginOpAddress+ImageBase+MemPos_CodeSection;
1108 }
1109 }
1110 delete pobj_SubAddrSchedule;
1111
1112
1113 if(bDll){
1114 //DLLの場合はリロケーション情報を生成
1115 pobj_Reloc->ResetRelocBuffer();
1116 }
1117
1118 delete pobj_TempSchedule;
1119
1120
1121
1122 //////////////////////////////////////
1123 // グローバル変数アドレススケジュール
1124 //////////////////////////////////////
1125
1126 /*
1127 GlobalArea1 - 初期バッファあり
1128 GlobalArea2 - 初期バッファなし
1129 */
1130 for(i=0;i<pobj_GlobalVarSchedule->num;i++){
1131 if(*((long *)(OpBuffer+pobj_GlobalVarSchedule->pObpValues[i])) & 0x80000000){
1132 //初期バッファなし
1133 *((long *)(OpBuffer+pobj_GlobalVarSchedule->pObpValues[i]))=
1134 AllInitGlobalVarSize+
1135 (*((long *)(OpBuffer+pobj_GlobalVarSchedule->pObpValues[i])) & 0x7FFFFFFF)+
1136 ImageBase+MemPos_RWSection;
1137 }
1138 else{
1139 //初期バッファあり
1140 *((long *)(OpBuffer+pobj_GlobalVarSchedule->pObpValues[i]))+=
1141 ImageBase+MemPos_RWSection;
1142 }
1143 }
1144 delete pobj_GlobalVarSchedule;
1145
1146
1147 ////////////////////////////////
1148 // リソースアドレススケジュール
1149 extern DWORD *lpdwRSrcAddrSchedule;
1150 extern int RSrcAddrScheduleNum;
1151 for(i=0;i<RSrcAddrScheduleNum;i++){
1152 *(DWORD *)(RSrcSectionBuffer+lpdwRSrcAddrSchedule[i])+=MemPos_RSrcSection;
1153 }
1154 HeapDefaultFree(lpdwRSrcAddrSchedule);
1155
1156
1157 //Dosスタブ
1158 char *DosStubBuffer;
1159 int DosStubSize;
1160 hFile=CreateFile(
1161 ( Jenga::Common::Environment::GetAppDir() + "\\SubOperation\\dosstub.pgm" ).c_str(),
1162 GENERIC_READ,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
1163 if(hFile==INVALID_HANDLE_VALUE){
1164 MessageBox(hOwnerEditor,"dosstub.pgmの読み込みに失敗","error",MB_OK);
1165 goto EndWriteOpcode;
1166 }
1167 DosStubSize=GetFileSize(hFile,NULL);
1168 DosStubBuffer=(char *)HeapAlloc(hHeap,0,DosStubSize);
1169 ReadFile(hFile,DosStubBuffer,DosStubSize,(DWORD *)&i2,NULL);
1170 CloseHandle(hFile);
1171
1172
1173 extern BOOL bError;
1174 if(bError) goto EndWriteOpcode;
1175
1176
1177 ////////////////////////////
1178 // EXEファイルのヘッダ情報
1179 ////////////////////////////
1180
1181 IMAGE_DOS_HEADER ImageDosHeader;
1182 ImageDosHeader.e_magic= 0x5A4D;
1183 ImageDosHeader.e_cblp= 0x0090;
1184 ImageDosHeader.e_cp= 0x0003;
1185 ImageDosHeader.e_crlc= 0;
1186 ImageDosHeader.e_cparhdr=4;
1187 ImageDosHeader.e_minalloc=0x0000;
1188 ImageDosHeader.e_maxalloc=0xFFFF;
1189 ImageDosHeader.e_ss= 0x0000;
1190 ImageDosHeader.e_sp= 0x00B8;
1191 ImageDosHeader.e_csum= 0x0000;
1192 ImageDosHeader.e_ip= 0x0000;
1193 ImageDosHeader.e_cs= 0x0000;
1194 ImageDosHeader.e_lfarlc=0x0040;
1195 ImageDosHeader.e_ovno= 0x0000;
1196 ImageDosHeader.e_res[0]=0;
1197 ImageDosHeader.e_res[1]=0;
1198 ImageDosHeader.e_res[2]=0;
1199 ImageDosHeader.e_res[3]=0;
1200 ImageDosHeader.e_oemid= 0x0000;
1201 ImageDosHeader.e_oeminfo=0x0000;
1202 ImageDosHeader.e_res2[0]=0;
1203 ImageDosHeader.e_res2[1]=0;
1204 ImageDosHeader.e_res2[2]=0;
1205 ImageDosHeader.e_res2[3]=0;
1206 ImageDosHeader.e_res2[4]=0;
1207 ImageDosHeader.e_res2[5]=0;
1208 ImageDosHeader.e_res2[6]=0;
1209 ImageDosHeader.e_res2[7]=0;
1210 ImageDosHeader.e_res2[8]=0;
1211 ImageDosHeader.e_res2[9]=0;
1212 ImageDosHeader.e_lfanew=0x0100; //PEヘッダの位置
1213
1214
1215 /////////////////////////////////////////////
1216 // PEヘッダ
1217 /////////////////////////////////////////////
1218
1219 IMAGE_NT_HEADERS64 ImagePeHdr;
1220 ImagePeHdr.Signature=IMAGE_NT_SIGNATURE;
1221
1222 //マシンタイプ
1223 ImagePeHdr.FileHeader.Machine= IMAGE_FILE_MACHINE_AMD64;
1224
1225 ImagePeHdr.FileHeader.NumberOfSections= bUse_CodeSection+
1226 bUse_ExportSection+
1227 bUse_ImportSection+
1228 bUse_DataSection+
1229 bUse_RWSection+
1230 bUse_RSrcSection+
1231 bUse_RelocSection+
1232 bUse_DebugSection; //セクション数
1233 ImagePeHdr.FileHeader.TimeDateStamp= (DWORD)time(NULL);
1234 ImagePeHdr.FileHeader.PointerToSymbolTable= 0x00000000;
1235 ImagePeHdr.FileHeader.NumberOfSymbols= 0x00000000;
1236 ImagePeHdr.FileHeader.SizeOfOptionalHeader= IMAGE_SIZEOF_NT_OPTIONAL64_HEADER;
1237 if(bDll){
1238 ImagePeHdr.FileHeader.Characteristics= IMAGE_FILE_EXECUTABLE_IMAGE|
1239 IMAGE_FILE_DLL|
1240 IMAGE_FILE_LARGE_ADDRESS_AWARE;
1241 }
1242 else{
1243 ImagePeHdr.FileHeader.Characteristics= IMAGE_FILE_RELOCS_STRIPPED|
1244 IMAGE_FILE_EXECUTABLE_IMAGE|
1245 IMAGE_FILE_LARGE_ADDRESS_AWARE;
1246 }
1247
1248 ImagePeHdr.OptionalHeader.Magic= IMAGE_NT_OPTIONAL_HDR64_MAGIC;
1249 ImagePeHdr.OptionalHeader.MajorLinkerVersion= 5;
1250 ImagePeHdr.OptionalHeader.MinorLinkerVersion= 0;
1251 ImagePeHdr.OptionalHeader.SizeOfCode= FileSize_CodeSection; //コードサイズ(.textのセッションサイズ)
1252 ImagePeHdr.OptionalHeader.SizeOfInitializedData=FileSize_DataSection; //データサイズ(.dataのセッションサイズ)
1253 ImagePeHdr.OptionalHeader.SizeOfUninitializedData=0; //未初期化データのサイズ(なし)
1254 if(bDll){
1255 if(DllMain_EntryPoint==-1)
1256 ImagePeHdr.OptionalHeader.AddressOfEntryPoint=0;
1257 else
1258 ImagePeHdr.OptionalHeader.AddressOfEntryPoint=MemPos_CodeSection+DllMain_EntryPoint;
1259 }
1260 else ImagePeHdr.OptionalHeader.AddressOfEntryPoint= MemPos_CodeSection;
1261 ImagePeHdr.OptionalHeader.BaseOfCode= MemPos_CodeSection; //.textのアドレス
1262
1263 ImagePeHdr.OptionalHeader.ImageBase= ImageBase; //イメージベース
1264 ImagePeHdr.OptionalHeader.SectionAlignment= MEM_ALIGNMENT; //セクションアラインメント
1265 ImagePeHdr.OptionalHeader.FileAlignment= FILE_ALIGNMENT;
1266 ImagePeHdr.OptionalHeader.MajorOperatingSystemVersion=4;
1267 ImagePeHdr.OptionalHeader.MinorOperatingSystemVersion=0;
1268 ImagePeHdr.OptionalHeader.MajorImageVersion= 0;
1269 ImagePeHdr.OptionalHeader.MinorImageVersion= 0;
1270 ImagePeHdr.OptionalHeader.MajorSubsystemVersion=4;
1271 ImagePeHdr.OptionalHeader.MinorSubsystemVersion=0;
1272 ImagePeHdr.OptionalHeader.Win32VersionValue= 0;
1273 ImagePeHdr.OptionalHeader.SizeOfImage= EXE_HEADER_SIZE+
1274 MemSize_CodeSection+
1275 MemSize_ExportSection+
1276 MemSize_ImportSection+
1277 MemSize_DataSection+
1278 MemSize_RWSection+
1279 MemSize_RSrcSection+
1280 MemSize_RelocSection+
1281 MemSize_DebugSection;//すべてのイメージサイズ
1282 ImagePeHdr.OptionalHeader.SizeOfHeaders= EXE_HEADER_SIZE;//ヘッダサイズ
1283 ImagePeHdr.OptionalHeader.CheckSum= 0;
1284 extern unsigned short TypeOfSubSystem;
1285 ImagePeHdr.OptionalHeader.Subsystem= TypeOfSubSystem;
1286 ImagePeHdr.OptionalHeader.DllCharacteristics= 0;
1287 ImagePeHdr.OptionalHeader.SizeOfStackReserve= 0x00100000;
1288 ImagePeHdr.OptionalHeader.SizeOfStackCommit= 0x00001000;
1289 ImagePeHdr.OptionalHeader.SizeOfHeapReserve= 0x00100000;
1290 ImagePeHdr.OptionalHeader.SizeOfHeapCommit= 0x00001000;
1291 ImagePeHdr.OptionalHeader.LoaderFlags= 0;
1292 ImagePeHdr.OptionalHeader.NumberOfRvaAndSizes= IMAGE_NUMBEROF_DIRECTORY_ENTRIES;
1293
1294 //データ ディクショナリ
1295 ImagePeHdr.OptionalHeader.DataDirectory[0].VirtualAddress=MemPos_ExportSection;
1296 ImagePeHdr.OptionalHeader.DataDirectory[0].Size=FileSize_ExportSection;
1297 ImagePeHdr.OptionalHeader.DataDirectory[1].VirtualAddress= //IMAGE_IMPORT_DESCRIPTORを指す
1298 MemPos_ImportSection+
1299 LookupSize+ //インポート アドレス テーブル
1300 LookupSize; //ルックアップ テーブル
1301 ImagePeHdr.OptionalHeader.DataDirectory[1].Size=(ImportDllNum+1)*sizeof(IMAGE_IMPORT_DESCRIPTOR);
1302 ImagePeHdr.OptionalHeader.DataDirectory[2].VirtualAddress=MemPos_RSrcSection;
1303 ImagePeHdr.OptionalHeader.DataDirectory[2].Size=RSrcSectionSize;
1304 ImagePeHdr.OptionalHeader.DataDirectory[3].VirtualAddress=0;
1305 ImagePeHdr.OptionalHeader.DataDirectory[3].Size=0;
1306 ImagePeHdr.OptionalHeader.DataDirectory[4].VirtualAddress=0;
1307 ImagePeHdr.OptionalHeader.DataDirectory[4].Size=0;
1308 ImagePeHdr.OptionalHeader.DataDirectory[5].VirtualAddress=MemPos_RelocSection;
1309 ImagePeHdr.OptionalHeader.DataDirectory[5].Size=pobj_Reloc->length;
1310 ImagePeHdr.OptionalHeader.DataDirectory[6].VirtualAddress=0;
1311 ImagePeHdr.OptionalHeader.DataDirectory[6].Size=0;
1312 ImagePeHdr.OptionalHeader.DataDirectory[7].VirtualAddress=0;
1313 ImagePeHdr.OptionalHeader.DataDirectory[7].Size=0;
1314 ImagePeHdr.OptionalHeader.DataDirectory[8].VirtualAddress=0;
1315 ImagePeHdr.OptionalHeader.DataDirectory[8].Size=0;
1316 ImagePeHdr.OptionalHeader.DataDirectory[9].VirtualAddress=0;
1317 ImagePeHdr.OptionalHeader.DataDirectory[9].Size=0;
1318 ImagePeHdr.OptionalHeader.DataDirectory[10].VirtualAddress=0;
1319 ImagePeHdr.OptionalHeader.DataDirectory[10].Size=0;
1320 ImagePeHdr.OptionalHeader.DataDirectory[11].VirtualAddress=0;
1321 ImagePeHdr.OptionalHeader.DataDirectory[11].Size=0;
1322 ImagePeHdr.OptionalHeader.DataDirectory[12].VirtualAddress=MemPos_ImportSection;//インポート アドレス テーブル
1323 ImagePeHdr.OptionalHeader.DataDirectory[12].Size=LookupSize;
1324 ImagePeHdr.OptionalHeader.DataDirectory[13].VirtualAddress=0;
1325 ImagePeHdr.OptionalHeader.DataDirectory[13].Size=0;
1326 ImagePeHdr.OptionalHeader.DataDirectory[14].VirtualAddress=0;
1327 ImagePeHdr.OptionalHeader.DataDirectory[14].Size=0;
1328 ImagePeHdr.OptionalHeader.DataDirectory[15].VirtualAddress=0;
1329 ImagePeHdr.OptionalHeader.DataDirectory[15].Size=0;
1330
1331
1332 //コードセクションヘッダ
1333 IMAGE_SECTION_HEADER CodeSectionHeader;
1334 memset((char *)CodeSectionHeader.Name,0,IMAGE_SIZEOF_SHORT_NAME);
1335 lstrcpy((char *)CodeSectionHeader.Name,".text");
1336 CodeSectionHeader.Misc.VirtualSize= obp;
1337 CodeSectionHeader.VirtualAddress= MemPos_CodeSection; //開始アドレス
1338 CodeSectionHeader.SizeOfRawData= FileSize_CodeSection;
1339 CodeSectionHeader.PointerToRawData= FilePos_CodeSection; //ファイル上の開始アドレス
1340 CodeSectionHeader.PointerToRelocations= 0;
1341 CodeSectionHeader.PointerToLinenumbers= 0;
1342 CodeSectionHeader.NumberOfRelocations= 0;
1343 CodeSectionHeader.NumberOfLinenumbers= 0;
1344 CodeSectionHeader.Characteristics= IMAGE_SCN_MEM_EXECUTE|
1345 IMAGE_SCN_MEM_READ|
1346 IMAGE_SCN_CNT_CODE;
1347
1348 //エクスポートセクションヘッダ
1349 IMAGE_SECTION_HEADER ExportSectionHeader;
1350 memset((char *)ExportSectionHeader.Name,0,IMAGE_SIZEOF_SHORT_NAME);
1351 lstrcpy((char *)ExportSectionHeader.Name,".edata");
1352 ExportSectionHeader.Misc.VirtualSize= MemSize_ExportSection;
1353 ExportSectionHeader.VirtualAddress= MemPos_ExportSection; //開始アドレス
1354 ExportSectionHeader.SizeOfRawData= FileSize_ExportSection; //サイズ
1355 ExportSectionHeader.PointerToRawData= FilePos_ExportSection; //ファイル上の開始アドレス
1356 ExportSectionHeader.PointerToRelocations= 0;
1357 ExportSectionHeader.PointerToLinenumbers= 0;
1358 ExportSectionHeader.NumberOfRelocations= 0;
1359 ExportSectionHeader.NumberOfLinenumbers= 0;
1360 ExportSectionHeader.Characteristics= IMAGE_SCN_CNT_INITIALIZED_DATA|
1361 IMAGE_SCN_MEM_READ;
1362
1363 //インポートセクションヘッダ
1364 IMAGE_SECTION_HEADER ImportSectionHeader;
1365 memset((char *)ImportSectionHeader.Name,0,IMAGE_SIZEOF_SHORT_NAME);
1366 lstrcpy((char *)ImportSectionHeader.Name,".idata");
1367 ImportSectionHeader.Misc.VirtualSize=
1368 LookupSize+ //インポートアドレステーブル
1369 LookupSize+ //ルックアップテーブル
1370 (ImportDllNum+1)*sizeof(IMAGE_IMPORT_DESCRIPTOR)+
1371 16*ImportDllNum+ //DLL名
1372 HintSize; //ヒント名(関数名)テーブル
1373 ImportSectionHeader.VirtualAddress= MemPos_ImportSection; //開始アドレス
1374 ImportSectionHeader.SizeOfRawData= FileSize_ImportSection; //サイズ
1375 ImportSectionHeader.PointerToRawData= FilePos_ImportSection; //ファイル上の開始アドレス
1376 ImportSectionHeader.PointerToRelocations= 0;
1377 ImportSectionHeader.PointerToLinenumbers= 0;
1378 ImportSectionHeader.NumberOfRelocations= 0;
1379 ImportSectionHeader.NumberOfLinenumbers= 0;
1380 ImportSectionHeader.Characteristics= IMAGE_SCN_CNT_INITIALIZED_DATA|
1381 IMAGE_SCN_MEM_READ;
1382
1383 //データセクションヘッダ
1384 IMAGE_SECTION_HEADER DataSectionHeader;
1385 memset((char *)DataSectionHeader.Name,0,IMAGE_SIZEOF_SHORT_NAME);
1386 lstrcpy((char *)DataSectionHeader.Name,".sdata");
1387 DataSectionHeader.Misc.VirtualSize= MemSize_DataSection;
1388 DataSectionHeader.VirtualAddress= MemPos_DataSection;
1389 DataSectionHeader.SizeOfRawData= FileSize_DataSection;
1390 DataSectionHeader.PointerToRawData= FilePos_DataSection;
1391 DataSectionHeader.PointerToRelocations= 0;
1392 DataSectionHeader.PointerToLinenumbers= 0;
1393 DataSectionHeader.NumberOfRelocations= 0;
1394 DataSectionHeader.NumberOfLinenumbers= 0;
1395 DataSectionHeader.Characteristics= IMAGE_SCN_CNT_INITIALIZED_DATA|
1396 IMAGE_SCN_MEM_READ|
1397 IMAGE_SCN_MEM_WRITE;
1398
1399 //リライタブルセクションヘッダ
1400 IMAGE_SECTION_HEADER RWSectionHeader;
1401 memset((char *)RWSectionHeader.Name,0,IMAGE_SIZEOF_SHORT_NAME);
1402 lstrcpy((char *)RWSectionHeader.Name,".data");
1403 RWSectionHeader.Misc.VirtualSize= AllInitGlobalVarSize+AllGlobalVarSize;
1404 RWSectionHeader.VirtualAddress= MemPos_RWSection;
1405 RWSectionHeader.SizeOfRawData= FileSize_RWSection;
1406 RWSectionHeader.PointerToRawData= FilePos_RWSection;
1407 RWSectionHeader.PointerToRelocations= 0;
1408 RWSectionHeader.PointerToLinenumbers= 0;
1409 RWSectionHeader.NumberOfRelocations= 0;
1410 RWSectionHeader.NumberOfLinenumbers= 0;
1411 RWSectionHeader.Characteristics= IMAGE_SCN_CNT_INITIALIZED_DATA|
1412 IMAGE_SCN_MEM_READ|
1413 IMAGE_SCN_MEM_WRITE;
1414
1415 //リソースセクションヘッダ
1416 IMAGE_SECTION_HEADER RSrcSectionHeader;
1417 memset((char *)RSrcSectionHeader.Name,0,IMAGE_SIZEOF_SHORT_NAME);
1418 lstrcpy((char *)RSrcSectionHeader.Name,".rsrc");
1419 RSrcSectionHeader.Misc.VirtualSize= RSrcSectionSize;
1420 RSrcSectionHeader.VirtualAddress= MemPos_RSrcSection;
1421 RSrcSectionHeader.SizeOfRawData= FileSize_RSrcSection;
1422 RSrcSectionHeader.PointerToRawData= FilePos_RSrcSection;
1423 RSrcSectionHeader.PointerToRelocations= 0;
1424 RSrcSectionHeader.PointerToLinenumbers= 0;
1425 RSrcSectionHeader.NumberOfRelocations= 0;
1426 RSrcSectionHeader.NumberOfLinenumbers= 0;
1427 RSrcSectionHeader.Characteristics= IMAGE_SCN_CNT_INITIALIZED_DATA|
1428 IMAGE_SCN_MEM_READ;
1429
1430 //リロケーションセクションヘッダ
1431 IMAGE_SECTION_HEADER RelocSectionHeader;
1432 memset((char *)RelocSectionHeader.Name,0,IMAGE_SIZEOF_SHORT_NAME);
1433 lstrcpy((char *)RelocSectionHeader.Name,".reloc");
1434 RelocSectionHeader.Misc.VirtualSize= pobj_Reloc->length;
1435 RelocSectionHeader.VirtualAddress= MemPos_RelocSection; //開始アドレス
1436 RelocSectionHeader.SizeOfRawData= FileSize_RelocSection; //サイズ
1437 RelocSectionHeader.PointerToRawData= FilePos_RelocSection; //ファイル上の開始アドレス
1438 RelocSectionHeader.PointerToRelocations= 0;
1439 RelocSectionHeader.PointerToLinenumbers= 0;
1440 RelocSectionHeader.NumberOfRelocations= 0;
1441 RelocSectionHeader.NumberOfLinenumbers= 0;
1442 RelocSectionHeader.Characteristics= IMAGE_SCN_CNT_INITIALIZED_DATA|
1443 IMAGE_SCN_MEM_DISCARDABLE|
1444 IMAGE_SCN_MEM_READ;
1445
1446 //デバッグセクションヘッダ
1447 IMAGE_SECTION_HEADER DebugSectionHeader;
1448 memset((char *)DebugSectionHeader.Name,0,IMAGE_SIZEOF_SHORT_NAME);
1449 lstrcpy((char *)DebugSectionHeader.Name,".debug");
1450 DebugSectionHeader.Misc.VirtualSize= pobj_DebugSection->length;
1451 DebugSectionHeader.VirtualAddress= MemPos_DebugSection; //開始アドレス
1452 DebugSectionHeader.SizeOfRawData= FileSize_DebugSection; //サイズ
1453 DebugSectionHeader.PointerToRawData= FilePos_DebugSection; //ファイル上の開始アドレス
1454 DebugSectionHeader.PointerToRelocations= 0;
1455 DebugSectionHeader.PointerToLinenumbers= 0;
1456 DebugSectionHeader.NumberOfRelocations= 0;
1457 DebugSectionHeader.NumberOfLinenumbers= 0;
1458 DebugSectionHeader.Characteristics= IMAGE_SCN_MEM_DISCARDABLE|
1459 IMAGE_SCN_MEM_READ;
1460
1461
1462 hFile=CreateFile(OutputFileName,GENERIC_WRITE,0,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);
1463 if(hFile==INVALID_HANDLE_VALUE){
1464 SetError(53,OutputFileName,-1);
1465 goto EndWriteOpcode;
1466 }
1467
1468 //ヘッダ
1469 WriteFile(hFile,(void *)&ImageDosHeader,sizeof(IMAGE_DOS_HEADER),(DWORD *)&i2,NULL);
1470 i=i2;
1471
1472 //Dosスタブ
1473 WriteFile(hFile,DosStubBuffer,DosStubSize,(DWORD *)&i2,NULL);
1474 i+=i2;
1475
1476 //0x0100までNULLを並べる
1477 temp2=(char *)HeapAlloc(hHeap,HEAP_ZERO_MEMORY,0x0100-i);
1478 WriteFile(hFile,temp2,0x0100-i,(DWORD *)&i2,NULL);
1479 HeapDefaultFree(temp2);
1480 i+=i2;
1481
1482 //PEヘッダ
1483 WriteFile(hFile,&ImagePeHdr,sizeof(IMAGE_NT_HEADERS64),(DWORD *)&i2,NULL);
1484 i+=i2;
1485
1486 //コード セクション ヘッダ
1487 WriteFile(hFile,&CodeSectionHeader,sizeof(IMAGE_SECTION_HEADER),(DWORD *)&i2,NULL);
1488 i+=i2;
1489
1490 if(bUse_ExportSection){
1491 //エクスポート セクション ヘッダ
1492 WriteFile(hFile,&ExportSectionHeader,sizeof(IMAGE_SECTION_HEADER),(DWORD *)&i2,NULL);
1493 i+=i2;
1494 }
1495 if(bUse_ImportSection){
1496 //インポート セクション ヘッダ
1497 WriteFile(hFile,&ImportSectionHeader,sizeof(IMAGE_SECTION_HEADER),(DWORD *)&i2,NULL);
1498 i+=i2;
1499 }
1500 if(bUse_DataSection){
1501 //データ セクション ヘッダ
1502 WriteFile(hFile,&DataSectionHeader,sizeof(IMAGE_SECTION_HEADER),(DWORD *)&i2,NULL);
1503 i+=i2;
1504 }
1505 if(bUse_RWSection){
1506 //リライタブルセクションヘッダ
1507 WriteFile(hFile,&RWSectionHeader,sizeof(IMAGE_SECTION_HEADER),(DWORD *)&i2,NULL);
1508 i+=i2;
1509 }
1510 if(bUse_RSrcSection){
1511 //リソースセクションヘッダ
1512 WriteFile(hFile,&RSrcSectionHeader,sizeof(IMAGE_SECTION_HEADER),(DWORD *)&i2,NULL);
1513 i+=i2;
1514 }
1515 if(bUse_RelocSection){
1516 //リロケーションセクションヘッダ
1517 WriteFile(hFile,&RelocSectionHeader,sizeof(IMAGE_SECTION_HEADER),(DWORD *)&i2,NULL);
1518 i+=i2;
1519 }
1520 if(bUse_DebugSection){
1521 //デバッグセクションヘッダ
1522 WriteFile(hFile,&DebugSectionHeader,sizeof(IMAGE_SECTION_HEADER),(DWORD *)&i2,NULL);
1523 i+=i2;
1524 }
1525
1526 //EXE_HEADER_SIZEまでNULLを並べる
1527 temp2=(char *)HeapAlloc(hHeap,HEAP_ZERO_MEMORY,EXE_HEADER_SIZE-i);
1528 WriteFile(hFile,temp2,EXE_HEADER_SIZE-i,(DWORD *)&i2,NULL);
1529 HeapDefaultFree(temp2);
1530 i+=i2;
1531
1532 //コード
1533 WriteFile(hFile,OpBuffer,obp,(DWORD *)&i2,NULL);
1534 i+=i2;
1535
1536 //FilePos_ExportSectionまでNULLを並べる
1537 temp2=(char *)HeapAlloc(hHeap,HEAP_ZERO_MEMORY,FilePos_ExportSection-i);
1538 WriteFile(hFile,temp2,FilePos_ExportSection-i,(DWORD *)&i2,NULL);
1539 HeapDefaultFree(temp2);
1540 i+=i2;
1541
1542 if(bUse_ExportSection){
1543 //エクスポート ディレクトリ テーブル
1544 WriteFile(hFile,&ImageExportDirectory,sizeof(IMAGE_EXPORT_DIRECTORY),(DWORD *)&i2,NULL);
1545 i+=i2;
1546
1547 //エクスポート アドレス テーブル
1548 WriteFile(hFile,lpdwExportAddressTable,ExportNum*sizeof(DWORD),(DWORD *)&i2,NULL);
1549 i+=i2;
1550
1551 //エクスポート名ポインタ テーブル
1552 WriteFile(hFile,lpdwExportNamePointerTable,ExportNum*sizeof(DWORD),(DWORD *)&i2,NULL);
1553 i+=i2;
1554
1555 //エクスポート序数テーブル
1556 WriteFile(hFile,lpwExportOrdinalTable,ExportNum*sizeof(WORD),(DWORD *)&i2,NULL);
1557 i+=i2;
1558
1559 //シンボル名
1560 WriteFile(hFile,lpExportNames,ExportNamesLength,(DWORD *)&i2,NULL);
1561 i+=i2;
1562 }
1563
1564 //FilePos_ImportSectionまでNULLを並べる
1565 temp2=(char *)HeapAlloc(hHeap,HEAP_ZERO_MEMORY,FilePos_ImportSection-i);
1566 WriteFile(hFile,temp2,FilePos_ImportSection-i,(DWORD *)&i2,NULL);
1567 HeapDefaultFree(temp2);
1568 i+=i2;
1569
1570 if(bUse_ImportSection){
1571 //インポート アドレス テーブル
1572 WriteFile(hFile,pLookupTable,LookupSize,(DWORD *)&i2,NULL);
1573 i+=i2;
1574
1575 //ルックアップ テーブル
1576 WriteFile(hFile,pLookupTable,LookupSize,(DWORD *)&i2,NULL);
1577 i+=i2;
1578
1579 //インポート ディレクトリ テーブル(Nullディレクトリ テーブルを含む)
1580 for(i3=0;i3<(ImportDllNum+1);i3++){
1581 WriteFile(hFile,&pImportDescriptor[i3],sizeof(IMAGE_IMPORT_DESCRIPTOR),(DWORD *)&i2,NULL);
1582 i+=i2;
1583 }
1584
1585 //DLL名
1586 for(i3=0;i3<ImportDllNum;i3++){
1587 WriteFile(hFile,ppDllNames[i3],16,(DWORD *)&i2,NULL);
1588 i+=i2;
1589 }
1590
1591 //ヒント テーブル
1592 WriteFile(hFile,pHintTable,HintSize,(DWORD *)&i2,NULL);
1593 i+=i2;
1594 }
1595
1596 //FilePos_DataSectionまでNULLを並べる
1597 temp2=(char *)HeapAlloc(hHeap,HEAP_ZERO_MEMORY,FilePos_DataSection-i);
1598 WriteFile(hFile,temp2,FilePos_DataSection-i,(DWORD *)&i2,NULL);
1599 HeapDefaultFree(temp2);
1600 i+=i2;
1601
1602 if(bUse_DataSection){
1603 //データ テーブル
1604 WriteFile(hFile,dataTable.GetPtr(),dataTable.GetSize(),(DWORD *)&i2,NULL);
1605 i+=i2;
1606 }
1607
1608 //FilePos_RWSectionまでNULLを並べる
1609 temp2=(char *)HeapAlloc(hHeap,HEAP_ZERO_MEMORY,FilePos_RWSection-i);
1610 WriteFile(hFile,temp2,FilePos_RWSection-i,(DWORD *)&i2,NULL);
1611 HeapDefaultFree(temp2);
1612 i+=i2;
1613
1614 if(bUse_RWSection){
1615 //リライタブル データ テーブル(グローバル変数の初期バッファ)
1616 initGlobalBuf=(BYTE *)HeapReAlloc(hHeap,
1617 HEAP_ZERO_MEMORY,
1618 initGlobalBuf,
1619 FileSize_RWSection);
1620 WriteFile(hFile,initGlobalBuf,FileSize_RWSection,(DWORD *)&i2,NULL);
1621 i+=i2;
1622 }
1623
1624 //FilePos_RSrcSectionまでNULLを並べる
1625 temp2=(char *)HeapAlloc(hHeap,HEAP_ZERO_MEMORY,FilePos_RSrcSection-i);
1626 WriteFile(hFile,temp2,FilePos_RSrcSection-i,(DWORD *)&i2,NULL);
1627 HeapDefaultFree(temp2);
1628 i+=i2;
1629
1630 if(bUse_RSrcSection){
1631 //リソースバッファ
1632 WriteFile(hFile,RSrcSectionBuffer,RSrcSectionSize,(DWORD *)&i2,NULL);
1633 i+=i2;
1634 }
1635
1636 //FilePos_RelocSectionまでNULLを並べる
1637 temp2=(char *)HeapAlloc(hHeap,HEAP_ZERO_MEMORY,FilePos_RelocSection-i);
1638 WriteFile(hFile,temp2,FilePos_RelocSection-i,(DWORD *)&i2,NULL);
1639 HeapDefaultFree(temp2);
1640 i+=i2;
1641
1642 if(bUse_RelocSection){
1643 //リロケーション情報
1644 WriteFile(hFile,pobj_Reloc->buffer,pobj_Reloc->length,(DWORD *)&i2,NULL);
1645 i+=i2;
1646 }
1647
1648 //ファイルアラインメントを考慮
1649 if(i%FILE_ALIGNMENT){
1650 temp2=(char *)HeapAlloc(hHeap,HEAP_ZERO_MEMORY,FILE_ALIGNMENT-i%FILE_ALIGNMENT);
1651 WriteFile(hFile,temp2,FILE_ALIGNMENT-i%FILE_ALIGNMENT,(DWORD *)&i2,NULL);
1652 HeapDefaultFree(temp2);
1653 i+=i2;
1654 }
1655
1656 if(bUse_DebugSection){
1657 //デバッグセクション
1658 WriteFile(hFile,pobj_DebugSection->buffer,pobj_DebugSection->length,(DWORD *)&i2,NULL);
1659 i+=i2;
1660 }
1661
1662 //ファイルアラインメントを考慮
1663 if(i%FILE_ALIGNMENT){
1664 temp2=(char *)HeapAlloc(hHeap,HEAP_ZERO_MEMORY,FILE_ALIGNMENT-i%FILE_ALIGNMENT);
1665 WriteFile(hFile,temp2,FILE_ALIGNMENT-i%FILE_ALIGNMENT,(DWORD *)&i2,NULL);
1666 HeapDefaultFree(temp2);
1667 i+=i2;
1668 }
1669
1670 //書き込み終了
1671 CloseHandle(hFile);
1672
1673
1674EndWriteOpcode:
1675
1676 //Dosスタブ用のメモリを解放
1677 HeapDefaultFree(DosStubBuffer);
1678
1679 //エクスポート テーブル情報を解放
1680 HeapDefaultFree(lpdwExportAddressTable);
1681 HeapDefaultFree(lpdwExportNamePointerTable);
1682 HeapDefaultFree(lpwExportOrdinalTable);
1683
1684 //インポートDLL情報を解放
1685 HeapDefaultFree(pImportDescriptor);
1686 for(i=0;i<ImportDllNum;i++)
1687 HeapDefaultFree(ppDllNames[i]);
1688 HeapDefaultFree(ppDllNames);
1689
1690 //ルックアップテーブルに関する情報を解放
1691 HeapDefaultFree(pLookupTable);
1692
1693 //ヒントテーブルに関する情報を解放
1694 HeapDefaultFree(pHintTable);
1695
1696 //グローバル変数の初期バッファを解放
1697 HeapDefaultFree(initGlobalBuf);
1698
1699 //コードバッファを解放
1700 HeapDefaultFree(OpBuffer);
1701 OpBuffer=0;
1702
1703 //リソースセクションバッファを解放
1704 HeapDefaultFree(RSrcSectionBuffer);
1705
1706 //デバッグセクションを開放
1707 delete pobj_DebugSection;
1708
1709 //リロケーション情報を解放
1710 delete pobj_Reloc;
1711
1712 //列挙体に関する情報の破棄
1713 CEnumParent::DestroyEnum();
1714
1715 //クラスに関するメモリを解放
1716 delete pobj_DBClass;
1717 pobj_DBClass=0;
1718}
Note: See TracBrowser for help on using the repository browser.