Changeset 218 in dev for trunk/abdev/BasicCompiler64/MakePeHdr.cpp
- Timestamp:
- Jul 18, 2007, 1:55:39 AM (17 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/abdev/BasicCompiler64/MakePeHdr.cpp
r214 r218 191 191 192 192 193 /*194 193 if( !compiler.GetMeta().WriteXml( Jenga::Common::Environment::GetAppDir() + "\\meta_test.xml" ) ) 195 194 { … … 201 200 MessageBox(0,"XML読み込みに失敗","test",0); 202 201 } 203 */ 202 /* 204 203 if( !compiler.GetMeta().WriteBinaly( Jenga::Common::Environment::GetAppDir() + "\\meta_test.dat" ) ) 205 204 { … … 211 210 MessageBox(0,"バイナリ読み込みに失敗","test",0); 212 211 } 212 if( !compiler.GetMeta().WriteText( Jenga::Common::Environment::GetAppDir() + "\\meta_test.dat" ) ) 213 { 214 MessageBox(0,"バイナリ書き込みに失敗","test",0); 215 } 216 MetaImpl *pTempMeta = new MetaImpl(); 217 if( !pTempMeta->ReadText( Jenga::Common::Environment::GetAppDir() + "\\meta_test.dat" ) ) 218 { 219 MessageBox(0,"バイナリ読み込みに失敗","test",0); 220 }*/ 213 221 compiler.GetMeta() = (*pTempMeta); 214 222 … … 523 531 // 使用するDLL関数のチェック 524 532 //////////////////////////////// 525 for(i=0;i<MAX_HASH;i++){ 526 extern DllProc **ppDeclareHash; 527 const DllProc *pDllProc = ppDeclareHash[i]; 528 while(pDllProc){ 529 if( !pDllProc->IsUsing() ){ 530 pDllProc=pDllProc->pNextData; 531 continue; 533 compiler.GetMeta().GetDllProcs().Iterator_Reset(); 534 while( compiler.GetMeta().GetDllProcs().Iterator_HasNext() ) 535 { 536 const DllProc *pDllProc = compiler.GetMeta().GetDllProcs().Iterator_GetNext(); 537 538 if( !pDllProc->IsUsing() ){ 539 pDllProc=pDllProc->pNextData; 540 continue; 541 } 542 /* 543 //エラーチェック 544 HINSTANCE hLib; 545 hLib=LoadLibrary( pDllProc->GetDllFileName().c_str() ); 546 if(!hLib){ 547 extern char OutputFileName[MAX_PATH]; 548 char temp2[MAX_PATH],temp3[MAX_PATH]; 549 _splitpath(OutputFileName,temp2,temp3,NULL,NULL); 550 lstrcat(temp2,temp3); 551 lstrcpy(temp3,pDllProc->GetDllFileName().c_str()); 552 GetFullPath(temp3,temp2); 553 hLib=LoadLibrary(temp3); 554 555 if(!hLib){ 556 SetError(-106,pDllProc->GetDllFileName().c_str(),pDllProc->GetCodePos()); 532 557 } 533 /* 534 //エラーチェック 535 HINSTANCE hLib; 536 hLib=LoadLibrary( pDllProc->GetDllFileName().c_str() ); 537 if(!hLib){ 538 extern char OutputFileName[MAX_PATH]; 539 char temp2[MAX_PATH],temp3[MAX_PATH]; 540 _splitpath(OutputFileName,temp2,temp3,NULL,NULL); 541 lstrcat(temp2,temp3); 542 lstrcpy(temp3,pDllProc->GetDllFileName().c_str()); 543 GetFullPath(temp3,temp2); 544 hLib=LoadLibrary(temp3); 545 546 if(!hLib){ 547 SetError(-106,pDllProc->GetDllFileName().c_str(),pDllProc->GetCodePos()); 548 } 558 } 559 560 if(hLib){ 561 if(!GetProcAddress(hLib,pDllProc->GetAlias().c_str())){ 562 FreeLibrary(hLib); 563 SetError(-107,pDllProc->GetAlias(),pDllProc->GetCodePos()); 549 564 } 550 551 if(hLib){ 552 if(!GetProcAddress(hLib,pDllProc->GetAlias().c_str())){ 553 FreeLibrary(hLib); 554 SetError(-107,pDllProc->GetAlias(),pDllProc->GetCodePos()); 555 } 556 FreeLibrary(hLib); 557 } 565 FreeLibrary(hLib); 566 } 558 567 */ 559 pDllProc=pDllProc->pNextData;560 }561 568 } 562 569 … … 669 676 //インポートDLL情報 670 677 ///////////////////// 671 extern DllProc **ppDeclareHash;672 DllProc *pDllProc;673 char **ppDllNames;674 int ImportDllNum;675 678 676 679 /* … … 702 705 */ 703 706 704 ppDllNames=(char **)HeapAlloc(hHeap,0,1); 705 706 ImportDllNum=0; 707 for(i=0;i<MAX_HASH;i++){ 708 const DllProc *pDllProc=ppDeclareHash[i]; 709 while(pDllProc){ 710 if( !pDllProc->IsUsing() ){ 711 pDllProc=pDllProc->pNextData; 712 continue; 713 } 714 715 if( pDllProc->GetDllFileName().size() > 16 ){ 716 SetError(7,NULL,cp); 707 char **ppDllNames=(char **)HeapAlloc(hHeap,0,1); 708 709 int ImportDllNum=0; 710 711 compiler.GetMeta().GetDllProcs().Iterator_Reset(); 712 while( compiler.GetMeta().GetDllProcs().Iterator_HasNext() ) 713 { 714 const DllProc *pDllProc = compiler.GetMeta().GetDllProcs().Iterator_GetNext(); 715 716 if( !pDllProc->IsUsing() ){ 717 pDllProc=pDllProc->pNextData; 718 continue; 719 } 720 721 if( pDllProc->GetDllFileName().size() > 16 ){ 722 SetError(7,NULL,cp); 723 break; 724 } 725 for(i2=0;i2<ImportDllNum;i2++){ 726 if( pDllProc->GetDllFileName() == ppDllNames[i2] ){ 717 727 break; 718 728 } 719 for(i2=0;i2<ImportDllNum;i2++){ 720 if( pDllProc->GetDllFileName() == ppDllNames[i2] ){ 721 break; 722 } 723 } 724 if(i2==ImportDllNum){ 725 ppDllNames=(char **)HeapReAlloc(hHeap,0,ppDllNames,(ImportDllNum+1)*sizeof(char **)); 726 ppDllNames[ImportDllNum]=(char *)HeapAlloc(hHeap,HEAP_ZERO_MEMORY,16); 727 lstrcpy(ppDllNames[ImportDllNum],pDllProc->GetDllFileName().c_str()); 728 ImportDllNum++; 729 } 730 731 pDllProc=pDllProc->pNextData; 729 } 730 if(i2==ImportDllNum){ 731 ppDllNames=(char **)HeapReAlloc(hHeap,0,ppDllNames,(ImportDllNum+1)*sizeof(char **)); 732 ppDllNames[ImportDllNum]=(char *)HeapAlloc(hHeap,HEAP_ZERO_MEMORY,16); 733 lstrcpy(ppDllNames[ImportDllNum],pDllProc->GetDllFileName().c_str()); 734 ImportDllNum++; 732 735 } 733 736 } … … 744 747 pImportDescriptor[i].ForwarderChain=0; 745 748 pImportDescriptor[i].Name=i*0x10; //※すぐ下で再計算 746 for(i2=0;i2<MAX_HASH;i2++){ 747 pDllProc=ppDeclareHash[i2]; 748 while(pDllProc){ 749 if( !pDllProc->IsUsing() ){ 750 pDllProc=pDllProc->pNextData; 751 continue; 752 } 753 754 if( pDllProc->GetDllFileName() == ppDllNames[i] ){ 755 //ルックアップデータのサイズを追加 756 LookupSize+=sizeof(_int64); 757 } 758 749 750 compiler.GetMeta().GetDllProcs().Iterator_Reset(); 751 while( compiler.GetMeta().GetDllProcs().Iterator_HasNext() ) 752 { 753 const DllProc *pDllProc = compiler.GetMeta().GetDllProcs().Iterator_GetNext(); 754 755 if( !pDllProc->IsUsing() ){ 759 756 pDllProc=pDllProc->pNextData; 757 continue; 758 } 759 760 if( pDllProc->GetDllFileName() == ppDllNames[i] ){ 761 //ルックアップデータのサイズを追加 762 LookupSize+=sizeof(_int64); 760 763 } 761 764 } … … 783 786 pHintTable=(char *)HeapAlloc(hHeap,0,HintAllocSize); 784 787 for(i=0,i5=0;i<ImportDllNum;i++){ 785 for(i2=0;i2<MAX_HASH;i2++){ 786 pDllProc=ppDeclareHash[i2]; 787 while(pDllProc){ 788 if( !pDllProc->IsUsing() ){ 789 pDllProc=pDllProc->pNextData; 790 continue; 788 compiler.GetMeta().GetDllProcs().Iterator_Reset(); 789 while( compiler.GetMeta().GetDllProcs().Iterator_HasNext() ) 790 { 791 DllProc *pDllProc = compiler.GetMeta().GetDllProcs().Iterator_GetNext(); 792 793 if( !pDllProc->IsUsing() ){ 794 pDllProc=pDllProc->pNextData; 795 continue; 796 } 797 798 if( pDllProc->GetDllFileName() == ppDllNames[i] ){ 799 //ルックアップの位置をセット(後にインポート アドレス テーブルにセットしなおされる) 800 pDllProc->SetLookupAddress( i5*sizeof(_int64) ); 801 802 //ルックアップ テーブルの値をセット 803 pLookupTable[i5++]= 804 LookupSize+ //インポート アドレス テーブル 805 LookupSize+ //ルックアップテーブル 806 (ImportDllNum+1)*sizeof(IMAGE_IMPORT_DESCRIPTOR)+ //IMAGE_IMPORT_DESCRIPTOR 807 ImportDllNum*0x10+ //DLL名の羅列 808 HintSize; //ヒント名へのオフセット 809 810 //ヒント テーブル 811 pHintTable[HintSize++]=0; 812 pHintTable[HintSize++]=0; 813 lstrcpy(pHintTable+HintSize,pDllProc->GetAlias().c_str()); 814 i4=(int)pDllProc->GetAlias().size(); 815 HintSize+=i4+1; 816 if(i4%2==0) pHintTable[HintSize++]=0; 817 818 if(HintAllocSize<HintSize+128){ 819 HintAllocSize+=128; 820 pHintTable=(char *)HeapReAlloc(hHeap,0,pHintTable,HintAllocSize); 791 821 } 792 793 if( pDllProc->GetDllFileName() == ppDllNames[i] ){794 //ルックアップの位置をセット(後にインポート アドレス テーブルにセットしなおされる)795 pDllProc->SetLookupAddress( i5*sizeof(_int64) );796 797 //ルックアップ テーブルの値をセット798 pLookupTable[i5++]=799 LookupSize+ //インポート アドレス テーブル800 LookupSize+ //ルックアップテーブル801 (ImportDllNum+1)*sizeof(IMAGE_IMPORT_DESCRIPTOR)+ //IMAGE_IMPORT_DESCRIPTOR802 ImportDllNum*0x10+ //DLL名の羅列803 HintSize; //ヒント名へのオフセット804 805 //ヒント テーブル806 pHintTable[HintSize++]=0;807 pHintTable[HintSize++]=0;808 lstrcpy(pHintTable+HintSize,pDllProc->GetAlias().c_str());809 i4=(int)pDllProc->GetAlias().size();810 HintSize+=i4+1;811 if(i4%2==0) pHintTable[HintSize++]=0;812 813 if(HintAllocSize<HintSize+128){814 HintAllocSize+=128;815 pHintTable=(char *)HeapReAlloc(hHeap,0,pHintTable,HintAllocSize);816 }817 }818 819 pDllProc=pDllProc->pNextData;820 822 } 821 823 } … … 1088 1090 LookupSize; //ルックアップテーブル 1089 1091 1090 for(i2=0;i2<MAX_HASH;i2++){ 1091 const DllProc *pDllProc=ppDeclareHash[i2]; 1092 while(pDllProc){ 1093 if( !pDllProc->IsUsing() ){ 1094 pDllProc=pDllProc->pNextData; 1095 continue; 1096 } 1097 1098 if( pDllProc->GetDllFileName() == ppDllNames[i] ){ 1099 //ルックアップ テーブル 1100 pLookupTable[i5++]+=MemPos_ImportSection; 1101 } 1102 1092 compiler.GetMeta().GetDllProcs().Iterator_Reset(); 1093 while( compiler.GetMeta().GetDllProcs().Iterator_HasNext() ) 1094 { 1095 const DllProc *pDllProc = compiler.GetMeta().GetDllProcs().Iterator_GetNext(); 1096 1097 if( !pDllProc->IsUsing() ){ 1103 1098 pDllProc=pDllProc->pNextData; 1099 continue; 1100 } 1101 1102 if( pDllProc->GetDllFileName() == ppDllNames[i] ){ 1103 //ルックアップ テーブル 1104 pLookupTable[i5++]+=MemPos_ImportSection; 1104 1105 } 1105 1106 }
Note:
See TracChangeset
for help on using the changeset viewer.