如何在32位应用程序中模拟64位指针

问题描述

我有一个用C#编写的32位用户模式应用程序,我需要模拟64位指针的行为。我知道我可以编译为64位,但是我使用的是Directx9 dll,一旦更改目标体系结构,它们将变得不兼容。

我的问题是IntPtr类类型太小,只有4个字节大,并且在与64位内核模式驱动程序进行通信时会引起问题。我需要一个64位指针来匹配驱动程序上的结构。

我的问题是,是否可以在C#应用程序上创建64位指针?有没有包装类可以为我做这件事?

ideally:

IntPtr32 pnt32; //would 4 bytes large
IntPtr64 pnt64; //and this would be 8 bytes large

解决方法

尝试了雷蒙德(Raymond)的建议后,使用long强制使用64位变量,我可以确认虽然确实存在问题,但它确实起作用。

该指针需要做什么的一些背景知识。驱动程序和用户模式应用程序都有一个用于相互发送请求的结构。该结构具有由驱动程序写入并由usermode应用程序发送的void *。请求完成后,它充当用户读取信息的缓冲区。

//NOTE: alot of stuff ommitted for simplicity

T buffer = default;
IntPtr pBuffer = Marshal.AllocHGlobal(Marshal.SizeOf(buffer));
Marshal.StructureToPtr(buffer,pBuffer,false);

//construct struct for the read request
KERNEL_READ_REQUEST ReadRequest = new KERNEL_READ_REQUEST();
ReadRequest.pBuff = pBuffer.ToInt64(); //long type variable in struct

if(DeviceIoControl(&ReadRequest)){ 
    buffer = (T)Marshal.PtrToStructure(pBuffer,typeof(T));

    //return buffer and free memory
    Marshal.FreeHGlobal(pBuffer); //free the memory

    return buffer;
}

我不会将其标记为答案,因为使用冗长的时间存储64位地址并不合适,但我将在这里保留对我有用的内容。