/* * C R T F I L E . C P P * * Wrapper for CreateFileW() such that path the "\\?\" path extension * is prefixed onto each path before a call to CreateFileW() is made. * * Copyright 1986-1997 Microsoft Corporation, All Rights Reserved */ #include "_davfs.h" //$ REVIEW: undefine the following to have DAV not prefix the paths // passed to the WIN32 file system APIs. // #define DAV_PREFIX_PATHS // //$ REVIEW: end. // Dav path prefix ----------------------------------------------------------- // DEC_CONST WCHAR gc_wszPathPrefix[] = L"\\\\?\\"; DEC_CONST WCHAR gc_wszUncPathPrefix[] = L"UNC"; // Prefixing macro ----------------------------------------------------------- // // Note that this is a macro so that the stack buffer legitmately remains // in scope for the duration of the macro's calling function // #define DavPrefix(_v) \ CStackBuffer lpPrefixed ## _v; \ { \ /* Trim off the trailing slash if need be... */ \ UINT cch = static_cast(wcslen(lp ## _v)); \ if (L'\\' == lp ## _v[cch - 1]) \ { \ /* Allow for "drive roots" */ \ if ((cch < 2) || (L':' != lp ## _v[cch - 2])) \ cch -= 1; \ } \ \ /* Adjust for UNC paths */ \ UINT cchUnc = 0; \ if ((L'\\' == *(lp ## _v) && (L'\\' == lp ## _v[1]))) \ { \ /* Skip past the first of the two slashes */ \ lp ## _v += 1; \ cch -= 1; \ cchUnc = CchConstString(gc_wszUncPathPrefix); \ } \ \ /* Prefix the path */ \ UINT cchT = cch + CchConstString(gc_wszPathPrefix) + cchUnc; \ \ if (NULL == lpPrefixed ## _v.resize(CbSizeWsz(cchT))) \ { SetLastError(ERROR_NOT_ENOUGH_MEMORY); return FALSE; } \ \ memcpy (lpPrefixed ## _v.get(), \ gc_wszPathPrefix, \ sizeof(gc_wszPathPrefix)); \ memcpy (lpPrefixed ## _v.get() + CchConstString(gc_wszPathPrefix), \ gc_wszUncPathPrefix, \ cchUnc * sizeof(WCHAR)); \ memcpy (lpPrefixed ## _v.get() + \ CchConstString(gc_wszPathPrefix) + \ cchUnc, \ lp ## _v, \ CbSizeWsz(cch)); \ \ /* Terminate the path */ \ lpPrefixed ## _v[cchT] = 0; \ } \ // DavCreateFile() ----------------------------------------------------------- // HANDLE __fastcall DavCreateFile ( /* [in] */ LPCWSTR lpFileName, /* [in] */ DWORD dwDesiredAccess, /* [in] */ DWORD dwShareMode, /* [in] */ LPSECURITY_ATTRIBUTES lpSecurityAttributes, /* [in] */ DWORD dwCreationDisposition, /* [in] */ DWORD dwFlagsAndAttributes, /* [in] */ HANDLE hTemplateFile) { #ifdef DAV_PREFIX_PATHS DavPrefix(FileName); return CreateFileW (lpPrefixedFileName.get(), dwDesiredAccess, dwShareMode, lpSecurityAttributes, dwCreationDisposition, dwFlagsAndAttributes, hTemplateFile); #else return CreateFileW (lpFileName, dwDesiredAccess, dwShareMode, lpSecurityAttributes, dwCreationDisposition, dwFlagsAndAttributes, hTemplateFile); #endif // DAV_PREFIX_PATHS } // DavDeleteFile() ----------------------------------------------------------- // BOOL __fastcall DavDeleteFile ( /* [in] */ LPCWSTR lpFileName) { #ifdef DAV_PREFIX_PATHS DavPrefix(FileName); return DeleteFileW (lpPrefixedFileName.get()); #else return DeleteFileW (lpFileName); #endif // DAV_PREFIX_PATHS } // DavCopyFile() ------------------------------------------------------------- // BOOL __fastcall DavCopyFile ( /* [in] */ LPCWSTR lpExistingFileName, /* [in] */ LPCWSTR lpNewFileName, /* [in] */ BOOL bFailIfExists) { #ifdef DAV_PREFIX_PATHS DavPrefix(NewFileName); DavPrefix(ExistingFileName); return CopyFileW (lpPrefixedExistingFileName.get(), lpPrefixedNewFileName.get(), bFailIfExists); #else return CopyFileW (lpExistingFileName, lpNewFileName, bFailIfExists); #endif // DAV_PREFIX_PATHS } // DavMoveFile() ------------------------------------------------------------- // BOOL __fastcall DavMoveFile ( /* [in] */ LPCWSTR lpExistingFileName, /* [in] */ LPCWSTR lpNewFileName, /* [in] */ DWORD dwReplace) { #ifdef DAV_PREFIX_PATHS DavPrefix(NewFileName); DavPrefix(ExistingFileName); return MoveFileExW (lpPrefixedExistingFileName.get(), lpPrefixedNewFileName.get(), dwReplace); #else return MoveFileExW (lpExistingFileName, lpNewFileName, dwReplace); #endif // DAV_PREFIX_PATHS } // DavCreateDirectory() ------------------------------------------------------ // BOOL __fastcall DavCreateDirectory ( /* [in] */ LPCWSTR lpFileName, /* [in] */ LPSECURITY_ATTRIBUTES lpSecurityAttributes) { #ifdef DAV_PREFIX_PATHS DavPrefix(FileName); return CreateDirectoryW (lpPrefixedFileName.get(), lpSecurityAttributes); #else return CreateDirectoryW (lpFileName, lpSecurityAttributes); #endif // DAV_PREFIX_PATHS } // DavRemoveDirectory() ------------------------------------------------------ // BOOL __fastcall DavRemoveDirectory ( /* [in] */ LPCWSTR lpFileName) { #ifdef DAV_PREFIX_PATHS DavPrefix(FileName) return RemoveDirectoryW (lpPrefixedFileName.get()); #else return RemoveDirectoryW (lpFileName); #endif // DAV_PREFIX_PATHS } // DavGetFileAttributes() ---------------------------------------------------- // BOOL __fastcall DavGetFileAttributes ( /* [in] */ LPCWSTR lpFileName, /* [in] */ GET_FILEEX_INFO_LEVELS fInfoLevelId, /* [out] */ LPVOID lpFileInformation) { #ifdef DAV_PREFIX_PATHS DavPrefix(FileName); return GetFileAttributesExW (lpPrefixedFileName.get(), fInfoLevelId, lpFileInformation); #else return GetFileAttributesExW (lpFileName, fInfoLevelId, lpFileInformation); #endif // DAV_PREFIX_PATHS } BOOL __fastcall DavFindFirstFile( /* [in] */ LPCWSTR lpFileName, /* [out] */ HANDLE * ph, /* [out] */ WIN32_FIND_DATAW * pfd) { HANDLE h; Assert(ph); #ifdef DAV_PREFIX_PATHS DavPrefix(FileName); h = FindFirstFileW (lpPrefixedFileName.get(), pfd); #else h = FindFirstFileW (lpFileName, pfd); #endif // DAV_PREFIX_PATHS *ph = h; return (INVALID_HANDLE_VALUE != h); }