oХотя я согласен, что код ошибки кажется неожиданным, я думаю, проблема в том, что cbSize должен быть установлен в sizeof (SP_DRVINFO_DETAIL_DATA) (это правильный размер C, а не Marshal.SizeOf в вашей структуре p / invoke.)
Быстрый тест с программой на две строки C дает:
ANSI 797
UNICODE 1570
Для двух правильных значений sizeof (вам нужно выяснить, какое из них вам нужно ...)
Для сравнения Marshal.SizeOf(typeof(SP_DRVINFO_DETAIL_DATA))
для вашей структуры дает 1048 как длину.
Я думаю, вам нужно выстроить это в очередь, прежде чем идти дальше.
Я подозреваю, что, возможно, ошибка слишком маленького буфера возвращается, если DriverInfoDetailDataSize слишком мала, но ошибка неверного буфера возвращается, если cbSize неверен.
В справке по SetupDiGetDriverInfoDetail также явным образом указано, что cbSize и DriverInfoDetailDataSize не должны быть одинаковыми значениями (поскольку ANYSIZE_ARRAY определяется как 1 как заполнитель), поэтому не следует ожидать, что Marshal.SizeOf будет работать правильно намеренно негабаритная структура.
Дополнительная коррекция:
Ваш член InfFilename также имеет неправильную длину - структура, которая точно соответствует структуре из SETUPAPI.H:
[StructLayout(LayoutKind.Sequential, Pack = 1, CharSet=CharSet.Unicode)]
internal struct SP_DRVINFO_DETAIL_DATA
{
public Int32 cbSize;
public System.Runtime.InteropServices.ComTypes.FILETIME InfDate;
public Int32 CompatIDsOffset;
public Int32 CompatIDsLength;
public IntPtr Reserved;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 256)]
public String SectionName;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 260)]
public String InfFileName;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 256)]
public String DrvDescription;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 1)]
public String HardwareID;
};
Это дает правильную длину как в версиях ANSI, так и в UNICODE. Однако вы не хотите использовать это как есть, потому что вам нужен HardwareID, чтобы быть длиннее, поэтому вам придется отрегулировать длину и затем использовать Marshal.SizeOf, давая неправильное значение для прямого подключения к cbSize.