mirror of https://github.com/tongzx/nt5src
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
110 lines
2.3 KiB
110 lines
2.3 KiB
/*++
|
|
|
|
Copyright (c) 1998 - 2000 Microsoft Corporation
|
|
|
|
Module Name:
|
|
|
|
emio.cpp
|
|
|
|
Abstract:
|
|
|
|
Contains:
|
|
High-level Event Manager routines for asynchronous I/O
|
|
|
|
Environment:
|
|
|
|
User Mode - Win32
|
|
|
|
History:
|
|
|
|
1. 14-Feb-2000 -- File creation (based on Ilya Kleyman (ilyak)
|
|
previous work by AjayCh)
|
|
|
|
--*/
|
|
|
|
#include "stdafx.h"
|
|
|
|
/*++
|
|
|
|
Routine Description:
|
|
Called when asynchronous send, receive or accept completes
|
|
|
|
Arguments:
|
|
Status - status of the operation being completed
|
|
BytesTransferred - number of bytes transferred
|
|
Overlapped - internal data structure
|
|
|
|
Return Values:
|
|
None
|
|
|
|
Notes:
|
|
Callback
|
|
--*/
|
|
static void WINAPI EventMgrIoCompletionCallback (
|
|
IN DWORD Status,
|
|
IN DWORD BytesTransferred,
|
|
IN LPOVERLAPPED Overlapped)
|
|
{
|
|
PIOContext IoContext;
|
|
|
|
IoContext = (PIOContext) Overlapped;
|
|
|
|
CALL_BRIDGE& CallBridge = IoContext->pOvProcessor->GetCallBridge();
|
|
|
|
switch (IoContext -> reqType) {
|
|
|
|
case EMGR_OV_IO_REQ_ACCEPT:
|
|
|
|
HandleAcceptCompletion ((PAcceptContext) IoContext, Status);
|
|
|
|
break;
|
|
|
|
case EMGR_OV_IO_REQ_SEND:
|
|
|
|
HandleSendCompletion ((PSendRecvContext) IoContext, BytesTransferred, Status);
|
|
|
|
break;
|
|
|
|
case EMGR_OV_IO_REQ_RECV:
|
|
|
|
HandleRecvCompletion ((PSendRecvContext) IoContext, BytesTransferred, Status);
|
|
|
|
break;
|
|
|
|
default:
|
|
// This should never happen
|
|
DebugF(_T("H323: Unknown I/O completed: %d.\n"), IoContext -> reqType);
|
|
_ASSERTE(0);
|
|
break;
|
|
|
|
}
|
|
|
|
CallBridge.Release ();
|
|
}
|
|
|
|
/*++
|
|
|
|
Routine Description:
|
|
Designates a routine to be called when asynchrounous send, receive or accept completes
|
|
|
|
Arguments:
|
|
sock - socket handle to which a routine is being bound
|
|
|
|
Return Values:
|
|
Win32 error code
|
|
|
|
Notes:
|
|
Callback
|
|
--*/
|
|
HRESULT EventMgrBindIoHandle (SOCKET sock)
|
|
{
|
|
DWORD Result;
|
|
|
|
if (BindIoCompletionCallback ((HANDLE) sock, EventMgrIoCompletionCallback, 0))
|
|
return S_OK;
|
|
else {
|
|
Result = GetLastError ();
|
|
DebugF (_T("H323: Failed to bind i/o completion callback.\n"));
|
|
return HRESULT_FROM_WIN32 (Result);
|
|
}
|
|
}
|