2016-04-07 6 views
0

ich die folgende Fehlermeldung erhalten, wenn eine Datei EntriegelnArithmetic Operation führte zu einem Überlauf C#

Rechenoperation in einem Überlauf führte

System.IntPtr.ToInt32

ich es vermuten ist die folgende Zeile zu pBuffer.ToInt32():

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

Ich kann den Fehler nicht selbst reproduzieren und der Fehler zeigt nicht die richtige Zeilennummer an. Ich suche nach einer Möglichkeit, dies zu reproduzieren oder eine Rückmeldung über die mögliche Ursache. Dank

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

aktualisieren

ich hinzugefügt, um die Win32-API-Code.

Die folgenden Antworten sehen korrekt aus und die Maschine ist 64 Bit. Aber ich kann es nicht auf dem Dev-Server reproduzieren, obwohl die Entwicklungsumgebung 64 Bit ist. Irgendwelche Ideen, um den Fehler zu reproduzieren?

+0

nicht Ihr Beispielcode tut einen ToInt64 erwähnt ich als Folge denken könnte es sehr schwierig sein, für Irgendwelche von uns, es zu reproduzieren, wenn Sie nicht können, und Sie haben Ihren ganzen Code. – BugFinder

+0

@BugFinder Ich habe den Code aktualisiert, um den Win32-Code zu enthalten – H20rider

Antwort

3

der Fehler durch den Code ausgeführt wird in einem 64-Bit-Kontext und Zurückgeben eines Zeigeradresse, die mit 32 Bit außerhalb des Bereichs liegt adressierbaren verursacht wird, so wirft .ToInt32().

Anruf Environment.Is64BitProcess zu erkennen, ob Ihr Prozess in 32 oder 64 Bit ausgeführt wird, und wandelt die Adresse entsprechend:

long pointerAddress; 

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

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

Dank CodeCaster. Ich werde das Projekt aktualisieren. Ich habe Probleme, den Fehler zu replizieren. Ich habe versucht, die Zielplattform auf x64 zu ändern, ohne dass der Fehler auftritt. Aber ich benutze Iis Express – H20rider

+0

Danke. Ich wurde für einen Monat ohne Probleme in Produktion genommen. Es dauerte eine Weile, um zu validieren, da ich nicht replizieren konnte – H20rider

1

Ich sehe zwei Fehler im Code direkt an:

  1. Sie setzen Ihre pBuffer auf 0, und es nie wirklich zuordnen. Es sollte Fehler, wenn Sie es an NetFileEnum übergeben, obwohl das eine Win32-API-Funktion ist, so kann es nicht bemerken.

  2. Sie konvertieren pBuffer .ToInt32(), die sollte Arbeit, wenn speziell für x86 kompiliert, aber wenn Sie irgendeine CPU oder x64 als Zielplattform haben, das wird auch ein Problem sein.

+0

Von [NetFileEnum] (https://msdn.microsoft.com/en-us/library/windows/desktop/bb525378.aspx): * "bufptr [out]: [ ...] Dieser Puffer wird vom System zugewiesen [...] "* – IInspectable

+0

Matt - Dies ist eine asp.net-Anwendung. Was schlagen Sie vor, um es zu lösen? – H20rider

Verwandte Themen