Je vais essayer de faire un détour dans la fonction de connexion de la ws_32.dll. Au détour des œuvres, mais quelque chose se passe mal lors de l'appel à l'origine de la fonction. J'utilise relativement peu connu de la bibliothèque de crochet de la fonction. Il est appelé WhiteMagic. Il travaille avec d'autres fonctions eh bien, pas celui-ci.
Je l'ai essayé sur Internet Explorer et je ne peux pas me connecter de n'importe où. Si je bloque avec Fil.Le sommeil de 100 ms, il fonctionne.
public static UIntPtr ConnectSocketDetoured(UIntPtr s, ref NativeSocks.sockaddr name, int namelen)
{
Magic.Instance.Detours[DetouredConnectId].Remove();
var retVal = ((NativeSocks.Dconnect)Magic.Instance.Detours[DetouredConnectId].TargetDelegate).Invoke(s, ref name, namelen);
//var retVal = NativeSocks.connect(s, ref name, namelen); PINVOKE IMPORT DOESNT WORK TOO.
//IF I BLOCK HERE 100 MILLISECONDS THIS WORK.
Magic.Instance.Detours[DetouredConnectId].Apply();
return retVal;
}
[UnmanagedFunctionPointer(CallingConvention.StdCall, CharSet = CharSet.Ansi, SetLastError = false)]
public delegate UIntPtr Dconnect(UIntPtr s, ref sockaddr_in name, int namelen);
Struct sockaddr_in
[StructLayoutAttribute(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
public struct sockaddr_in
{
public short sin_family;
public ushort sin_port;
public in_addr sin_addr;
[MarshalAsAttribute(UnmanagedType.ByValTStr, SizeConst = 8)]
public string sin_zero;
}
[StructLayoutAttribute(LayoutKind.Sequential)]
public struct in_addr
{
public Anonymous1 S_un;
}
[StructLayoutAttribute(LayoutKind.Explicit)]
public struct Anonymous1
{
[FieldOffsetAttribute(0)]
public Anonymous2 S_un_b;
[FieldOffsetAttribute(0)]
public Anonymous3 S_un_w;
[FieldOffsetAttribute(0)]
public uint S_addr;
}
[StructLayoutAttribute(LayoutKind.Sequential)]
public struct Anonymous2
{
public byte s_b1;
public byte s_b2;
public byte s_b3;
public byte s_b4;
}
[StructLayoutAttribute(LayoutKind.Sequential)]
public struct Anonymous3
{
public ushort s_w1;
public ushort s_w2;
}
Je pense que par le blocage à l'intérieur de la détour de la fonction tandis que le crochet est supprimé sera la cause d'une erreur WSAEWOULDBLOCK. Pour cette raison, internet explorer appelle la fonction de connexion de nouveau, tandis que le crochet est supprimé et appelle le travail original de la fonction.
WSAEWOULDBLOCK description de l'Erreur :
Ressource temporairement non disponible. Cette erreur est retournée d'opérations sur les sockets nonblocking qui ne peut pas être effectuée immédiatement, par exemple recv lorsque aucune donnée n'est en attente d'être lu à partir de la prise. C'est une erreur non fatale, et l'opération doit être réitérée plus tard. Il est normal que WSAEWOULDBLOCK être déclarées comme le résultat de l'appel se connecter sur un non bloquantes socket SOCK_STREAM, depuis un certain temps doit s'écouler pour que la connexion soit établie.