source: dev/BasicCompiler64/MakePeHdr.cpp@ 14

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

LexicalAnalysisのベース部分を用意。

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