Esempio n. 1
0
        public static NTStatus CreateDirectory(INTFileStore fileStore, string path, SecurityContext securityContext)
        {
            object     handle;
            FileStatus fileStatus;
            NTStatus   createStatus = fileStore.CreateFile(out handle, out fileStatus, path, DirectoryAccessMask.FILE_ADD_SUBDIRECTORY, ShareAccess.FILE_SHARE_READ | ShareAccess.FILE_SHARE_WRITE, CreateDisposition.FILE_CREATE, CreateOptions.FILE_DIRECTORY_FILE, securityContext);

            if (createStatus != NTStatus.STATUS_SUCCESS)
            {
                return(createStatus);
            }
            fileStore.CloseFile(handle);
            return(createStatus);
        }
Esempio n. 2
0
        public static NTStatus CheckDirectory(INTFileStore fileStore, string path, SecurityContext securityContext)
        {
            object     handle;
            FileStatus fileStatus;
            NTStatus   openStatus = fileStore.CreateFile(out handle, out fileStatus, path, (AccessMask)0, 0, ShareAccess.Read | ShareAccess.Write, CreateDisposition.FILE_OPEN, CreateOptions.FILE_DIRECTORY_FILE, securityContext);

            if (openStatus != NTStatus.STATUS_SUCCESS)
            {
                return(openStatus);
            }

            fileStore.CloseFile(handle);
            return(NTStatus.STATUS_SUCCESS);
        }
        public static NTStatus GetFileInformation(out FileInformation result, INTFileStore fileStore, string path, FileInformationClass informationClass, SecurityContext securityContext)
        {
            object     handle;
            FileStatus fileStatus;
            NTStatus   openStatus = fileStore.CreateFile(out handle, out fileStatus, path, (AccessMask)FileAccessMask.FILE_READ_ATTRIBUTES, 0, ShareAccess.Read | ShareAccess.Write, CreateDisposition.FILE_OPEN, 0, securityContext);

            if (openStatus != NTStatus.STATUS_SUCCESS)
            {
                result = null;
                return(openStatus);
            }
            NTStatus returnStatus = fileStore.GetFileInformation(out result, handle, informationClass);

            fileStore.CloseFile(handle);
            return(returnStatus);
        }
        public static NTStatus GetFileInformation(out QueryInformation result, INTFileStore fileStore, string path, QueryInformationLevel informationLevel, SecurityContext securityContext)
        {
            object     handle;
            FileStatus fileStatus;
            NTStatus   openStatus = fileStore.CreateFile(out handle, out fileStatus, path, FileAccessMask.FILE_READ_ATTRIBUTES, ShareAccess.FILE_SHARE_READ | ShareAccess.FILE_SHARE_WRITE, CreateDisposition.FILE_OPEN, 0, securityContext);

            if (openStatus != NTStatus.STATUS_SUCCESS)
            {
                result = null;
                return(openStatus);
            }
            NTStatus returnStatus = GetFileInformation(out result, fileStore, handle, informationLevel);

            fileStore.CloseFile(handle);
            return(returnStatus);
        }
Esempio n. 5
0
        public static NTStatus QueryInformation(out FileNetworkOpenInformation fileInfo, INTFileStore fileStore, string path, SecurityContext securityContext)
        {
            object     handle;
            FileStatus fileStatus;
            NTStatus   openStatus = fileStore.CreateFile(out handle, out fileStatus, path, (AccessMask)FileAccessMask.FILE_READ_ATTRIBUTES, 0, ShareAccess.Read | ShareAccess.Write, CreateDisposition.FILE_OPEN, 0, securityContext);

            if (openStatus != NTStatus.STATUS_SUCCESS)
            {
                fileInfo = null;
                return(openStatus);
            }

            fileInfo = NTFileStoreHelper.GetNetworkOpenInformation(fileStore, handle);
            fileStore.CloseFile(handle);
            return(NTStatus.STATUS_SUCCESS);
        }
