WsKSendTo возвращает STATUS_INVALID_DEVICE_STATE:что это значит?

StackOverflow https://stackoverflow.com/questions/1159809

  •  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 ( Инициализация события ) для начала).

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top