Example #1
0
        /// <summary>
        /// CreateFile wrapper that attempts to use CreateFile2 if running as Windows Store app.
        /// </summary>
        public static SafeFileHandle CreateFile(
            StringSpan path,
            CreationDisposition creationDisposition,
            DesiredAccess desiredAccess       = DesiredAccess.GenericReadWrite,
            ShareModes shareMode              = ShareModes.ReadWrite,
            FileAttributes fileAttributes     = FileAttributes.None,
            FileFlags fileFlags               = FileFlags.None,
            SecurityQosFlags securityQosFlags = SecurityQosFlags.None)
        {
            // Prefer CreateFile2, falling back to CreateFileEx if we can
            if (s_createFileDelegate == null)
            {
                s_createFileDelegate = CreateFile2;
                try
                {
                    return(s_createFileDelegate(path, desiredAccess, shareMode, creationDisposition, fileAttributes, fileFlags, securityQosFlags));
                }
                catch (EntryPointNotFoundException)
                {
                    s_createFileDelegate = Delegates.CreateDelegate <CreateFileDelegate>(
                        "WInterop.Storage.Desktop.NativeMethods, " + Delegates.DesktopLibrary,
                        "CreateFileW");
                }
            }

            return(s_createFileDelegate(path, desiredAccess, shareMode, creationDisposition, fileAttributes, fileFlags, securityQosFlags));
        }
Example #2
0
        /// <summary>
        /// CreateFile2 wrapper. Only available on Windows 8 and above.
        /// </summary>
        public static unsafe SafeFileHandle CreateFile2(
            StringSpan path,
            DesiredAccess desiredAccess,
            ShareModes shareMode,
            CreationDisposition creationDisposition,
            FileAttributes fileAttributes     = FileAttributes.None,
            FileFlags fileFlags               = FileFlags.None,
            SecurityQosFlags securityQosFlags = SecurityQosFlags.None)
        {
            CREATEFILE2_EXTENDED_PARAMETERS extended = new CREATEFILE2_EXTENDED_PARAMETERS()
            {
                dwSize             = (uint)sizeof(CREATEFILE2_EXTENDED_PARAMETERS),
                dwFileAttributes   = fileAttributes,
                dwFileFlags        = fileFlags,
                dwSecurityQosFlags = securityQosFlags
            };

            SafeFileHandle handle = Imports.CreateFile2(
                lpFileName: ref MemoryMarshal.GetReference(path.GetSpanWithoutTerminator()),
                dwDesiredAccess: desiredAccess,
                dwShareMode: shareMode,
                dwCreationDisposition: creationDisposition,
                pCreateExParams: ref extended);

            if (handle.IsInvalid)
            {
                throw Error.GetExceptionForLastError(path.ToString());
            }

            return(handle);
        }
Example #3
0
        /// <summary>
        /// CreateFile2 wrapper. Only available on Windows 8 and above.
        /// </summary>
        public static unsafe SafeFileHandle CreateFile2(
            string path,
            DesiredAccess desiredAccess,
            ShareModes shareMode,
            CreationDisposition creationDisposition,
            FileAttributes fileAttributes     = FileAttributes.None,
            FileFlags fileFlags               = FileFlags.None,
            SecurityQosFlags securityQosFlags = SecurityQosFlags.None)
        {
            CREATEFILE2_EXTENDED_PARAMETERS extended = new CREATEFILE2_EXTENDED_PARAMETERS()
            {
                dwSize             = (uint)sizeof(CREATEFILE2_EXTENDED_PARAMETERS),
                dwFileAttributes   = fileAttributes,
                dwFileFlags        = fileFlags,
                dwSecurityQosFlags = securityQosFlags
            };

            SafeFileHandle handle = Imports.CreateFile2(
                lpFileName: path,
                dwDesiredAccess: desiredAccess,
                dwShareMode: shareMode,
                dwCreationDisposition: creationDisposition,
                pCreateExParams: ref extended);

            if (handle.IsInvalid)
            {
                throw Errors.GetIoExceptionForLastError(path);
            }

            return(handle);
        }
 internal static extern SafeFileHandle CreateFile(
     string lpFileName,
     DesiredAccesses dwDesiredAccess,
     ShareModes dwShareMode,
     ref SECURITY_ATTRIBUTES lpSecurityAttributes,
     int dwCreationDisposition,
     FileFlags dwFlagsAndAttributes,
     int hTemplateFile);
