Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

189 lines
3.6 KiB

/*++
Copyright (c) 1996, 1997 Microsoft Corporation
Module Name:
filemisc.c
Abstract:
This module contains routines to perform miscellaneous file related
operations in the protected store.
Author:
Scott Field (sfield) 27-Nov-96
--*/
#include <windows.h>
#include <sha.h>
#include "filemisc.h"
#include "unicode5.h"
#include "debug.h"
BOOL
GetFileNameFromPath(
IN LPCWSTR FullPath,
IN OUT LPCWSTR *FileName // points to filename component in FullPath
)
{
DWORD cch = lstrlenW(FullPath);
*FileName = FullPath;
while( cch ) {
if( FullPath[cch] == L'\\' ||
FullPath[cch] == L'/' ||
(cch == 1 && FullPath[1] == L':') ) {
*FileName = &FullPath[cch+1];
break;
}
cch--;
}
return TRUE;
}
BOOL
GetFileNameFromPathA(
IN LPCSTR FullPath,
IN OUT LPCSTR *FileName // points to filename component in FullPath
)
{
DWORD cch = lstrlenA(FullPath);
*FileName = FullPath;
while( cch ) {
if( FullPath[cch] == '\\' ||
FullPath[cch] == '/' ||
(cch == 1 && FullPath[1] == ':') ) {
*FileName = &FullPath[cch+1];
break;
}
cch--;
}
return TRUE;
}
BOOL
TranslateFromSlash(
IN LPWSTR szInput,
IN OUT LPWSTR *pszOutput // optional
)
{
return TranslateString(szInput, pszOutput, L'\\', L'*');
}
BOOL
TranslateToSlash(
IN LPWSTR szInput,
IN OUT LPWSTR *pszOutput // optional
)
{
return TranslateString(szInput, pszOutput, L'*', L'\\');
}
BOOL
TranslateString(
IN LPWSTR szInput,
IN OUT LPWSTR *pszOutput, // optional
IN WCHAR From,
IN WCHAR To
)
{
LPWSTR szOut;
DWORD cch = lstrlenW(szInput);
DWORD i; // scan forward for cache - locality of reference
if(pszOutput == NULL) {
//
// translate in place in existing string.
//
szOut = szInput;
} else {
DWORD cb = (cch+1) * sizeof(WCHAR);
//
// allocate new string and translate there.
//
szOut = (LPWSTR)SSAlloc( cb );
*pszOutput = szOut;
if(szOut == NULL)
return FALSE;
CopyMemory((LPBYTE)szOut, (LPBYTE)szInput, cb);
}
for(i = 0 ; i < cch ; i++) {
if( szOut[ i ] == From )
szOut[ i ] = To;
}
return TRUE;
}
BOOL
FindAndOpenFile(
IN LPCWSTR szFileName, // file to search for + open
IN LPWSTR pszFullPath, // file to fill fullpath with
IN DWORD cchFullPath, // size of full path buffer, including NULL
IN OUT PHANDLE phFile // resultant open file handle
)
/*++
This function searches the path for the specified file and if a file
is found, the file is opened for read access and a handle to the open
file is returned to the caller in the phFile parameter.
--*/
{
LPWSTR szPart;
*phFile = INVALID_HANDLE_VALUE;
if(SearchPathW(
NULL,
szFileName,
NULL,
cchFullPath,
pszFullPath,
&szPart
) == 0)
{
return FALSE;
}
*phFile = CreateFileU(
pszFullPath,
GENERIC_READ,
FILE_SHARE_READ,
NULL,
OPEN_EXISTING,
0,
NULL
);
if(*phFile == INVALID_HANDLE_VALUE)
return FALSE;
return TRUE;
}