IOCTL_DISK_GET_MEDIA_TYPES
представляется устаревшим и больше не поддерживается. По крайней мере, так на моей ОС (Win7 x64). Попытка вызова DeviceIoControl
с IOCTL_DISK_GET_MEDIA_TYPES
приводит к коду ошибки 1, ERROR_INVALID_FUNCTION
.
Я считаю, что вам нужно будет использовать IOCTL_STORAGE_GET_MEDIA_TYPES_EX
.
Мой совет в этой ситуации - сначала попытаться вызвать функции API из C ++. Таким образом, вам не нужно бороться с p / invoke, и вы знаете, что все структуры и прототипы функций верны. Как только вы разобрались, как вызывать определенную функцию API, переведите ее в p / invoke.
Кроме того, вам следует быть немного более осторожным в отношении ваших вызовов p /. Будьте внимательны, чтобы использовать uint
для соответствия DWORD
, и убедитесь, что вы используете SetLastError=true
, чтобы вы могли запросить код ошибки с помощью Marshal.GetLastWin32Error()
.
Примерно так:
[DllImport("kernel32.dll", SetLastError=true)]
public static extern IntPtr CreateFile(
string lpFileName, uint dwDesiredAccess, uint dwShareMode,
IntPtr lpSecurityAttributes, uint dwCreationDisposition,
uint dwFlagsAndAttributes, IntPtr hTemplateFile);
[DllImport("kernel32.dll", SetLastError=true)]
internal static extern bool DeviceIoControl(
IntPtr hDevice, uint dwIoControlCode, IntPtr lpInBuffer,
uint nInBufferSize, IntPtr lpOutBuffer, uint nOutBufferSize,
ref uint lpBytesReturned, IntPtr lpOverlapped);