Ignore:
Timestamp:
Jul 18, 2007, 1:55:39 AM (17 years ago)
Author:
dai_9181
Message:
 
File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/abdev/BasicCompiler64/MakePeHdr.cpp

    r214 r218  
    191191
    192192
    193 /*
    194193    if( !compiler.GetMeta().WriteXml( Jenga::Common::Environment::GetAppDir() + "\\meta_test.xml" ) )
    195194    {
     
    201200        MessageBox(0,"XML読み込みに失敗","test",0);
    202201    }
    203 */
     202/*
    204203    if( !compiler.GetMeta().WriteBinaly( Jenga::Common::Environment::GetAppDir() + "\\meta_test.dat" ) )
    205204    {
     
    211210        MessageBox(0,"バイナリ読み込みに失敗","test",0);
    212211    }
     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    }*/
    213221    compiler.GetMeta() = (*pTempMeta);
    214222
     
    523531    // 使用するDLL関数のチェック
    524532    ////////////////////////////////
    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());
    532557            }
    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());
    549564            }
    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        }
    558567*/
    559             pDllProc=pDllProc->pNextData;
    560         }
    561568    }
    562569
     
    669676    //インポートDLL情報
    670677    /////////////////////
    671     extern DllProc **ppDeclareHash;
    672     DllProc *pDllProc;
    673     char **ppDllNames;
    674     int ImportDllNum;
    675678
    676679    /*
     
    702705    */
    703706
    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] ){
    717727                break;
    718728            }
    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++;
    732735        }
    733736    }
     
    744747        pImportDescriptor[i].ForwarderChain=0;
    745748        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() ){
    759756                pDllProc=pDllProc->pNextData;
     757                continue;
     758            }
     759
     760            if( pDllProc->GetDllFileName() == ppDllNames[i] ){
     761                //ルックアップデータのサイズを追加
     762                LookupSize+=sizeof(_int64);
    760763            }
    761764        }
     
    783786    pHintTable=(char *)HeapAlloc(hHeap,0,HintAllocSize);
    784787    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);
    791821                }
    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_DESCRIPTOR
    802                         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;
    820822            }
    821823        }
     
    10881090            LookupSize;         //ルックアップテーブル
    10891091
    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() ){
    11031098                pDllProc=pDllProc->pNextData;
     1099                continue;
     1100            }
     1101
     1102            if( pDllProc->GetDllFileName() == ppDllNames[i] ){
     1103                //ルックアップ テーブル
     1104                pLookupTable[i5++]+=MemPos_ImportSection;
    11041105            }
    11051106        }
Note: See TracChangeset for help on using the changeset viewer.