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

子:

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

バイトオーダーでおかしなことはありますか?

4

2 に答える 2

0

問題は主に不適切な構造体の配置にあり、サイズが異なります。しかし、何らかの理由で、サイズが同じ場合でも、int32、int64 の場合、転送時にデータに損傷を与え続けるようです (たとえば、最後の DBGPRINT は保存された値を正しく出力します)。強制的に使わせてもらいました

  long startTime;
  long padding;

C# の long として適切な値を受け取るには、その値をマーシャリングする他の方法は失敗しました。それ以外の場合は、後で完成したサンプルを投稿します-質問は閉じられます。

于 2011-12-12T08:06:48.733 に答える
0

LARGE_INTEGER64 ビットの符号付き整数を表します。あなたの問題はUInt64の代わりに使用することから来ると思いますInt64

于 2011-12-11T09:08:03.153 に答える