2016-04-07 4 views
0

я получаю следующее сообщение об ошибке при разблокировании файлАрифметические операции привело к переполнению с #

Арифметические операции привело к переполнению

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

Update

Я добавил код win32 Apis.

Ниже приведены правильные ответы и машина 64-бит. Но я не могу воспроизвести его на dev-сервере, несмотря на то, что среда dev составляет 64 бит. Любые идеи воспроизвести ошибку?

+0

Ваш пример кода оленья кожа не говоря уже о ToInt64 я думаю, что в результате это может быть очень трудно любой из нас, чтобы воспроизвести его, если вы тоже не можете, и у вас есть весь ваш код. – BugFinder

+0

@BugFinder Я обновил код, чтобы включить код win32 – H20rider

ответ

3

Ошибка вызвана код работает в битовом контексте 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))); 
+0

Спасибо CodeCaster. Я собираюсь обновить проект. У меня возникли проблемы с воспроизведением ошибки. Я попытался изменить целевую платформу на x64 без ведома ошибки. Но я использую iis express – H20rider

+0

Спасибо. Я был выпущен на производство в течение месяца без каких-либо проблем. Мне потребовалось некоторое время, чтобы проверить, так как я не мог реплицировать – H20rider

1

Я вижу две ошибки в коде сразу:

  1. Вы устанавливаете pBuffer 0, и никогда не выделять его. Это должно быть ошибка при передаче его NetFileEnum, хотя это функция Win32 API, поэтому она может не заметить.

  2. Вы конвертировать пиксельный буфер .ToInt32(), который должен работу при компиляции для x86 специально, но если у вас есть Любой процессор или x64 в качестве целевой платформы, это будет проблемой также.

+0

Из [NetFileEnum] (https://msdn.microsoft.com/en-us/library/windows/desktop/bb525378.aspx): * "bufptr [out]: [ ...] Этот буфер выделяется системой [...] "* – IInspectable

+0

Matt - это приложение asp.net. Что вы предлагаете сделать, чтобы решить эту проблему. – H20rider

 Смежные вопросы

  • Нет связанных вопросов^_^