private static void PingCallback(object state, bool signaled) { Ping ping = (Ping)state; PingCompletedEventArgs arg = null; bool cancelled = false; AsyncOperation asyncOp = null; SendOrPostCallback d = null; try { lock (ping.lockObject) { cancelled = ping.cancelled; asyncOp = ping.asyncOp; d = ping.onPingCompletedDelegate; if (!cancelled) { PingReply reply; SafeLocalFree replyBuffer = ping.replyBuffer; if (!ping.ipv6 && !ComNetOS.IsVista) { UnsafeNetInfoNativeMethods.IcmpParseReplies(replyBuffer.DangerousGetHandle(), 0x100ff); } if (ping.ipv6) { Icmp6EchoReply reply2 = (Icmp6EchoReply)Marshal.PtrToStructure(replyBuffer.DangerousGetHandle(), typeof(Icmp6EchoReply)); reply = new PingReply(reply2, replyBuffer.DangerousGetHandle(), ping.sendSize); } else { IcmpEchoReply reply3 = (IcmpEchoReply)Marshal.PtrToStructure(replyBuffer.DangerousGetHandle(), typeof(IcmpEchoReply)); reply = new PingReply(reply3); } arg = new PingCompletedEventArgs(reply, null, false, asyncOp.UserSuppliedState); } else { arg = new PingCompletedEventArgs(null, null, true, asyncOp.UserSuppliedState); } } } catch (Exception exception) { PingException error = new PingException(SR.GetString("net_ping"), exception); arg = new PingCompletedEventArgs(null, error, false, asyncOp.UserSuppliedState); } finally { ping.FreeUnmanagedStructures(); ping.UnregisterWaitHandle(); ping.Finish(true); } asyncOp.PostOperationCompleted(d, arg); }