Пример #1
0
void* _FindResource(IMAGE_DOS_HEADER* pDosHeader, void* prt, int resIndex, int resType, DWORD* pcbSize)
{
	int count, index = 0;
	IMAGE_RESOURCE_DIRECTORY_ENTRY* pRes;
	IMAGE_RESOURCE_DATA_ENTRY* pEntry;

	pRes = _FindResourceBase(prt, resType, &count);
	if (resIndex < 0) {
		for (index = 0; index < count; index++)
			if (pRes[index].Name == (DWORD)(-resIndex))
				break;
	}
	else index = resIndex;

	if (index >= count)
		return NULL;

	if (pRes[index].OffsetToData & IMAGE_RESOURCE_DATA_IS_DIRECTORY) {
		IMAGE_RESOURCE_DIRECTORY* pDir;
		pDir = (IMAGE_RESOURCE_DIRECTORY*)((LPBYTE)prt + (pRes[index].OffsetToData & ~IMAGE_RESOURCE_DATA_IS_DIRECTORY));
		pRes = (IMAGE_RESOURCE_DIRECTORY_ENTRY*)(pDir+1);
		index = 0;
	}

	if (pRes[index].OffsetToData & IMAGE_RESOURCE_DATA_IS_DIRECTORY)
		return NULL;

	pEntry = (IMAGE_RESOURCE_DATA_ENTRY*)((LPBYTE)prt + pRes[index].OffsetToData);
	*pcbSize = pEntry->Size;
	return _RelativeVirtualAddresstoPtr(pDosHeader, pEntry->OffsetToData);
}
Пример #2
0
int _FindResourceCount(void* prt, int resType)
{
	int count;

	_FindResourceBase(prt, resType, &count);
	return count;
}
Пример #3
0
int ExtractIcons::_FindResourceCount( void* prt, INT_PTR resType )
{
    int count;
    IMAGE_RESOURCE_DIRECTORY_ENTRY* pRes;
    pRes = _FindResourceBase( prt, resType, &count );
    return count;
}
Пример #4
0
void* ExtractIcons::_FindResource( IMAGE_DOS_HEADER* pDosHeader, void* prt, int resIndex, INT_PTR resType, DWORD* pcbSize )
{
    int count;
    IMAGE_RESOURCE_DIRECTORY_ENTRY* pRes;
    pRes = _FindResourceBase( prt, resType, &count );

    int index = 0;
    // find the actual resource  
    //      id (resIndex < 0)
    //      ordinal (resIndex >= 0)
    if( resIndex < 0 )
    {
        for( index = 0; index < count; index++ )
            if( pRes[index].Name == (DWORD)(-resIndex) )
                break;
    }
    else
    {
        index = resIndex;
    }

    if( index >= count )
        return NULL; // index out of range

    // another Directory 
    // probably language take the first one
    if( pRes[index].OffsetToData & IMAGE_RESOURCE_DATA_IS_DIRECTORY)
    {
        IMAGE_RESOURCE_DIRECTORY* pDir;
        pDir = (IMAGE_RESOURCE_DIRECTORY*)((LPBYTE)prt + (pRes[index].OffsetToData & ~IMAGE_RESOURCE_DATA_IS_DIRECTORY) );
        pRes = (IMAGE_RESOURCE_DIRECTORY_ENTRY*)(pDir+1);
        index = 0;  
    }

    // Oooooooooooo no !! another Directory !!! 
    if( pRes[index].OffsetToData & IMAGE_RESOURCE_DATA_IS_DIRECTORY )
        return NULL;

    IMAGE_RESOURCE_DATA_ENTRY* pEntry;
    pEntry = (IMAGE_RESOURCE_DATA_ENTRY*)((LPBYTE)prt + pRes[index].OffsetToData);

    // all OffsetToData fields except the final one are relative to
    // the start of the section.  the final one is a virtual address
    // we need to go back to the header and get the virtual address
    // of the resource section to do this right.
    *pcbSize = pEntry->Size;
    return _RelativeVirtualAddresstoPtr( pDosHeader, pEntry->OffsetToData );
}