mirror of
https://github.com/reactos/reactos.git
synced 2025-08-03 06:25:49 +00:00
Jens Collin <jens.collin@lakhei.com>
Add PATHEXT env var and use it to locate command svn path=/trunk/; revision=10081
This commit is contained in:
parent
839cdb0644
commit
c8d9ece95d
3 changed files with 111 additions and 187 deletions
|
@ -103,6 +103,7 @@ HKLM,"SYSTEM\CurrentControlSet\Control\Session Manager\Environment","Path",0x000
|
||||||
HKLM,"SYSTEM\CurrentControlSet\Control\Session Manager\Environment","windir",0x00020000,"%SystemRoot%"
|
HKLM,"SYSTEM\CurrentControlSet\Control\Session Manager\Environment","windir",0x00020000,"%SystemRoot%"
|
||||||
HKLM,"SYSTEM\CurrentControlSet\Control\Session Manager\Environment","TEMP",0x00020000,"%SystemDrive%\TEMP"
|
HKLM,"SYSTEM\CurrentControlSet\Control\Session Manager\Environment","TEMP",0x00020000,"%SystemDrive%\TEMP"
|
||||||
HKLM,"SYSTEM\CurrentControlSet\Control\Session Manager\Environment","TMP",0x00020000,"%SystemDrive%\TEMP"
|
HKLM,"SYSTEM\CurrentControlSet\Control\Session Manager\Environment","TMP",0x00020000,"%SystemDrive%\TEMP"
|
||||||
|
HKLM,"SYSTEM\CurrentControlSet\Control\Session Manager\Environment","PATHEXT",0x00020000,".COM;.EXE;.BAT;.CMD"
|
||||||
|
|
||||||
; Known DLLs
|
; Known DLLs
|
||||||
HKLM,"SYSTEM\CurrentControlSet\Control\Session Manager\KnownDlls","DllDirectory",0x00020000,"%SystemRoot%\system32"
|
HKLM,"SYSTEM\CurrentControlSet\Control\Session Manager\KnownDlls","DllDirectory",0x00020000,"%SystemRoot%\system32"
|
||||||
|
|
|
@ -359,7 +359,8 @@ BOOL IsValidPathName (LPCTSTR pszPath)
|
||||||
|
|
||||||
BOOL IsValidFileName (LPCTSTR pszPath)
|
BOOL IsValidFileName (LPCTSTR pszPath)
|
||||||
{
|
{
|
||||||
return (GetFileAttributes (pszPath) != 0xFFFFFFFF);
|
DWORD attr = GetFileAttributes (pszPath);
|
||||||
|
return (attr != 0xFFFFFFFF && (! (attr & FILE_ATTRIBUTE_DIRECTORY)) );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -67,6 +67,11 @@
|
||||||
*
|
*
|
||||||
* 20-Apr-1999 (Eric Kohl <ekohl@abo.rhein-zeitung.de>)
|
* 20-Apr-1999 (Eric Kohl <ekohl@abo.rhein-zeitung.de>)
|
||||||
* Some minor changes and improvements.
|
* Some minor changes and improvements.
|
||||||
|
*
|
||||||
|
|
||||||
|
* 10-Jul-2004 (Jens Collin <jens.collin@lakhei.com>)
|
||||||
|
* Fixed searxhing for files with specific extensions in PATHEXT order..
|
||||||
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "config.h"
|
#include "config.h"
|
||||||
|
@ -82,29 +87,23 @@
|
||||||
#define ENV_BUFFER_SIZE 1024
|
#define ENV_BUFFER_SIZE 1024
|
||||||
|
|
||||||
|
|
||||||
static LPTSTR ext[] = {_T(".bat"), _T(".cmd"), _T(".com"), _T(".exe")};
|
|
||||||
static INT nExtCount = sizeof(ext) / sizeof(LPTSTR);
|
|
||||||
|
|
||||||
|
|
||||||
/* searches for file using path info. */
|
/* searches for file using path info. */
|
||||||
|
|
||||||
BOOL
|
BOOL
|
||||||
SearchForExecutable (LPCTSTR pFileName, LPTSTR pFullName)
|
SearchForExecutableSingle (LPCTSTR pFileName, LPTSTR pFullName, LPTSTR pExtension)
|
||||||
{
|
{
|
||||||
TCHAR szPathBuffer[MAX_PATH];
|
TCHAR szPathBuffer[MAX_PATH];
|
||||||
LPTSTR pszBuffer = NULL;
|
LPTSTR pszBuffer = NULL;
|
||||||
DWORD dwBuffer, len;
|
DWORD dwBuffer, len;
|
||||||
INT n;
|
LPTSTR s,f;
|
||||||
LPTSTR p,s,f;
|
// initialize full name buffer
|
||||||
|
|
||||||
|
|
||||||
/* initialize full name buffer */
|
|
||||||
*pFullName = _T('\0');
|
*pFullName = _T('\0');
|
||||||
|
|
||||||
#ifdef _DEBUG
|
#ifdef _DEBUG
|
||||||
DebugPrintf (_T("SearchForExecutable: \'%s\'\n"), pFileName);
|
DebugPrintf (_T("SearchForExecutableSingle: \'%s\' with ext: \'%s\'\n"), pFileName, pExtension);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
// Check if valid directly on specified path
|
||||||
if (_tcschr (pFileName, _T('\\')) != NULL)
|
if (_tcschr (pFileName, _T('\\')) != NULL)
|
||||||
{
|
{
|
||||||
LPTSTR pFilePart;
|
LPTSTR pFilePart;
|
||||||
|
@ -120,47 +119,45 @@ SearchForExecutable (LPCTSTR pFileName, LPTSTR pFullName)
|
||||||
|
|
||||||
if(pFilePart == 0)
|
if(pFilePart == 0)
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
// Add extension and test file:
|
||||||
|
if (pExtension)
|
||||||
|
_tcscat(szPathBuffer, pExtension);
|
||||||
|
|
||||||
|
if (IsValidFileName (szPathBuffer))
|
||||||
if (_tcschr (pFilePart, _T('.')) != NULL)
|
{
|
||||||
{
|
|
||||||
#ifdef _DEBUG
|
#ifdef _DEBUG
|
||||||
DebugPrintf (_T("Filename extension!\n"));
|
DebugPrintf (_T("Found: \'%s\'\n"), szPathBuffer);
|
||||||
#endif
|
#endif
|
||||||
_tcscpy (pFullName, szPathBuffer);
|
_tcscpy (pFullName, szPathBuffer);
|
||||||
return TRUE;
|
return TRUE;
|
||||||
|
}
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
// search in current directory
|
||||||
else
|
len = GetCurrentDirectory (MAX_PATH, szPathBuffer);
|
||||||
{
|
if (szPathBuffer[len - 1] != _T('\\'))
|
||||||
|
{
|
||||||
|
szPathBuffer[len] = _T('\\');
|
||||||
|
szPathBuffer[len + 1] = _T('\0');
|
||||||
|
}
|
||||||
|
_tcscat (szPathBuffer, pFileName);
|
||||||
|
|
||||||
|
if (pExtension)
|
||||||
|
_tcscat (szPathBuffer, pExtension);
|
||||||
|
|
||||||
|
if (IsValidFileName (szPathBuffer))
|
||||||
|
{
|
||||||
#ifdef _DEBUG
|
#ifdef _DEBUG
|
||||||
DebugPrintf (_T("No filename extension!\n"));
|
DebugPrintf (_T("Found: \'%s\'\n"), szPathBuffer);
|
||||||
#endif
|
#endif
|
||||||
|
_tcscpy (pFullName, szPathBuffer);
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
p = szPathBuffer + _tcslen (szPathBuffer);
|
|
||||||
|
|
||||||
for (n = 0; n < nExtCount; n++)
|
|
||||||
{
|
|
||||||
_tcscpy (p, ext[n]);
|
|
||||||
|
|
||||||
#ifdef _DEBUG
|
// load environment varable PATH into buffer
|
||||||
DebugPrintf (_T("Testing: \'%s\'\n"), szPathBuffer);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
if (IsValidFileName (szPathBuffer))
|
|
||||||
{
|
|
||||||
#ifdef _DEBUG
|
|
||||||
DebugPrintf (_T("Found: \'%s\'\n"), szPathBuffer);
|
|
||||||
#endif
|
|
||||||
_tcscpy (pFullName, szPathBuffer);
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* load environment varable PATH into buffer */
|
|
||||||
pszBuffer = (LPTSTR)malloc (ENV_BUFFER_SIZE * sizeof(TCHAR));
|
pszBuffer = (LPTSTR)malloc (ENV_BUFFER_SIZE * sizeof(TCHAR));
|
||||||
dwBuffer = GetEnvironmentVariable (_T("PATH"), pszBuffer, ENV_BUFFER_SIZE);
|
dwBuffer = GetEnvironmentVariable (_T("PATH"), pszBuffer, ENV_BUFFER_SIZE);
|
||||||
if (dwBuffer > ENV_BUFFER_SIZE)
|
if (dwBuffer > ENV_BUFFER_SIZE)
|
||||||
|
@ -169,16 +166,26 @@ SearchForExecutable (LPCTSTR pFileName, LPTSTR pFullName)
|
||||||
GetEnvironmentVariable (_T("PATH"), pszBuffer, dwBuffer * sizeof (TCHAR));
|
GetEnvironmentVariable (_T("PATH"), pszBuffer, dwBuffer * sizeof (TCHAR));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!(p = _tcsrchr (pFileName, _T('.'))) ||
|
|
||||||
_tcschr (p + 1, _T('\\')))
|
|
||||||
{
|
|
||||||
/* There is no extension ==> test all the extensions. */
|
|
||||||
#ifdef _DEBUG
|
|
||||||
DebugPrintf (_T("No filename extension!\n"));
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* search in current directory */
|
// search in PATH
|
||||||
len = GetCurrentDirectory (MAX_PATH, szPathBuffer);
|
s = pszBuffer;
|
||||||
|
while (s && *s)
|
||||||
|
{
|
||||||
|
f = _tcschr (s, _T(';'));
|
||||||
|
|
||||||
|
if (f)
|
||||||
|
{
|
||||||
|
_tcsncpy (szPathBuffer, s, (size_t)(f-s));
|
||||||
|
szPathBuffer[f-s] = _T('\0');
|
||||||
|
s = f + 1;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
_tcscpy (szPathBuffer, s);
|
||||||
|
s = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
len = _tcslen(szPathBuffer);
|
||||||
if (szPathBuffer[len - 1] != _T('\\'))
|
if (szPathBuffer[len - 1] != _T('\\'))
|
||||||
{
|
{
|
||||||
szPathBuffer[len] = _T('\\');
|
szPathBuffer[len] = _T('\\');
|
||||||
|
@ -186,95 +193,9 @@ SearchForExecutable (LPCTSTR pFileName, LPTSTR pFullName)
|
||||||
}
|
}
|
||||||
_tcscat (szPathBuffer, pFileName);
|
_tcscat (szPathBuffer, pFileName);
|
||||||
|
|
||||||
p = szPathBuffer + _tcslen (szPathBuffer);
|
if (pExtension)
|
||||||
|
_tcscat (szPathBuffer, pExtension);
|
||||||
|
|
||||||
for (n = 0; n < nExtCount; n++)
|
|
||||||
{
|
|
||||||
_tcscpy (p, ext[n]);
|
|
||||||
|
|
||||||
#ifdef _DEBUG
|
|
||||||
DebugPrintf (_T("Testing: \'%s\'\n"), szPathBuffer);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
if (IsValidFileName (szPathBuffer))
|
|
||||||
{
|
|
||||||
#ifdef _DEBUG
|
|
||||||
DebugPrintf (_T("Found: \'%s\'\n"), szPathBuffer);
|
|
||||||
#endif
|
|
||||||
free (pszBuffer);
|
|
||||||
_tcscpy (pFullName, szPathBuffer);
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* search in PATH */
|
|
||||||
s = pszBuffer;
|
|
||||||
while (s && *s)
|
|
||||||
{
|
|
||||||
f = _tcschr (s, _T(';'));
|
|
||||||
|
|
||||||
if (f)
|
|
||||||
{
|
|
||||||
_tcsncpy (szPathBuffer, s, (size_t)(f-s));
|
|
||||||
szPathBuffer[f-s] = _T('\0');
|
|
||||||
s = f + 1;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
_tcscpy (szPathBuffer, s);
|
|
||||||
s = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
len = _tcslen(szPathBuffer);
|
|
||||||
if (szPathBuffer[len - 1] != _T('\\'))
|
|
||||||
{
|
|
||||||
szPathBuffer[len] = _T('\\');
|
|
||||||
szPathBuffer[len + 1] = _T('\0');
|
|
||||||
}
|
|
||||||
_tcscat (szPathBuffer, pFileName);
|
|
||||||
|
|
||||||
p = szPathBuffer + _tcslen (szPathBuffer);
|
|
||||||
|
|
||||||
for (n = 0; n < nExtCount; n++)
|
|
||||||
{
|
|
||||||
_tcscpy (p, ext[n]);
|
|
||||||
|
|
||||||
#ifdef _DEBUG
|
|
||||||
DebugPrintf (_T("Testing: \'%s\'\n"), szPathBuffer);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
if (IsValidFileName (szPathBuffer))
|
|
||||||
{
|
|
||||||
#ifdef _DEBUG
|
|
||||||
DebugPrintf (_T("Found: \'%s\'\n"), szPathBuffer);
|
|
||||||
#endif
|
|
||||||
free (pszBuffer);
|
|
||||||
_tcscpy (pFullName, szPathBuffer);
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
/* There is an extension and it is in the last path component, */
|
|
||||||
/* so don't test all the extensions. */
|
|
||||||
#ifdef _DEBUG
|
|
||||||
DebugPrintf (_T("Filename extension!\n"));
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* search in current directory */
|
|
||||||
len = GetCurrentDirectory (MAX_PATH, szPathBuffer);
|
|
||||||
if (szPathBuffer[len - 1] != _T('\\'))
|
|
||||||
{
|
|
||||||
szPathBuffer[len] = _T('\\');
|
|
||||||
szPathBuffer[len + 1] = _T('\0');
|
|
||||||
}
|
|
||||||
_tcscat (szPathBuffer, pFileName);
|
|
||||||
|
|
||||||
#ifdef _DEBUG
|
|
||||||
DebugPrintf (_T("Testing: \'%s\'\n"), szPathBuffer);
|
|
||||||
#endif
|
|
||||||
if (IsValidFileName (szPathBuffer))
|
if (IsValidFileName (szPathBuffer))
|
||||||
{
|
{
|
||||||
#ifdef _DEBUG
|
#ifdef _DEBUG
|
||||||
|
@ -284,50 +205,51 @@ SearchForExecutable (LPCTSTR pFileName, LPTSTR pFullName)
|
||||||
_tcscpy (pFullName, szPathBuffer);
|
_tcscpy (pFullName, szPathBuffer);
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/* search in PATH */
|
|
||||||
s = pszBuffer;
|
|
||||||
while (s && *s)
|
|
||||||
{
|
|
||||||
f = _tcschr (s, _T(';'));
|
|
||||||
|
|
||||||
if (f)
|
|
||||||
{
|
|
||||||
_tcsncpy (szPathBuffer, s, (size_t)(f-s));
|
|
||||||
szPathBuffer[f-s] = _T('\0');
|
|
||||||
s = f + 1;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
_tcscpy (szPathBuffer, s);
|
|
||||||
s = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
len = _tcslen(szPathBuffer);
|
|
||||||
if (szPathBuffer[len - 1] != _T('\\'))
|
|
||||||
{
|
|
||||||
szPathBuffer[len] = _T('\\');
|
|
||||||
szPathBuffer[len + 1] = _T('\0');
|
|
||||||
}
|
|
||||||
_tcscat (szPathBuffer, pFileName);
|
|
||||||
|
|
||||||
#ifdef _DEBUG
|
|
||||||
DebugPrintf (_T("Testing: \'%s\'\n"), szPathBuffer);
|
|
||||||
#endif
|
|
||||||
if (IsValidFileName (szPathBuffer))
|
|
||||||
{
|
|
||||||
#ifdef _DEBUG
|
|
||||||
DebugPrintf (_T("Found: \'%s\'\n"), szPathBuffer);
|
|
||||||
#endif
|
|
||||||
free (pszBuffer);
|
|
||||||
_tcscpy (pFullName, szPathBuffer);
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
free (pszBuffer);
|
free (pszBuffer);
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
BOOL
|
||||||
|
SearchForExecutable (LPCTSTR pFileName, LPTSTR pFullName)
|
||||||
|
{
|
||||||
|
LPTSTR pszBuffer = NULL;
|
||||||
|
LPTSTR pCh;
|
||||||
|
DWORD dwBuffer;
|
||||||
|
#ifdef _DEBUG
|
||||||
|
DebugPrintf (_T("SearchForExecutable: \'%s\'\n"), pFileName);
|
||||||
|
#endif
|
||||||
|
// check the filename directly
|
||||||
|
if (SearchForExecutableSingle(pFileName, pFullName, NULL))
|
||||||
|
{
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
// load environment varable PATHEXT
|
||||||
|
pszBuffer = (LPTSTR)malloc (ENV_BUFFER_SIZE * sizeof(TCHAR));
|
||||||
|
dwBuffer = GetEnvironmentVariable (_T("PATHEXT"), pszBuffer, ENV_BUFFER_SIZE);
|
||||||
|
if (dwBuffer > ENV_BUFFER_SIZE)
|
||||||
|
{
|
||||||
|
pszBuffer = (LPTSTR)realloc (pszBuffer, dwBuffer * sizeof (TCHAR));
|
||||||
|
GetEnvironmentVariable (_T("PATHEXT"), pszBuffer, dwBuffer * sizeof (TCHAR));
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef _DEBUG
|
||||||
|
DebugPrintf (_T("SearchForExecutable(): Loaded PATHEXT: %s\n"), pszBuffer);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
pCh = _tcstok(pszBuffer, ";");
|
||||||
|
while (pCh)
|
||||||
|
{
|
||||||
|
if (SearchForExecutableSingle(pFileName, pFullName, pCh))
|
||||||
|
{
|
||||||
|
free(pszBuffer);
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
pCh = _tcstok(NULL, ";");
|
||||||
|
}
|
||||||
|
|
||||||
|
free(pszBuffer);
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue