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);

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

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

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

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

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

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

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