Example #5
0
 public unsafe static extern SafeFileHandle CreateFileW(
     string lpFileName,
     DesiredAccess dwDesiredAccess,
     ShareModes dwShareMode,
     SECURITY_ATTRIBUTES *lpSecurityAttributes,
     CreationDisposition dwCreationDisposition,
     uint dwFlagsAndAttributes,
     IntPtr hTemplateFile);
Example #6
0
 public static LzHandle LzCreateFile(
     string path,
     DesiredAccess access         = DesiredAccess.GenericRead,
     ShareModes share             = ShareModes.ReadWrite,
     CreationDisposition creation = CreationDisposition.OpenExisting)
 {
     return(new LzCreateHandle(ValidateLzResult(
                                   Imports.LZCreateFileW(path, access, share, creation, EmptySafeHandle.Instance), path)));
 }
Example #7
0
 /// <summary>
 /// NtCreateFile wrapper.
 /// </summary>
 public unsafe static SafeFileHandle CreateFileDirect(
     string path,
     CreateDisposition createDisposition,
     DesiredAccess desiredAccess       = DesiredAccess.GenericReadWrite | DesiredAccess.Synchronize,
     ShareModes shareAccess            = ShareModes.ReadWrite,
     FileAttributes fileAttributes     = FileAttributes.None,
     CreateOptions createOptions       = CreateOptions.SynchronousIoNonalert,
     ObjectAttributes objectAttributes = ObjectAttributes.CaseInsensitive)
 {
     return(CreateFileRelative(path, null, createDisposition, desiredAccess, shareAccess,
                               fileAttributes, createOptions, objectAttributes));
 }
Example #8
0
 public unsafe static extern NTStatus NtCreateFile(
     out IntPtr FileHandle,
     DesiredAccess DesiredAccess,
     ref OBJECT_ATTRIBUTES ObjectAttributes,
     out IO_STATUS_BLOCK IoStatusBlock,
     long *AllocationSize,
     FileAttributes FileAttributes,
     ShareModes ShareAccess,
     CreateDisposition CreateDisposition,
     CreateOptions CreateOptions,
     void *EaBuffer,
     uint EaLength);
Example #9
0
 public unsafe static SafeFileHandle CreateFileRelative(
     ReadOnlySpan <char> path,
     SafeFileHandle rootDirectory,
     CreateDisposition createDisposition,
     DesiredAccess desiredAccess       = DesiredAccess.GenericReadWrite | DesiredAccess.Synchronize,
     ShareModes shareAccess            = ShareModes.ReadWrite,
     FileAttributes fileAttributes     = FileAttributes.None,
     CreateOptions createOptions       = CreateOptions.SynchronousIoNonalert,
     ObjectAttributes objectAttributes = ObjectAttributes.CaseInsensitive)
 {
     using (var handle = new UnwrapHandle(rootDirectory))
     {
         return(new SafeFileHandle(
                    CreateFileRelative(path, handle, createDisposition, desiredAccess,
                                       shareAccess, fileAttributes, createOptions, objectAttributes),
                    true));
     }
 }
