Во-первых, я скажу, что если вы купите SDF ($ 50), вы получите исходный код для этой функции, который вы могли бы затем вставить в свой проект и запутать.
Если, однако, у вас больше времени, чем денег, и вы хотите реализовать это самостоятельно, я могу указать вам верное направление. Я оставляю вам возможность связать все эти части вместе, но вот шаги:
Во-первых, вы должны открыть том следующим образом:
IntPtr hFile = NativeMethods.CreateFile(
string.Format("{0}\\Vol:", driveName),
NativeMethods.GENERIC_READ, 0, 0, NativeMethods.OPEN_EXISTING, 0, 0);
Это дает вам управление приводом. Затем вы просто вызываете IOCTL, чтобы получить идентификатор хранилища:
byte[] data = new byte[512];
int returned;
int result = NativeMethods.DeviceIoControl(
hFile, IOCTL_DISK_GET_STORAGEID, IntPtr.Zero, 0,
data, data.Length, out returned, IntPtr.Zero);
if (result != 0)
{
m_storageID = STORAGE_IDENTIFICATION.FromBytes(data);
}
Это дает вам двоичное представление STORAGE_IDENTIFICATION структуры. Обратите внимание, что структура на самом деле является только описанием заголовка данных. Он содержит смещение фактических данных серийного номера, которое является строкой ASCII. Извлечение выглядит примерно так:
int snoffset = BitConverter.ToInt32(data, 12);
string sn = Encoding.ASCII.GetString(data, snoffset, data.Length - snoffset);
return sn.TrimEnd(new char[] { '\0' });