148 lines
5.2 KiB
C
148 lines
5.2 KiB
C
|
//
|
||
|
// SafeFile.h
|
||
|
//
|
||
|
// Functions to help prevent opening unsafe files.
|
||
|
//
|
||
|
// History:
|
||
|
//
|
||
|
// 2002-03-18 KenSh Created
|
||
|
//
|
||
|
// Copyright (c) 2002 Microsoft Corporation
|
||
|
//
|
||
|
|
||
|
#pragma once
|
||
|
|
||
|
|
||
|
//
|
||
|
// You can override these allocators in your stdafx.h if necessary
|
||
|
//
|
||
|
#ifndef SafeFileMalloc
|
||
|
#define SafeFileMalloc malloc
|
||
|
#endif
|
||
|
#ifndef SafeFileFree
|
||
|
#define SafeFileFree(p) ((p) ? free(p) : NULL) // allow null to avoid confusion w/ "safe" in name
|
||
|
#endif
|
||
|
|
||
|
|
||
|
//
|
||
|
// "Safe file flags", used by various public API's.
|
||
|
//
|
||
|
// Note that they don't overlap, to avoid errors where one function's
|
||
|
// flags are passed to another function by accident.
|
||
|
//
|
||
|
|
||
|
// SafeCreateFile flags
|
||
|
//
|
||
|
#define SCF_ALLOW_NETWORK_DRIVE 0x00000001 // file can be on a network drive
|
||
|
#define SCF_ALLOW_REMOVABLE_DRIVE 0x00000002 // file can be on a removable drive (incl. CD-ROM & others)
|
||
|
#define SCF_ALLOW_ALTERNATE_STREAM 0x00000004 // allow filename to refer to alternate stream such as ":foo:$DATA"
|
||
|
|
||
|
// SafePathCombine flags
|
||
|
//
|
||
|
#define SPC_FILE_MUST_EXIST 0x00000010 // return an error if path or file doesn't exist
|
||
|
#define SPC_ALLOW_ALTERNATE_STREAM 0x00000020 // allow filename to refer to alternate stream such as ":foo:$DATA"
|
||
|
|
||
|
// SafeFileCheckForReparsePoint flags
|
||
|
//
|
||
|
#define SRP_FILE_MUST_EXIST 0x00000100 // return an error if path or file doesn't exist
|
||
|
|
||
|
// SafeDeleteFolderAndContents flags
|
||
|
//
|
||
|
#define SDF_ALLOW_NETWORK_DRIVE 0x00001000 // ok to delete files on a network drive
|
||
|
#define SDF_DELETE_READONLY_FILES 0x00002000 // delete files even if read-only
|
||
|
#define SDF_CONTINUE_IF_ERROR 0x00004000 // keep deleting files even if one fails
|
||
|
|
||
|
|
||
|
//
|
||
|
// Public function declarations. See SafeFile.cpp for detailed descriptions.
|
||
|
//
|
||
|
|
||
|
BOOL WINAPI IsFullPathName
|
||
|
(
|
||
|
IN LPCTSTR pszFileName, // full or relative path to a file
|
||
|
OUT OPTIONAL BOOL* pfUNC = NULL, // TRUE path is UNC (int incl mapped drive)
|
||
|
OUT OPTIONAL BOOL* pfExtendedSyntax = NULL // TRUE if path is \\?\ syntax
|
||
|
);
|
||
|
|
||
|
HRESULT WINAPI GetReparsePointType
|
||
|
(
|
||
|
IN LPCTSTR pszFileName, // full path to folder to check
|
||
|
OUT DWORD* pdwReparsePointType // set to reparse point type, or 0 if none
|
||
|
);
|
||
|
|
||
|
HRESULT WINAPI SafeFileCheckForReparsePoint
|
||
|
(
|
||
|
IN LPCTSTR pszFileName, // full path of a file
|
||
|
IN int nFirstUntrustedOffset, // char offset of first path component to check
|
||
|
IN DWORD dwSafeFlags // zero or more SRP_* flags
|
||
|
);
|
||
|
|
||
|
HRESULT WINAPI SafePathCombine
|
||
|
(
|
||
|
OUT LPTSTR pszBuf, // buffer where combined path will be stored
|
||
|
IN int cchBuf, // size of output buffer, in TCHARs
|
||
|
IN LPCTSTR pszTrustedBasePath, // first half of path, all trusted
|
||
|
IN LPCTSTR pszUntrustedFileName, // second half of path, not trusted
|
||
|
IN DWORD dwSafeFlags // zero or more SPC_* flags
|
||
|
);
|
||
|
|
||
|
HRESULT WINAPI SafePathCombineAlloc
|
||
|
(
|
||
|
OUT LPTSTR* ppszResult, // ptr to newly alloc'd buffer stored here
|
||
|
IN LPCTSTR pszTrustedBasePath, // first half of path, all trusted
|
||
|
IN LPCTSTR pszUntrustedFileName, // second half of path, not trusted
|
||
|
IN DWORD dwSafeFlags // zero or more SPC_* flags
|
||
|
);
|
||
|
|
||
|
HRESULT WINAPI SafeCreateFile
|
||
|
(
|
||
|
OUT HANDLE* phFileResult, // receives handle to opened file, or INVALID_HANDLE_VALUE
|
||
|
IN DWORD dwSafeFlags, // zero or more SCF_* flags
|
||
|
IN LPCTSTR pszFileName, // same as CreateFile
|
||
|
IN DWORD dwDesiredAccess, // same as CreateFile
|
||
|
IN DWORD dwShareMode, // same as CreateFile
|
||
|
IN LPSECURITY_ATTRIBUTES lpSecurityAttributes, // same as CreateFile
|
||
|
IN DWORD dwCreationDisposition, // same as CreateFile
|
||
|
IN DWORD dwFlagsAndAttributes, // same as CreateFile + (SECURITY_SQOS_PRESENT|SECURITY_ANONYMOUS)
|
||
|
IN HANDLE hTemplateFile // same as CreateFile
|
||
|
);
|
||
|
|
||
|
HRESULT WINAPI SafeRemoveFileAttributes
|
||
|
(
|
||
|
IN LPCTSTR pszFileName, // full path to file whose attributes we will change
|
||
|
IN DWORD dwCurAttrib, // current attributes of the file
|
||
|
IN DWORD dwRemoveAttrib // attribute bits to remove
|
||
|
);
|
||
|
|
||
|
HRESULT WINAPI SafeDeleteFolderAndContents
|
||
|
(
|
||
|
IN LPCTSTR pszFolderToDelete, // full path of folder to delete
|
||
|
IN DWORD dwSafeFlags // zero or more SDF_* flags
|
||
|
);
|
||
|
|
||
|
|
||
|
//
|
||
|
// Limited ansi/unicode support
|
||
|
//
|
||
|
|
||
|
#ifdef UNICODE
|
||
|
#define IsFullPathNameW IsFullPathName
|
||
|
#define GetReparsePointTypeW GetReparsePointType
|
||
|
#define SafeFileCheckForReparsePointW SafeFileCheckForReparsePoint
|
||
|
#define SafePathCombineW SafePathCombine
|
||
|
#define SafePathCombineAllocW SafePathCombineAlloc
|
||
|
#define SafeCreateFileW SafeCreateFile
|
||
|
#define SafeRemoveFileAttributesW SafeRemoveFileAttributes
|
||
|
#define SafeDeleteFolderAndContentsW SafeDeleteFolderAndContents
|
||
|
#else // !UNICODE
|
||
|
#define IsFullPathNameA IsFullPathName
|
||
|
#define GetReparsePointTypeA GetReparsePointType
|
||
|
#define SafeFileCheckForReparsePointA SafeFileCheckForReparsePoint
|
||
|
#define SafePathCombineA SafePathCombine
|
||
|
#define SafePathCombineAllocA SafePathCombineAlloc
|
||
|
#define SafeCreateFileA SafeCreateFile
|
||
|
#define SafeRemoveFileAttributesA SafeRemoveFileAttributes
|
||
|
#define SafeDeleteFolderAndContentsA SafeDeleteFolderAndContents
|
||
|
#endif // !UNICODE
|
||
|
|