Есть ли способ удалить неиспользуемые переменные из структуры? - PullRequest
0 голосов
/ 16 ноября 2018

У меня есть такая структура

[StructLayout(LayoutKind.Sequential)]
internal struct Context
{
    internal uint ContextFlags;

    private readonly IntPtr Dr0;
    private readonly IntPtr Dr1;
    private readonly IntPtr Dr2;
    private readonly IntPtr Dr3;
    private readonly IntPtr Dr6;
    private readonly IntPtr Dr7;

    private readonly FloatingSaveArea FloatingSave;

    private readonly IntPtr SegGs;
    private readonly IntPtr SegFs;
    private readonly IntPtr SegEs;
    private readonly IntPtr SegDs;

    private readonly IntPtr Edi;
    private readonly IntPtr Esi;
    private readonly IntPtr Ebx;
    private readonly IntPtr Edx;
    private readonly IntPtr Ecx;
    private readonly IntPtr Eax;

    private readonly IntPtr Ebp;
    internal IntPtr Eip;
    private readonly IntPtr SegCs;
    private readonly IntPtr EFlags;
    private readonly IntPtr Esp;
    private readonly IntPtr SegSs;

    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 512)]
    private readonly byte[] ExtendedRegisters;
}

Она заполнена данными с использованием следующего метода pinvoke

[DllImport("kernel32.dll")]
internal static extern bool GetThreadContext(IntPtr hThread, ref Context lpContext);

Мне нужен только доступ к переменным ContextFlags и Eip

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

Я также попробовал следующее

[StructLayout(LayoutKind.Explicit)]
internal struct Context
{
    [FieldOffset(0)]
    internal uint ContextFlags;

    [FieldOffset(184)]
    internal IntPtr Eip;
}

Смещение поля 184 происходит от

uint offsetEip = (uint) Marshal.OffsetOf(typeof(Context), "Eip");

Это также не работает

Есть лиспособ достичь этого?Может быть, с помощью класса вместо структуры?

Ответы [ 2 ]

0 голосов
/ 16 ноября 2018

Конечно, это может работать, в конце концов, это просто непрозрачный массив байтов, но вы должны убедиться, что размер всей структуры одинаков и соответствует текущему аппаратному / программному контексту, поэтому просто определите это так для процесса x86:

[StructLayout(LayoutKind.Explicit, Size = 716)] // size is 716 for x86
internal struct X86Context
{
    [FieldOffset(0)]
    internal uint ContextFlags;

    [FieldOffset(184)]
    internal IntPtr Eip;
}
0 голосов
/ 16 ноября 2018

Структура определена в заголовочном файле Windows, чтобы соответствовать функции API Windows, и она предполагает, что вы передаете адрес в выделенную / принадлежащую ячейку памяти того же размера, что и вся структура. Поскольку функция Windows API получает только указатель, она должна предполагать, что вы передали указатель на всю структуру, хотя вы будете использовать только два члена. Вы можете создать свою собственную структуру того же размера, чтобы выставлять только два нужных вам члена.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...