46 #define STRING_LENGTH 0x400 51 PWSTR PendingOperations, BufferWrite;
55 WCHAR PendingOperationsBuffer[
sizeof(
L"PendingFileRenameOperations") /
sizeof(
WCHAR) + 6];
57 RtlInitUnicodeString(&SessionManagerString,
L"\\Registry\\Machine\\System\\CurrentControlSet\\Control\\Session Manager");
62 PendingOperations =
L"PendingFileRenameOperations";
66 StringCbPrintfW(PendingOperationsBuffer,
sizeof(PendingOperationsBuffer),
L"PendingFileRenameOperations%d", KeyId);
67 PendingOperations = PendingOperationsBuffer;
72 &SessionManagerString,
108 &PendingOperationsString,
149 BufferBegin = PartialInfo->
Data;
154 RtlCopyMemory(BufferWrite, ExistingPath->Buffer, ExistingPath->Length);
155 BufferWrite += ExistingPath->Length /
sizeof(
WCHAR);
160 RtlCopyMemory(BufferWrite, NewPath->Buffer, NewPath->Length);
161 BufferWrite += NewPath->Length /
sizeof(
WCHAR);
169 &PendingOperationsString,
192 PWSTR AbsolutePath, EndOfName;
193 USHORT AbsolutePathLength, NameLength;
199 DPRINT(
"BasepGetComputerNameFromNtPath(%wZ, %p, %p, %lu)\n", NewPath, NewHandle, ComputerName, ComputerNameLength);
205 if (NewPath->Length <= UncString.
Length)
211 AbsolutePath = &NewPath->Buffer[UncString.
Length /
sizeof(
WCHAR)];
212 AbsolutePathLength = NewPath->Length - UncString.
Length;
222 Letter = NewPath->Buffer[4];
250 AbsolutePath =
Path + 1;
292 AbsolutePathLength = 0;
296 EndOfName = AbsolutePath;
297 if (AbsolutePathLength)
299 for (NameLength = 0; NameLength < AbsolutePathLength; NameLength +=
sizeof(
WCHAR))
302 if (EndOfName[0] ==
'\\')
307 else if (EndOfName[0] ==
'.')
316 NameLength = EndOfName - AbsolutePath;
331 *ComputerNameLength = NameLength /
sizeof(
WCHAR);
352 CHAR ComputerNameStringBuffer[0x105];
363 DPRINT(
"BasepNotifyTrackingService(%p, %p, %p, %wZ)\n", *ExistingHandle,
ObjectAttributes, NewHandle, NewPath);
366 ComputerNameLength =
ARRAYSIZE(ComputerName);
372 FileTrackingInfo.ObjectInformationLength = 0;
377 ComputerNameStringA.Length = 0;
378 ComputerNameStringA.MaximumLength =
ARRAYSIZE(ComputerNameStringBuffer);
379 ComputerNameStringA.Buffer = ComputerNameStringBuffer;
388 RtlCopyMemory(FileTrackingInfo.ObjectInformation, ComputerNameStringA.Buffer, ComputerNameStringA.Length);
389 FileTrackingInfo.ObjectInformation[ComputerNameStringA.Length] = 0;
390 FileTrackingInfo.ObjectInformationLength = ComputerNameStringA.Length + 1;
394 FileTrackingInfo.DestinationFile = NewHandle;
400 sizeof(FileTrackingInfo),
430 sizeof(FileBasicInfo),
446 sizeof(FileBasicInfo),
463 *ExistingHandle = hFullWrite;
469 sizeof(FileTrackingInfo),
481 sizeof(FileBasicInfo),
508 ULONG IntShareAccess;
514 RelativeNtName->Length =
515 RelativeNtName->MaximumLength = 0;
516 RelativeNtName->Buffer =
NULL;
526 *NtName = RelativeNtName->Buffer;
636 if (!dwCallbackReason)
638 if (StreamBytesTransferred.QuadPart == StreamSize.QuadPart)
647 Ret =
Context->UserRoutine(TotalFileSize,
648 TotalBytesTransferred,
650 StreamBytesTransferred,
682 BOOL Ret =
FALSE, ReplaceIfExists, DelayUntilReboot, AttemptReopenWithoutReparse;
684 DPRINT(
"MoveFileWithProgressW(%S, %S, %p, %p, %x)\n", lpExistingFileName, lpNewFileName, lpProgressRoutine, lpData,
dwFlags);
716 AttemptReopenWithoutReparse =
TRUE;
732 if (DelayUntilReboot &&
739 AttemptReopenWithoutReparse =
FALSE;
766 AttemptReopenWithoutReparse =
FALSE;
778 AttemptReopenWithoutReparse =
FALSE;
783 if (AttemptReopenWithoutReparse)
799 if (DelayUntilReboot && !lpNewFileName)
811 if (DelayUntilReboot)
814 if (ReplaceIfExists && NewPathU.
Length)
817 if (NewBuffer ==
NULL)
828 NewPathU.
Buffer = NewBuffer;
869 if (RenameInfo ==
NULL)
903 DPRINT1(
"Forcing copy, renaming not supported by FSD\n");
1117 UNICODE_STRING ReplacedFileNameW, ReplacementFileNameW, BackupFileNameW;
1119 if (!lpReplacedFileName || !lpReplacementFileName || lpExclude || lpReserved || dwReplaceFlags & ~(REPLACEFILE_WRITE_THROUGH | REPLACEFILE_IGNORE_MERGE_ERRORS))
1136 if (lpBackupFileName)
1152 if (lpBackupFileName)
1169 LPCWSTR lpReplacementFileName,
1171 DWORD dwReplaceFlags,
1187 FIXME(
"Ignoring flags %x\n", dwReplaceFlags);
1190 if (!lpReplacedFileName || !lpReplacementFileName)
1197 if(lpBackupFileName)
1297 if (hReplaced)
NtClose(hReplaced);
1298 if (hReplacement)
NtClose(hReplacement);
1301 if (NtReplacementName.
Buffer)
1303 if (NtReplacedName.
Buffer)
1309 TRACE(
"ReplaceFileW failed (error=%lu)\n",
Error);
1325 LPWSTR RelativeSource, RelativeDestination;
1334 DPRINT(
"PrivMoveFileIdentityW(%S, %S, %x)\n", lpSource, lpDestination,
dwFlags);
1340 RelativeSource =
NULL;
1345 RelativeDestination =
NULL;
1368 &ObjectAttributesSource,
1387 RtlFreeHeap(RtlGetProcessHeap(), 0, RelativeSource);
1388 RelativeSource =
NULL;
1420 &RelativeDestination,
1422 &ObjectAttributesDestination,
1439 if (RelativeDestination)
1441 RtlFreeHeap(RtlGetProcessHeap(), 0, RelativeDestination);
1442 RelativeDestination =
NULL;
1464 sizeof(SourceInformation),
1469 RtlZeroMemory(&DestinationInformation,
sizeof(DestinationInformation));
1475 &DestinationInformation,
1476 sizeof(DestinationInformation),
1500 &ObjectAttributesSource,
1519 RtlFreeHeap(RtlGetProcessHeap(), 0, RelativeSource);
1521 if (RelativeDestination)
1522 RtlFreeHeap(RtlGetProcessHeap(), 0, RelativeDestination);
1533 &FileDispositionInfo,
1534 sizeof(FileDispositionInfo),
BOOL WINAPI SetFileAttributesW(LPCWSTR lpFileName, DWORD dwFileAttributes)
#define STATUS_OBJECT_NAME_COLLISION
#define ERROR_INVALID_PARAMETER
IN PUNICODE_STRING IN POBJECT_ATTRIBUTES ObjectAttributes
LPPROGRESS_ROUTINE UserRoutine
#define MOVEFILE_CREATE_HARDLINK
BOOL WINAPI MoveFileExA(IN LPCSTR lpExistingFileName, IN LPCSTR lpNewFileName OPTIONAL, IN DWORD dwFlags)
struct _COPY_PROGRESS_CONTEXT * PCOPY_PROGRESS_CONTEXT
_Must_inspect_result_ _In_ WDFDEVICE _In_ DEVICE_REGISTRY_PROPERTY _In_ ULONG BufferLength
_Must_inspect_result_ _In_ WDFDEVICE _In_ ULONG _In_ ACCESS_MASK DesiredAccess
#define STATUS_INSUFFICIENT_RESOURCES
NTSTATUS NTAPI NtSetInformationFile(HANDLE hFile, PIO_STATUS_BLOCK io, PVOID ptr, ULONG len, FILE_INFORMATION_CLASS FileInformationClass)
NTSTATUS NTAPI NtCreateKey(OUT PHANDLE KeyHandle, IN ACCESS_MASK DesiredAccess, IN POBJECT_ATTRIBUTES ObjectAttributes, IN ULONG TitleIndex, IN PUNICODE_STRING Class OPTIONAL, IN ULONG CreateOptions, OUT PULONG Disposition OPTIONAL)
BOOL WINAPI MoveFileWithProgressA(IN LPCSTR lpExistingFileName, IN LPCSTR lpNewFileName OPTIONAL, IN LPPROGRESS_ROUTINE lpProgressRoutine OPTIONAL, IN LPVOID lpData OPTIONAL, IN DWORD dwFlags)
#define STATUS_NOT_SAME_DEVICE
#define OBJ_CASE_INSENSITIVE
_Must_inspect_result_ _Out_ PNDIS_STATUS _Out_ PNDIS_STATUS _Out_ PNDIS_HANDLE _Out_ PUINT _In_ UINT _In_ NDIS_HANDLE _In_ NDIS_HANDLE _In_ PNDIS_STRING _In_ UINT OpenOptions
_Must_inspect_result_ _Out_ PNDIS_STATUS _In_ NDIS_HANDLE _In_ ULONG _Out_ PNDIS_STRING _Out_ PNDIS_HANDLE KeyHandle
_Must_inspect_result_ __drv_aliasesMem PDEVICE_OBJECT _In_ PDEVICE_OBJECT TargetDevice
#define MOVEFILE_REPLACE_EXISTING
IN BOOLEAN OUT PSTR Buffer
#define STATUS_INVALID_PARAMETER
#define ERROR_BUFFER_OVERFLOW
_CONST_RETURN wchar_t *__cdecl wcsstr(_In_z_ const wchar_t *_Str, _In_z_ const wchar_t *_SubStr)
#define MOVEFILE_COPY_ALLOWED
HANDLE ContainingDirectory
BOOL WINAPI SetEndOfFile(HANDLE hFile)
VOID NTAPI RtlReleaseRelativeName(_In_ PRTL_RELATIVE_NAME_U RelativeName)
BOOLEAN NTAPI RtlFreeHeap(IN PVOID HeapHandle, IN ULONG Flags, IN PVOID HeapBase)
#define FILE_OPEN_NO_RECALL
DEBUG_CHANNEL(kernel32file)
BOOL WINAPI MoveFileA(IN LPCSTR lpExistingFileName, IN LPCSTR lpNewFileName)
#define ERROR_NOT_ENOUGH_MEMORY
#define INVALID_HANDLE_VALUE
DWORD WINAPI GetLastError(VOID)
struct _COPY_PROGRESS_CONTEXT COPY_PROGRESS_CONTEXT
BOOL WINAPI GetComputerNameW(LPWSTR lpBuffer, LPDWORD lpnSize)
_In_ PIO_STACK_LOCATION _Inout_ PFILE_OBJECT _Inout_ PVCB _Outptr_result_maybenull_ PDCB _In_ PDCB _In_ PDIRENT _In_ ULONG _In_ ULONG _In_ PUNICODE_STRING _In_ PACCESS_MASK _In_ USHORT ShareAccess
#define FILE_WRITE_ATTRIBUTES
#define STATUS_BUFFER_TOO_SMALL
NTSYSAPI BOOLEAN NTAPI RtlDosPathNameToRelativeNtPathName_U(_In_ PCWSTR DosName, _Out_ PUNICODE_STRING NtName, _Out_ PCWSTR *PartName, _Out_ PRTL_RELATIVE_NAME_U RelativeName)
#define STATUS_END_OF_FILE
#define IO_REPARSE_TAG_MOUNT_POINT
return STATUS_NOT_IMPLEMENTED
_Must_inspect_result_ _In_ PWDFDEVICE_INIT _In_opt_ PCUNICODE_STRING DeviceName
NTSYSAPI ULONG WINAPI RtlNtStatusToDosError(NTSTATUS)
BOOLEAN WINAPI Basep8BitStringToDynamicUnicodeString(OUT PUNICODE_STRING UnicodeString, IN LPCSTR String)
#define STATUS_SHARING_VIOLATION
#define MOVEFILE_WRITE_THROUGH
#define PRIV_ALLOW_NON_TRACKABLE
NTSTATUS WINAPI BasepNotifyTrackingService(IN OUT PHANDLE ExistingHandle, IN POBJECT_ATTRIBUTES ObjectAttributes, IN HANDLE NewHandle, IN PUNICODE_STRING NewPath)
BOOL WINAPI MoveFileW(IN LPCWSTR lpExistingFileName, IN LPCWSTR lpNewFileName)
BOOL WINAPI ReplaceFileW(LPCWSTR lpReplacedFileName, LPCWSTR lpReplacementFileName, LPCWSTR lpBackupFileName, DWORD dwReplaceFlags, LPVOID lpExclude, LPVOID lpReserved)
BOOL WINAPI DeleteFileW(IN LPCWSTR lpFileName)
BOOL WINAPI ReplaceFileA(IN LPCSTR lpReplacedFileName, IN LPCSTR lpReplacementFileName, IN LPCSTR lpBackupFileName OPTIONAL, IN DWORD dwReplaceFlags, IN LPVOID lpExclude, IN LPVOID lpReserved)
#define COPY_FILE_OPEN_SOURCE_FOR_WRITE
#define FILE_WRITE_THROUGH
STRSAFEAPI StringCbPrintfW(STRSAFE_LPWSTR pszDest, size_t cbDest, STRSAFE_LPCWSTR pszFormat,...)
DWORD WINAPI QueryDosDeviceW(LPCWSTR lpDeviceName, LPWSTR lpTargetPath, DWORD ucchMax)
#define MOVEFILE_DELAY_UNTIL_REBOOT
DWORD BaseSetLastNTError(IN NTSTATUS Status)
DWORD WINAPI BasepGetComputerNameFromNtPath(IN PUNICODE_STRING NewPath, IN HANDLE NewHandle, OUT PWSTR ComputerName, IN OUT PULONG ComputerNameLength)
_Must_inspect_result_ _In_opt_ PFLT_INSTANCE _Out_ PHANDLE _In_ ACCESS_MASK _In_ POBJECT_ATTRIBUTES _Out_ PIO_STATUS_BLOCK _In_opt_ PLARGE_INTEGER _In_ ULONG FileAttributes
#define ERROR_FILE_NOT_FOUND
#define FILE_ATTRIBUTE_REPARSE_POINT
PVOID NTAPI RtlAllocateHeap(IN PVOID HeapHandle, IN ULONG Flags, IN SIZE_T Size)
#define REG_OPTION_NON_VOLATILE
#define FILE_DELETE_ON_CLOSE
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)
NTSYSAPI NTSTATUS NTAPI NtQueryValueKey(IN HANDLE KeyHandle, IN PUNICODE_STRING ValueName, IN KEY_VALUE_INFORMATION_CLASS KeyValueInformationClass, IN PVOID KeyValueInformation, IN ULONG Length, IN PULONG ResultLength)
#define FILE_ATTRIBUTE_DEVICE
BOOL WINAPI FlushFileBuffers(IN HANDLE hFile)
_CONST_RETURN wchar_t *__cdecl wcschr(_In_z_ const wchar_t *_Str, wchar_t _Ch)
#define NT_SUCCESS(StatCode)
#define ERROR_UNABLE_TO_REMOVE_REPLACED
BOOL WINAPI CopyFileW(IN LPCWSTR lpExistingFileName, IN LPCWSTR lpNewFileName, IN BOOL bFailIfExists)
struct _KEY_VALUE_PARTIAL_INFORMATION * PKEY_VALUE_PARTIAL_INFORMATION
#define FILE_ATTRIBUTE_READONLY
#define STATUS_OBJECT_PATH_NOT_FOUND
NTSYSAPI VOID NTAPI RtlFreeUnicodeString(PUNICODE_STRING UnicodeString)
#define STATUS_ACCESS_DENIED
#define REG_OPTION_BACKUP_RESTORE
BOOL WINAPI PrivMoveFileIdentityW(IN LPCWSTR lpSource, IN LPCWSTR lpDestination, IN DWORD dwFlags)
BOOL Query(LPCTSTR *ServiceArgs, DWORD ArgCount, BOOL bExtended)
NTSTATUS WINAPI BasepOpenFileForMove(IN LPCWSTR File, OUT PUNICODE_STRING RelativeNtName, OUT LPWSTR *NtName, OUT PHANDLE FileHandle, OUT POBJECT_ATTRIBUTES ObjectAttributes, IN ACCESS_MASK DesiredAccess, IN ULONG ShareAccess, IN ULONG OpenOptions)
NTSTATUS NTAPI NtClose(IN HANDLE Handle)
#define FILE_READ_ATTRIBUTES
#define PRIV_DELETE_ON_SUCCESS
#define FILE_ATTRIBUTE_NORMAL
#define FILE_SHARE_DELETE
_In_ PCCERT_CONTEXT _In_ DWORD dwFlags
BOOL BasepCopyFileExW(IN LPCWSTR lpExistingFileName, IN LPCWSTR lpNewFileName, IN LPPROGRESS_ROUTINE lpProgressRoutine OPTIONAL, IN LPVOID lpData OPTIONAL, IN LPBOOL pbCancel OPTIONAL, IN DWORD dwCopyFlags, IN DWORD dwBasepFlags, OUT LPHANDLE lpExistingHandle, OUT LPHANDLE lpNewHandle)
NTSYSAPI NTSTATUS NTAPI NtWriteFile(IN HANDLE hFile, IN HANDLE hEvent OPTIONAL, IN PIO_APC_ROUTINE IoApcRoutine OPTIONAL, IN PVOID IoApcContext OPTIONAL, OUT PIO_STATUS_BLOCK pIoStatusBlock, IN PVOID WriteBuffer, IN ULONG WriteBufferLength, IN PLARGE_INTEGER FileOffset OPTIONAL, IN PULONG LockOperationKey OPTIONAL)
#define FILE_NON_DIRECTORY_FILE
NTSYSAPI NTSTATUS NTAPI RtlUnicodeStringToOemString(POEM_STRING DestinationString, PCUNICODE_STRING SourceString, BOOLEAN AllocateDestinationString)
DWORD(WINAPI * LPPROGRESS_ROUTINE)(_In_ LARGE_INTEGER, _In_ LARGE_INTEGER, _In_ LARGE_INTEGER, _In_ LARGE_INTEGER, _In_ DWORD, _In_ DWORD, _In_ HANDLE, _In_ HANDLE, _In_opt_ LPVOID)
NTSTATUS NTAPI NtQueryInformationFile(HANDLE hFile, PIO_STATUS_BLOCK io, PVOID ptr, ULONG len, FILE_INFORMATION_CLASS FileInformationClass)
static const WCHAR Cleanup[]
#define MAX_COMPUTERNAME_LENGTH
NTSTATUS WINAPI BasepMoveFileDelayed(IN PUNICODE_STRING ExistingPath, IN PUNICODE_STRING NewPath, IN INT KeyId, IN BOOL CreateIfNotFound)
PRTL_UNICODE_STRING_BUFFER Path
#define STATUS_OBJECT_NAME_NOT_FOUND
#define STATUS_BUFFER_OVERFLOW
struct _FILE_TRACKING_INFORMATION FILE_TRACKING_INFORMATION
#define FILE_OPEN_FOR_BACKUP_INTENT
static OUT PIO_STATUS_BLOCK IoStatusBlock
NTSYSAPI NTSTATUS NTAPI NtSetValueKey(IN HANDLE KeyHandle, IN PUNICODE_STRING ValueName, IN ULONG TitleIndex OPTIONAL, IN ULONG Type, IN PVOID Data, IN ULONG DataSize)
BOOL WINAPI MoveFileWithProgressW(IN LPCWSTR lpExistingFileName, IN LPCWSTR lpNewFileName, IN LPPROGRESS_ROUTINE lpProgressRoutine, IN LPVOID lpData, IN DWORD dwFlags)
NTSYSAPI BOOLEAN NTAPI RtlPrefixUnicodeString(IN PUNICODE_STRING String1, IN PUNICODE_STRING String2, IN BOOLEAN CaseInSensitive)
#define UNIMPLEMENTED_DBGBREAK(...)
#define FILE_SYNCHRONOUS_IO_NONALERT
DWORD WINAPI BasepMoveFileCopyProgress(IN LARGE_INTEGER TotalFileSize, IN LARGE_INTEGER TotalBytesTransferred, IN LARGE_INTEGER StreamSize, IN LARGE_INTEGER StreamBytesTransferred, IN DWORD dwStreamNumber, IN DWORD dwCallbackReason, IN HANDLE hSourceFile, IN HANDLE hDestinationFile, IN LPVOID lpData OPTIONAL)
NTSYSAPI VOID NTAPI RtlInitUnicodeString(PUNICODE_STRING DestinationString, PCWSTR SourceString)
#define RtlZeroMemory(Destination, Length)
BOOL WINAPI MoveFileExW(IN LPCWSTR lpExistingFileName, IN LPCWSTR lpNewFileName OPTIONAL, IN DWORD dwFlags)
#define InitializeObjectAttributes(p, n, a, r, s)
#define RtlCopyMemory(Destination, Source, Length)
UNICODE_STRING RelativeName
#define ERROR_PATH_NOT_FOUND
#define ERROR_BAD_PATHNAME
#define FILE_OPEN_REPARSE_POINT
NTSYSAPI ULONG NTAPI RtlIsDosDeviceName_U(_In_ PCWSTR Name)
_In_ NDIS_STATUS _In_ ULONG _In_ USHORT _In_opt_ PVOID _In_ ULONG DataSize
#define MOVEFILE_FAIL_IF_NOT_TRACKABLE
NTSYSAPI BOOLEAN NTAPI RtlDosPathNameToNtPathName_U(_In_opt_z_ PCWSTR DosPathName, _Out_ PUNICODE_STRING NtPathName, _Out_opt_ PCWSTR *NtFileNamePart, _Out_opt_ PRTL_RELATIVE_NAME_U DirectoryInfo)
NTSTATUS NTAPI NtReadFile(HANDLE FileHandle, HANDLE Event, PIO_APC_ROUTINE ApcRoutine, PVOID ApcContext, PIO_STATUS_BLOCK IoStatusBlock, PVOID Buffer, ULONG Length, PLARGE_INTEGER ByteOffset, PULONG Key)
NTSYSAPI RTL_PATH_TYPE NTAPI RtlDetermineDosPathNameType_U(_In_ PCWSTR Path)
#define RTL_CONSTANT_STRING(s)
PULONG MinorVersion OPTIONAL