Implemented "App Paths" registry key support for SearchPath().

This commit is contained in:
Andreas Mohr 2002-02-27 18:49:40 +00:00 committed by Alexandre Julliard
parent c8dcafc65e
commit 8f925ae5c8
1 changed files with 80 additions and 18 deletions

View File

@ -24,6 +24,7 @@
#include "wingdi.h"
#include "wine/winuser16.h"
#include "winerror.h"
#include "winreg.h"
#include "drive.h"
#include "file.h"
#include "heap.h"
@ -513,6 +514,37 @@ static BOOL DIR_TryPath( const DOS_FULL_NAME *dir, LPCSTR name,
return TRUE;
}
static BOOL DIR_SearchSemicolonedPaths(LPCSTR name, DOS_FULL_NAME *full_name, LPSTR pathlist)
{
LPSTR next, buffer = NULL;
INT len = strlen(name), newlen, currlen = 0;
BOOL ret = FALSE;
next = pathlist;
while (!ret && next)
{
LPSTR cur = next;
while (*cur == ';') cur++;
if (!*cur) break;
next = strchr( cur, ';' );
if (next) *next++ = '\0';
newlen = strlen(cur) + len + 2;
if (newlen > currlen)
{
if (!(buffer = HeapReAlloc( GetProcessHeap(), 0, buffer, newlen)))
goto done;
currlen = newlen;
}
strcpy( buffer, cur );
strcat( buffer, "\\" );
strcat( buffer, name );
ret = DOSFS_GetFullName( buffer, TRUE, full_name );
}
done:
HeapFree( GetProcessHeap(), 0, buffer );
return ret;
}
/***********************************************************************
* DIR_TryEnvironmentPath
@ -522,9 +554,8 @@ static BOOL DIR_TryPath( const DOS_FULL_NAME *dir, LPCSTR name,
*/
static BOOL DIR_TryEnvironmentPath( LPCSTR name, DOS_FULL_NAME *full_name, LPCSTR envpath )
{
LPSTR path, next, buffer;
LPSTR path;
BOOL ret = FALSE;
INT len = strlen(name);
DWORD size;
size = envpath ? strlen(envpath)+1 : GetEnvironmentVariableA( "PATH", NULL, 0 );
@ -532,22 +563,8 @@ static BOOL DIR_TryEnvironmentPath( LPCSTR name, DOS_FULL_NAME *full_name, LPCST
if (!(path = HeapAlloc( GetProcessHeap(), 0, size ))) return FALSE;
if (envpath) strcpy( path, envpath );
else if (!GetEnvironmentVariableA( "PATH", path, size )) goto done;
next = path;
while (!ret && next)
{
LPSTR cur = next;
while (*cur == ';') cur++;
if (!*cur) break;
next = strchr( cur, ';' );
if (next) *next++ = '\0';
if (!(buffer = HeapAlloc( GetProcessHeap(), 0, strlen(cur) + len + 2)))
goto done;
strcpy( buffer, cur );
strcat( buffer, "\\" );
strcat( buffer, name );
ret = DOSFS_GetFullName( buffer, TRUE, full_name );
HeapFree( GetProcessHeap(), 0, buffer );
}
ret = DIR_SearchSemicolonedPaths(name, full_name, path);
done:
HeapFree( GetProcessHeap(), 0, path );
@ -584,6 +601,47 @@ static BOOL DIR_TryModulePath( LPCSTR name, DOS_FULL_NAME *full_name, BOOL win32
}
/***********************************************************************
* DIR_TryAppPath
*
* Helper function for DIR_SearchPath.
*/
static BOOL DIR_TryAppPath( LPCSTR name, DOS_FULL_NAME *full_name )
{
HKEY hkAppPaths, hkApp;
char lpAppName[MAX_PATHNAME_LEN], lpAppPaths[MAX_PATHNAME_LEN];
LPSTR lpFileName;
BOOL res = FALSE;
DWORD type, count;
if (RegOpenKeyA(HKEY_LOCAL_MACHINE, "Software\\Microsoft\\Windows\\CurrentVersion\\App Paths", &hkAppPaths) != ERROR_SUCCESS)
return FALSE;
if (GetModuleFileNameA(0, lpAppName, sizeof(lpAppName)) == 0)
{
WARN("huh, module not found ??\n");
goto end;
}
lpFileName = strrchr(lpAppName, '\\');
if (!lpFileName)
goto end;
else lpFileName++; /* skip '\\' */
if (RegOpenKeyA(hkAppPaths, lpFileName, &hkApp) != ERROR_SUCCESS)
goto end;
count = sizeof(lpAppPaths);
if (RegQueryValueExA(hkApp, "Path", 0, &type, (LPBYTE)lpAppPaths, &count) != ERROR_SUCCESS)
goto end;
TRACE("successfully opened App Paths for '%s'\n", lpFileName);
res = DIR_SearchSemicolonedPaths(name, full_name, lpAppPaths);
end:
if (hkApp)
RegCloseKey(hkApp);
if (hkAppPaths)
RegCloseKey(hkAppPaths);
return res;
}
/***********************************************************************
* DIR_SearchPath
*
@ -661,6 +719,10 @@ DWORD DIR_SearchPath( LPCSTR path, LPCSTR name, LPCSTR ext,
if (!win32 && DIR_TryModulePath( name, full_name, win32 )) goto done;
/* Try the "App Paths" entry if existing (undocumented ??) */
if (DIR_TryAppPath(name, full_name))
goto done;
/* Try all directories in path */
ret = DIR_TryEnvironmentPath( name, full_name, NULL );