source: dev/BasicCompiler64/MakePeHdr.cpp@ 95

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

RegisterGlobalRootsの自動生成に対応

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