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);
65 PWSTR PathUBuffer, FilePart;
81 lpPathName[1] !=
L'\\' && lpPathName[2] !=
L'?' && lpPathName[3] !=
L'\\')
106 PathUBuffer = NtPathU.
Buffer;
124 (lpSecurityAttributes ? lpSecurityAttributes->lpSecurityDescriptor :
NULL));
180 PWSTR TemplateBuffer, PathUBuffer, FilePart, SubstituteName;
190 TemplateBuffer = NtTemplatePathU.
Buffer;
222 RtlFreeHeap(RtlGetProcessHeap(), 0, TemplateBuffer);
227OpenWithoutReparseSupport:
239 RtlFreeHeap(RtlGetProcessHeap(), 0, TemplateBuffer);
254 RtlFreeHeap(RtlGetProcessHeap(), 0, TemplateBuffer);
273 RtlFreeHeap(RtlGetProcessHeap(), 0, TemplateBuffer);
291 RtlFreeHeap(RtlGetProcessHeap(), 0, TemplateBuffer);
301 goto OpenWithoutReparseSupport;
313 RtlFreeHeap(RtlGetProcessHeap(), 0, TemplateBuffer);
320 PathUBuffer = NtPathU.
Buffer;
329 RtlFreeHeap(RtlGetProcessHeap(), 0, TemplateBuffer);
337 RtlFreeHeap(RtlGetProcessHeap(), 0, TemplateBuffer);
343 lpNewDirectory[1] !=
L'\\' && lpNewDirectory[2] !=
L'?' && lpNewDirectory[3] !=
L'\\')
397 if (FileEaInfo.
EaSize != 0)
442 (lpSecurityAttributes ? lpSecurityAttributes->lpSecurityDescriptor :
NULL));
522 if (!ReparseDataBuffer)
543 RtlFreeHeap(RtlGetProcessHeap(), 0, ReparseDataBuffer);
553 RtlFreeHeap(RtlGetProcessHeap(), 0, ReparseDataBuffer);
571 RtlFreeHeap(RtlGetProcessHeap(), 0, ReparseDataBuffer);
588 RtlFreeHeap(RtlGetProcessHeap(), 0, ReparseDataBuffer);
607 RtlFreeHeap(RtlGetProcessHeap(), 0, ReparseDataBuffer);
622 for (StreamSize = 0x1000; ; StreamSize = StreamSize * 2)
668 DPRINT1(
"Warning: streams copying is unimplemented!\n");
708 PWSTR PathUBuffer, SubstituteName;
722 PathUBuffer = NtPathU.
Buffer;
772 goto MarkFileForDelete;
791 goto MarkFileForDelete;
797 goto MarkFileForDelete;
817 goto MarkFileForDelete;
837 goto MarkFileForDelete;
846 if (!ReparseDataBuffer)
864 RtlFreeHeap(RtlGetProcessHeap(), 0, ReparseDataBuffer);
865 goto MarkFileForDelete;
874 RtlFreeHeap(RtlGetProcessHeap(), 0, ReparseDataBuffer);
875 goto MarkFileForDelete;
884 RtlFreeHeap(RtlGetProcessHeap(), 0, ReparseDataBuffer);
900 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 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)
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)
#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)
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
static OUT PIO_STATUS_BLOCK IoStatusBlock
#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::@298::@301 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