1

我尝试NdisGetCurrentSystemTime通过 ioctl 将结果编组到 C# 程序。

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
    ...
    }

字节顺序有什么奇怪的吗?

4

2 回答 2

0

LARGE_INTEGER表示一个64 位有符号整数。我希望您的问题来自使用UInt64而不是Int64.

于 2011-12-11T09:08:03.153 回答
0

问题主要在于结构对齐不当,因此大小不同;但由于某种原因,对于 int32、int64 情况,即使大小相同,它似乎在传输时仍会破坏数据(例如,最后一个 DBGPRINT 正确打印保存的值);我被迫使用

  long startTime;
  long padding;

接收正确的值作为 C# 的 long,其他编组该值的方法失败了。稍后将发布更多完整的示例,除非 - 问题已关闭。

于 2011-12-12T08:06:48.733 回答