Pinvoke Параметры DeviceIoControl

я работаю над проектом C #, используяDeviceIoControl, Я'мы консультировались сСтраница Pinvoke.net для моей подписи: я

[DllImport("Kernel32.dll", SetLastError = false, CharSet = CharSet.Auto)]
public static extern bool DeviceIoControl(
    SafeFileHandle hDevice,
    EIOControlCode IoControlCode,

    [MarshalAs(UnmanagedType.AsAny)]
    [In] object InBuffer,
    uint nInBufferSize,

    [MarshalAs(UnmanagedType.AsAny)]
    [Out] object OutBuffer,
    uint nOutBufferSize,

    out uint pBytesReturned,
    [In] IntPtr Overlapped
    );

никогда не виделobject а также[MarshalAs(UnmanagedType.AsAny)] раньше, ноДокументация MSDN звучало многообещающе:

Динамический тип, который определяет тип объекта во время выполнения и маршалирует объект как этот тип. Этот член действителен только для методов вызова платформы.

Мой вопрос: что такое "Лучший" и / или "собственно» способ использования этой подписи?

Например,IOCTL_STORAGE_QUERY_PROPERTY надеетсяInBuffer бытьSTORAGE_PROPERTY_QUERY состав. Кажется, я должен быть в состоянии определить эту структуру, создатьnew экземпляр и передать его в мою подпись Pinvoke:

var query = new STORAGE_PROPERTY_QUERY { PropertyId = 0, QueryType = 0 };
DeviceIoControl(..., query, Marshal.SizeOf(query), ...);

Тем не менее, я только что получилSystem.ExecutionEngineException Делая это, я изменил что-то вроде:

int cb = Marshal.SizeOf(typeof(...));
IntPtr query = Marshal.AllocHGlobal(cb);
...
Marshal.PtrToStructure(...);
Marshal.FreeHGlobal(query);

и это по крайней мере неНе выкидывай никаких исключений, когда я это назвал. Это просто очень уродливо, и, тем не менее, огромная боль в заднице. Можно't маршаллер обрабатывает копирование данных в / из моих локальных структур, как я надеялся?

Выходные данные иногда могут быть хитрыми, потому что они нет структур фиксированного размера. Я понимаю, что маршаллер можетвозможно, я справлюсь с этим автоматически, и яЯ в порядке с HGlobal и копирую бизнес там, где мне нужно.

Дополнительно:

Этот вопрос сначала выглядело полезным, но в итоге оказалось, что это неверная константа.

я не против использованияunsafe строит. (Thefixed-размерstruct члены требуют этого.)

Ответы на вопрос(1)

Ваш ответ на вопрос