Pregunta

Tengo una aplicación que muestra un componente WebBrowser, que contiene una aplicación flash que crear un XMLSocket con un servidor. Ahora estoy tratando de conectar recv (por suerte una LocalHook) para purpuse registro, pero cuando trato de leer el contenido de toma consigo solamente caracteres extraños, pero si me puse el gancho con SpyStudio consigo cadenas legibles. Aquí está el uso de código I:

  1. I fijar el gancho con

    CreateRecvHook = LocalHook.Create(
        LocalHook.GetProcAddress("ws2_32.dll", "recv"),
        new Drecv(recv_Hooked),
        this);
    
    
    CreateRecvHook.ThreadACL.SetExclusiveACL(new Int32[] { 0 });
    
  2. I creó todo lo que necesita con

    [DllImport("ws2_32.dll")]
    static extern int recv(
                IntPtr socketHandle,
                IntPtr buf,
                int count,
                int socketFlags
        );
    
    
    [UnmanagedFunctionPointer(CallingConvention.StdCall,
        CharSet = CharSet.Unicode,
        SetLastError = true)]
    
    
    delegate int Drecv(
                IntPtr socketHandle,
                IntPtr buf,
                int count,
                int socketFlags
        );
    
    
    static int recv_Hooked(
                IntPtr socketHandle,
                IntPtr buf,
                int count,
                int socketFlags)
    {
        byte[] test = new byte[count];
        Marshal.Copy(buf, test, 0, count);
    
    
    
    IntPtr ptr = IntPtr.Zero;
    
    
    ptr = Marshal.AllocHGlobal(count);
    Marshal.Copy(test, 0, ptr, count);
    
    
    string s = System.Text.UnicodeEncoding.Unicode.GetString(test);
    Debug.WriteLine(s);
    System.IO.StreamWriter file = new System.IO.StreamWriter("log.txt");
    file.WriteLine(s);
    
    
    file.Close();
    return recv(socketHandle, buf, count, socketFlags);;
    
    }

Ya he intentado utilizar una codificación diferente sin éxito. Como nota al margen, el WebBrowser no parece tener ningún problema.

¿Fue útil?

Solución

Usted está ahorrando el contenido del búfer no inicializado, no es de extrañar que de basura.

No hay nada en ese búfer hasta después recv (el verdadero) lo llena. También no se puede saber cuántos bytes son realmente válidos salvo mediante la inspección del código de retorno de la recv real.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top