WsKSendTo retourne STATUS_INVALID_DEVICE_STATE: qu'est-ce que cela signifie?
-
18-09-2019 - |
Question
Je fais appel WsKSendTo sur un socket ouvert (retourne IPR succès rappel). Mais WskSendTo sur cette socket retournée c0000184, ce qui est référencé comme STATUS_INVALID_DEVICE_STATE. Quel genre d'erreurs sont traitées par là?
Ai-je manqué quelque chose dans la routine d'envoi?
psc->dstaddr.sin_family = AF_INET;
psc->dstaddr.sin_port = 0x6973; // big endian
psc->dstaddr.sin_addr.S_un.S_un_b.s_b1 = 0x02;
psc->dstaddr.sin_addr.S_un.S_un_b.s_b2 =
psc->dstaddr.sin_addr.S_un.S_un_b.s_b3 = 0x17;
psc->dstaddr.sin_addr.S_un.S_un_b.s_b4 = 0x0a;
// create IRP
psc->pirp = IoAllocateIrp(1, FALSE);
if(!psc->pirp){
DbgPrint("ShoutShout: IRP not allocated\n");
FreeShoutContext(psc);
return STATUS_UNSUCCESSFUL;
}
IoSetCompletionRoutine(
psc->pirp,
ShoutShoutComplete,
psc,
TRUE,
TRUE,
TRUE
);
// initiate send
const WSK_PROVIDER_DATAGRAM_DISPATCH *dispatch =
(PWSK_PROVIDER_DATAGRAM_DISPATCH)sockContext->socket->Dispatch;
status = dispatch->WskSendTo(
sockContext->socket, //PWSK_SOCKET
&psc->buf, //__in PWSK_BUF
NULL, // undocumented IN ULONG Flags,
(PSOCKADDR)&psc->dstaddr, // IN PSOCKADDR RemoteAddress OPTIONAL,
0, // IN SIZE_T ControlInfoLength,
0, // IN PCMSGHDR ControlInfo OPTIONAL,
psc->pirp); // IN PIRP Irp );
Après l'état et pirp-> IoStatus-> Statut contient le code d'erreur susmentionné et rien est envoyé (ou atteindre la destination). Toutes les suggestions?
La solution
c0000184 est renvoyée si la prise est pas complètement initialisés. Par exemple, si la prise est pas encore lié à une adresse. Le même problème existst en userland, se lient toujours votre prise! (Ici en utilisant WskBind.)
Il est également utile pour synchroniser les différentes étapes du processus d'initialisation: allocation de contexte de douille, la création de la douille et la liaison en utilisant KEVENT (voir KeInitializeEvent pour commencer).