C # P / вызвать выравнивание структуры - PullRequest
3 голосов
/ 11 августа 2009

Я пытаюсь вызвать NtGetContextThread из C # на AMD64. Проблема в том, что структуру CONTEXT для AMD64 необходимо выровнять по 16-байтовой границе, и когда я вызываю NtGetContextThread , я всегда получаю STATUS_DATATYPE_MISALIGNMENT. Мне известно, что C # может выравнивать отдельные элементы структуры с помощью атрибута Pack , но, похоже, он не может выровнять всю структуру. Есть ли способ, которым я мог бы сделать это?

РЕДАКТИРОВАТЬ: Просто чтобы прояснить, я не хочу выравнивать отдельных членов. Я хочу выровнять всю структуру.

Ответы [ 2 ]

2 голосов
/ 13 августа 2009

Из вашего вопроса неясно, полностью ли вы понимаете свойство Pack атрибута StructLayout. См. MSDN статьи для получения дополнительной информации.

Если я вас правильно понимаю, вам нужна возможность явно выравнивать каждый член структуры по отдельности. Если это ваша цель, вы можете сделать это с помощью атрибутов StructLayout и FieldOffset следующим образом:

[StructLayout(LayoutKind.Explicit)]
public struct Message
{
    [FieldOffset(0)]
    public int a;
    [FieldOffset(4)]
    public short b;
    [FieldOffset(6)]
    public int c;
    [FieldOffset(22)] //Leave some empty space just for the heck of it.
    public DateTime dt;

}

Остерегайтесь, однако, что у .NET CF Marshaler есть некоторые правила, которые вы можете не ожидать. Например, массивы всегда должны быть выровнены по 4-байтовым границам. Для этой проблемы есть обходных путей , но вы должны знать, что подобные проблемы могут возникать.

0 голосов
/ 28 декабря 2013

Единственный способ найти это - перераспределить указатель и перейти в режим безопасности

Как это:

[StructLayout(LayoutKind.Explicit)]
struct Foo
{
  /* fields go here */
}

var ptrMemory = Marshal.AllocHGlobal(sizeof(Foo)  + 64);
IntPtr ptrAligned = new IntPtr(64 * (((long)ptrMemory + 63) / 64));
MyStructPointer* Foo = (Foo*)ptrAligned;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...