Как маршалировать структуру NDISUIO_QUERY_OID в C #, чтобы выполнить следующую задачу

Привет, я пытаюсь преобразовать C / C ++ Strcut в C # и как заполнить элемент структуры с адресом другой структуры в C #?

C / C ++ Struct выглядит так:

         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);

Получение IoctlResult успеха в C ++;

Мой C # Struct это:

    [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 # ?? а как заменить memcpy как в с ++?

Любые предложения или рекомендации будут полезны .. 🙂

Спасибо 🙂

1

Решение

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_STATS структурировать Data а не после Data,

На более общей ноте вы теперь задавали по существу вопрос семь раз. Я думаю, что вам пора сделать шаг назад и попытаться понять структуру памяти лучше, чем вы в настоящее время. Каждый раз, когда вы задаете вопрос, вы не четко указываете, какой макет вы хотите использовать для своей версии NDISUIO_QUERY_OID структура. Пришло время, чтобы вы получили это в уме.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]