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.
 
 
 
 
 
 

147 lines
5.3 KiB

//
// 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