public void RenameFolder() { var setting = this.Settings.First(); var client = new SMB1Client(); var connected = client.Connect(IPAddress.Parse(setting.Address), SMBTransportType.DirectTCPTransport); if (connected) { var loginStatus = client.Login(string.Empty, setting.UserName, setting.Password); if (loginStatus == NTStatus.STATUS_SUCCESS) { var store = client.TreeConnect(setting.TestPath.Share, out var shareStatus) as SMB1FileStore; if (shareStatus == NTStatus.STATUS_SUCCESS) { var createStatus = store.CreateFile( out var handle, out _, @"\\Musics\created", AccessMask.GENERIC_ALL | AccessMask.SYNCHRONIZE, 0, ShareAccess.None, CreateDisposition.FILE_OPEN, CreateOptions.FILE_DIRECTORY_FILE, null ); if (createStatus == NTStatus.STATUS_SUCCESS) { var info = new FileRenameInformationType1() { FileName = @"\\updated", }; var renameStatus = store.SetFileInformation(handle, info); Debug.WriteLine((renameStatus == NTStatus.STATUS_SUCCESS) ? "Succeeded!" : "Failed..."); store.CloseFile(handle); } store.Disconnect(); } } client.Disconnect(); } }
public NTStatus SetFileInformation(object handle, FileInformation information) { IO_STATUS_BLOCK ioStatusBlock; if (information is FileRenameInformationType2) { FileRenameInformationType2 fileRenameInformationRemote = (FileRenameInformationType2)information; if (ProcessHelper.Is64BitProcess) { // We should not modify the FileRenameInformationType2 instance we received - the caller may use it later. FileRenameInformationType2 fileRenameInformationLocal = new FileRenameInformationType2(); fileRenameInformationLocal.ReplaceIfExists = fileRenameInformationRemote.ReplaceIfExists; fileRenameInformationLocal.FileName = ToNativePath(fileRenameInformationRemote.FileName); information = fileRenameInformationLocal; } else { // Note: WOW64 process should use FILE_RENAME_INFORMATION_TYPE_1. // Note: Server 2003 x64 has issues with using FILE_RENAME_INFORMATION under WOW64. FileRenameInformationType1 fileRenameInformationLocal = new FileRenameInformationType1(); fileRenameInformationLocal.ReplaceIfExists = fileRenameInformationRemote.ReplaceIfExists; fileRenameInformationLocal.FileName = ToNativePath(fileRenameInformationRemote.FileName); information = fileRenameInformationLocal; } } else if (information is FileLinkInformationType2) { FileLinkInformationType2 fileLinkInformationRemote = (FileLinkInformationType2)information; if (ProcessHelper.Is64BitProcess) { FileRenameInformationType2 fileLinkInformationLocal = new FileRenameInformationType2(); fileLinkInformationLocal.ReplaceIfExists = fileLinkInformationRemote.ReplaceIfExists; fileLinkInformationLocal.FileName = ToNativePath(fileLinkInformationRemote.FileName); information = fileLinkInformationRemote; } else { FileLinkInformationType1 fileLinkInformationLocal = new FileLinkInformationType1(); fileLinkInformationLocal.ReplaceIfExists = fileLinkInformationRemote.ReplaceIfExists; fileLinkInformationLocal.FileName = ToNativePath(fileLinkInformationRemote.FileName); information = fileLinkInformationRemote; } } byte[] buffer = information.GetBytes(); return(NtSetInformationFile((IntPtr)handle, out ioStatusBlock, buffer, (uint)buffer.Length, (uint)information.FileInformationClass)); }
public void SetFileInformation(NtHandle handle, FileInformation information) { if (!m_client.InfoLevelPassthrough) { throw new NotSupportedException("Server does not support InfoLevelPassthrough"); } if (information is FileRenameInformationType2 fileRenameInformationType2) { FileRenameInformationType1 informationType1 = new FileRenameInformationType1 { FileName = fileRenameInformationType2.FileName, ReplaceIfExists = fileRenameInformationType2.ReplaceIfExists, RootDirectory = (uint)fileRenameInformationType2.RootDirectory }; information = informationType1; } int maxOutputLength = 4096; Transaction2SetFileInformationRequest subcommand = new Transaction2SetFileInformationRequest { FID = ((Smb1Handle)handle).FID, }; subcommand.SetInformation(information); Transaction2Request request = new Transaction2Request { Setup = subcommand.GetSetup(), TransParameters = subcommand.GetParameters(m_client.Unicode), TransData = subcommand.GetData(m_client.Unicode) }; request.TotalDataCount = (ushort)request.TransData.Length; request.TotalParameterCount = (ushort)request.TransParameters.Length; request.MaxParameterCount = Transaction2SetFileInformationResponse.ParametersLength; request.MaxDataCount = (ushort)maxOutputLength; TrySendMessage(request); SMB1Message reply = m_client.WaitForMessage(CommandName.SMB_COM_TRANSACTION2); reply.IsSuccessElseThrow(); }
public NTStatus SetFileInformation(object handle, FileInformation information) { if (m_client.InfoLevelPassthrough) { if (information is FileRenameInformationType2) { FileRenameInformationType1 informationType1 = new FileRenameInformationType1(); informationType1.FileName = ((FileRenameInformationType2)information).FileName; informationType1.ReplaceIfExists = ((FileRenameInformationType2)information).ReplaceIfExists; informationType1.RootDirectory = (uint)((FileRenameInformationType2)information).RootDirectory; information = informationType1; } int maxOutputLength = 4096; Transaction2SetFileInformationRequest subcommand = new Transaction2SetFileInformationRequest(); subcommand.FID = (ushort)handle; subcommand.SetInformation(information); Transaction2Request request = new Transaction2Request(); request.Setup = subcommand.GetSetup(); request.TransParameters = subcommand.GetParameters(m_client.Unicode); request.TransData = subcommand.GetData(m_client.Unicode); request.TotalDataCount = (ushort)request.TransData.Length; request.TotalParameterCount = (ushort)request.TransParameters.Length; request.MaxParameterCount = Transaction2SetFileInformationResponse.ParametersLength; request.MaxDataCount = (ushort)maxOutputLength; TrySendMessage(request); SMB1Message reply = m_client.WaitForMessage(CommandName.SMB_COM_TRANSACTION2); if (reply != null) { return(reply.Header.Status); } return(NTStatus.STATUS_INVALID_SMB); } else { throw new NotSupportedException("Server does not support InfoLevelPassthrough"); } }