jjzjj

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

coder 2024-06-04 原文

我有一个问题,关于根据编译架构将多个结构输入一个方法, 或关于正确布置 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/

有关基于体系结构的 C# 结构行为的更多相关文章

  1. ruby - 使用 ruby​​ 将 HTML 转换为纯文本并维护结构/格式 - 2

    我想将html转换为纯文本。不过,我不想只删除标签,我想智能地保留尽可能多的格式。为插入换行符标签,检测段落并格式化它们等。输入非常简单,通常是格式良好的html(不是整个文档,只是一堆内容,通常没有anchor或图像)。我可以将几个正则表达式放在一起,让我达到80%,但我认为可能有一些现有的解决方案更智能。 最佳答案 首先,不要尝试为此使用正则表达式。很有可能你会想出一个脆弱/脆弱的解决方案,它会随着HTML的变化而崩溃,或者很难管理和维护。您可以使用Nokogiri快速解析HTML并提取文本:require'nokogiri'h

  2. ruby - 如何根据特征实现 FactoryGirl 的条件行为 - 2

    我有一个用户工厂。我希望默认情况下确认用户。但是鉴于unconfirmed特征,我不希望它们被确认。虽然我有一个基于实现细节而不是抽象的工作实现,但我想知道如何正确地做到这一点。factory:userdoafter(:create)do|user,evaluator|#unwantedimplementationdetailshereunlessFactoryGirl.factories[:user].defined_traits.map(&:name).include?(:unconfirmed)user.confirm!endendtrait:unconfirmeddoenden

  3. c# - 如何在 ruby​​ 中调用 C# dll? - 2

    如何在ruby​​中调用C#dll? 最佳答案 我能想到几种可能性:为您的DLL编写(或找人编写)一个COM包装器,如果它还没有,则使用Ruby的WIN32OLE库来调用它;看看RubyCLR,其中一位作者是JohnLam,他继续在Microsoft从事IronRuby方面的工作。(估计不会再维护了,可能不支持.Net2.0以上的版本);正如其他地方已经提到的,看看使用IronRuby,如果这是您的技术选择。有一个主题是here.请注意,最后一篇文章实际上来自JohnLam(看起来像是2009年3月),他似乎很自在地断言RubyCL

  4. C# 到 Ruby sha1 base64 编码 - 2

    我正在尝试在Ruby中复制Convert.ToBase64String()行为。这是我的C#代码:varsha1=newSHA1CryptoServiceProvider();varpasswordBytes=Encoding.UTF8.GetBytes("password");varpasswordHash=sha1.ComputeHash(passwordBytes);returnConvert.ToBase64String(passwordHash);//returns"W6ph5Mm5Pz8GgiULbPgzG37mj9g="当我在Ruby中尝试同样的事情时,我得到了相同sha

  5. ruby - 是否有用于序列化和反序列化各种格式的对象层次结构的模式? - 2

    给定一个复杂的对象层次结构,幸运的是它不包含循环引用,我如何实现支持各种格式的序列化?我不是来讨论实际实现的。相反,我正在寻找可能会派上用场的设计模式提示。更准确地说:我正在使用Ruby,我想解析XML和JSON数据以构建复杂的对象层次结构。此外,应该可以将该层次结构序列化为JSON、XML和可能的HTML。我可以为此使用Builder模式吗?在任何提到的情况下,我都有某种结构化数据-无论是在内存中还是文本中-我想用它来构建其他东西。我认为将序列化逻辑与实际业务逻辑分开会很好,这样我以后就可以轻松支持多种XML格式。 最佳答案 我最

  6. 叮咚买菜基于 Apache Doris 统一 OLAP 引擎的应用实践 - 2

    导读:随着叮咚买菜业务的发展,不同的业务场景对数据分析提出了不同的需求,他们希望引入一款实时OLAP数据库,构建一个灵活的多维实时查询和分析的平台,统一数据的接入和查询方案,解决各业务线对数据高效实时查询和精细化运营的需求。经过调研选型,最终引入ApacheDoris作为最终的OLAP分析引擎,Doris作为核心的OLAP引擎支持复杂地分析操作、提供多维的数据视图,在叮咚买菜数十个业务场景中广泛应用。作者|叮咚买菜资深数据工程师韩青叮咚买菜创立于2017年5月,是一家专注美好食物的创业公司。叮咚买菜专注吃的事业,为满足更多人“想吃什么”而努力,通过美好食材的供应、美好滋味的开发以及美食品牌的孵

  7. 基于C#实现简易绘图工具【100010177】 - 2

    C#实现简易绘图工具一.引言实验目的:通过制作窗体应用程序(C#画图软件),熟悉基本的窗体设计过程以及控件设计,事件处理等,熟悉使用C#的winform窗体进行绘图的基本步骤,对于面向对象编程有更加深刻的体会.Tutorial任务设计一个具有基本功能的画图软件**·包括简单的新建文件,保存,重新绘图等功能**·实现一些基本图形的绘制,包括铅笔和基本形状等,学习橡皮工具的创建**·设计一个合理舒适的UI界面**注明:你可能需要先了解一些关于winform窗体应用程序绘图的基本知识,以及关于GDI+类和结构的知识二.实验环境Windows系统下的visualstudio2017C#窗体应用程序三.

  8. kvm虚拟机安装centos7基于ubuntu20.04系统 - 2

    需求:要创建虚拟机,就需要给他提供一个虚拟的磁盘,我们就在/opt目录下创建一个10G大小的raw格式的虚拟磁盘CentOS-7-x86_64.raw命令格式:qemu-imgcreate-f磁盘格式磁盘名称磁盘大小qemu-imgcreate-f磁盘格式-o?1.创建磁盘qemu-imgcreate-fraw/opt/CentOS-7-x86_64.raw10G执行效果#ls/opt/CentOS-7-x86_64.raw2.安装虚拟机使用virt-install命令,基于我们提供的系统镜像和虚拟磁盘来创建一个虚拟机,另外在创建虚拟机之前,提前打开vnc客户端,在创建虚拟机的时候,通过vnc

  9. ruby-on-rails - 一般建议和推荐的文件夹结构 - Sinatra - 2

    您将如何构建一个简单的Sinatra应用程序?我正在制作,我希望该应用具有以下功能:“应用程序”更像是一个包含所有信息的管理仪表板。然后另一个应用程序将通过REST访问信息。我还没有创建仪表板,只是从数据库中获取东西session和身份验证(尚未实现)您可以上传图片,其他应用可以显示这些图片我已经使用RSpec创建了一个测试文件通过Prawn生成报告目前的设置是这样的:app.rbtest_app.rb因为我实际上只有应用程序和测试文件。到目前为止,我已经将Datamapper用于ORM,将SQLite用于数据库。这是我的第一个Ruby/Sinatra项目,所以欢迎任何和所有建议-我应

  10. ruby - Ruby gsub 替换中的行为不一致? - 2

    两个gsub产生不同的结果。谁能解释一下为什么?代码也可在https://gist.github.com/franklsf95/6c0f8938f28706b5644d获得.ver=9999str="\tCFBundleDevelopmentRegion\n\ten\n\tCFBundleVersion\n\t0.1.190\n\tAppID\n\t000000000000000"putsstr.gsub/(CFBundleVersion\n\t.*\.).*()/,"#{$1}#{ver}#{$2}"puts'--------'putsstr.gsub/(CFBundleVersio

随机推荐