WsKSendTo vuelve STATUS_INVALID_DEVICE_STATE: ¿qué significa?
-
18-09-2019 - |
Pregunta
Estoy llamando WsKSendTo en un socket abierto (IRP rendimientos éxito en la devolución de llamada). Pero WskSendTo en que los rendimientos de socket c0000184, lo que se hace referencia como STATUS_INVALID_DEVICE_STATE. ¿Qué tipo de errores se dirige el presente?
¿Me he perdido algo en la rutina de envío?
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 );
Después de estado y pirp-> IoStatus-> Estado contiene el código de error ya mencionado y no se envía nada (o de llegar al destino). ¿Alguna sugerencia?
Solución
c0000184 se devuelve si el conector no está inicializado completamente. Por ejemplo, si la toma de corriente todavía no está vinculada a una dirección. El mismo problema existst en espacio de usuario, siempre se unen a su toma! (Aquí usando WskBind.)
También es útil para sincronizar los pasos individuales del proceso de inicialización: asignación de contexto socket, la creación de zócalo y de unión usando KEVENT (ver KeInitializeEvent para empezar).