21#define IS_VOLUME_NAME(s, l) \
22 ((l == 96 || (l == 98 && s[48] == '\\')) && \
23 s[0] == '\\'&& (s[1] == '?' || s[1] == '\\') && \
24 s[2] == '?' && s[3] == '\\' && s[4] == 'V' && \
25 s[5] == 'o' && s[6] == 'l' && s[7] == 'u' && \
26 s[8] == 'm' && s[9] == 'e' && s[10] == '{' && \
27 s[19] == '-' && s[24] == '-' && s[29] == '-' && \
28 s[34] == '-' && s[47] == '}')
49 lpSecurityAttributes);
66 if (!TemplateDirectoryW)
78 lpSecurityAttributes);
97 PWSTR PathUBuffer, FilePart;
113 lpPathName[1] !=
L'\\' && lpPathName[2] !=
L'?' && lpPathName[3] !=
L'\\')
138 PathUBuffer = NtPathU.
Buffer;
156 (lpSecurityAttributes ? lpSecurityAttributes->lpSecurityDescriptor :
NULL));
212 PWSTR TemplateBuffer, PathUBuffer, FilePart, SubstituteName;
222 TemplateBuffer = NtTemplatePathU.
Buffer;
254 RtlFreeHeap(RtlGetProcessHeap(), 0, TemplateBuffer);
259OpenWithoutReparseSupport:
271 RtlFreeHeap(RtlGetProcessHeap(), 0, TemplateBuffer);
281 sizeof(FileBasicInfo),
286 RtlFreeHeap(RtlGetProcessHeap(), 0, TemplateBuffer);
300 sizeof(FileBasicInfo),
305 RtlFreeHeap(RtlGetProcessHeap(), 0, TemplateBuffer);
323 RtlFreeHeap(RtlGetProcessHeap(), 0, TemplateBuffer);
333 goto OpenWithoutReparseSupport;
345 RtlFreeHeap(RtlGetProcessHeap(), 0, TemplateBuffer);
352 PathUBuffer = NtPathU.
Buffer;
361 RtlFreeHeap(RtlGetProcessHeap(), 0, TemplateBuffer);
369 RtlFreeHeap(RtlGetProcessHeap(), 0, TemplateBuffer);
375 lpNewDirectory[1] !=
L'\\' && lpNewDirectory[2] !=
L'?' && lpNewDirectory[3] !=
L'\\')
429 if (FileEaInfo.
EaSize != 0)
474 (lpSecurityAttributes ? lpSecurityAttributes->lpSecurityDescriptor :
NULL));
554 if (!ReparseDataBuffer)
575 RtlFreeHeap(RtlGetProcessHeap(), 0, ReparseDataBuffer);
585 RtlFreeHeap(RtlGetProcessHeap(), 0, ReparseDataBuffer);
603 RtlFreeHeap(RtlGetProcessHeap(), 0, ReparseDataBuffer);
620 RtlFreeHeap(RtlGetProcessHeap(), 0, ReparseDataBuffer);
639 RtlFreeHeap(RtlGetProcessHeap(), 0, ReparseDataBuffer);
654 for (StreamSize = 0x1000; ; StreamSize = StreamSize * 2)
675 RtlFreeHeap(RtlGetProcessHeap(), 0, FileStreamInfo);
676 FileStreamInfo =
NULL;
690 RtlFreeHeap(RtlGetProcessHeap(), 0, FileStreamInfo);
700 DPRINT1(
"Warning: streams copying is unimplemented!\n");
701 RtlFreeHeap(RtlGetProcessHeap(), 0, FileStreamInfo);
740 PWSTR PathUBuffer, SubstituteName;
754 PathUBuffer = NtPathU.
Buffer;
804 goto MarkFileForDelete;
823 goto MarkFileForDelete;
829 goto MarkFileForDelete;
849 goto MarkFileForDelete;
869 goto MarkFileForDelete;
878 if (!ReparseDataBuffer)
896 RtlFreeHeap(RtlGetProcessHeap(), 0, ReparseDataBuffer);
897 goto MarkFileForDelete;
906 RtlFreeHeap(RtlGetProcessHeap(), 0, ReparseDataBuffer);
907 goto MarkFileForDelete;
916 RtlFreeHeap(RtlGetProcessHeap(), 0, ReparseDataBuffer);
932 RtlFreeHeap(RtlGetProcessHeap(), 0, ReparseDataBuffer);
static HANDLE DirectoryHandle
#define FILE_DIRECTORY_FILE
PVOID NTAPI RtlAllocateHeap(IN PVOID HeapHandle, IN ULONG Flags, IN SIZE_T Size)
BOOLEAN NTAPI RtlFreeHeap(IN PVOID HeapHandle, IN ULONG Flags, IN PVOID HeapBase)
IN PUNICODE_STRING IN POBJECT_ATTRIBUTES ObjectAttributes
#define STATUS_NOT_IMPLEMENTED
#define ERROR_NOT_ENOUGH_MEMORY
BOOL WINAPI DeviceIoControl(IN HANDLE hDevice, IN DWORD dwIoControlCode, IN LPVOID lpInBuffer OPTIONAL, IN DWORD nInBufferSize OPTIONAL, OUT LPVOID lpOutBuffer OPTIONAL, IN DWORD nOutBufferSize OPTIONAL, OUT LPDWORD lpBytesReturned OPTIONAL, IN LPOVERLAPPED lpOverlapped OPTIONAL)
#define NT_SUCCESS(StatCode)
#define FILE_ATTRIBUTE_NORMAL
#define ERROR_INVALID_NAME
#define IS_VOLUME_NAME(s, l)
BOOL WINAPI RemoveDirectoryA(IN LPCSTR lpPathName)
BOOL WINAPI CreateDirectoryExW(IN LPCWSTR lpTemplateDirectory, IN LPCWSTR lpNewDirectory, IN LPSECURITY_ATTRIBUTES lpSecurityAttributes)
BOOL WINAPI CreateDirectoryW(IN LPCWSTR lpPathName, IN LPSECURITY_ATTRIBUTES lpSecurityAttributes)
BOOL WINAPI CreateDirectoryExA(IN LPCSTR lpTemplateDirectory, IN LPCSTR lpNewDirectory, IN LPSECURITY_ATTRIBUTES lpSecurityAttributes)
BOOL WINAPI RemoveDirectoryW(IN LPCWSTR lpPathName)
BOOL WINAPI CreateDirectoryA(IN LPCSTR lpPathName, IN LPSECURITY_ATTRIBUTES lpSecurityAttributes)
DWORD WINAPI GetFullPathNameW(IN LPCWSTR lpFileName, IN DWORD nBufferLength, OUT LPWSTR lpBuffer, OUT LPWSTR *lpFilePart)
BOOLEAN WINAPI Basep8BitStringToDynamicUnicodeString(OUT PUNICODE_STRING UnicodeString, IN LPCSTR String)
VOID WINAPI BaseMarkFileForDelete(IN HANDLE FileHandle, IN ULONG FileAttributes)
PUNICODE_STRING WINAPI Basep8BitStringToStaticUnicodeString(IN LPCSTR String)
static const WCHAR Cleanup[]
IN PVCB IN PDIRENT OUT PULONG EaLength
@ FileAttributeTagInformation
@ FileDispositionInformation
#define FILE_OPEN_REPARSE_POINT
#define FILE_SYNCHRONOUS_IO_NONALERT
#define FILE_OPEN_FOR_BACKUP_INTENT
#define OBJ_CASE_INSENSITIVE
NTSTATUS NTAPI NtQueryEaFile(IN HANDLE FileHandle, OUT PIO_STATUS_BLOCK IoStatusBlock, OUT PVOID Buffer, IN ULONG Length, IN BOOLEAN ReturnSingleEntry, IN PVOID EaList OPTIONAL, IN ULONG EaListLength, IN PULONG EaIndex OPTIONAL, IN BOOLEAN RestartScan)
BOOL WINAPI SetVolumeMountPointW(IN LPCWSTR lpszVolumeMountPoint, IN LPCWSTR lpszVolumeName)
BOOL WINAPI DeleteVolumeMountPointW(IN LPCWSTR lpszVolumeMountPoint)
static OUT PIO_STATUS_BLOCK IoStatusBlock
#define InitializeObjectAttributes(p, n, a, r, s)
NTSYSAPI ULONG NTAPI RtlIsDosDeviceName_U(_In_ PCWSTR Name)
VOID NTAPI RtlReleaseRelativeName(_In_ PRTL_RELATIVE_NAME_U RelativeName)
NTSYSAPI BOOLEAN NTAPI RtlDosPathNameToRelativeNtPathName_U(_In_ PCWSTR DosName, _Out_ PUNICODE_STRING NtName, _Out_ PCWSTR *PartName, _Out_ PRTL_RELATIVE_NAME_U RelativeName)
NTSYSAPI NTSTATUS NTAPI NtOpenFile(OUT PHANDLE phFile, IN ACCESS_MASK DesiredAccess, IN POBJECT_ATTRIBUTES ObjectAttributes, OUT PIO_STATUS_BLOCK pIoStatusBlock, IN ULONG ShareMode, IN ULONG OpenMode)
#define FILE_ATTRIBUTE_VALID_FLAGS
#define FILE_READ_ATTRIBUTES
#define FILE_LIST_DIRECTORY
NTSYSAPI VOID NTAPI RtlInitUnicodeString(PUNICODE_STRING DestinationString, PCWSTR SourceString)
NTSYSAPI BOOLEAN NTAPI RtlEqualUnicodeString(PUNICODE_STRING String1, PUNICODE_STRING String2, BOOLEAN CaseInSensitive)
NTSYSAPI NTSTATUS NTAPI NtSetInformationFile(IN HANDLE hFile, OUT PIO_STATUS_BLOCK pIoStatusBlock, IN PVOID FileInformationBuffer, IN ULONG FileInformationBufferLength, IN FILE_INFORMATION_CLASS FileInfoClass)
NTSYSAPI NTSTATUS NTAPI NtQueryInformationFile(IN HANDLE hFile, OUT PIO_STATUS_BLOCK pIoStatusBlock, OUT PVOID FileInformationBuffer, IN ULONG FileInformationBufferLength, IN FILE_INFORMATION_CLASS FileInfoClass)
#define FILE_SHARE_DELETE
#define FILE_WRITE_ATTRIBUTES
NTSTATUS NTAPI NtClose(IN HANDLE Handle)
NTSYSAPI VOID NTAPI RtlFreeUnicodeString(PUNICODE_STRING UnicodeString)
NTSTATUS NTAPI NtCreateFile(OUT PHANDLE FileHandle, IN ACCESS_MASK DesiredAccess, IN POBJECT_ATTRIBUTES ObjectAttributes, OUT PIO_STATUS_BLOCK IoStatusBlock, IN PLARGE_INTEGER AllocationSize OPTIONAL, IN ULONG FileAttributes, IN ULONG ShareAccess, IN ULONG CreateDisposition, IN ULONG CreateOptions, IN PVOID EaBuffer OPTIONAL, IN ULONG EaLength)
NTSYSAPI NTSTATUS NTAPI NtFsControlFile(IN HANDLE hFile, IN HANDLE hEvent OPTIONAL, IN PIO_APC_ROUTINE IoApcRoutine OPTIONAL, IN PVOID IoApcContext OPTIONAL, OUT PIO_STATUS_BLOCK pIoStatusBlock, IN ULONG DeviceIoControlCode, IN PVOID InBuffer OPTIONAL, IN ULONG InBufferLength, OUT PVOID OutBuffer OPTIONAL, IN ULONG OutBufferLength)
_In_ ULONG _In_ ULONG _In_ ULONG Length
#define FILE_ATTRIBUTE_REPARSE_POINT
#define STATUS_IO_REPARSE_TAG_NOT_HANDLED
#define FSCTL_GET_REPARSE_POINT
#define FSCTL_SET_REPARSE_POINT
DWORD BaseSetLastNTError(IN NTSTATUS Status)
#define STATUS_BUFFER_TOO_SMALL
#define STATUS_BUFFER_OVERFLOW
struct _REPARSE_DATA_BUFFER::@334::@337 MountPointReparseBuffer
UNICODE_STRING RelativeName
HANDLE ContainingDirectory
#define FIELD_OFFSET(t, f)
#define RtlCopyMemory(Destination, Source, Length)
#define STATUS_NOT_A_DIRECTORY
#define STATUS_ACCESS_DENIED
#define STATUS_INVALID_PARAMETER
#define STATUS_OBJECT_NAME_INVALID
_Must_inspect_result_ _In_ WDFIOTARGET _In_opt_ WDFREQUEST _In_ ULONG _In_opt_ PWDF_MEMORY_DESCRIPTOR _In_opt_ PWDF_MEMORY_DESCRIPTOR _In_opt_ PWDF_REQUEST_SEND_OPTIONS _Out_opt_ PULONG_PTR BytesReturned
#define ERROR_PATH_NOT_FOUND
#define ERROR_FILENAME_EXCED_RANGE
_In_ ACCESS_MASK _In_ POBJECT_ATTRIBUTES _Out_ PIO_STATUS_BLOCK _In_opt_ PLARGE_INTEGER _In_ ULONG _In_ ULONG _In_ ULONG _In_ ULONG _In_opt_ PVOID EaBuffer
#define MAXIMUM_REPARSE_DATA_BUFFER_SIZE
#define IO_REPARSE_TAG_MOUNT_POINT
#define FAILED_ACCESS_ACE_FLAG