【问题标题】:What is the hex value of PROCESS_CREATION_MITIGATION_POLICY_BLOCK_NON_MICROSOFT_BINARIES_ALWAYS_ON?PROCESS_CREATION_MITIGATION_POLICY_BLOCK_NON_MICROSOFT_BINARIES_ALWAYS_ON 的十六进制值是多少?
【发布时间】:2021-04-27 14:48:09
【问题描述】:

我想在 C# 程序中使用 UpdateProcThreadAttribute() API 调用,但我找不到 PROCESS_CREATION_MITIGATION_POLICY_BLOCK_NON_MICROSOFT_BINARIES_ALWAYS_ON 的十六进制值。根据PInvoke.net,我只能在Microsoft's website 上找到(0x00000001ui64 << 44),但我不知道如何将其实现到我的代码中并将其用作IntPtr

【问题讨论】:

标签: c# .net winapi


【解决方案1】:

在 C/C++ 中,0x00000001ui64 是一个无符号 64 位整数,其值为 1<< 44 将该值左移 44 位。左移相当于乘以 2,因此将1 乘以2 44 次的结果是17592186044416,十六进制为0x100000000000UL,或0x1000_0000_0000UL 以便于阅读。

仅供参考,C# 具有 C/C++ 具有的 same bit-shift operators

LPPROC_THREAD_ATTRIBUTE_LIST 是指向PROC_THREAD_ATTRIBUTE_LIST 结构的指针。调用InitializeProcThreadAttributeList() 1 次以确定该列表需要多大,然后分配该大小的内存,并再次调用InitializeProcThreadAttributeList() 以初始化该列表。

例如(另见.NET : How to PInvoke UpdateProcThreadAttribute):

const int PROC_THREAD_ATTRIBUTE_MITIGATION_POLICY = 0x20007;
const long PROCESS_CREATION_MITIGATION_POLICY_BLOCK_NON_MICROSOFT_BINARIES_ALWAYS_ON = 0x100000000000L;

[DllImport("kernel32.dll", SetLastError=true)]
[return: MarshalAs(UnmanagedType.Bool)]
public static extern bool InitializeProcThreadAttributeList(
     IntPtr lpAttributeList,
     int dwAttributeCount,
     int dwFlags,
     ref IntPtr lpSize);

[DllImport("kernel32.dll", SetLastError=true)]
public static extern bool DeleteProcThreadAttributeList(IntPtr lpAttributeList);

[DllImport("kernel32.dll", SetLastError=true)]
[return: MarshalAs(UnmanagedType.Bool)]
public static extern bool UpdateProcThreadAttribute(
     IntPtr lpAttributeList,
     uint dwFlags,
     IntPtr Attribute,
     IntPtr lpValue,
     IntPtr cbSize,
     IntPtr lpPreviousValue,
     IntPtr lpReturnSize);

...

IntPtr attrListSize = 0;
InitializeProcThreadAttributeList(
    IntPtr.Zero,
    1,
    0,
    ref attrListSize);

IntPtr attrList = Marshal.AllocHGlobal(attrListSize);
InitializeProcThreadAttributeList(
    attrList,
    1,
    0,
    ref attrListSize);

IntPtr lpValue = Marshal.AllocHGlobal(sizeof(long));
Marshal.WriteInt64(lpValue, PROCESS_CREATION_MITIGATION_POLICY_BLOCK_NON_MICROSOFT_BINARIES_ALWAYS_ON);

UpdateProcThreadAttribute(
    attrList,
    0,
    (IntPtr)PROC_THREAD_ATTRIBUTE_MITIGATION_POLICY,
    lpValue,
    sizeof(long),
    IntPtr.Zero,
    IntPtr.Zero
);

// use attrList as needed, ie in STARTUPINFOEX.lpAttributeList ...

DeleteProcThreadAttributeList(attrList);

Marshal.FreeHGlobal(lpValue);
Marshal.FreeHGlobal(attrList);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-09-27
    • 2018-07-26
    • 1970-01-01
    • 2011-12-21
    • 1970-01-01
    • 2015-11-01
    • 2016-08-07
    相关资源
    最近更新 更多