private static void SetIOPriority(Stream stream, PRIORITY_HINT priority) { FileStream fileStream = (FileStream)stream; FieldInfo field = fileStream.GetType().GetField("_handle", BindingFlags.Instance | BindingFlags.NonPublic); SafeHandle fileHandle = (SafeHandle)field.GetValue(fileStream); FILE_IO_PRIORITY_HINT_INFO fi = new FILE_IO_PRIORITY_HINT_INFO(); fi.PriorityHint = priority; bool reffed = false; bool f = false; int hrForLastWin32Error = 0; try { RuntimeHelpers.PrepareConstrainedRegions(); try { } finally { fileHandle.DangerousAddRef(ref reffed); } f = SetFileInformationByHandle(fileHandle.DangerousGetHandle(), FILE_INFO_BY_HANDLE_CLASS.FileIoPriorityHintInfo, ref fi, Marshal.SizeOf(fi)); hrForLastWin32Error = Marshal.GetHRForLastWin32Error(); } finally { if (reffed) { fileHandle.DangerousRelease(); } } if (!f) { Marshal.ThrowExceptionForHR(hrForLastWin32Error); } }
private static extern bool SetFileInformationByHandle( IntPtr hFile, FILE_INFO_BY_HANDLE_CLASS FileInformationClass, [MarshalAs(UnmanagedType.Struct)] ref FILE_IO_PRIORITY_HINT_INFO lpFileInformation, int dwBufferSize);