0

我在打开的套接字上调用 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 包含上述错误代码,并且没有发送任何内容(或到达目的地)。有什么建议么?

4

1 回答 1

1

如果套接字未完全初始化,则返回 c0000184。例如,如果套接字尚未绑定到地址。用户态也存在同样的问题,总是绑定你的套接字!(这里使用 WskBind。)

同步初始化过程的各个步骤也很有用:套接字上下文的分配、套接字创建和使用 KEVENT 的绑定(请参阅KeInitializeEvent开始)。

于 2009-07-22T14:22:41.157 回答