gpt4 book ai didi

基于体系结构的 C# 结构行为

转载 作者:可可西里 更新时间:2023-11-01 09:19:38 27 4
gpt4 key购买 nike

我有一个问题,关于根据编译架构将多个结构输入一个方法,或关于正确布置 Thread_Basic_Information 结构,这样我就可以对相同的方法使用单个结构,而不管 x64/x86(参见引用:https://msdn.microsoft.com/en-us/library/windows/desktop/ms684283(v=vs.85).aspx)

我已经确认它在 x86 上工作正常,如果我手动切换结构,它也适用于 x64。然而,我最近尝试改变我的方法,从仅仅复制粘贴大量函数到尝试回收我的代码。

我很难找到关于所讨论结构的精确信息,我可以在 C# 中使用它来使其兼容,而不管 x86/x64,或者根据体系结构将 2 个不同的结构输入到相同的方法中.

也许 StructLayout 包大小?但是我不熟悉该属性。

我希望有一种方法可以泛化它,例如如果 IntPtr.Size == 8 则使用 64 位结构,否则使用 32 位结构。无论是否复制粘贴代码并进行较小的重命名,我都希望有一种方法可以使用泛型来做到这一点?

代码:

创建线程的方法:

public IRemoteThread Create(IntPtr address, bool isStarted = true)
{
//Create the thread
var thr = ThreadHelper.CreateRemoteThread(Process.Handle, address, IntPtr.Zero, ThreadCreationFlags.Suspended)
//Acquire desired information from the thread
var ret = ThreadHelper.NtQueryInformationThread(thr);

// Do other stuff
return result;
}

支持查询我们想要的线程信息的方法:

public static ThreadBasicInformation NtQueryInformationThread(SafeMemoryHandle threadHandle)
{
// Check if the handle is valid
HandleManipulator.ValidateAsArgument(threadHandle, "threadHandle");

// Create a structure to store thread info
var info = new ThreadBasicInformation();

// Get the thread info
var ret = Nt.NtQueryInformationThread(threadHandle, 0, ref info, MarshalType<ThreadBasicInformation>.Size,
IntPtr.Zero);

// If the function succeeded
if (ret == 0)
return info;

// Else, couldn't get the thread info, throws an exception
throw new ApplicationException($"Couldn't get the information from the thread, error code '{ret}'.");
}

上述方法中使用的32位结构体:

[StructLayout(LayoutKind.Sequential)]
public struct ThreadBasicInformation
{
public uint ExitStatus;

public IntPtr TebBaseAdress;

public int ProcessId;

public int ThreadId;

public uint AffinityMask;

public uint Priority;

public uint BasePriority;
}

同一结构的 x64 变体

[StructLayout(LayoutKind.Explicit)]
public struct ThreadBasicInformation64
{
[FieldOffset(0)]
public uint ExitStatus;

[FieldOffset(8)]
public IntPtr TebBaseAdress;

[FieldOffset(16)]
public int ProcessId;

[FieldOffset(24)]
public int ThreadId;

[FieldOffset(32)]
public uint AffinityMask;

[FieldOffset(40)]
public uint Priority;

[FieldOffset(44)]
public uint BasePriority;
}

编辑:

我发现的 C 声明:

typedef LONG KPRIORITY; 

typedef struct _CLIENT_ID {
HANDLE UniqueProcess;
HANDLE UniqueThread;
} CLIENT_ID;
typedef CLIENT_ID *PCLIENT_ID;

typedef struct _THREAD_BASIC_INFORMATION
{
NTSTATUS ExitStatus;
PVOID TebBaseAddress;
CLIENT_ID ClientId;
KAFFINITY AffinityMask;
KPRIORITY Priority;
KPRIORITY BasePriority;
} THREAD_BASIC_INFORMATION, *PTHREAD_BASIC_INFORMATION;

最佳答案

你的问题的前提是错误的,因为你错误地翻译了结构。正确翻译它们后,您会发现可以在 C# 代码中使用结构的单个声明,编译器将为所有目标体系结构正确布局。

[StructLayout(LayoutKind.Sequential)]
public struct CLIENT_ID
{
public IntPtr UniqueProcess;
public IntPtr UniqueThread;
}

[StructLayout(LayoutKind.Sequential)]
public struct THREAD_BASIC_INFORMATION
{
public int ExitStatus;
public IntPtr TebBaseAdress;
public CLIENT_ID ClientId;
public IntPtr AffinityMask;
public int Priority;
public int BasePriority;
}

关于基于体系结构的 C# 结构行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37291560/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com