Esempio n. 6
0
        public static NTStatus Delete(INTFileStore fileStore, string path, CreateOptions createOptions, SecurityContext securityContext)
        {
            object      handle;
            FileStatus  fileStatus;
            ShareAccess shareAccess = ShareAccess.Read | ShareAccess.Write | ShareAccess.Delete;
            NTStatus    status      = fileStore.CreateFile(out handle, out fileStatus, path, AccessMask.DELETE, 0, shareAccess, CreateDisposition.FILE_OPEN, createOptions, securityContext);

            if (status != NTStatus.STATUS_SUCCESS)
            {
                return(status);
            }
            FileDispositionInformation fileDispositionInfo = new FileDispositionInformation();

            fileDispositionInfo.DeletePending = true;
            status = fileStore.SetFileInformation(handle, fileDispositionInfo);
            fileStore.CloseFile(handle);
            return(status);
        }
        public static FileNetworkOpenInformation GetNetworkOpenInformation(INTFileStore fileStore, string path, SecurityContext securityContext)
        {
            object     handle;
            FileStatus fileStatus;
            NTStatus   openStatus = fileStore.CreateFile(out handle, out fileStatus, path, (AccessMask)FileAccessMask.FILE_READ_ATTRIBUTES, 0, ShareAccess.Read | ShareAccess.Write, CreateDisposition.FILE_OPEN, 0, securityContext);

            if (openStatus != NTStatus.STATUS_SUCCESS)
            {
                return(null);
            }
            FileInformation fileInfo;
            NTStatus        queryStatus = fileStore.GetFileInformation(out fileInfo, handle, FileInformationClass.FileNetworkOpenInformation);

            fileStore.CloseFile(handle);
            if (queryStatus != NTStatus.STATUS_SUCCESS)
            {
                return(null);
            }
            return((FileNetworkOpenInformation)fileInfo);
        }
Esempio n. 8
0
        public void TestCancel()
        {
            object     handle;
            FileStatus fileStatus;

            m_fileStore.CreateFile(out handle, out fileStatus, TestDirName, AccessMask.GENERIC_ALL, FileAttributes.Directory, ShareAccess.Read, CreateDisposition.FILE_OPEN, CreateOptions.FILE_DIRECTORY_FILE, null);

            object   ioRequest = null;
            NTStatus status    = m_fileStore.NotifyChange(out ioRequest, handle, NotifyChangeFilter.FileName | NotifyChangeFilter.LastWrite | NotifyChangeFilter.DirName, false, 8192, OnNotifyChangeCompleted, null);

            Assert.IsTrue(status == NTStatus.STATUS_PENDING);

            m_fileStore.Cancel(ioRequest);
            m_fileStore.CloseFile(handle);
            while (m_notifyChangeStatus == null)
            {
                Thread.Sleep(1);
            }
            Assert.IsTrue(m_notifyChangeStatus.Value == NTStatus.STATUS_CANCELLED);
        }
Esempio n. 9
0
        public static NTStatus Delete(INTFileStore fileStore, string path, CreateOptions createOptions, SecurityContext securityContext)
        {
            object     handle;
            FileStatus fileStatus;
            NTStatus   openStatus = fileStore.CreateFile(out handle, out fileStatus, path, DirectoryAccessMask.DELETE, 0, CreateDisposition.FILE_OPEN, createOptions, securityContext);

            if (openStatus != NTStatus.STATUS_SUCCESS)
            {
                return(openStatus);
            }
            FileDispositionInformation fileDispositionInfo = new FileDispositionInformation();

            fileDispositionInfo.DeletePending = true;
            NTStatus setStatus = fileStore.SetFileInformation(handle, fileDispositionInfo);

            if (setStatus != NTStatus.STATUS_SUCCESS)
            {
                return(setStatus);
            }
            NTStatus closeStatus = fileStore.CloseFile(handle);

            return(closeStatus);
        }
