簡體   English   中英

無法將結構的元帥指針轉換回struct

[英]Can't convert a Marshal pointer of a struct back to struct

我正在編寫與驅動程序通信的Windows服務的代碼,因此,我試圖通過測試將結構傳遞給它,並獲得返回的結構。

在C ++中,這是可行的,但是在C#中,我無法使用Marshal將IntPtr轉換為Struct,這就是為什么我無法從驅動程序返回結構的原因。

結構:

[StructLayout(LayoutKind.Sequential)]
struct TestEst
{
    public int value;
}

然后在我的驅動程序中:

typedef struct _TEST_EST
{
    int value;
} TEST_EST, *PTEST_EST;

通過IOCTL傳遞結構的代碼是:

void SendIOCTL<T>(IntPtr hDevice, uint dwIoControlCode, ref T inObj, ref T outObj)
    {
        IntPtr inPointer = IntPtr.Zero;
        IntPtr outPointer = IntPtr.Zero;
        int inObjSize = 0;
        int outObjSize = 0;
        uint bytesReturned = 0;

        if(inObj != null)
        {
            inObjSize = Marshal.SizeOf(inObj.GetType());
            inPointer = Marshal.AllocHGlobal(inObjSize);
            Marshal.StructureToPtr(inObj, inPointer, false);

            if (dwIoControlCode == TEST_CTL) // the TEST IOCTL
            {
                TestEst lets = new TestEst();

                Logger.Log("IsNull: " + (inPointer == IntPtr.Zero));
                Logger.Log("SizeObj: " + inObjSize);

                Marshal.PtrToStructure(inPointer, lets);
                Logger.Log("Working!: " + lets.value);
            }
        }
    }



public void SendTest()
    {
        TestEst request = new TestEst();
        TestEst result = new TestEst();

        request.value = 30;

        SendIOCTL(hDriver, TEST_CTL, ref request, ref result);

        Logger.Log("RA: " + result.value + " " + request.value);
    }

Logger.Log()只需將一個條目寫入Windows事件查看器。

我省略了實際的DeviceIoControl,因為這不是失敗的地方,發生的是

Marshal.PtrToStructure(inPointer, lets);

導致我的服務在日志中顯示此內容:

Windows事件查看器

而且inPointer不為null,inObjSize為4

我還嘗試過從SendIOCTL中刪除T,A並僅放置T,但這是相同的。

提前致謝

要編組結構指針,請使用此方法

var test = (T) Marshal.PtrToStructure(inPointer, typeof(T));

完成分配的內存塊后,不要忘了使用Marshal.FreeHGlobal(inPointer)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM