WsKSendTo возвращает STATUS_INVALID_DEVICE_STATE:что это значит?
-
18-09-2019 - |
Вопрос
Я вызываю WsKSendTo на открытом сокете (irp возвращает успех при обратном вызове).Но WskSendTo в этом сокете возвращает c0000184, на который ссылается STATUS_INVALID_DEVICE_STATE .Какие ошибки устраняются с помощью этого?
Я что-то пропустил в процедуре отправки?
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 );
Впоследствии status и pirp-> IoStatus-> Status содержат вышеупомянутый код ошибки, и ничего не отправляется (или не доходит до адресата).Есть какие-нибудь предложения?
Решение
c0000184 возвращается, если сокет не полностью инициализирован.Например, если сокет еще не привязан к определенному адресу.Та же проблема существует и в пользовательской среде, всегда привязывайте свой сокет!(Здесь используется WskBind.)
Также полезно синхронизировать отдельные этапы процесса инициализации:выделение контекста сокета, создание сокета и привязка с помощью KEVENT (см. KeInitializeEvent ( Инициализация события ) для начала).