INT SheChangeDirW( register WCHAR *newdir ) { WCHAR denvname[ 4 ]; WCHAR newpath[ MAX_PATH ]; WCHAR denvvalue[ MAX_PATH ]; WCHAR c, *s; DWORD attr; GetCurrentDirectoryW( MAX_PATH, denvvalue ); c = (WCHAR)(DWORD)CharUpperW((LPTSTR)(DWORD)denvvalue[0]); denvname[0] = WCHAR_EQUAL; if (IsCharAlphaW(*newdir) && newdir[1] == WCHAR_COLON) { denvname[1] = (WCHAR)(DWORD)CharUpperW((LPTSTR)(DWORD)*newdir); newdir += 2; } else { denvname[ 1 ] = c; } denvname[ 2 ] = WCHAR_COLON; denvname[ 3 ] = WCHAR_NULL; if ((*newdir == WCHAR_BSLASH) || (*newdir == WCHAR_SLASH)) { newpath[ 0 ] = denvname[ 1 ]; newpath[ 1 ] = denvname[ 2 ]; wcscpy( &newpath[ 2 ], newdir ); } else { if (NULL != (s = SheGetEnvVarW( denvname ))) { wcscpy( newpath, s ); } else { newpath[ 0 ] = denvname[ 1 ]; newpath[ 1 ] = denvname[ 2 ]; newpath[ 2 ] = WCHAR_NULL; } s = newpath + wcslen( newpath ); *s++ = WCHAR_BSLASH; wcscpy( s, newdir ); } if (!GetFullPathNameW(newpath, MAX_PATH, denvvalue, &s )) { return( ERROR_ACCESS_DENIED ); } attr = GetFileAttributesW( denvvalue ); if (attr == -1 || !(attr & FILE_ATTRIBUTE_DIRECTORY)) { return( ERROR_ACCESS_DENIED ); } if (SheSetEnvVarW(denvname,denvvalue)) { return( ERROR_NOT_ENOUGH_MEMORY ); } SetCurrentDirectoryW( denvvalue ); // this seems wrong... SheGetDir(GD_DEFAULT, CurDrvDirW) ; wcscpy(CurDrvDirW, denvvalue); // this seems right to me. return(SUCCESS) ; }
/* * @implemented */ BOOL WINAPI IsCharAlphaA(CHAR Ch) { WCHAR WCh; MultiByteToWideChar(CP_ACP, 0, &Ch, 1, &WCh, 1); return IsCharAlphaW(WCh); }
HRESULT PathCchStripPrefixW(PWSTR pszPath, size_t cchPath) { BOOL hasPrefix; if (!pszPath) return E_INVALIDARG; if (cchPath < 4 || cchPath > PATHCCH_MAX_CCH) return E_INVALIDARG; hasPrefix = ((pszPath[0] == '\\') && (pszPath[1] == '\\') && (pszPath[2] == '?') && (pszPath[3] == '\\')) ? TRUE : FALSE; if (hasPrefix) { int rc; if (cchPath < 6) return S_FALSE; rc = (lstrlenW(&pszPath[4]) + 1); if ((rc < 0) || ((INT64)cchPath < rc)) return HRESULT_FROM_WIN32(ERROR_INSUFFICIENT_BUFFER); if (IsCharAlphaW(pszPath[4]) && (pszPath[5] == L':')) /* like C: */ { wmemmove_s(pszPath, cchPath, &pszPath[4], cchPath - 4); /* since the passed pszPath must not necessarily be null terminated * and we always have enough space after the strip we can always * ensure the null termination of the stripped result */ pszPath[cchPath - 4] = 0; return S_OK; } } return S_FALSE; }
/*********************************************************************** * IsCharAlpha (USER.433) * IsCharAlphaA (USER32.@) */ BOOL WINAPI IsCharAlphaA(CHAR x) { WCHAR wch; MultiByteToWideChar(CP_ACP, 0, &x, 1, &wch, 1); return IsCharAlphaW(wch); }