mirror of
https://github.com/goatcorp/Dalamud.git
synced 2026-02-21 23:37:44 +01:00
chore: use CsWin32 for WriteAllBytesSafe()
We should start converting more to it, as time goes on
This commit is contained in:
parent
1d015c2ee0
commit
707bcd4d82
3 changed files with 25 additions and 14 deletions
|
|
@ -70,6 +70,9 @@
|
||||||
<PackageReference Include="JetBrains.Annotations" Version="2021.2.0" />
|
<PackageReference Include="JetBrains.Annotations" Version="2021.2.0" />
|
||||||
<PackageReference Include="Lumina" Version="3.11.0" />
|
<PackageReference Include="Lumina" Version="3.11.0" />
|
||||||
<PackageReference Include="Lumina.Excel" Version="6.5.0" />
|
<PackageReference Include="Lumina.Excel" Version="6.5.0" />
|
||||||
|
<PackageReference Include="Microsoft.Windows.CsWin32" Version="0.3.46-beta">
|
||||||
|
<PrivateAssets>all</PrivateAssets>
|
||||||
|
</PackageReference>
|
||||||
<PackageReference Include="MinSharp" Version="1.0.4" />
|
<PackageReference Include="MinSharp" Version="1.0.4" />
|
||||||
<PackageReference Include="MonoModReorg.RuntimeDetour" Version="23.1.2-prerelease.1" />
|
<PackageReference Include="MonoModReorg.RuntimeDetour" Version="23.1.2-prerelease.1" />
|
||||||
<PackageReference Include="Newtonsoft.Json" Version="13.0.2" />
|
<PackageReference Include="Newtonsoft.Json" Version="13.0.2" />
|
||||||
|
|
|
||||||
5
Dalamud/NativeMethods.txt
Normal file
5
Dalamud/NativeMethods.txt
Normal file
|
|
@ -0,0 +1,5 @@
|
||||||
|
CreateFile
|
||||||
|
FILE_ACCESS_RIGHTS
|
||||||
|
MoveFileEx
|
||||||
|
FlushFileBuffers
|
||||||
|
WriteFile
|
||||||
|
|
@ -1,4 +1,5 @@
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
|
using System.ComponentModel;
|
||||||
using System.Diagnostics;
|
using System.Diagnostics;
|
||||||
using System.IO;
|
using System.IO;
|
||||||
using System.IO.Compression;
|
using System.IO.Compression;
|
||||||
|
|
@ -17,11 +18,10 @@ using Dalamud.Game.ClientState.Objects.Types;
|
||||||
using Dalamud.Interface.Colors;
|
using Dalamud.Interface.Colors;
|
||||||
using Dalamud.Interface.Utility;
|
using Dalamud.Interface.Utility;
|
||||||
using Dalamud.Logging.Internal;
|
using Dalamud.Logging.Internal;
|
||||||
using Dalamud.Memory;
|
|
||||||
using ImGuiNET;
|
using ImGuiNET;
|
||||||
using Lumina.Excel.GeneratedSheets;
|
using Lumina.Excel.GeneratedSheets;
|
||||||
using PInvoke;
|
|
||||||
using Serilog;
|
using Serilog;
|
||||||
|
using Windows.Win32.Storage.FileSystem;
|
||||||
|
|
||||||
namespace Dalamud.Utility;
|
namespace Dalamud.Utility;
|
||||||
|
|
||||||
|
|
@ -640,36 +640,39 @@ public static class Util
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="path">The path of the file to write to.</param>
|
/// <param name="path">The path of the file to write to.</param>
|
||||||
/// <param name="bytes">The data to write.</param>
|
/// <param name="bytes">The data to write.</param>
|
||||||
public static void WriteAllBytesSafe(string path, byte[] bytes)
|
public static unsafe void WriteAllBytesSafe(string path, byte[] bytes)
|
||||||
{
|
{
|
||||||
ArgumentException.ThrowIfNullOrEmpty(path);
|
ArgumentException.ThrowIfNullOrEmpty(path);
|
||||||
|
|
||||||
// Open the temp file
|
// Open the temp file
|
||||||
var tempPath = path + ".tmp";
|
var tempPath = path + ".tmp";
|
||||||
|
|
||||||
using var tempFile = Kernel32
|
using var tempFile = Windows.Win32.PInvoke.CreateFile(
|
||||||
.CreateFile(tempPath.AsSpan(),
|
tempPath,
|
||||||
new Kernel32.ACCESS_MASK(Kernel32.FileAccess.FILE_GENERIC_READ | Kernel32.FileAccess.FILE_GENERIC_WRITE),
|
(uint)(FILE_ACCESS_RIGHTS.FILE_GENERIC_READ | FILE_ACCESS_RIGHTS.FILE_GENERIC_WRITE),
|
||||||
Kernel32.FileShare.None,
|
FILE_SHARE_MODE.FILE_SHARE_NONE,
|
||||||
null,
|
null,
|
||||||
Kernel32.CreationDisposition.CREATE_ALWAYS,
|
FILE_CREATION_DISPOSITION.CREATE_ALWAYS,
|
||||||
Kernel32.CreateFileFlags.FILE_ATTRIBUTE_NORMAL,
|
FILE_FLAGS_AND_ATTRIBUTES.FILE_ATTRIBUTE_NORMAL,
|
||||||
Kernel32.SafeObjectHandle.Null);
|
null);
|
||||||
|
|
||||||
if (tempFile.IsInvalid)
|
if (tempFile.IsInvalid)
|
||||||
throw new Win32Exception();
|
throw new Win32Exception();
|
||||||
|
|
||||||
// Write the data
|
// Write the data
|
||||||
var bytesWritten = Kernel32.WriteFile(tempFile, new ArraySegment<byte>(bytes));
|
uint bytesWritten = 0;
|
||||||
|
if (!Windows.Win32.PInvoke.WriteFile(tempFile, new ReadOnlySpan<byte>(bytes), &bytesWritten, null))
|
||||||
|
throw new Win32Exception();
|
||||||
|
|
||||||
if (bytesWritten != bytes.Length)
|
if (bytesWritten != bytes.Length)
|
||||||
throw new Exception($"Could not write all bytes to temp file ({bytesWritten} of {bytes.Length})");
|
throw new Exception($"Could not write all bytes to temp file ({bytesWritten} of {bytes.Length})");
|
||||||
|
|
||||||
if (!Kernel32.FlushFileBuffers(tempFile))
|
if (!Windows.Win32.PInvoke.FlushFileBuffers(tempFile))
|
||||||
throw new Win32Exception();
|
throw new Win32Exception();
|
||||||
|
|
||||||
tempFile.Close();
|
tempFile.Close();
|
||||||
|
|
||||||
if (!MoveFileEx(tempPath, path, MoveFileFlags.MovefileReplaceExisting | MoveFileFlags.MovefileWriteThrough))
|
if (!Windows.Win32.PInvoke.MoveFileEx(tempPath, path, MOVE_FILE_FLAGS.MOVEFILE_REPLACE_EXISTING | MOVE_FILE_FLAGS.MOVEFILE_WRITE_THROUGH))
|
||||||
throw new Win32Exception();
|
throw new Win32Exception();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue