2009-07-21 6 views
0

열린 소켓에서 WsKSendTo를 호출합니다 (irp가 콜백에서 성공을 반환 함). 그러나 그 소켓의 WskSendTo는 STATUS_INVALID_DEVICE_STATE로 참조되는 것을 c0000184로 반환합니다. 어떤 종류의 오류가이 문제로 해결됩니까?WsKSendTo가 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에 앞서 언급 한 오류 코드가 포함되어있어 아무 것도 보내지 않거나 대상에 도달하지 못합니다. 어떤 제안?

답변

1

c0000184 소켓이 완전히 초기화되지 않은 경우 반환됩니다. 예를 들어, 소켓이 아직 주소에 바인드되어 있지 않은 경우입니다. 유저 랜드에 같은 문제가 존재하며 항상 소켓을 묶어 라! (여기서 WskBind를 사용합니다.) KEVENT를 사용하여 소켓 컨텍스트 할당, 소켓 생성 및 바인딩과 같은 초기화 프로세스의 개별 단계를 동기화하는 것이 유용합니다 (KeInitializeEvent 시작 참조).

관련 문제