diff --git a/Examples/TestApplication/TestApplication.csproj b/Examples/TestApplication/TestApplication.csproj
index 5a6c710..e806853 100644
--- a/Examples/TestApplication/TestApplication.csproj
+++ b/Examples/TestApplication/TestApplication.csproj
@@ -1,14 +1,14 @@
-
+
- $(DefaultTargetFramework)
- Exe
+ netstandard2.0;net7.0-windows;net8.0-windows
+ Exe
-
+
diff --git a/RawDiskLib.sln b/RawDiskLib.sln
index d90728a..d6f64de 100644
--- a/RawDiskLib.sln
+++ b/RawDiskLib.sln
@@ -1,69 +1,69 @@
-Microsoft Visual Studio Solution File, Format Version 12.00
-# Visual Studio Version 16
-VisualStudioVersion = 16.0.31105.61
-MinimumVisualStudioVersion = 10.0.40219.1
-Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "RawDiskLib", "RawDiskLib\RawDiskLib.csproj", "{C2D3D361-FD53-4928-8467-72AAD5C63D24}"
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Examples", "Examples", "{C5A63324-038D-442A-A4E3-A73260C5A19C}"
-EndProject
-Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "TestApplication", "Examples\TestApplication\TestApplication.csproj", "{0D4905FB-6E29-4ADF-90B7-C560B962F3F0}"
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{D10F43F9-0CDD-4918-8FC8-8FCAF2DE31B3}"
- ProjectSection(SolutionItems) = preProject
- appveyor.yml = appveyor.yml
- Directory.Build.props = Directory.Build.props
- README.md = README.md
- EndProjectSection
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "_Imports", "_Imports", "{85DFF48C-8580-486C-9ADF-47946BFBD1E1}"
- ProjectSection(SolutionItems) = preProject
- _Imports\Local.targets = _Imports\Local.targets
- _Imports\Test.targets = _Imports\Test.targets
- EndProjectSection
-EndProject
-Global
- GlobalSection(SolutionConfigurationPlatforms) = preSolution
- Debug|Any CPU = Debug|Any CPU
- Debug|x64 = Debug|x64
- Debug|x86 = Debug|x86
- Release|Any CPU = Release|Any CPU
- Release|x64 = Release|x64
- Release|x86 = Release|x86
- EndGlobalSection
- GlobalSection(ProjectConfigurationPlatforms) = postSolution
- {C2D3D361-FD53-4928-8467-72AAD5C63D24}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {C2D3D361-FD53-4928-8467-72AAD5C63D24}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {C2D3D361-FD53-4928-8467-72AAD5C63D24}.Debug|x64.ActiveCfg = Debug|Any CPU
- {C2D3D361-FD53-4928-8467-72AAD5C63D24}.Debug|x64.Build.0 = Debug|Any CPU
- {C2D3D361-FD53-4928-8467-72AAD5C63D24}.Debug|x86.ActiveCfg = Debug|Any CPU
- {C2D3D361-FD53-4928-8467-72AAD5C63D24}.Debug|x86.Build.0 = Debug|Any CPU
- {C2D3D361-FD53-4928-8467-72AAD5C63D24}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {C2D3D361-FD53-4928-8467-72AAD5C63D24}.Release|Any CPU.Build.0 = Release|Any CPU
- {C2D3D361-FD53-4928-8467-72AAD5C63D24}.Release|x64.ActiveCfg = Release|Any CPU
- {C2D3D361-FD53-4928-8467-72AAD5C63D24}.Release|x64.Build.0 = Release|Any CPU
- {C2D3D361-FD53-4928-8467-72AAD5C63D24}.Release|x86.ActiveCfg = Release|Any CPU
- {C2D3D361-FD53-4928-8467-72AAD5C63D24}.Release|x86.Build.0 = Release|Any CPU
- {0D4905FB-6E29-4ADF-90B7-C560B962F3F0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {0D4905FB-6E29-4ADF-90B7-C560B962F3F0}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {0D4905FB-6E29-4ADF-90B7-C560B962F3F0}.Debug|x64.ActiveCfg = Debug|Any CPU
- {0D4905FB-6E29-4ADF-90B7-C560B962F3F0}.Debug|x64.Build.0 = Debug|Any CPU
- {0D4905FB-6E29-4ADF-90B7-C560B962F3F0}.Debug|x86.ActiveCfg = Debug|Any CPU
- {0D4905FB-6E29-4ADF-90B7-C560B962F3F0}.Debug|x86.Build.0 = Debug|Any CPU
- {0D4905FB-6E29-4ADF-90B7-C560B962F3F0}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {0D4905FB-6E29-4ADF-90B7-C560B962F3F0}.Release|Any CPU.Build.0 = Release|Any CPU
- {0D4905FB-6E29-4ADF-90B7-C560B962F3F0}.Release|x64.ActiveCfg = Release|Any CPU
- {0D4905FB-6E29-4ADF-90B7-C560B962F3F0}.Release|x64.Build.0 = Release|Any CPU
- {0D4905FB-6E29-4ADF-90B7-C560B962F3F0}.Release|x86.ActiveCfg = Release|Any CPU
- {0D4905FB-6E29-4ADF-90B7-C560B962F3F0}.Release|x86.Build.0 = Release|Any CPU
- EndGlobalSection
- GlobalSection(SolutionProperties) = preSolution
- HideSolutionNode = FALSE
- EndGlobalSection
- GlobalSection(NestedProjects) = preSolution
- {0D4905FB-6E29-4ADF-90B7-C560B962F3F0} = {C5A63324-038D-442A-A4E3-A73260C5A19C}
- {85DFF48C-8580-486C-9ADF-47946BFBD1E1} = {D10F43F9-0CDD-4918-8FC8-8FCAF2DE31B3}
- EndGlobalSection
- GlobalSection(ExtensibilityGlobals) = postSolution
- SolutionGuid = {10FC3F59-4D76-411E-B2E8-89A0D096B85F}
- EndGlobalSection
-EndGlobal
+Microsoft Visual Studio Solution File, Format Version 12.00
+# Visual Studio Version 16
+VisualStudioVersion = 16.0.31105.61
+MinimumVisualStudioVersion = 10.0.40219.1
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "RawDiskLib", "RawDiskLib\RawDiskLib.csproj", "{C2D3D361-FD53-4928-8467-72AAD5C63D24}"
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Examples", "Examples", "{C5A63324-038D-442A-A4E3-A73260C5A19C}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "TestApplication", "Examples\TestApplication\TestApplication.csproj", "{0D4905FB-6E29-4ADF-90B7-C560B962F3F0}"
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{D10F43F9-0CDD-4918-8FC8-8FCAF2DE31B3}"
+ ProjectSection(SolutionItems) = preProject
+ appveyor.yml = appveyor.yml
+ Directory.Build.props = Directory.Build.props
+ README.md = README.md
+ EndProjectSection
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "_Imports", "_Imports", "{85DFF48C-8580-486C-9ADF-47946BFBD1E1}"
+ ProjectSection(SolutionItems) = preProject
+ _Imports\Local.targets = _Imports\Local.targets
+ _Imports\Test.targets = _Imports\Test.targets
+ EndProjectSection
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ Debug|Any CPU = Debug|Any CPU
+ Debug|x64 = Debug|x64
+ Debug|x86 = Debug|x86
+ Release|Any CPU = Release|Any CPU
+ Release|x64 = Release|x64
+ Release|x86 = Release|x86
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {C2D3D361-FD53-4928-8467-72AAD5C63D24}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {C2D3D361-FD53-4928-8467-72AAD5C63D24}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {C2D3D361-FD53-4928-8467-72AAD5C63D24}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {C2D3D361-FD53-4928-8467-72AAD5C63D24}.Debug|x64.Build.0 = Debug|Any CPU
+ {C2D3D361-FD53-4928-8467-72AAD5C63D24}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {C2D3D361-FD53-4928-8467-72AAD5C63D24}.Debug|x86.Build.0 = Debug|Any CPU
+ {C2D3D361-FD53-4928-8467-72AAD5C63D24}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {C2D3D361-FD53-4928-8467-72AAD5C63D24}.Release|Any CPU.Build.0 = Release|Any CPU
+ {C2D3D361-FD53-4928-8467-72AAD5C63D24}.Release|x64.ActiveCfg = Release|Any CPU
+ {C2D3D361-FD53-4928-8467-72AAD5C63D24}.Release|x64.Build.0 = Release|Any CPU
+ {C2D3D361-FD53-4928-8467-72AAD5C63D24}.Release|x86.ActiveCfg = Release|Any CPU
+ {C2D3D361-FD53-4928-8467-72AAD5C63D24}.Release|x86.Build.0 = Release|Any CPU
+ {0D4905FB-6E29-4ADF-90B7-C560B962F3F0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {0D4905FB-6E29-4ADF-90B7-C560B962F3F0}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {0D4905FB-6E29-4ADF-90B7-C560B962F3F0}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {0D4905FB-6E29-4ADF-90B7-C560B962F3F0}.Debug|x64.Build.0 = Debug|Any CPU
+ {0D4905FB-6E29-4ADF-90B7-C560B962F3F0}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {0D4905FB-6E29-4ADF-90B7-C560B962F3F0}.Debug|x86.Build.0 = Debug|Any CPU
+ {0D4905FB-6E29-4ADF-90B7-C560B962F3F0}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {0D4905FB-6E29-4ADF-90B7-C560B962F3F0}.Release|Any CPU.Build.0 = Release|Any CPU
+ {0D4905FB-6E29-4ADF-90B7-C560B962F3F0}.Release|x64.ActiveCfg = Release|Any CPU
+ {0D4905FB-6E29-4ADF-90B7-C560B962F3F0}.Release|x64.Build.0 = Release|Any CPU
+ {0D4905FB-6E29-4ADF-90B7-C560B962F3F0}.Release|x86.ActiveCfg = Release|Any CPU
+ {0D4905FB-6E29-4ADF-90B7-C560B962F3F0}.Release|x86.Build.0 = Release|Any CPU
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+ GlobalSection(NestedProjects) = preSolution
+ {0D4905FB-6E29-4ADF-90B7-C560B962F3F0} = {C5A63324-038D-442A-A4E3-A73260C5A19C}
+ {85DFF48C-8580-486C-9ADF-47946BFBD1E1} = {D10F43F9-0CDD-4918-8FC8-8FCAF2DE31B3}
+ EndGlobalSection
+ GlobalSection(ExtensibilityGlobals) = postSolution
+ SolutionGuid = {10FC3F59-4D76-411E-B2E8-89A0D096B85F}
+ EndGlobalSection
+EndGlobal
diff --git a/RawDiskLib/DiskNumberType.cs b/RawDiskLib/DiskNumberType.cs
index d912fa5..f06a408 100644
--- a/RawDiskLib/DiskNumberType.cs
+++ b/RawDiskLib/DiskNumberType.cs
@@ -1,8 +1,8 @@
-namespace RawDiskLib
-{
- public enum DiskNumberType
- {
- PhysicalDisk,
- Volume,
- }
+namespace RawDiskLib
+{
+ public enum DiskNumberType
+ {
+ PhysicalDisk,
+ Volume,
+ }
}
\ No newline at end of file
diff --git a/RawDiskLib/Helpers/PlatformShim.cs b/RawDiskLib/Helpers/PlatformShim.cs
index 543e46b..9413dd2 100644
--- a/RawDiskLib/Helpers/PlatformShim.cs
+++ b/RawDiskLib/Helpers/PlatformShim.cs
@@ -6,8 +6,27 @@
namespace RawDiskLib.Helpers
{
- internal static class PlatformShim
+ internal static partial class PlatformShim
{
+#if NET7_0_OR_GREATER
+ [LibraryImport("kernel32.dll", EntryPoint = "CreateFileW", SetLastError = true, StringMarshalling = StringMarshalling.Utf16)]
+ private static partial SafeFileHandle CreateFile(
+ string lpFileName,
+ FileAccess dwDesiredAccess,
+ FileShare dwShareMode,
+ IntPtr lpSecurityAttributes,
+ FileMode dwCreationDisposition,
+ FileAttributes dwFlagsAndAttributes,
+ IntPtr hTemplateFile);
+
+ [LibraryImport("kernel32.dll", EntryPoint = "GetDiskFreeSpaceW", SetLastError = true, StringMarshalling = StringMarshalling.Utf16)]
+ [return: MarshalAs(UnmanagedType.Bool)]
+ internal static partial bool GetDiskFreeSpace(string lpRootPathName,
+ out uint lpSectorsPerCluster,
+ out uint lpBytesPerSector,
+ out uint lpNumberOfFreeClusters,
+ out uint lpTotalNumberOfClusters);
+#else
[DllImport("kernel32.dll", SetLastError = true, CharSet = CharSet.Unicode)]
private static extern SafeFileHandle CreateFile(
string lpFileName,
@@ -24,6 +43,7 @@ internal static extern bool GetDiskFreeSpace(string lpRootPathName,
out uint lpBytesPerSector,
out uint lpNumberOfFreeClusters,
out uint lpTotalNumberOfClusters);
+#endif
public static SafeFileHandle CreateDeviceHandle(string path, FileAccess access)
{
diff --git a/RawDiskLib/Helpers/Win32Helper.cs b/RawDiskLib/Helpers/Win32Helper.cs
index 965bad6..50981ee 100644
--- a/RawDiskLib/Helpers/Win32Helper.cs
+++ b/RawDiskLib/Helpers/Win32Helper.cs
@@ -1,53 +1,58 @@
-using System;
-using System.Collections.Generic;
-using System.Runtime.InteropServices;
-using System.Text;
-
-namespace RawDiskLib.Helpers
-{
- internal static class Win32Helper
- {
- private const int ERROR_INSUFFICIENT_BUFFER = 122;
- private const int ERROR_SUCCSS = 0;
-
- [DllImport("kernel32.dll", SetLastError = true)]
- private static extern int QueryDosDevice(string lpDeviceName, byte[] lpTargetPath, int ucchMax);
-
- public static string[] GetAllDevices()
- {
- int returnSize;
-
- byte[] bytes = new byte[16000];
- do
- {
- returnSize = QueryDosDevice(null, bytes, bytes.Length);
- int error = Marshal.GetLastWin32Error();
-
- if (returnSize > 0 || error == ERROR_SUCCSS)
- break;
-
- if (error != ERROR_INSUFFICIENT_BUFFER)
- throw new Exception("Unable to query DOS devices");
-
- bytes = new byte[bytes.Length * 2];
- } while (true);
-
- // Parse as list of null-seperated ANSI strings
- List res = new List();
- StringBuilder sb = new StringBuilder(200);
-
- for (int i = 0; i < returnSize; i++)
- {
- if (bytes[i] != 0)
- sb.Append((char)bytes[i]);
- else if (bytes[i] == 0 && sb.Length > 0)
- {
- res.Add(sb.ToString());
- sb.Clear();
- }
- }
-
- return res.ToArray();
- }
- }
-}
+using System;
+using System.Collections.Generic;
+using System.Runtime.InteropServices;
+using System.Text;
+
+namespace RawDiskLib.Helpers
+{
+ internal static partial class Win32Helper
+ {
+ private const int ERROR_INSUFFICIENT_BUFFER = 122;
+ private const int ERROR_SUCCSS = 0;
+
+#if NET7_0_OR_GREATER
+ [LibraryImport("kernel32.dll", EntryPoint = "QueryDosDeviceW", SetLastError = true, StringMarshalling = StringMarshalling.Utf16)]
+ private static partial int QueryDosDevice(string lpDeviceName, char[] lpTargetPath, int ucchMax);
+#else
+ [DllImport("kernel32.dll", EntryPoint = "QueryDosDeviceW", SetLastError = true, CharSet = CharSet.Unicode)]
+ private static extern int QueryDosDevice(string lpDeviceName, char[] lpTargetPath, int ucchMax);
+#endif
+
+ public static string[] GetAllDevices()
+ {
+ int returnSize;
+
+ char[] chars = new char[16000];
+ do
+ {
+ returnSize = QueryDosDevice(null, chars, chars.Length);
+ int error = Marshal.GetLastWin32Error();
+
+ if (returnSize > 0 || error == ERROR_SUCCSS)
+ break;
+
+ if (error != ERROR_INSUFFICIENT_BUFFER)
+ throw new Exception("Unable to query DOS devices");
+
+ chars = new char[chars.Length * 2];
+ } while (true);
+
+ // Parse as list of null-seperated UTF-16 strings
+ List res = new List();
+ StringBuilder sb = new StringBuilder(200);
+
+ for (int i = 0; i < returnSize; i++)
+ {
+ if (chars[i] != '\0')
+ sb.Append(chars[i]);
+ else if (sb.Length > 0)
+ {
+ res.Add(sb.ToString());
+ sb.Clear();
+ }
+ }
+
+ return res.ToArray();
+ }
+ }
+}
diff --git a/RawDiskLib/RawDiskLib.csproj b/RawDiskLib/RawDiskLib.csproj
index 018a467..46bcfee 100644
--- a/RawDiskLib/RawDiskLib.csproj
+++ b/RawDiskLib/RawDiskLib.csproj
@@ -1,7 +1,8 @@
- netstandard1.3;netstandard2.0
+ netstandard2.0;net7.0-windows;net8.0-windows
+ true
Library to read and write to raw disks in Windows, something that can be tricky from time to time
Raw-disk;Disk
@@ -10,9 +11,4 @@
-
-
-
-
-