gpt4 book ai didi

c# - 如何在 C# 中编码 NDISUIO_QUERY_OID 结构以执行以下任务

转载 作者:太空宇宙 更新时间:2023-11-04 11:37:17 24 4
gpt4 key购买 nike

您好,我正在尝试将 C/C++ Strcut 转换为 C#,以及如何使用 C# 中的另一个结构的地址填充结构成员?

C/C++ 结构看起来像:

         typedef struct _NDISUIO_QUERY_OID
{
NDIS_OID Oid;
PTCHAR ptcDeviceName;
UCHAR Data[sizeof(ULONG)];
} NDISUIO_QUERY_OID, *PNDISUIO_QUERY_OID;

typedef struct My_Struct
{
//leT's have 2 variables...
UINT a;
UINT b;
//sTRUCT may have many no.of variables depending upon the requirement
}My_STATS, *PMy_STATS;

PNDISUIO_QUERY_OID pQueryOid = NULL;

pQueryOid = (PNDISUIO_QUERY_OID)malloc(sizeof(NDISUIO_QUERY_OID)+ sizeof(My_STATS)) ;

PMy_STATS Statistics;
pQueryOid->Oid = ulOIDCode;//Required OID
pQueryOid->ptcDeviceName = AUB_NAME;//REquired STRING

memcpy(pQueryOid->Data, Statistics, sizeof(My_STATS));

IoctlResult = DeviceIoControl(
handle,
IOCTL_NDISUIO_QUERY_OID_VALUE,
pQueryOid,
sizeof(NDISUIO_QUERY_OID)+ sizeof(My_STATS),
pQueryOid,
sizeof(NDISUIO_QUERY_OID)+ sizeof(My_STATS),
&dwReturnedBytes,
NULL);

在 C++ 中获得 IoctlResult 成功;

我的 C# 结构是:

    [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]           
public struct _NDISUIO_QUERY_OID
{
public uint Oid;
[MarshalAs(UnmanagedType.LPWStr)]
public string ptcDeviceName;
[MarshalAs(UnmanagedType.ByValArray,SizeConst = sizeof(uint))]
public byte[] Data;
};

My_STATS Sta_Conn_Info = new My_STATS();
_NDISUIO_QUERY_OID QueryOid = new _NDISUIO_QUERY_OID();

QueryOid.Oid = ulOIDCode; // required OID
QueryOid.ptcDeviceName = STRING;//Required String

//Imported coredll.dll with required prototype for this.
IoctlResult = DeviceIoControl(
handle,
IOCTL_NDISUIO_QUERY_OID_VALUE,
ref QueryOid,
sizeof(NDISUIO_QUERY_OID)+ sizeof(My_STATS),
ref QueryOid,
sizeof(NDISUIO_QUERY_OID)+ sizeof(My_STATS),
ref dwReturnedBytes,
NULL
);

问题:如何编码 NDISUIO_QUERY 结构以将另一个结构复制到 C# 中的数据成员?以及如何像在 C++ 中那样替换 memcpy?

任何建议或指南都会有所帮助.. :)

谢谢:)

最佳答案

Data 成员不是它看起来的样子。它是一个占位符,结构实际上是可变长度的。我想我会倾向于使用 Marshal.AllocHGlobal 并手动编码。但您似乎更喜欢声明 C# 结构。只要您使用的结构总是相同的,那么您就可以这样声明它:

[StructLayout(LayoutKind.Sequential)]           
public struct NDISUIO_QUERY_OID
{
public uint Oid;
[MarshalAs(UnmanagedType.LPWStr)]
public string ptcDeviceName;
uint a;
uint b;
};

这与您提供的 C++ 代码不太匹配,因为它声明结构的大小为 sizeof(NDISUIO_QUERY_OID)+ sizeof(My_STATS) 但随后复制了 My_STATSData 上构造,而不是在 Data 之后构造。

更笼统地说,您现在基本上已经问了七次问题。我认为您可能是时候退后一步,尝试比现在更好地理解内存布局了。每次你问这个问题时,你都没有清楚地说明你想为你的 NDISUIO_QUERY_OID 结构版本使用什么布局。是时候让你的头脑清楚了。

关于c# - 如何在 C# 中编码 NDISUIO_QUERY_OID 结构以执行以下任务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22664547/

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