source: dev/BasicCompiler64/MakePeHdr.cpp@ 56

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

・[Unicode]リテラル文字列のスイッチング
・[Unicode]Char型を文字型として扱うようにする
・[Unicode]SByte型を追加する
に対応。

/unicodeコマンドオプションに対応。

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