Re[3]: PE формат и ресурсы
От: psu  
Дата: 05.01.06 08:38
Оценка:
И еще вот небольшой аппендикс: моя функция сканирования ресурсов

char* psResource — это базовый адрес ресурсов, считаных в память.

BOOL ExtractIconsFromResource( char* psResource )
{
IMAGE_RESOURCE_DIRECTORY *Dir;
IMAGE_RESOURCE_DIRECTORY_ENTRY *Entry;

Dir = ( IMAGE_RESOURCE_DIRECTORY* )psResource;//root dir

Entry = ( IMAGE_RESOURCE_DIRECTORY_ENTRY* )( Dir + 1 );//first entry in root dir

int nCount = Dir->NumberOfIdEntries + Dir->NumberOfNamedEntries;
int i;

IMAGE_RESOURCE_DIRECTORY_ENTRY* pEntries[100];
int nEntries = 0;

//cycle on root dir entries
for( i = 0; i < nCount; i++ )
{
if( Entry->Id == 0x0e ) //icon group subdir
{
Dir = ( IMAGE_RESOURCE_DIRECTORY* )( psResource + Entry->OffsetToDirectory );
nCount = Dir->NumberOfIdEntries + Dir->NumberOfNamedEntries;

//scan icons dir
// each entry points to subdirectory
Entry = ( IMAGE_RESOURCE_DIRECTORY_ENTRY* )( Dir + 1 );
for( i = 0; i < nCount; i ++ )
{
pEntries[ i ] = new IMAGE_RESOURCE_DIRECTORY_ENTRY;
memcpy( pEntries[ i ], Entry, sizeof( IMAGE_RESOURCE_DIRECTORY_ENTRY ) );
Entry++;
}

//gather icons data
int j;
int nIcons;
IMAGE_RESOURCE_DATA_ENTRY* pData;
for( i = 0; i < nCount; i ++ )
{
//enter subdir
Dir = ( IMAGE_RESOURCE_DIRECTORY* )( psResource + pEntries[ i ]->OffsetToDirectory );

//scan each icon subdir
Entry = ( IMAGE_RESOURCE_DIRECTORY_ENTRY* )( Dir + 1 );

//get data entry
pData = ( IMAGE_RESOURCE_DATA_ENTRY* )( psResource + Entry->OffsetToData );

}
break;
}
Entry++;
}
for( i = 0; i < nEntries; i++ )
{
delete pEntries[ i ];
}

return( TRUE );
}
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.