Example #10
0
        /// <summary>
        /// Get a stream for the specified file.
        /// </summary>
        public static System.IO.Stream CreateFileStream(
            StringSpan path,
            DesiredAccess desiredAccess,
            ShareModes shareMode,
            CreationDisposition creationDisposition,
            FileAttributes fileAttributes     = FileAttributes.None,
            FileFlags fileFlags               = FileFlags.None,
            SecurityQosFlags securityQosFlags = SecurityQosFlags.None)
        {
            var fileHandle = CreateFile(path, creationDisposition, desiredAccess, shareMode, fileAttributes, fileFlags, securityQosFlags);

            // FileStream will own the lifetime of the handle
            return(new System.IO.FileStream(
                       handle: fileHandle,
                       access: Conversion.DesiredAccessToFileAccess(desiredAccess),
                       bufferSize: 4096,
                       isAsync: (fileFlags & FileFlags.Overlapped) != 0));
        }
Example #11
0
        /// <summary>
        /// CreateFile wrapper. Desktop only. Prefer File.CreateFile() as it will handle all supported platforms.
        /// </summary>
        /// <remarks>Not available in Windows Store applications.</remarks>
        public unsafe static SafeFileHandle CreateFileW(
            string path,
            DesiredAccess desiredAccess,
            ShareModes shareMode,
            CreationDisposition creationDisposition,
            FileAttributes fileAttributes     = FileAttributes.None,
            FileFlags fileFlags               = FileFlags.None,
            SecurityQosFlags securityQosFlags = SecurityQosFlags.None)
        {
            uint flags = (uint)fileAttributes | (uint)fileFlags | (uint)securityQosFlags;

            SafeFileHandle handle = Imports.CreateFileW(path, desiredAccess, shareMode, lpSecurityAttributes: null, creationDisposition, flags, hTemplateFile: IntPtr.Zero);

            if (handle.IsInvalid)
            {
                throw Error.GetExceptionForLastError(path);
            }
            return(handle);
        }
Example #12
0
        public unsafe static IntPtr CreateFileRelative(
            ReadOnlySpan <char> path,
            IntPtr rootDirectory,
            CreateDisposition createDisposition,
            DesiredAccess desiredAccess       = DesiredAccess.GenericReadWrite | DesiredAccess.Synchronize,
            ShareModes shareAccess            = ShareModes.ReadWrite,
            FileAttributes fileAttributes     = FileAttributes.None,
            CreateOptions createOptions       = CreateOptions.SynchronousIoNonalert,
            ObjectAttributes objectAttributes = ObjectAttributes.CaseInsensitive)
        {
            fixed(char *c = &path.DangerousGetPinnableReference())
            {
                UNICODE_STRING    name       = new UNICODE_STRING(c, path.Length);
                OBJECT_ATTRIBUTES attributes = new OBJECT_ATTRIBUTES(
                    &name,
                    objectAttributes,
                    rootDirectory,
                    null,
                    null);

                NTSTATUS status = Imports.NtCreateFile(
                    out IntPtr handle,
                    desiredAccess,
                    ref attributes,
                    out IO_STATUS_BLOCK statusBlock,
                    AllocationSize: null,
                    FileAttributes: fileAttributes,
                    ShareAccess: shareAccess,
                    CreateDisposition: createDisposition,
                    CreateOptions: createOptions,
                    EaBuffer: null,
                    EaLength: 0);

                if (status != NTSTATUS.STATUS_SUCCESS)
                {
                    throw ErrorMethods.GetIoExceptionForNTStatus(status, path.ToString());
                }

                return(handle);
            }
        }
Example #13
0
        public static LzHandle LzCreateFile(
            string path,
            out string uncompressedName,
            DesiredAccess access         = DesiredAccess.GenericRead,
            ShareModes share             = ShareModes.ReadWrite,
            CreationDisposition creation = CreationDisposition.OpenExisting)
        {
            string   name   = null;
            LzHandle handle = null;

            BufferHelper.BufferInvoke((StringBuffer buffer) =>
            {
                buffer.EnsureCharCapacity(Paths.MaxPath);
                int result = ValidateLzResult(Imports.LZCreateFileW(path, access, share, creation, buffer), path);

                buffer.SetLengthToFirstNull();
                name   = buffer.ToString();
                handle = new LzCreateHandle(result);
            });

            uncompressedName = name;
            return(handle);
        }
