Ignore:
Timestamp:
Nov 29, 1999, 9:43:02 PM (26 years ago)
Author:
sandervl
Message:

EnumResourceTypesA/W changes

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/kernel32/winimgres.cpp

    r1872 r1879  
    1 /* $Id: winimgres.cpp,v 1.27 1999-11-29 00:04:07 bird Exp $ */
     1/* $Id: winimgres.cpp,v 1.28 1999-11-29 20:43:02 sandervl Exp $ */
    22
    33/*
     
    270270    //for the resource section (images loaded by the pe.exe and pe2lx/win32k)
    271271    //For LX images, this is 0 as OffsetToData contains a relative offset
    272     char *resdata = (char *)((char *)pResDir + pData->OffsetToData - ulRVAResourceSection);
     272    char *resdata = (char *)((char *)pResDir + (pData->OffsetToData - ulRVAResourceSection));
    273273    res = new Win32Resource(this, id, type, pData->Size, resdata);
    274274
     
    299299    return(hres);
    300300}
    301 //******************************************************************************
    302 //TODO:
    303 //******************************************************************************
    304 #if 0
    305 ULONG Win32Pe2LxImage::getResourceSizeA(LPCSTR lpszName, LPSTR lpszType, ULONG lang)
    306 {
    307     DebugInt3();
    308     return 0;
    309 }
    310 #endif
    311301//******************************************************************************
    312302//******************************************************************************
     
    356346    if(getVersionId() == -1) {
    357347        dprintf(("GetVersionStruct: %s has no version resource!\n", szModule));
     348        SetLastError(ERROR_RESOURCE_DATA_NOT_FOUND);
    358349        return(FALSE);
    359350    }
     
    380371    if(pData == NULL) {
    381372        dprintf(("Win32PeLdrImage::getVersionStruct: couldn't find version resource!"));
     373        SetLastError(ERROR_RESOURCE_DATA_NOT_FOUND);
    382374        return 0;
    383375    }
     
    432424    if (pResDir == NULL)
    433425    {
    434         /* SetLastError(?);? */
     426        SetLastError(ERROR_RESOURCE_DATA_NOT_FOUND);
    435427        return FALSE;
    436428    }
     
    702694    return pResDirRet;
    703695}
    704 
     696//******************************************************************************
     697//******************************************************************************
     698BOOL Win32ImageBase::enumResourceTypesA(HMODULE hmod, ENUMRESTYPEPROCA lpEnumFunc,
     699                                        LONG lParam)
     700{
     701 PIMAGE_RESOURCE_DIRECTORY       prdType;
     702 PIMAGE_RESOURCE_DIRECTORY_ENTRY prde;
     703 PIMAGE_RESOURCE_DIR_STRING_U    pstring;
     704 ULONG  i, nameOffset;
     705 BOOL   fRet;
     706
     707    if (pResDir == NULL)
     708    {
     709        SetLastError(ERROR_RESOURCE_DATA_NOT_FOUND);
     710        return FALSE;
     711    }
     712
     713    if ((unsigned)lpEnumFunc < 0x10000 || (unsigned)lpEnumFunc >= 0xc0000000)
     714    {
     715        SetLastError(ERROR_NOACCESS);
     716        return FALSE;
     717    }
     718
     719    //reminder:
     720    //1st level -> types
     721    //2nd level -> names
     722    //3rd level -> language
     723
     724    /* set pointer to first resource type entry */
     725    prde = (PIMAGE_RESOURCE_DIRECTORY_ENTRY)((ULONG)pResDir + sizeof(IMAGE_RESOURCE_DIRECTORY));
     726
     727    for (i=0; i<pResDir->NumberOfNamedEntries+pResDir->NumberOfIdEntries && fRet; i++)
     728    {
     729        /* locate directory or each resource type */
     730        prdType = (PIMAGE_RESOURCE_DIRECTORY)((int)pResDir + (int)prde->u2.OffsetToData);
     731
     732        if (prde->u1.s.NameIsString)
     733        {//name or id entry?
     734                //SvL: 30-10-'97, high bit is set, so clear to get real offset
     735                nameOffset = prde->u1.Name & ~0x80000000;
     736       
     737                pstring = (PIMAGE_RESOURCE_DIR_STRING_U)((ULONG)pResDir + nameOffset);
     738                char *typename = (char *)malloc(pstring->Length+1);
     739                lstrcpynWtoA(typename, pstring->NameString, pstring->Length+1);
     740                typename[pstring->Length] = 0;
     741
     742                fRet = lpEnumFunc(hmod, typename, lParam);
     743                free(typename);
     744        }
     745        else {
     746                fRet = lpEnumFunc(hmod, (LPSTR)prde->u1.Id, lParam);
     747        }
     748
     749        /* increment to next entry */
     750        prde++;
     751    }
     752    return fRet > 0 ? TRUE : FALSE;
     753}
     754//******************************************************************************
     755//******************************************************************************
     756BOOL Win32ImageBase::enumResourceTypesW(HMODULE hmod, ENUMRESTYPEPROCW lpEnumFunc,
     757                                        LONG lParam)
     758{
     759 PIMAGE_RESOURCE_DIRECTORY       prdType;
     760 PIMAGE_RESOURCE_DIRECTORY_ENTRY prde;
     761 PIMAGE_RESOURCE_DIR_STRING_U    pstring;
     762 ULONG  i, nameOffset;
     763 BOOL   fRet;
     764
     765    if (pResDir == NULL)
     766    {
     767        SetLastError(ERROR_RESOURCE_DATA_NOT_FOUND);
     768        return FALSE;
     769    }
     770
     771    if ((unsigned)lpEnumFunc < 0x10000 || (unsigned)lpEnumFunc >= 0xc0000000)
     772    {
     773        SetLastError(ERROR_NOACCESS);
     774        return FALSE;
     775    }
     776
     777    //reminder:
     778    //1st level -> types
     779    //2nd level -> names
     780    //3rd level -> language
     781
     782    /* set pointer to first resource type entry */
     783    prde = (PIMAGE_RESOURCE_DIRECTORY_ENTRY)((ULONG)pResDir + sizeof(IMAGE_RESOURCE_DIRECTORY));
     784
     785    for (i=0; i<pResDir->NumberOfNamedEntries+pResDir->NumberOfIdEntries && fRet; i++)
     786    {
     787        /* locate directory or each resource type */
     788        prdType = (PIMAGE_RESOURCE_DIRECTORY)((int)pResDir + (int)prde->u2.OffsetToData);
     789
     790        if (prde->u1.s.NameIsString)
     791        {//name or id entry?
     792                //SvL: 30-10-'97, high bit is set, so clear to get real offset
     793                nameOffset = prde->u1.Name & ~0x80000000;
     794       
     795                pstring = (PIMAGE_RESOURCE_DIR_STRING_U)((ULONG)pResDir + nameOffset);
     796                fRet = lpEnumFunc(hmod, pstring->NameString, lParam);
     797        }
     798        else    fRet = lpEnumFunc(hmod, (LPWSTR)prde->u1.Id, lParam);
     799
     800        /* increment to next entry */
     801        prde++;
     802    }
     803    return fRet > 0 ? TRUE : FALSE;
     804}
     805//******************************************************************************
     806//******************************************************************************
Note: See TracChangeset for help on using the changeset viewer.