算术运算导致溢出c#

时间:2016-04-07 13:53:06

标签: c# winapi win32-process

解锁文件时出现以下错误

  

算术运算导致溢出

     

System.IntPtr.ToInt32

我怀疑它是pBuffer.ToInt32()的以下行:

IntPtr iPtr = new IntPtr(pBuffer.ToInt32() + (i * Marshal.SizeOf(fi3)));

我无法自行重现错误,错误未显示正确的行号。我正在寻找一种方法来重现这个或任何有关可能原因的反馈。感谢

public void Close()
{
        const int MAX_PREFERRED_LENGTH = -1;
        int readEntries;
        int totalEntries;
        IntPtr pBuffer = IntPtr.Zero;
        FILE_INFO_3 fi3 = new FILE_INFO_3();
        int iStatus = NetFileEnum(this.HostName, this.HostPathToShare + this.FileNameFromShare, null, 3, ref pBuffer, MAX_PREFERRED_LENGTH, out readEntries, out totalEntries, pBuffer);
        if (iStatus == 0)
        {
            for (int i = 0; i < readEntries; i++)
            {
                IntPtr iPtr = new IntPtr(pBuffer.ToInt32() + (i * Marshal.SizeOf(fi3)));
                fi3 = (FILE_INFO_3)Marshal.PtrToStructure(iPtr, typeof(FILE_INFO_3));
                NetFileClose(this.HostName, fi3.fi3_id);
            }
        }
        NetApiBufferFree(pBuffer);
}

[DllImport("netapi32.dll", SetLastError=true, CharSet = CharSet.Unicode)]
static extern int NetFileClose(
    string servername,
    int id);

[DllImport("Netapi32.dll", SetLastError=true)]
static extern int NetApiBufferFree(IntPtr Buffer);

[DllImport("netapi32.dll", SetLastError=true, CharSet=CharSet.Unicode)]
static extern int NetFileEnum(
     string servername,
     string basepath,
     string username,
     int level,
     ref IntPtr bufptr,
     int prefmaxlen,
     out int entriesread,
     out int totalentries,
     IntPtr resume_handle
);

更新

我添加了win32 apis代码。

以下答案看起来正确,机器是64位。但是我无法在开发服务器上重现它,尽管dev环境是64位。有没有重现错误的想法?

2 个答案:

答案 0 :(得分:4)

错误是由您的代码在64位上下文中运行并返回一个位于32位可寻址范围之外的指针地址引起的,因此.ToInt32()会抛出。

调用Environment.Is64BitProcess检测您的进程是以32位还是64位运行,并相应地转换地址:

long pointerAddress;

if (Environment.Is64BitProcess)
{
    pointerAddress = pBuffer.ToInt64(); 
}
else
{
    pointerAddress = pBuffer.ToInt32(); 
}

var fileInfoPointer = new IntPtr(pointerAddress + (i * Marshal.SizeOf(fi3)));

答案 1 :(得分:1)

我发现代码中有两个错误:

  1. 您将pBuffer设置为0,从不实际分配它。将传递给NetFileEnum错误,尽管这是一个Win32 API函数,因此可能不会注意到。

  2. 转换pBuffer .ToInt32(),其中应该专门为x86编译时工作,但是如果您有任何CPU或x64作为目标平台,那么这将是一个问题也在。