source: dev/BasicCompiler64/MakePeHdr.cpp@ 79

Last change on this file since 79 was 78, checked in by dai_9181, 18 years ago

CTypeDef → TypeDef
Houseクラスを追加。
オーバーロードレベルの種類を追加(レベル1に挿入)

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