Changeset 10471 for trunk/src


Ignore:
Timestamp:
Feb 19, 2004, 2:03:07 PM (22 years ago)
Author:
sandervl
Message:

DBCS fixes for console & resource functions

Location:
trunk/src/kernel32
Files:
4 edited

Legend:

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

    r10010 r10471  
    1 /* $Id: conbuffer.cpp,v 1.19 2003-04-11 12:08:35 sandervl Exp $ */
     1/* $Id: conbuffer.cpp,v 1.20 2004-02-19 13:03:05 sandervl Exp $ */
    22
    33/*
     
    24982498}
    24992499
    2500 
    25012500/*****************************************************************************
    25022501 * Name      : DWORD HMDeviceConsoleBufferClass::WriteConsoleW
     
    25242523  DWORD          rc;
    25252524  LPSTR          pszAscii;
     2525  int            alen;
    25262526
    25272527#ifdef DEBUG_LOCAL2
     
    25342534#endif
    25352535
     2536  alen = WideCharToMultiByte( GetConsoleCP(), 0, (LPCWSTR)lpvBuffer, cchToWrite, 0, 0, 0, 0 );
    25362537  /* Ascii -> unicode translation */
    2537   pszAscii = (LPSTR)HEAP_malloc(cchToWrite+1);
     2538  pszAscii = (LPSTR)HEAP_malloc(( alen + 1 ) * sizeof( WCHAR ));
    25382539  if (pszAscii == NULL)
    25392540     return ERROR_NOT_ENOUGH_MEMORY;
    25402541
    2541   lstrcpynWtoA(pszAscii, (LPWSTR)lpvBuffer, cchToWrite+1);
     2542  WideCharToMultiByte( GetConsoleCP(), 0, (LPWSTR)lpvBuffer, cchToWrite, pszAscii, alen, 0, 0 );
     2543  pszAscii[ alen ] = 0;
    25422544
    25432545  /* simply forward the request to that routine */
    25442546  rc = HMDeviceConsoleBufferClass::WriteFile(pHMHandleData,
    25452547                                             pszAscii,
    2546                                              cchToWrite,
     2548                                             alen,
    25472549                                             lpcchWritten,
    25482550                                             NULL, NULL);
    25492551
     2552  *lpcchWritten = MultiByteToWideChar( GetConsoleCP(), 0, pszAscii, *lpcchWritten, 0, 0 );
    25502553  // free memory again
    25512554  HEAP_free(pszAscii);
  • trunk/src/kernel32/conin.cpp

    r7550 r10471  
    1 /* $Id: conin.cpp,v 1.17 2001-12-05 18:05:59 sandervl Exp $ */
     1/* $Id: conin.cpp,v 1.18 2004-02-19 13:03:05 sandervl Exp $ */
    22
    33/*
     
    755755
    756756  // create ascii buffer
    757   lpstrAscii = (LPSTR)HEAP_malloc(cchToRead);
     757  lpstrAscii = (LPSTR)HEAP_malloc(cchToRead * sizeof( WCHAR ));
    758758  if (lpstrAscii == NULL)
    759759     return ERROR_NOT_ENOUGH_MEMORY;
    760760
    761761                               /* simply forward the request to that routine */
     762  // FIXME : if results of ReadFile() have MBCS string, some data might be lost on next call.
    762763  dwResult = HMDeviceConsoleInClass::ReadFile(pHMHandleData,
    763764                                              lpstrAscii,
    764                                               cchToRead,
     765                                              cchToRead * sizeof( WCHAR ),
    765766                                              lpcchRead,
    766767                                              NULL, NULL);
     
    768769  /* Ascii -> unicode translation */
    769770  if (dwResult == TRUE)
    770     lstrcpynAtoW((LPWSTR)lpvBuffer, lpstrAscii, min(cchToRead, *lpcchRead+1));
     771    *lpcchRead = MultiByteToWideChar( GetConsoleCP(), 0, lpstrAscii, *lpcchRead, ( LPWSTR )lpvBuffer, cchToRead );
    771772
    772773  HEAP_free(lpstrAscii);
  • trunk/src/kernel32/console.cpp

    r9544 r10471  
    1 /* $Id: console.cpp,v 1.32 2002-12-27 13:42:08 sandervl Exp $ */
     1/* $Id: console.cpp,v 1.33 2004-02-19 13:03:06 sandervl Exp $ */
    22
    33/*
     
    6161#define  INCL_DOSSEMAPHORES
    6262#define  INCL_DOSERRORS
     63#define  INCL_DOSEXCEPTIONS
    6364#define  INCL_DOSPROCESS
    6465#define  INCL_DOSMODULEMGR
     66#define  INCL_DOSDEVICES
    6567#define  INCL_VIO
    6668#define  INCL_KBD
     
    177179  if (ConsoleGlobals.hevConsole != NULLHANDLE) /* we're already initialized ?*/
    178180    return (NO_ERROR);                             /* then abort immediately */
     181
     182  rc = DosSetSignalExceptionFocus(SIG_SETFOCUS, &ulPostCount);
     183  if(rc) {
     184      dprintf(("DosSetSignalExceptionFocus failed with %d", rc));
     185  }
    179186
    180187  if(flVioConsole == TRUE)
     
    26952702 *****************************************************************************/
    26962703
     2704
    26972705DWORD WIN32API GetConsoleTitleW(LPWSTR lpConsoleTitle,
    26982706                                DWORD  nSize)
    26992707{
    2700   ULONG ulLength;                                          /* length of text */
    2701 
    27022708  if (ConsoleGlobals.pszWindowTitle == NULL)    /* is there a window title ? */
    27032709    return 0;                                           /* abort immediately */
    27042710
    2705   ulLength = strlen(ConsoleGlobals.pszWindowTitle);        /* length of text */
    2706 
    2707   lstrcpynAtoW(lpConsoleTitle,
    2708                ConsoleGlobals.pszWindowTitle,
    2709                nSize);
    2710 
    2711   return (nSize < ulLength) ? nSize : ulLength;
     2711  MultiByteToWideChar( GetConsoleCP(), 0, ConsoleGlobals.pszWindowTitle, -1,
     2712        lpConsoleTitle, nSize );
     2713  lpConsoleTitle[ nSize - 1 ] = 0;
     2714
     2715  return lstrlenW( lpConsoleTitle );
    27122716}
    27132717
     
    34433447BOOL WIN32API SetConsoleTitleW(LPWSTR lpszTitle)
    34443448{
     3449  int alen;
     3450
    34453451  if (lpszTitle == NULL)                                 /* check parameters */
    34463452    return FALSE;
     
    34493455    free (ConsoleGlobals.pszWindowTitle);                     /* then free it */
    34503456
     3457  alen = WideCharToMultiByte( GetConsoleCP(), 0, lpszTitle, -1, 0, 0, 0, 0 );
    34513458  /* create an ascii copy of the lpszTitle */
    3452   int iLength = lstrlenW(lpszTitle);
    3453 
    3454   ConsoleGlobals.pszWindowTitle = (PSZ)malloc(iLength+1);
    3455   ConsoleGlobals.pszWindowTitle[iLength] = 0;
    3456   lstrcpynWtoA(ConsoleGlobals.pszWindowTitle,
    3457                lpszTitle,
    3458                iLength+1); //must add one (lstrcpynWtoA terminates string)
     3459  ConsoleGlobals.pszWindowTitle = (PSZ)malloc( alen );
     3460  WideCharToMultiByte( GetConsoleCP(), 0, lpszTitle, -1,
     3461        ConsoleGlobals.pszWindowTitle, alen, 0, 0 );
    34593462
    34603463  WinSetWindowText(ConsoleGlobals.hwndFrame,           /* set new title text */
  • trunk/src/kernel32/winimgres.cpp

    r6442 r10471  
    1 /* $Id: winimgres.cpp,v 1.53 2001-08-03 17:45:27 sandervl Exp $ */
     1/* $Id: winimgres.cpp,v 1.54 2004-02-19 13:03:07 sandervl Exp $ */
    22
    33/*
     
    1111 * Copyright 1995 Thomas Sandford
    1212 * Copyright 1996 Martin von Loewis
    13  * 
     13 *
    1414 *
    1515 * Project Odin Software License can be found in LICENSE.TXT
     
    3232#include "oslibmisc.h"
    3333
    34 #define DBG_LOCALLOG    DBG_winimgres
     34#define DBG_LOCALLOG    DBG_winimgres
    3535#include "dbglocal.h"
    3636
     
    4242
    4343STD_RESTYPE ResType[MAX_RES] =
    44       { {NULL,          0}, 
    45         {"CURSOR",      6}, 
     44      { {NULL,          0},
     45        {"CURSOR",      6},
    4646        {"BITMAP",      6},
    4747        {"ICON",        4},
     
    6969{
    7070 PIMAGE_RESOURCE_DATA_ENTRY pData = NULL;
    71    
     71
    7272    pData = (PIMAGE_RESOURCE_DATA_ENTRY)findResourceA(lpszName, lpszType, lang);
    7373    if(pData == NULL) {
     
    8282{
    8383 PIMAGE_RESOURCE_DATA_ENTRY pData = NULL;
    84    
     84
    8585    pData = (PIMAGE_RESOURCE_DATA_ENTRY)findResourceW(lpszName, lpszType, lang);
    8686    if(pData == NULL) {
     
    9898
    9999  if(pData == NULL) {
    100         DebugInt3();
    101         return NULL;
     100    DebugInt3();
     101    return NULL;
    102102  }
    103103  //ulRVAResourceSection contains the relative virtual address (relative to the start of the image)
     
    113113
    114114  if(pData == NULL) {
    115         DebugInt3();
    116         return NULL;
     115    DebugInt3();
     116    return NULL;
    117117  }
    118118  return pData->Size;
     
    127127 HRSRC                     hRes;
    128128
    129     if(HIWORD(lpszType) != 0) 
    130     {
    131         typelen = strlen(lpszType);
     129    if(HIWORD(lpszType) != 0)
     130    {
     131    typelen = strlen(lpszType);
    132132
    133133        for(int i=0;i<MAX_RES;i++) {
    134             if(ResType[i].namelen && 
     134            if(ResType[i].namelen &&
    135135               ResType[i].namelen == typelen &&
    136136               stricmp(lpszType, ResType[i].typename) == 0)
     
    144144    if(!pResDirRet) {
    145145        dprintf2(("FindResourceA %s: resource %x (type %x, lang %x) TYPE NOT FOUND", szModule, lpszName, lpszType, lang));
    146         SetLastError(ERROR_RESOURCE_TYPE_NOT_FOUND);
    147         return NULL;
     146    SetLastError(ERROR_RESOURCE_TYPE_NOT_FOUND);
     147    return NULL;
    148148    }
    149149    pResDirRet = getResSubDirA(pResDirRet, lpszName);
    150150    if(!pResDirRet) {
    151151        dprintf2(("FindResourceA %s: resource %x (type %x, lang %x) NAME NOT FOUND", szModule, lpszName, lpszType, lang));
    152         SetLastError(ERROR_RESOURCE_NAME_NOT_FOUND);
    153         return NULL;
     152    SetLastError(ERROR_RESOURCE_NAME_NOT_FOUND);
     153    return NULL;
    154154    }
    155155
     
    160160       lang == MAKELANGID(LANG_NEUTRAL, 3)) /* FIXME: real name? */
    161161    {
    162         hRes = getResourceLang(pResDirRet);
     162        hRes = getResourceLang(pResDirRet);
    163163    }
    164164    else hRes = getResourceLangEx(pResDirRet, lang);
     
    181181 HRSRC                     hRes;
    182182
    183     if(HIWORD(lpszType) != 0 && lpszType[0] != (WCHAR)'#') 
     183    if(HIWORD(lpszType) != 0 && lpszType[0] != (WCHAR)'#')
    184184    {
    185185        astring1 = UnicodeToAsciiString(lpszType);
    186         typelen = strlen(astring1);
     186    typelen = strlen(astring1);
    187187
    188188        for(int i=0;i<MAX_RES;i++) {
    189             if(ResType[i].namelen && 
     189            if(ResType[i].namelen &&
    190190               ResType[i].namelen == typelen &&
    191191               stricmp(astring1, ResType[i].typename) == 0)
     
    195195             lpszType = (LPWSTR)i;
    196196        }
    197         FreeAsciiString(astring1);
     197    FreeAsciiString(astring1);
    198198    }
    199199    pResDirRet = getResSubDirW(pResRootDir, lpszType);
    200200    if(!pResDirRet) {
    201201        dprintf2(("FindResourceW %s: resource %x (type %x, lang %x) TYPE NOT FOUND", szModule, lpszName, lpszType, lang));
    202         SetLastError(ERROR_RESOURCE_TYPE_NOT_FOUND);
    203         return NULL;
     202    SetLastError(ERROR_RESOURCE_TYPE_NOT_FOUND);
     203    return NULL;
    204204    }
    205205    pResDirRet = getResSubDirW(pResDirRet, lpszName);
    206206    if(!pResDirRet) {
    207207        dprintf2(("FindResourceW %s: resource %x (type %x, lang %x) NAME NOT FOUND", szModule, lpszName, lpszType, lang));
    208         SetLastError(ERROR_RESOURCE_NAME_NOT_FOUND);
    209         return NULL;
     208    SetLastError(ERROR_RESOURCE_NAME_NOT_FOUND);
     209    return NULL;
    210210    }
    211211
     
    216216       lang == MAKELANGID(LANG_NEUTRAL, 3)) /* FIXME: real name? */
    217217    {
    218         hRes = getResourceLang(pResDirRet);
     218        hRes = getResourceLang(pResDirRet);
    219219    }
    220220    else hRes = getResourceLangEx(pResDirRet, lang);
     
    248248    hRes = (HRSRC)getResDataLang(pResDirToSearch, lang);
    249249    if(!hRes) {
    250         /* 2. Neutral language with default sublanguage */
    251         lang = MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT);
     250    /* 2. Neutral language with default sublanguage */
     251    lang = MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT);
    252252        hRes = (HRSRC)getResDataLang(pResDirToSearch, lang);
    253253    }
    254254    if(!hRes) {
    255         /* 3. Current locale lang id */
    256         lang = LANGIDFROMLCID(GetUserDefaultLCID());
     255    /* 3. Current locale lang id */
     256    lang = LANGIDFROMLCID(GetUserDefaultLCID());
    257257        hRes = (HRSRC)getResDataLang(pResDirToSearch, lang);
    258258    }
    259259    if(!hRes) {
    260         /* 4. Current locale lang id with neutral sublanguage */
    261         lang = MAKELANGID(PRIMARYLANGID(lang), SUBLANG_NEUTRAL);
     260    /* 4. Current locale lang id with neutral sublanguage */
     261    lang = MAKELANGID(PRIMARYLANGID(lang), SUBLANG_NEUTRAL);
    262262        hRes = (HRSRC)getResDataLang(pResDirToSearch, lang);
    263263    }
    264264    if(!hRes) {
    265         /* 5. (!) LANG_ENGLISH, SUBLANG_DEFAULT */
    266         lang = MAKELANGID(LANG_ENGLISH, SUBLANG_DEFAULT);
     265    /* 5. (!) LANG_ENGLISH, SUBLANG_DEFAULT */
     266    lang = MAKELANGID(LANG_ENGLISH, SUBLANG_DEFAULT);
    267267        hRes = (HRSRC)getResDataLang(pResDirToSearch, lang);
    268268    }
    269269    if(!hRes) {
    270         /* 6. Return first in the list */
     270    /* 6. Return first in the list */
    271271        hRes = (HRSRC)getResDataLang(pResDirToSearch, lang, TRUE);
    272272    }
     
    290290    hRes = (HRSRC)getResDataLang(pResDirToSearch, lang);
    291291    if(!hRes) {
    292         /* 2. Language with neutral sublanguage */
     292    /* 2. Language with neutral sublanguage */
    293293        lang = MAKELANGID(PRIMARYLANGID(lang), SUBLANG_NEUTRAL);
    294294        hRes = (HRSRC)getResDataLang(pResDirToSearch, lang);
    295295    }
    296296    if(!hRes) {
    297         /* 3. Neutral language with neutral sublanguage */
     297    /* 3. Neutral language with neutral sublanguage */
    298298        lang = MAKELANGID(LANG_NEUTRAL, SUBLANG_NEUTRAL);
    299299        hRes = (HRSRC)getResDataLang(pResDirToSearch, lang);
    300300    }
    301301    if(!hRes) {
    302         /* 4. Current locale lang id with neutral sublanguage */
    303         lang = MAKELANGID(PRIMARYLANGID(lang), SUBLANG_NEUTRAL);
     302    /* 4. Current locale lang id with neutral sublanguage */
     303    lang = MAKELANGID(PRIMARYLANGID(lang), SUBLANG_NEUTRAL);
    304304        hRes = (HRSRC)getResDataLang(pResDirToSearch, lang);
    305305    }
     
    324324    hRes = findResourceW((LPWSTR)ID_GETFIRST, (LPWSTR)NTRT_VERSION, MAKELANGID(LANG_NEUTRAL, SUBLANG_NEUTRAL));
    325325    if(hRes == NULL) {
    326         //last error already set by findResourceW
     326    //last error already set by findResourceW
    327327        dprintf(("Win32PeLdrImage::getVersionStruct: couldn't find version resource!"));
    328328        return 0;
     
    397397 * @author    knut st. osmundsen
    398398 */
    399 PIMAGE_RESOURCE_DIRECTORY Win32ImageBase::getResSubDirW(PIMAGE_RESOURCE_DIRECTORY pResDirToSearch, 
     399PIMAGE_RESOURCE_DIRECTORY Win32ImageBase::getResSubDirW(PIMAGE_RESOURCE_DIRECTORY pResDirToSearch,
    400400                                                        LPCWSTR lpszName)
    401401{
     
    405405
    406406    if(pResDirToSearch == NULL) {
    407         return NULL;
     407    return NULL;
    408408    }
    409409
    410410    if((ULONG)lpszName == -1) {//check for nonsense values
    411         return NULL;
     411    return NULL;
    412412    }
    413413
     
    460460                (PIMAGE_RESOURCE_DIR_STRING_U)(paResDirEntries[i].u1.s.NameOffset + (ULONG)pResRootDir /*?*/);
    461461
    462             //SvL: Must do case insensitive string compare here
     462        //SvL: Must do case insensitive string compare here
    463463            if (pResDirStr->Length == cusName
    464464                && lstrncmpiW(pResDirStr->NameString, lpszName, cusName) == 0)
     
    485485 * @author    knut st. osmundsen
    486486 */
    487 PIMAGE_RESOURCE_DIRECTORY Win32ImageBase::getResSubDirA(PIMAGE_RESOURCE_DIRECTORY pResDirToSearch, 
     487PIMAGE_RESOURCE_DIRECTORY Win32ImageBase::getResSubDirA(PIMAGE_RESOURCE_DIRECTORY pResDirToSearch,
    488488                                                        LPCTSTR lpszName)
    489489{
     
    492492
    493493    if(pResDirToSearch == NULL) {
    494         return NULL;
     494    return NULL;
    495495    }
    496496
    497497    if((ULONG)lpszName == -1) {//check for nonsense values
    498         return NULL;
     498    return NULL;
    499499    }
    500500
     
    528528 */
    529529//******************************************************************************
    530 PIMAGE_RESOURCE_DATA_ENTRY 
     530PIMAGE_RESOURCE_DATA_ENTRY
    531531     Win32ImageBase::getResDataLang(PIMAGE_RESOURCE_DIRECTORY pResDirToSearch,
    532532                                    ULONG language, BOOL fGetDefault)
     
    536536
    537537    if(pResDirToSearch == NULL) {
    538         return NULL;
     538    return NULL;
    539539    }
    540540
     
    542542
    543543    if(pResDirToSearch->NumberOfNamedEntries) {
    544         DebugInt3();
     544    DebugInt3();
    545545    }
    546546    paResDirEntries += pResDirToSearch->NumberOfNamedEntries;
    547547
    548548    for (i = 0; i < pResDirToSearch->NumberOfIdEntries; i++) {
    549         if (paResDirEntries[i].u1.Id == language)
     549        if (paResDirEntries[i].u1.Id == language)
    550550        {
    551                 return (PIMAGE_RESOURCE_DATA_ENTRY) (paResDirEntries[i].u2.s.OffsetToDirectory + (ULONG)pResRootDir);
    552         }
     551                return (PIMAGE_RESOURCE_DATA_ENTRY) (paResDirEntries[i].u2.s.OffsetToDirectory + (ULONG)pResRootDir);
     552    }
    553553    }
    554554
     
    556556    if(fGetDefault)
    557557    {
    558         return (PIMAGE_RESOURCE_DATA_ENTRY) (paResDirEntries[0].u2.s.OffsetToDirectory + (ULONG)pResRootDir);
    559     }
    560     return NULL;
    561 }
    562 //******************************************************************************
    563 //******************************************************************************
    564 BOOL Win32ImageBase::enumResourceTypesA(HMODULE hmod, ENUMRESTYPEPROCA lpEnumFunc, 
     558        return (PIMAGE_RESOURCE_DATA_ENTRY) (paResDirEntries[0].u2.s.OffsetToDirectory + (ULONG)pResRootDir);
     559    }
     560    return NULL;
     561}
     562//******************************************************************************
     563//******************************************************************************
     564BOOL Win32ImageBase::enumResourceTypesA(HMODULE hmod, ENUMRESTYPEPROCA lpEnumFunc,
    565565                                        LONG lParam)
    566566{
     
    591591    prde = (PIMAGE_RESOURCE_DIRECTORY_ENTRY)((ULONG)pResRootDir + sizeof(IMAGE_RESOURCE_DIRECTORY));
    592592
    593     for (i=0; i<pResRootDir->NumberOfNamedEntries+pResRootDir->NumberOfIdEntries && fRet; i++) 
    594     {
    595         /* locate directory or each resource type */
    596         prdType = (PIMAGE_RESOURCE_DIRECTORY)((int)pResRootDir + (int)prde->u2.OffsetToData);
     593    for (i=0; i<pResRootDir->NumberOfNamedEntries+pResRootDir->NumberOfIdEntries && fRet; i++)
     594    {
     595        /* locate directory or each resource type */
     596        prdType = (PIMAGE_RESOURCE_DIRECTORY)((int)pResRootDir + (int)prde->u2.OffsetToData);
    597597
    598598        if (prde->u1.s.NameIsString)
    599         {//name or id entry?
    600                 //SvL: 30-10-'97, high bit is set, so clear to get real offset
    601                 nameOffset = prde->u1.Name & ~0x80000000;
    602        
    603                 pstring = (PIMAGE_RESOURCE_DIR_STRING_U)((ULONG)pResRootDir + nameOffset);
    604                 char *typename = (char *)malloc(pstring->Length+1);
    605                 lstrcpynWtoA(typename, pstring->NameString, pstring->Length+1);
    606                 typename[pstring->Length] = 0;
    607 
    608                 fRet = lpEnumFunc(hmod, typename, lParam);
    609                 free(typename);
    610         }
    611         else {
    612                 fRet = lpEnumFunc(hmod, (LPSTR)prde->u1.Id, lParam);
    613         }
     599        {//name or id entry?
     600            //SvL: 30-10-'97, high bit is set, so clear to get real offset
     601            nameOffset = prde->u1.Name & ~0x80000000;
     602
     603            pstring = (PIMAGE_RESOURCE_DIR_STRING_U)((ULONG)pResRootDir + nameOffset);
     604            int len = lstrlenWtoA( pstring->NameString, pstring->Length );
     605            char *typename = (char *)malloc( len + 1 );
     606            lstrcpynWtoA(typename, pstring->NameString, len + 1 );
     607            typename[len] = 0;
     608
     609        fRet = lpEnumFunc(hmod, typename, lParam);
     610            free(typename);
     611        }
     612        else {
     613        fRet = lpEnumFunc(hmod, (LPSTR)prde->u1.Id, lParam);
     614    }
    614615
    615616        /* increment to next entry */
     
    620621//******************************************************************************
    621622//******************************************************************************
    622 BOOL Win32ImageBase::enumResourceTypesW(HMODULE hmod, ENUMRESTYPEPROCW lpEnumFunc, 
     623BOOL Win32ImageBase::enumResourceTypesW(HMODULE hmod, ENUMRESTYPEPROCW lpEnumFunc,
    623624                                        LONG lParam)
    624625{
     
    650651    prde = (PIMAGE_RESOURCE_DIRECTORY_ENTRY)((ULONG)pResRootDir + sizeof(IMAGE_RESOURCE_DIRECTORY));
    651652
    652     for (i=0; i<pResRootDir->NumberOfNamedEntries+pResRootDir->NumberOfIdEntries && fRet; i++) 
    653     {
    654         /* locate directory or each resource type */
    655         prdType = (PIMAGE_RESOURCE_DIRECTORY)((int)pResRootDir + (int)prde->u2.OffsetToData);
     653    for (i=0; i<pResRootDir->NumberOfNamedEntries+pResRootDir->NumberOfIdEntries && fRet; i++)
     654    {
     655        /* locate directory or each resource type */
     656        prdType = (PIMAGE_RESOURCE_DIRECTORY)((int)pResRootDir + (int)prde->u2.OffsetToData);
    656657
    657658        if (prde->u1.s.NameIsString)
    658         {//name or id entry?
    659                 //SvL: 30-10-'97, high bit is set, so clear to get real offset
    660                 nameOffset = prde->u1.Name & ~0x80000000;
    661        
    662                 pstring = (PIMAGE_RESOURCE_DIR_STRING_U)((ULONG)pResRootDir + nameOffset);
    663 
    664                 lpszType = (LPWSTR)malloc((pstring->Length+1) * sizeof(WCHAR));
     659        {//name or id entry?
     660            //SvL: 30-10-'97, high bit is set, so clear to get real offset
     661            nameOffset = prde->u1.Name & ~0x80000000;
     662
     663            pstring = (PIMAGE_RESOURCE_DIR_STRING_U)((ULONG)pResRootDir + nameOffset);
     664
     665        lpszType = (LPWSTR)malloc((pstring->Length+1) * sizeof(WCHAR));
    665666                memcpy(lpszType, pstring->NameString, pstring->Length * sizeof(WCHAR));
    666667                lpszType[pstring->Length] = 0;
    667668
    668                 fRet = lpEnumFunc(hmod, pstring->NameString, lParam);
    669 
    670                 free(lpszType);
    671         }
    672         else    fRet = lpEnumFunc(hmod, (LPWSTR)prde->u1.Id, lParam);
     669        fRet = lpEnumFunc(hmod, pstring->NameString, lParam);
     670
     671        free(lpszType);
     672        }
     673        else    fRet = lpEnumFunc(hmod, (LPWSTR)prde->u1.Id, lParam);
    673674
    674675        /* increment to next entry */
     
    776777                    pszASCII = (char*)pszTmp;
    777778                }
    778                 lstrcpynWtoA(pszASCII, pResDirString->NameString, pResDirString->Length+1);
    779                 pszASCII[pResDirString->Length] = 0;
     779
     780                int len = lstrlenWtoA( pResDirString->NameString, pResDirString->Length );
     781                lstrcpynWtoA(pszASCII, pResDirString->NameString, len + 1);
     782                pszASCII[len] = 0;
    780783                lpszName = pszASCII;
    781784            }
     
    879882            LPWSTR lpszName, lpszResName;
    880883
    881             if(paResDirEntries[i].u1.s.NameIsString) 
     884            if(paResDirEntries[i].u1.s.NameIsString)
    882885            {
    883886                lpszName = (LPWSTR)(paResDirEntries[i].u1.s.NameOffset + (ULONG)pResRootDir + 2);
    884887                length   = (int)*(LPWSTR)(paResDirEntries[i].u1.s.NameOffset + (ULONG)pResRootDir);
    885888
    886                 lpszResName = (LPWSTR)malloc((length+1) * sizeof(WCHAR));
     889            lpszResName = (LPWSTR)malloc((length+1) * sizeof(WCHAR));
    887890                memcpy(lpszResName, lpszName, length * sizeof(WCHAR));
    888891                lpszResName[length] = 0;
    889892
    890893                fRet = lpEnumFunc(hmod, lpszType, lpszResName, lParam);
    891                 free(lpszResName);
     894        free(lpszResName);
    892895            }
    893896            else {
     
    907910//******************************************************************************
    908911//******************************************************************************
    909 BOOL Win32ImageBase::enumResourceLanguagesA(HMODULE hmod, LPCSTR lpszType, 
    910                                             LPCSTR lpszName, 
    911                                             ENUMRESLANGPROCA lpEnumFunc, 
     912BOOL Win32ImageBase::enumResourceLanguagesA(HMODULE hmod, LPCSTR lpszType,
     913                                            LPCSTR lpszName,
     914                                            ENUMRESLANGPROCA lpEnumFunc,
    912915                                            LONG lParam)
    913916{
     
    930933    pResDirRet = getResSubDirA(pResRootDir, lpszType);
    931934    if(!pResDirRet) {
    932         SetLastError(ERROR_RESOURCE_TYPE_NOT_FOUND);
    933         return FALSE;
     935    SetLastError(ERROR_RESOURCE_TYPE_NOT_FOUND);
     936    return FALSE;
    934937    }
    935938    pResDirRet = getResSubDirA(pResDirRet, lpszName);
    936939    if(!pResDirRet) {
    937         SetLastError(ERROR_RESOURCE_NAME_NOT_FOUND);
    938         return FALSE;
     940    SetLastError(ERROR_RESOURCE_NAME_NOT_FOUND);
     941    return FALSE;
    939942    }
    940943
    941944    paResDirEntries = (PIMAGE_RESOURCE_DIRECTORY_ENTRY)((ULONG)pResDirRet + sizeof(*pResDirRet));
    942945    if(pResDirRet->NumberOfNamedEntries) {
    943         DebugInt3();
     946    DebugInt3();
    944947    }
    945948    paResDirEntries += pResDirRet->NumberOfNamedEntries;
    946949
    947     for(int i = 0;i < pResDirRet->NumberOfIdEntries;i++) 
    948     {
    949         fRet = lpEnumFunc(hmod, lpszType, lpszName, paResDirEntries[i].u1.Id, lParam);
    950         if(!fRet)
    951                 break;
     950    for(int i = 0;i < pResDirRet->NumberOfIdEntries;i++)
     951    {
     952    fRet = lpEnumFunc(hmod, lpszType, lpszName, paResDirEntries[i].u1.Id, lParam);
     953    if(!fRet)
     954        break;
    952955    }
    953956    return fRet;
     
    955958//******************************************************************************
    956959//******************************************************************************
    957 BOOL Win32ImageBase::enumResourceLanguagesW(HMODULE hmod, LPCWSTR lpszType, 
    958                                             LPCWSTR lpszName, 
    959                                             ENUMRESLANGPROCW lpEnumFunc, 
     960BOOL Win32ImageBase::enumResourceLanguagesW(HMODULE hmod, LPCWSTR lpszType,
     961                                            LPCWSTR lpszName,
     962                                            ENUMRESLANGPROCW lpEnumFunc,
    960963                                            LONG lParam)
    961964{
     
    978981    pResDirRet = getResSubDirW(pResRootDir, lpszType);
    979982    if(!pResDirRet) {
    980         SetLastError(ERROR_RESOURCE_TYPE_NOT_FOUND);
    981         return FALSE;
     983    SetLastError(ERROR_RESOURCE_TYPE_NOT_FOUND);
     984    return FALSE;
    982985    }
    983986    pResDirRet = getResSubDirW(pResDirRet, lpszName);
    984987    if(!pResDirRet) {
    985         SetLastError(ERROR_RESOURCE_NAME_NOT_FOUND);
    986         return FALSE;
     988    SetLastError(ERROR_RESOURCE_NAME_NOT_FOUND);
     989    return FALSE;
    987990    }
    988991
    989992    paResDirEntries = (PIMAGE_RESOURCE_DIRECTORY_ENTRY)((ULONG)pResDirRet + sizeof(*pResDirRet));
    990993    if(pResDirRet->NumberOfNamedEntries) {
    991         DebugInt3();
     994    DebugInt3();
    992995    }
    993996    paResDirEntries += pResDirRet->NumberOfNamedEntries;
    994997
    995     for(int i = 0;i < pResDirRet->NumberOfIdEntries;i++) 
    996     {
    997         fRet = lpEnumFunc(hmod, lpszType, lpszName, paResDirEntries[i].u1.Id, lParam);
    998         if(!fRet)
    999                 break;
     998    for(int i = 0;i < pResDirRet->NumberOfIdEntries;i++)
     999    {
     1000    fRet = lpEnumFunc(hmod, lpszType, lpszName, paResDirEntries[i].u1.Id, lParam);
     1001    if(!fRet)
     1002        break;
    10001003    }
    10011004    return fRet;
Note: See TracChangeset for help on using the changeset viewer.