Esempio n. 10
0
        public static List <string> ListShares(INTFileStore namedPipeShare, ShareType?shareType, out NTStatus status)
        {
            object pipeHandle;
            int    maxTransmitFragmentSize;

            status = NamedPipeHelper.BindPipe(namedPipeShare, ServerService.ServicePipeName, ServerService.ServiceInterfaceGuid, ServerService.ServiceVersion, out pipeHandle, out maxTransmitFragmentSize);
            if (status != NTStatus.STATUS_SUCCESS)
            {
                return(null);
            }

            NetrShareEnumRequest shareEnumRequest = new NetrShareEnumRequest();

            shareEnumRequest.InfoStruct            = new ShareEnum();
            shareEnumRequest.InfoStruct.Level      = 1;
            shareEnumRequest.InfoStruct.Info       = new ShareInfo1Container();
            shareEnumRequest.PreferedMaximumLength = UInt32.MaxValue;
            shareEnumRequest.ServerName            = "*";
            RequestPDU requestPDU = new RequestPDU();

            requestPDU.Flags = PacketFlags.FirstFragment | PacketFlags.LastFragment;
            requestPDU.DataRepresentation.CharacterFormat             = CharacterFormat.ASCII;
            requestPDU.DataRepresentation.ByteOrder                   = ByteOrder.LittleEndian;
            requestPDU.DataRepresentation.FloatingPointRepresentation = FloatingPointRepresentation.IEEE;
            requestPDU.OpNum          = (ushort)ServerServiceOpName.NetrShareEnum;
            requestPDU.Data           = shareEnumRequest.GetBytes();
            requestPDU.AllocationHint = (uint)requestPDU.Data.Length;
            byte[] input = requestPDU.GetBytes();
            byte[] output;
            int    maxOutputLength = maxTransmitFragmentSize;

            status = namedPipeShare.DeviceIOControl(pipeHandle, (uint)IoControlCode.FSCTL_PIPE_TRANSCEIVE, input, out output, maxOutputLength);
            if (status != NTStatus.STATUS_SUCCESS)
            {
                return(null);
            }
            ResponsePDU responsePDU = RPCPDU.GetPDU(output, 0) as ResponsePDU;

            if (responsePDU == null)
            {
                status = NTStatus.STATUS_NOT_SUPPORTED;
                return(null);
            }

            byte[] responseData = responsePDU.Data;
            while ((responsePDU.Flags & PacketFlags.LastFragment) == 0)
            {
                status = namedPipeShare.ReadFile(out output, pipeHandle, 0, maxOutputLength);
                if (status != NTStatus.STATUS_SUCCESS)
                {
                    return(null);
                }
                responsePDU = RPCPDU.GetPDU(output, 0) as ResponsePDU;
                if (responsePDU == null)
                {
                    status = NTStatus.STATUS_NOT_SUPPORTED;
                    return(null);
                }
                responseData = ByteUtils.Concatenate(responseData, responsePDU.Data);
            }
            namedPipeShare.CloseFile(pipeHandle);
            NetrShareEnumResponse shareEnumResponse = new NetrShareEnumResponse(responseData);
            ShareInfo1Container   shareInfo1        = shareEnumResponse.InfoStruct.Info as ShareInfo1Container;

            if (shareInfo1 == null || shareInfo1.Entries == null)
            {
                if (shareEnumResponse.Result == Win32Error.ERROR_ACCESS_DENIED)
                {
                    status = NTStatus.STATUS_ACCESS_DENIED;
                }
                else
                {
                    status = NTStatus.STATUS_NOT_SUPPORTED;
                }
                return(null);
            }

            List <string> result = new List <string>();

            foreach (ShareInfo1Entry entry in shareInfo1.Entries)
            {
                if (!shareType.HasValue || shareType.Value == entry.ShareType.ShareType)
                {
                    result.Add(entry.NetName.Value);
                }
            }
            return(result);
        }