2009-07-21 4 views
0

Ich rufe WsKSendTo auf einem geöffneten Socket (irp gibt Erfolg im Rückruf zurück). Aber WskSendTo für diesen Socket gibt C0000184 zurück, was als STATUS_INVALID_DEVICE_STATE bezeichnet wird. Welche Art von Fehlern werden dadurch angegangen?WsKSendTo gibt STATUS_INVALID_DEVICE_STATE zurück: Was bedeutet das?

Habe ich etwas in der Sende-Routine vermisst?

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 ); 

Danach Status und pirp-> IoStatus-> Status enthalten vorgenannten Fehlercode und nichts gesendet (oder das Ziel zu erreichen). Irgendwelche Vorschläge?

Antwort

1

c0000184 wird zurückgegeben, wenn der Socket nicht vollständig initialisiert ist. Zum Beispiel, wenn der Socket noch nicht an eine Adresse gebunden ist. Das gleiche Problem existiert in userland, binden Sie immer Ihren Socket! (Hier mit WskBind.)

Es ist auch sinnvoll, die einzelnen Schritte des Initialisierungsprozesses zu synchronisieren: Zuordnung von Socket-Kontext, Socket-Erstellung und Bindung mit KEVENT (siehe zunächst KeInitializeEvent).