Foro de elhacker.net

Programación => .NET (C#, VB.NET, ASP) => Mensaje iniciado por: **Aincrad** en 9 Enero 2019, 00:52 am



Título: Pantallaso Azul con mi programa.
Publicado por: **Aincrad** en 9 Enero 2019, 00:52 am
hola, he codificado un contador de ping en milisegundos. pero aveces hace que el windows se me crashtee y no se la razon.

a alguien ya le ha salido este error antes? el codigo del error dice > "PROCESS_HAS_LOCKED_PAGES"
 

Imagen de mi app >

(https://i.imgur.com/PvZ0uIl.jpg)



@Elektro  te mando el código por privado, ya que es parte de mi antivirus que ando desarrollando y todavía no publicare código.

gracias de antemano.


Título: Re: Pantallaso Azul con mi programa.
Publicado por: Eleкtro en 9 Enero 2019, 08:46 am
A mi no me aparece ningún BSOD. He probado el programa compilando en modo Debug y Release, terminando el programa de forma normal, terminando de forma abrupta (usando el botón detener en VS), y cerrando Visual Studio. Cero pantallazos azules.

Según un comentario en el siguiente hilo, el cual casualmente es de un usuario que usa Windows 7 como tú, dicen que tras haber visualizado la información de depuración del volcado de memoria del BSOD, han llegado a la conclusión de que se trata de un bug de ese sistema operativo Windows 7...

  • https://social.technet.microsoft.com/Forums/en-US/1f847268-e38d-4ac3-a1ea-f41069604fd0/bsod-when-interrupting-ping?forum=w7itpronetworking

Cita de: Andre.Ziegler
I've previously posted the dumps etc. to another forum here is the link. We came to the conclusion it was a bug in Windows, not the network driver? (considered "solved" of sorts :) See the OSVDB link in the post..

http://www.techsupportforum.com/forums/f217/solved-tcpip-sys-bsod-issue-530767.html (http://www.techsupportforum.com/forums/f217/solved-tcpip-sys-bsod-issue-530767.html)

De todas formas en la documentación de Microsoft explican que se trata de un fallo por parte de algún driver instalado en el sistema (un driver de dispositivos de red, supongo, o quizás incluso pueda ser culpa de algún driver o servicio en segundo plano de algún antivirus que puedas tener en ejecución mientras haces ping), y que ocurre cuando el driver no puede liberar páginas (páginas de memoria) bloqueadas despues de una operación de entrata y salida o input/output (I/O), es decir, de una operación de escritura y lectura de las páginas bloqueadas...

  • https://docs.microsoft.com/en-us/windows-hardware/drivers/debugger/bug-check-0x76--process-has-locked-pages

Hay te explican además una posible solución.

En caso de que no sea culpa de tu antivirus, yo te propongo otra posible solución: espera a que la operación de ping finalice antes de cerrar completamente el programa.

He revisado tu código y hay varias cosas imperfectas, desde el modo en el que posicionas el Form en la esquina de la barra de tareas mediante un búcle Do While (cuando lo puedes hacer con una simple operación matemática), hasta la implementación del BackgroundWorker que tira excepciones del tipo InvalidOperationException por intentar acceder a un control desde otro thread distinto desde el que fue creado. En fin, le hice algunas modificaciones y ha quedado de la siguiente manera; pruébalo a ver si con suerte te soluciona el problema en tu PC...

Código
  1. Imports System.ComponentModel
  2. Imports System.Threading
  3.  
  4. Public NotInheritable Class Form1
  5.  
  6.    Private ReadOnly Property HostNameOrAddress As String
  7.        Get
  8.            Return Me.TextBox2?.Text
  9.        End Get
  10.    End Property
  11.  
  12.    Private Sub Form1_Load(ByVal sender As Object, ByVal e As EventArgs) Handles MyBase.Load
  13.        Dim scr As Screen = Screen.FromHandle(Me.Handle)
  14.        Me.Location = New Point((scr.WorkingArea.Right - Me.Size.Width), (scr.WorkingArea.Bottom - Me.Size.Height))
  15.  
  16.        With Me.BackgroundWorker1
  17.            .WorkerReportsProgress = True
  18.            .WorkerSupportsCancellation = True
  19.  
  20.            .RunWorkerAsync()
  21.        End With
  22.    End Sub
  23.  
  24.    Private Sub BackgroundWorker1_DoWork(ByVal sender As Object, ByVal e As DoWorkEventArgs) Handles BackgroundWorker1.DoWork
  25.        Dim bgw As BackgroundWorker = DirectCast(sender, BackgroundWorker)
  26.  
  27.        Do Until bgw.CancellationPending
  28.            Dim elapsed As Double = Me.MedidorPing(Me.HostNameOrAddress, TimeSpan.FromSeconds(5))
  29.            Dim userState As String
  30.            If (elapsed.Equals(Double.NaN)) Then
  31.                userState = "Ping request timed out."
  32.            Else
  33.                userState = String.Format("{0:F0} ms", elapsed)
  34.            End If
  35.  
  36.            bgw.ReportProgress(Nothing, userState)
  37.        Loop
  38.        bgw.ReportProgress(100, Nothing)
  39.    End Sub
  40.  
  41.    Sub BackgroundWorker1_ProgressChanged(sender As Object, e As ProgressChangedEventArgs) Handles BackgroundWorker1.ProgressChanged
  42.        Me.TextBox3.Text = CStr(e.UserState)
  43.    End Sub
  44.  
  45.    Private Sub BackgroundWorker1_RunWorkerCompleted(sender As Object, e As RunWorkerCompletedEventArgs) Handles BackgroundWorker1.RunWorkerCompleted
  46.        Me.Close()
  47.    End Sub
  48.  
  49.    Private Sub HexCheckBox1_CheckedChanged(ByVal sender As Object) Handles HexCheckBox1.CheckedChanged
  50.        Me.TopMost = Me.HexCheckBox1.Checked
  51.    End Sub
  52.  
  53.    Private Sub HexButton1_Click(sender As Object, e As EventArgs) Handles HexButton1.Click
  54.        DirectCast(sender, HexButton).Enabled = False
  55.  
  56.        If (Me.BackgroundWorker1.IsBusy) Then
  57.            Me.BackgroundWorker1.CancelAsync()
  58.  
  59.            Do While Me.BackgroundWorker1.IsBusy
  60.                Application.DoEvents()
  61.                Thread.Sleep(TimeSpan.FromMilliseconds(100))
  62.            Loop
  63.        End If
  64.    End Sub
  65.  
  66.    Private Function MedidorPing(ByVal hostNameOrAddress As String, timeout As TimeSpan) As Double
  67.  
  68.        If String.IsNullOrEmpty(hostNameOrAddress) Then
  69.            Return Double.NaN
  70.        End If
  71.  
  72.        If Not My.Computer.Network.IsAvailable() Then
  73.            Return Double.NaN
  74.        End If
  75.  
  76.        Dim sw As New Stopwatch()
  77.        Try
  78.            sw.Start()
  79.            My.Computer.Network.Ping(hostNameOrAddress, CInt(timeout.TotalMilliseconds))
  80.            sw.Stop()
  81.            Return sw.Elapsed.TotalMilliseconds
  82.  
  83.        Catch ex As Exception ' ArgumentNullException, InvalidOperationException, PingException or SocketException
  84.            Return Double.NaN
  85.  
  86.        End Try
  87.  
  88.    End Function
  89.  
  90. End Class
  91.  


Título: Re: Pantallaso Azul con mi programa.
Publicado por: **Aincrad** en 9 Enero 2019, 17:02 pm
Exelente, con tu código es rápido y ya no me lanza el pantallaso azul al depurar.

grax.