Changeset 4249 for trunk/src


Ignore:
Timestamp:
Sep 13, 2000, 12:45:19 AM (25 years ago)
Author:
bird
Message:

Added compare function matchModName.

Location:
trunk/src/kernel32
Files:
2 edited

Legend:

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

    r4003 r4249  
    1 /* $Id: winimagebase.cpp,v 1.25 2000-08-12 16:58:40 sandervl Exp $ */
     1/* $Id: winimagebase.cpp,v 1.26 2000-09-12 22:45:19 bird Exp $ */
    22
    33/*
     
    55 *
    66 * Copyright 1998-1999 Sander van Leeuwen (sandervl@xs4all.nl)
    7  * Copyright 1998 Knut St. Osmundsen
     7 * Copyright 1998-2000 knut st. osmundsen (knut.stange.osmundsen@mynd.no)
    88 *
    99 * Project Odin Software License can be found in LICENSE.TXT
     
    3939#include <winconst.h>
    4040
    41 #define DBG_LOCALLOG    DBG_winimagebase
     41#define DBG_LOCALLOG    DBG_winimagebase
    4242#include "dbglocal.h"
    4343
     
    107107  item = loadedDlls.Head();
    108108  while(item) {
    109         if(loadedDlls.getItem(item) == (ULONG)image) {
    110                 ret = TRUE;
    111                 break;
    112         }         
    113         item = loadedDlls.getNext(item);
     109    if(loadedDlls.getItem(item) == (ULONG)image) {
     110        ret = TRUE;
     111        break;
     112    }
     113    item = loadedDlls.getNext(item);
    114114  }
    115115  dlllistmutex.leave();
     
    147147//******************************************************************************
    148148//******************************************************************************
    149 BOOL Win32ImageBase::findDll(const char *szFileName, char *szFullName, 
     149BOOL Win32ImageBase::findDll(const char *szFileName, char *szFullName,
    150150                             int cchFullFileName, const char *pszAltPath)
    151151{
     
    157157  strupr(szFullName);
    158158  if(!strchr(szFullName, (int)'.')) {
    159         strcat(szFullName,".DLL");
     159        strcat(szFullName,".DLL");
    160160  }
    161161
     
    167167  //5) path
    168168  if(WinExe) {
    169         strcpy(modname, WinExe->getFullPath());
    170         //remove file name from full path
    171         imagepath = modname + strlen(modname) - 1;
    172         while(*imagepath != '\\') imagepath--;
    173         imagepath[1] = 0;
    174         strcat(modname, szFullName);
    175         dllfile = OSLibDosOpen(modname, OSLIB_ACCESS_READONLY|OSLIB_ACCESS_SHAREDENYNONE);
     169    strcpy(modname, WinExe->getFullPath());
     170    //remove file name from full path
     171    imagepath = modname + strlen(modname) - 1;
     172    while(*imagepath != '\\') imagepath--;
     173    imagepath[1] = 0;
     174    strcat(modname, szFullName);
     175    dllfile = OSLibDosOpen(modname, OSLIB_ACCESS_READONLY|OSLIB_ACCESS_SHAREDENYNONE);
    176176  }
    177177  if(dllfile == NULL) {
    178         strcpy(modname, szFullName);
    179         dllfile = OSLibDosOpen(szFullName, OSLIB_ACCESS_READONLY|OSLIB_ACCESS_SHAREDENYNONE);
    180         if(dllfile == NULL) {
    181                 strcpy(modname, InternalGetSystemDirectoryA());
    182                 strcat(modname, "\\");
    183                 strcat(modname, szFullName);
    184                 dllfile = OSLibDosOpen(modname, OSLIB_ACCESS_READONLY|OSLIB_ACCESS_SHAREDENYNONE);
    185                 if(dllfile == NULL) {
    186                         strcpy(modname, InternalGetWindowsDirectoryA());
    187                         strcat(modname, "\\");
    188                         strcat(modname, szFullName);
    189                         dllfile = OSLibDosOpen(modname, OSLIB_ACCESS_READONLY|OSLIB_ACCESS_SHAREDENYNONE);
    190                         if(dllfile == NULL) {
    191                                 if(OSLibDosSearchPath(OSLIB_SEARCHENV, "PATH", szFullName, modname, sizeof(modname)) == 0) {
    192                                         return FALSE;
    193                                 }
    194                         }
    195                 }
    196         }
     178    strcpy(modname, szFullName);
     179    dllfile = OSLibDosOpen(szFullName, OSLIB_ACCESS_READONLY|OSLIB_ACCESS_SHAREDENYNONE);
     180    if(dllfile == NULL) {
     181            strcpy(modname, InternalGetSystemDirectoryA());
     182        strcat(modname, "\\");
     183            strcat(modname, szFullName);
     184        dllfile = OSLibDosOpen(modname, OSLIB_ACCESS_READONLY|OSLIB_ACCESS_SHAREDENYNONE);
     185        if(dllfile == NULL) {
     186            strcpy(modname, InternalGetWindowsDirectoryA());
     187            strcat(modname, "\\");
     188                strcat(modname, szFullName);
     189            dllfile = OSLibDosOpen(modname, OSLIB_ACCESS_READONLY|OSLIB_ACCESS_SHAREDENYNONE);
     190            if(dllfile == NULL) {
     191                if(OSLibDosSearchPath(OSLIB_SEARCHENV, "PATH", szFullName, modname, sizeof(modname)) == 0) {
     192                    return FALSE;
     193                }
     194            }
     195        }
     196    }
    197197  }
    198198  strcpy(szFullName, modname);
     
    200200  return TRUE;
    201201}
     202
    202203//******************************************************************************
    203204//returns ERROR_SUCCESS or error code
     
    252253  rc = DosRead(win32handle, pdoshdr, sizeof(IMAGE_DOS_HEADER), &ulRead);
    253254  if(rc != NO_ERROR || ulRead != sizeof(IMAGE_DOS_HEADER)) {
    254         free(pdoshdr);
     255    free(pdoshdr);
    255256        DosClose(win32handle);                /* Close the file */
    256257        return ERROR_INVALID_EXE_SIGNATURE_W;
    257258  }
    258259  if(pdoshdr->e_magic != IMAGE_DOS_SIGNATURE) {
    259         free(pdoshdr);
     260    free(pdoshdr);
    260261        DosClose(win32handle);                /* Close the file */
    261262        return ERROR_INVALID_EXE_SIGNATURE_W;
     
    331332
    332333
     334/**
     335 * Matches a given filename or module name with the module name of
     336 * this object.
     337 * @returns     TRUE:   The modulenames matches.
     338 *              FALSE:  Don't match.
     339 * @param       pszFilename     Pointer to filename or module name.
     340 * @status      completely implemented.
     341 * @author      knut st. osmundsen (knut.stange.osmundsen@mynd.no)
     342 * @remark      Just a clarification:
     343 *              A module name is the filename of a executable image without
     344 *              path and without extention.
     345 */
     346BOOL Win32ImageBase::matchModName(const char *pszFilename) const
     347{
     348    const char *pszModName;             /* Pointer to the modulename. */
     349    const char *pszModNameEnd = NULL;   /* Pointer to the dot starting the extention. (if any) */
     350    register char ch;
     351
     352    /** @sketch
     353     * Search the filename string finding the modulename start and end.
     354     * The loop ends when we have passed one char left of the module name.
     355     */
     356    pszModName = pszFilename + strlen(pszFilename) - 1;
     357    while (pszModName >= pszFilename
     358           && (ch = *pszModName) != '\\'
     359           && ch != '/'
     360           && ch != ':'
     361           )
     362    {
     363        if (ch == '.' && pszModNameEnd != NULL)
     364            pszModName = pszModName;
     365        pszModName--;
     366    }
     367    pszModName++;
     368
     369    /** @sketch
     370     * Compare the names caseinsensitivly.
     371     */
     372    if (pszModNameEnd)
     373        return strnicmp(pszModName, szModule, pszModNameEnd - pszModName) == 0;
     374    return stricmp(pszModName, szModule) == 0;
     375}
  • trunk/src/kernel32/winimagebase.h

    r4224 r4249  
    1 /* $Id: winimagebase.h,v 1.15 2000-09-08 18:07:51 sandervl Exp $ */
     1/* $Id: winimagebase.h,v 1.16 2000-09-12 22:45:19 bird Exp $ */
    22
    33/*
     
    55 *
    66 * Copyright 1998-1999 Sander van Leeuwen (sandervl@xs4all.nl)
     7 * Copyright 1999-2000 knut st. osmundsen (knut.stange.osmundsen@mynd.no)
    78 *
    89 *
     
    4142class Win32DllBase;
    4243
     44
    4345class Win32ImageBase
    4446{
     
    4648        DWORD magic;
    4749public:
    48         void checkObject()
    49         {
    50                 if(magic != MAGIC_WINIMAGE) {
    51                         eprintf(("Corrupt this pointer %X %X!!", this, magic));
    52                         DebugInt3();
    53                 }
    54         };
     50    void checkObject()
     51    {
     52        if (magic != MAGIC_WINIMAGE) {
     53            eprintf(("Corrupt this pointer %X %X!!", this, magic));
     54            DebugInt3();
     55        }
     56    };
    5557
    5658public:
     
    5961virtual ~Win32ImageBase();
    6062
    61         ULONG     getError()          { return errorState; };
    62         HINSTANCE getInstanceHandle() { return hinstance; };
     63    ULONG     getError()          { return errorState; };
     64    HINSTANCE getInstanceHandle() { return hinstance; };
    6365
    6466//Returns required OS version for this image
     
    6668
    6769virtual void  setFullPath(char *name);
    68         char *getFullPath()           { return fullpath; };
    69 
    70         char *getModuleName()         { return szModule; };
     70    char *getFullPath()           { return fullpath; };
     71    char *getModuleName()         { return szModule; };
    7172
    7273        //findResource returns the pointer of the resource's IMAGE_RESOURCE_DATA_ENTRY structure
    73         HRSRC findResourceA(LPCSTR lpszName, LPSTR lpszType, ULONG lang = MAKELANGID(LANG_NEUTRAL, SUBLANG_NEUTRAL));
    74         HRSRC findResourceW(LPWSTR lpszName, LPWSTR lpszType, ULONG lang = MAKELANGID(LANG_NEUTRAL, SUBLANG_NEUTRAL));
     74    HRSRC findResourceA(LPCSTR lpszName, LPSTR lpszType, ULONG lang = MAKELANGID(LANG_NEUTRAL, SUBLANG_NEUTRAL));
     75    HRSRC findResourceW(LPWSTR lpszName, LPWSTR lpszType, ULONG lang = MAKELANGID(LANG_NEUTRAL, SUBLANG_NEUTRAL));
    7576
    76         ULONG getResourceSizeA(LPSTR lpszName, LPSTR lpszType, ULONG lang = MAKELANGID(LANG_NEUTRAL, SUBLANG_NEUTRAL));
    77         ULONG getResourceSizeW(LPWSTR lpszName, LPWSTR lpszType, ULONG lang = MAKELANGID(LANG_NEUTRAL, SUBLANG_NEUTRAL));
    78         BOOL  enumResourceNamesA(HMODULE hmod, LPCTSTR  lpszType, ENUMRESNAMEPROCA lpEnumFunc, LONG lParam);
    79         BOOL  enumResourceNamesW(HMODULE hmod, LPCWSTR  lpszType, ENUMRESNAMEPROCW lpEnumFunc, LONG lParam);
    80         BOOL  enumResourceTypesA(HMODULE hmod, ENUMRESTYPEPROCA lpEnumFunc,
    81                                  LONG lParam);
    82         BOOL  enumResourceTypesW(HMODULE hmod, ENUMRESTYPEPROCW lpEnumFunc,
    83                                  LONG lParam);
    84         BOOL  enumResourceLanguagesA(HMODULE hmod, LPCSTR lpType, LPCSTR lpName,
    85                                      ENUMRESLANGPROCA lpEnumFunc, LONG lParam);
    86         BOOL  enumResourceLanguagesW(HMODULE hmod, LPCWSTR lpType, LPCWSTR lpName,
    87                                      ENUMRESLANGPROCW lpEnumFunc, LONG lParam);
     77    ULONG getResourceSizeA(LPSTR lpszName, LPSTR lpszType, ULONG lang = MAKELANGID(LANG_NEUTRAL, SUBLANG_NEUTRAL));
     78    ULONG getResourceSizeW(LPWSTR lpszName, LPWSTR lpszType, ULONG lang = MAKELANGID(LANG_NEUTRAL, SUBLANG_NEUTRAL));
     79    BOOL  enumResourceNamesA(HMODULE hmod, LPCTSTR  lpszType, ENUMRESNAMEPROCA lpEnumFunc, LONG lParam);
     80    BOOL  enumResourceNamesW(HMODULE hmod, LPCWSTR  lpszType, ENUMRESNAMEPROCW lpEnumFunc, LONG lParam);
     81    BOOL  enumResourceTypesA(HMODULE hmod, ENUMRESTYPEPROCA lpEnumFunc,
     82                             LONG lParam);
     83    BOOL  enumResourceTypesW(HMODULE hmod, ENUMRESTYPEPROCW lpEnumFunc,
     84                             LONG lParam);
     85    BOOL  enumResourceLanguagesA(HMODULE hmod, LPCSTR lpType, LPCSTR lpName,
     86                                 ENUMRESLANGPROCA lpEnumFunc, LONG lParam);
     87    BOOL  enumResourceLanguagesW(HMODULE hmod, LPCWSTR lpType, LPCWSTR lpName,
     88                                 ENUMRESLANGPROCW lpEnumFunc, LONG lParam);
    8889
    89         ULONG getVersionSize();
    90         BOOL  getVersionStruct(char *verstruct, ULONG bufLength);
     90    ULONG getVersionSize();
     91    BOOL  getVersionStruct(char *verstruct, ULONG bufLength);
    9192
    92         //Returns pointer to data of resource handle
    93         char *getResourceAddr(HRSRC hResource);
    94         ULONG getResourceSize(HRSRC hResource);
     93    //Returns pointer to data of resource handle
     94    char *getResourceAddr(HRSRC hResource);
     95    ULONG getResourceSize(HRSRC hResource);
    9596
    96         //returns ERROR_SUCCESS or error code
     97    //returns ERROR_SUCCESS or error code
    9798static  ULONG isPEImage(char *szFileName);
    9899static  BOOL  findDll(const char *pszFileName, char *pszFullName,
    99100                      int cchFullName, const char *pszAltPath = NULL);
    100101
    101         void  setEntryPoint(ULONG startAddress) { entryPoint = startAddress; };
     102    void  setEntryPoint(ULONG startAddress)        { entryPoint = startAddress; };
    102103
    103         void  setTLSAddress(LPVOID dwTlsAddress)        { tlsAddress = dwTlsAddress; };
    104         void  setTLSIndexAddr(LPDWORD dwTlsIndexAddr)   { tlsIndexAddr = dwTlsIndexAddr; };
    105         void  setTLSInitSize(ULONG dwTlsSize)           { tlsInitSize = dwTlsSize; };
    106         void  setTLSTotalSize(ULONG dwTlsSize)          { tlsTotalSize = dwTlsSize; };
    107         void  setTLSCallBackAddr(PIMAGE_TLS_CALLBACK *dwTlsCallBackAddr)
    108         {
    109            tlsCallBackAddr = dwTlsCallBackAddr;
    110         };
     104    void  setTLSAddress(LPVOID dwTlsAddress)        { tlsAddress = dwTlsAddress; };
     105    void  setTLSIndexAddr(LPDWORD dwTlsIndexAddr)   { tlsIndexAddr = dwTlsIndexAddr; };
     106    void  setTLSInitSize(ULONG dwTlsSize)           { tlsInitSize = dwTlsSize; };
     107    void  setTLSTotalSize(ULONG dwTlsSize)          { tlsTotalSize = dwTlsSize; };
     108    void  setTLSCallBackAddr(PIMAGE_TLS_CALLBACK *dwTlsCallBackAddr)
     109    {
     110       tlsCallBackAddr = dwTlsCallBackAddr;
     111    };
    111112
    112         void  tlsAttachThread();        //setup TLS structures for new thread
    113         void  tlsDetachThread();        //destroy TLS structures
     113    void  tlsAttachThread();    //setup TLS structures for new thread
     114    void  tlsDetachThread();    //destroy TLS structures
    114115
    115116virtual BOOL  insideModule(ULONG address);
    116117virtual BOOL  insideModuleCode(ULONG address);
    117118
    118 virtual ULONG getApi(char *name)  = 0;
     119virtual ULONG getApi(char *name)  = 0;
    119120virtual ULONG getApi(int ordinal) = 0;
    120121
     
    124125
    125126static Win32ImageBase * findModule(HMODULE hModule);
     127    BOOL  matchModName(const char *pszFilename) const;
    126128
    127         //Add image to dependency list of this image
    128         void  addDependency(Win32DllBase *dll);
    129         BOOL  dependsOn(Win32DllBase *dll);
     129    /* @cat Depencies */
     130    //Add image to dependency list of this image
     131    void  addDependency(Win32DllBase *dll);
     132    BOOL  dependsOn(Win32DllBase *dll);
    130133
    131134protected:
    132         void tlsAlloc();                //Allocate TLS index for this module
    133         void tlsDelete();               //Destroy TLS index for this module
     135    void tlsAlloc();        //Allocate TLS index for this module
     136    void tlsDelete();       //Destroy TLS index for this module
    134137
    135         ULONG                 errorState, entryPoint;
     138    ULONG                   errorState,
     139                            entryPoint;
    136140
    137         char                 *fullpath;
    138         char                  szModule[CCHMAXPATH];
    139         char                  szFileName[CCHMAXPATH];
     141    char *                  fullpath;
     142    char                    szModule[CCHMAXPATH];
     143    char                    szFileName[CCHMAXPATH];
    140144
    141         HINSTANCE             hinstance;
     145    HINSTANCE               hinstance;
    142146
    143         LPVOID                tlsAddress;               //address of TLS data
    144         LPDWORD               tlsIndexAddr;             //address of DWORD that receives the TLS index
    145         ULONG                 tlsInitSize;              //size of initialized TLS memory block
    146         ULONG                 tlsTotalSize;             //size of TLS memory block
    147         PIMAGE_TLS_CALLBACK  *tlsCallBackAddr;  //ptr to TLS callback array
    148         ULONG                 tlsIndex;         //module TLS index
     147    LPVOID                  tlsAddress;         //address of TLS data
     148    LPDWORD                 tlsIndexAddr;       //address of DWORD that receives the TLS index
     149    ULONG                   tlsInitSize;        //size of initialized TLS memory block
     150    ULONG                   tlsTotalSize;       //size of TLS memory block
     151    PIMAGE_TLS_CALLBACK *   tlsCallBackAddr;    //ptr to TLS callback array
     152    ULONG                   tlsIndex;           //module TLS index
    149153
    150         PIMAGE_RESOURCE_DIRECTORY  getResSubDirW(PIMAGE_RESOURCE_DIRECTORY pResDir, LPCWSTR lpszName);
    151         PIMAGE_RESOURCE_DIRECTORY  getResSubDirA(PIMAGE_RESOURCE_DIRECTORY pResDir, LPCTSTR lpszName);
     154    PIMAGE_RESOURCE_DIRECTORY  getResSubDirW(PIMAGE_RESOURCE_DIRECTORY pResDir, LPCWSTR lpszName);
     155    PIMAGE_RESOURCE_DIRECTORY  getResSubDirA(PIMAGE_RESOURCE_DIRECTORY pResDir, LPCTSTR lpszName);
    152156
    153         PIMAGE_RESOURCE_DATA_ENTRY getResDataLang(PIMAGE_RESOURCE_DIRECTORY pResDir, ULONG language, BOOL fGetDefault = FALSE);
     157    PIMAGE_RESOURCE_DATA_ENTRY getResDataLang(PIMAGE_RESOURCE_DIRECTORY pResDir, ULONG language, BOOL fGetDefault = FALSE);
    154158
    155         HRSRC                      getResourceLang(PIMAGE_RESOURCE_DIRECTORY pResDirToSearch);
    156         HRSRC                      getResourceLangEx(PIMAGE_RESOURCE_DIRECTORY pResDirToSearch,
    157                                                      DWORD lang);
     159    HRSRC                      getResourceLang(PIMAGE_RESOURCE_DIRECTORY pResDirToSearch);
     160    HRSRC                      getResourceLangEx(PIMAGE_RESOURCE_DIRECTORY pResDirToSearch,
     161                                                 DWORD lang);
    158162
    159         PIMAGE_RESOURCE_DIRECTORY pResRootDir;
     163    PIMAGE_RESOURCE_DIRECTORY  pResRootDir;
    160164
    161         //substracted from RVA data offsets
    162         ULONG                     ulRVAResourceSection;
     165    //substracted from RVA data offsets
     166    ULONG                   ulRVAResourceSection;
    163167
    164         //linked list of dlls loaded on behalf of this executable image (dll or exe)
    165         Queue                      loadedDlls;
     168    //linked list of dlls loaded on behalf of this executable image (dll or exe)
     169    Queue                   loadedDlls;
     170
    166171private:
    167 
    168         friend class Win32Resource;
    169         friend ULONG SYSTEM GetVersionSize(char *modname);
     172    friend class Win32Resource;
     173    friend ULONG SYSTEM GetVersionSize(char *modname);
    170174};
    171175
     
    180184} WINIMAGE_LOOKUP;
    181185
    182 #define WINIMAGE_LOOKUPADDR(a)  (WINIMAGE_LOOKUP *)((ULONG)a + PAGE_SIZE - sizeof(WINIMAGE_LOOKUP))
     186#define WINIMAGE_LOOKUPADDR(a)  (WINIMAGE_LOOKUP *)((ULONG)a + PAGE_SIZE - sizeof(WINIMAGE_LOOKUP))
    183187
    184188#endif //__WINIMAGEBASE_H__
Note: See TracChangeset for help on using the changeset viewer.