source: dev/BasicCompiler32/MakePeHdr.cpp@ 15

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

LexicalAnalysisを廃止。

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