Example #14
0
        public unsafe static IntPtr CreateFileRelative(
            ReadOnlySpan <char> path,
            IntPtr rootDirectory,
            CreateDisposition createDisposition,
            DesiredAccess desiredAccess       = DesiredAccess.GenericReadWrite | DesiredAccess.Synchronize,
            ShareModes shareAccess            = ShareModes.ReadWrite,
            FileAttributes fileAttributes     = FileAttributes.None,
            CreateOptions createOptions       = CreateOptions.SynchronousIoNonalert,
            ObjectAttributes objectAttributes = ObjectAttributes.CaseInsensitive)
        {
            fixed(char *c = &MemoryMarshal.GetReference(path))
            {
                var name       = new SafeString.Unsafe.UNICODE_STRING(c, path.Length);
                var attributes = new Handles.Unsafe.OBJECT_ATTRIBUTES(
                    &name,
                    objectAttributes,
                    rootDirectory,
                    null,
                    null);

                Imports.NtCreateFile(
                    out IntPtr handle,
                    desiredAccess,
                    ref attributes,
                    out IO_STATUS_BLOCK statusBlock,
                    AllocationSize: null,
                    FileAttributes: fileAttributes,
                    ShareAccess: shareAccess,
                    CreateDisposition: createDisposition,
                    CreateOptions: createOptions,
                    EaBuffer: null,
                    EaLength: 0)
                .ThrowIfFailed(path.ToString());

                return(handle);
            }
        }
Example #15
0
 public static extern IntPtr ReOpenFile(
     SafeFileHandle hOriginalFile,
     DesiredAccess dwDesiredAccess,
     ShareModes dwShareMode,
     uint dwFlags);
Example #16
0
 public static extern SafeFileHandle CreateFile(string lpFileName, DesiredAccesses dwDesiredAccess, ShareModes dwShareMode, IntPtr lpSecurityAttributes, CreationDispositions dwCreationDisposition, FlagsAndAttributes dwFlagsAndAttributes, IntPtr hTemplateFile);
Example #17
0
 public static extern int LZCreateFileW(
     string lpFileName,
     DesiredAccess dwAccess,
     ShareModes dwShareMode,
     CreationDisposition dwCreate,
     SafeHandle lpCompressedName);
Example #18
0
 public static extern SafeFileHandle CreateFile2(
     ref char lpFileName,
     DesiredAccess dwDesiredAccess,
     ShareModes dwShareMode,
     CreationDisposition dwCreationDisposition,
     ref CREATEFILE2_EXTENDED_PARAMETERS pCreateExParams);
        public SafeFileHandle OpenDevice(string devicePath, DesiredAccesses deviceAccesses, ShareModes shareModes, FileFlags flags)
        {
            if (devicePath == null)
            {
                throw new ArgumentNullException($"{nameof(devicePath)} is null");
            }

            var security = new SECURITY_ATTRIBUTES(true);

            SafeFileHandle result = NativeMethods.CreateFile(devicePath, deviceAccesses, shareModes, ref security, NativeMethods.OPEN_EXISTING, flags, 0);

            if (result.IsInvalid)
            {
                Marshal.ThrowExceptionForHR(Marshal.GetHRForLastWin32Error());
            }

            return(result);
        }
Example #20
0
        public SafeFileHandle OpenDevice(string devicePath, DesiredAccesses deviceAccesses, ShareModes shareModes, FileFlags flags)
        {
            if (IsThrow)
            {
                throw new Exception("TestException");
            }
            var returnValue = IsFailureHandle ? IntPtr.Zero : new IntPtr(1);

            IsOpenDevice = true;
            return(new SafeFileHandle(returnValue, true));
        }
Example #21
0
 public static extern SafeFileHandle CreateFile(string lpFileName, DesiredAccesses dwDesiredAccess, ShareModes dwShareMode, IntPtr lpSecurityAttributes, CreationDispositions dwCreationDisposition, FlagsAndAttributes dwFlagsAndAttributes, IntPtr hTemplateFile);