Implemented "App Paths" registry key support for SearchPath().
This commit is contained in:
parent
c8dcafc65e
commit
8f925ae5c8
|
@ -24,6 +24,7 @@
|
||||||
#include "wingdi.h"
|
#include "wingdi.h"
|
||||||
#include "wine/winuser16.h"
|
#include "wine/winuser16.h"
|
||||||
#include "winerror.h"
|
#include "winerror.h"
|
||||||
|
#include "winreg.h"
|
||||||
#include "drive.h"
|
#include "drive.h"
|
||||||
#include "file.h"
|
#include "file.h"
|
||||||
#include "heap.h"
|
#include "heap.h"
|
||||||
|
@ -513,6 +514,37 @@ static BOOL DIR_TryPath( const DOS_FULL_NAME *dir, LPCSTR name,
|
||||||
return TRUE;
|
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
|
* 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 )
|
static BOOL DIR_TryEnvironmentPath( LPCSTR name, DOS_FULL_NAME *full_name, LPCSTR envpath )
|
||||||
{
|
{
|
||||||
LPSTR path, next, buffer;
|
LPSTR path;
|
||||||
BOOL ret = FALSE;
|
BOOL ret = FALSE;
|
||||||
INT len = strlen(name);
|
|
||||||
DWORD size;
|
DWORD size;
|
||||||
|
|
||||||
size = envpath ? strlen(envpath)+1 : GetEnvironmentVariableA( "PATH", NULL, 0 );
|
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 (!(path = HeapAlloc( GetProcessHeap(), 0, size ))) return FALSE;
|
||||||
if (envpath) strcpy( path, envpath );
|
if (envpath) strcpy( path, envpath );
|
||||||
else if (!GetEnvironmentVariableA( "PATH", path, size )) goto done;
|
else if (!GetEnvironmentVariableA( "PATH", path, size )) goto done;
|
||||||
next = path;
|
|
||||||
while (!ret && next)
|
ret = DIR_SearchSemicolonedPaths(name, full_name, path);
|
||||||
{
|
|
||||||
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 );
|
|
||||||
}
|
|
||||||
|
|
||||||
done:
|
done:
|
||||||
HeapFree( GetProcessHeap(), 0, path );
|
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
|
* 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;
|
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 */
|
/* Try all directories in path */
|
||||||
|
|
||||||
ret = DIR_TryEnvironmentPath( name, full_name, NULL );
|
ret = DIR_TryEnvironmentPath( name, full_name, NULL );
|
||||||
|
|
Loading…
Reference in New Issue