Reputation: 86789
I want to be able to read and write data directly to and from a disk (i.e. at a sector / cluster level) but I've yet to find a suitable tool for doing this under windows.
I've been trying to figure out how to write my own in C#, but the documentation I've found is sparse and only deals with C++ APIs.
Whats the best way of reading /writing directly to / from a drive in C#? (or can anyone recommend me a tool that allows me to read / write directly from a drive?)
Upvotes: 9
Views: 16881
Reputation: 5986
This question comes up on a search for terms related to block device write in .NET, so I'd like to embellish the original answers with some direct links.
First, you'll be using a PInvoke to CreateFile to get a file handle.
PInvoke methods are used to import CreateFile into the .NET environment. MSDN have an example under their discussion of SafeFileHandle. If you want to create c# type for the parameters and return codes of CreateFile, there are some examples on PInvoke
However, you need to decide whether you want to write to physical device or a volume on it. Volumes correspond to partitions on the device. E.g. "\.\PhysicalDrive0" is the physical device, whereas "\.\C:" is the volume.
For details of the the available Win32 devices, use a C# version of QueryDosDevice Background on these Win32 devices, their naming convertion and relationship to O/S objects can be found in "Windows Internals" by Mark Russinovich.
Upvotes: 1
Reputation: 28600
pinvoke.net has a collection of managed code wrappers for essentially all Win32 API's, including those that can talk to the Disk Manager service and perform low level kernel/IO.
Upvotes: 10
Reputation: 47809
Honestly, you probably need to look at Platform Invoke if you want to write this code in C#. It lets you interact with unmanaged platform APIs, which you mentioned is the bulk of the information you've found so far :-)
Upvotes: 3