- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试在 C# 中重新创建一个将与 Win API 一起使用的结构,这是结构:
typedef struct _LDR_MODULE {
LIST_ENTRY InLoadOrderModuleList;
LIST_ENTRY InMemoryOrderModuleList;
LIST_ENTRY InInitializationOrderModuleList;
PVOID BaseAddress;
PVOID EntryPoint;
ULONG SizeOfImage;
UNICODE_STRING FullDllName;
UNICODE_STRING BaseDllName;
ULONG Flags;
SHORT LoadCount;
SHORT TlsIndex;
LIST_ENTRY HashTableEntry;
ULONG TimeDateStamp;
} LDR_MODULE, *PLDR_MODULE;
我不确定的两个成员是 LIST_ENTRY 和 UNICODE_STRING,我如何在 C# 中模仿它们?
最佳答案
我来晚了,但我只是为了个人“好奇心项目”而这样做 - 签名最终看起来像这样:
[StructLayout(LayoutKind.Sequential, Pack = 0)]
public struct LIST_ENTRY
{
public IntPtr Flink;
public IntPtr Blink;
public ListEntryWrapper Fwd
{
get
{
var fwdAddr = Flink.ToInt32();
return new ListEntryWrapper()
{
Header = Flink.ReadMemory<LIST_ENTRY>(),
Body = new IntPtr(fwdAddr + Marshal.SizeOf(typeof(LIST_ENTRY))).ReadMemory<LDR_MODULE>()
};
}
}
public ListEntryWrapper Back
{
get
{
var fwdAddr = Blink.ToInt32();
return new ListEntryWrapper()
{
Header = Flink.ReadMemory<LIST_ENTRY>(),
Body = new IntPtr(fwdAddr + Marshal.SizeOf(typeof(LIST_ENTRY))).ReadMemory<LDR_MODULE>()
};
}
}
}
[StructLayout(LayoutKind.Sequential, Pack = 0)]
public struct ListEntryWrapper
{
public LIST_ENTRY Header;
public LDR_MODULE Body;
}
[StructLayout(LayoutKind.Sequential)]
public struct UNICODE_STRING : IDisposable
{
public ushort Length;
public ushort MaximumLength;
private IntPtr buffer;
public UNICODE_STRING(string s)
{
Length = (ushort)(s.Length * 2);
MaximumLength = (ushort)(Length + 2);
buffer = Marshal.StringToHGlobalUni(s);
}
public void Dispose()
{
Marshal.FreeHGlobal(buffer);
buffer = IntPtr.Zero;
}
public override string ToString()
{
return Marshal.PtrToStringUni(buffer);
}
}
[StructLayout(LayoutKind.Sequential, Pack = 0)]
public struct PEB_LDR_DATA
{
public int Length;
public int Initialized;
public int SsHandle;
public IntPtr InLoadOrderModuleListPtr;
public IntPtr InMemoryOrderModuleListPtr;
public IntPtr InInitOrderModuleListPtr;
public int EntryInProgress;
public ListEntryWrapper InLoadOrderModuleList { get { return InLoadOrderModuleListPtr.ReadMemory<ListEntryWrapper>(); } }
public ListEntryWrapper InMemoryOrderModuleList { get { return InLoadOrderModuleListPtr.ReadMemory<ListEntryWrapper>(); } }
public ListEntryWrapper InInitOrderModuleList { get { return InLoadOrderModuleListPtr.ReadMemory<ListEntryWrapper>(); } }
}
其中 IntPtr.ReadMemory 只是一个扩展方法:
public static T ReadMemory<T>(this IntPtr atAddress)
{
var ret = (T)Marshal.PtrToStructure(atAddress, typeof (T));
return ret;
}
关于c# - LIST_ENTRY 和 UNICODE_STRING pinvoke C#,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6838302/
如何检查 UNICODE_STRING 结构的缓冲区是否为空?它在访问缓冲区值时崩溃,如果为 null,但当我检查它是否为 null 时,它返回 true。 if ( &struct.name.Buf
我发现在Windows中运行的程序的命令行参数存储在Process Environment block 中。我发现PEB内部有一个名为RTL_USER_PROCESS_PARAMETERS的结构体,它
有一个 UNICODE_STRING,我想检查其中是否有定义的字符(最好是 $ 在末尾)。 我们正在使用 OpenPasswordFilter并想检查提交的帐户是用户还是计算机。如果是计算机,以'$'
我需要将 UNICODE_STRING 结构转换为简单的 NULL TERMINATED STRING。 typedef struct _UNICODE_STRING { USHORT Le
我正在尝试在 C# 中重新创建一个将与 Win API 一起使用的结构,这是结构: typedef struct _LDR_MODULE { LIST_ENTRY InL
以下代码必须能够将每个进程名称添加到 ArrayList,因为当前名称仍未存储在列表中。 ArrayList 实现的代码来自 this reference,但有一个问题,当将 int 更改为 UNIC
我想使用 UNICODE_STRING 中的缓冲区,但似乎我不能通过复制引用直接使用它,因为有时我可以看到字符串中间有空字节,并且 Length 比我在调试器中看到的要大。所以如果我这样做 UNICO
我有一个 UNICODE_STRING,我想将其与以 null 结尾的 ANSI 字符串进行比较,以检查它们是否相同。我正在使用 C。我想避免为 RtlInitUnicodeString 包含 win
我正在尝试分隔 UNICODE_STRING 路径名的组成部分,以便创建从设备根到文件叶的目录树。这需要在 WDK 驱动程序中完成。 我需要使用 ZwCreateFile() 一次构建一个目录结构,因
我是一名优秀的程序员,十分优秀!