コード例 #1
0
        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();
            }
        }
コード例 #2
0
        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));
        }
コード例 #3
0
        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();
        }
コード例 #4
0
ファイル: SMB1FileStore.cs プロジェクト: zhouzu/Redfish
        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");
            }
        }