Значение LARGE_INTEGER изменяется при маршалинге: с LARGE_INTEGER до UINT64 (C) на C # в uint64 - PullRequest
1 голос
/ 11 декабря 2011

Я пытаюсь маршалировать NdisGetCurrentSystemTime результат в программу на C # через ioctl.

LARGE_INTEGER data;
NdisGetCurrentSystemTime (&data );
marshal_data->time = (UINT64)(data.QuadPart / 10^6);
    DBGPRINT(("Time: %64u", marshal_data->time));

На стороне получателя C # поле времени определяется как uint64;есть также пара других полей uint64 в структуре маршала.Однако при выполнении

    String.Format(("Time was {0}", recv_data->time)) 

я получаю неожиданно большое число, которое отличается от числа в DBGPRINT.

C #:

    [StructLayout(LayoutKind.Sequential)]
    ...
    public UInt64 time

C:

    struct _marshalme {
    ... 
    UINT64 time
    ...
    }

Что-нибудь странное с порядком байтов?

Ответы [ 2 ]

0 голосов
/ 12 декабря 2011

Проблема была в основном в неправильном выравнивании структуры, поэтому разные размеры;но по какой-то причине кажется, что он продолжает повреждать данные при передаче (например, последний DBGPRINT печатает сохраненное значение правильно) для случаев int32, int64, даже когда размер одинаков;Я был вынужден использовать

  long startTime;
  long padding;

, чтобы получить правильное значение как длинное C #, другие способы маршалинга этого значения потерпели неудачу.Позже выложу более законченный образец, если не так - вопрос закрыт.

0 голосов
/ 11 декабря 2011

LARGE_INTEGER представляет 64-бит со знаком целое число . Я ожидаю, что ваши проблемы связаны с использованием UInt64 вместо Int64.

...