source: dev/BasicCompiler64/MakePeHdr.cpp@ 42

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

EnumメンバにOpenやPrintを指定できないバグを修正。
DLLコンパイル時に静的メンバが認識されないバグを修正。

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