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.
472 lines
15 KiB
472 lines
15 KiB
/*==========================================================================
|
|
*
|
|
* Copyright (C) 1999-2000 Microsoft Corporation. All Rights Reserved.
|
|
*
|
|
* File: IOData.cpp
|
|
* Content: Functions for IO structures
|
|
*
|
|
*
|
|
* History:
|
|
* Date By Reason
|
|
* ==== == ======
|
|
* 11/25/98 jtk Created
|
|
* 02/11/2000 jtk Derived from IODAta.h
|
|
***************************************************************************/
|
|
|
|
#include "dnmdmi.h"
|
|
|
|
|
|
#undef DPF_SUBCOMP
|
|
#define DPF_SUBCOMP DN_SUBCOMP_MODEM
|
|
|
|
//**********************************************************************
|
|
// Constant definitions
|
|
//**********************************************************************
|
|
|
|
//**********************************************************************
|
|
// Macro definitions
|
|
//**********************************************************************
|
|
|
|
//**********************************************************************
|
|
// Structure definitions
|
|
//**********************************************************************
|
|
|
|
//**********************************************************************
|
|
// Variable definitions
|
|
//**********************************************************************
|
|
|
|
//**********************************************************************
|
|
// Function prototypes
|
|
//**********************************************************************
|
|
|
|
//**********************************************************************
|
|
// ------------------------------
|
|
// CModemReadIOData::PoolAllocFunction - called when new CModemReadIOData is allocated
|
|
//
|
|
// Entry: Context (handle of read complete event)
|
|
//
|
|
// Exit: Boolean indicating success
|
|
// TRUE = success
|
|
// FALSE = failure
|
|
// ------------------------------
|
|
#undef DPF_MODNAME
|
|
#define DPF_MODNAME "CModemReadIOData::PoolAllocFunction"
|
|
|
|
BOOL CModemReadIOData::PoolAllocFunction( void* pvItem, void* pvContext )
|
|
{
|
|
BOOL fReturn;
|
|
|
|
CModemReadIOData* pReadIOData = (CModemReadIOData*)pvItem;
|
|
HANDLE hContext = (HANDLE)pvContext;
|
|
|
|
//
|
|
// initialize
|
|
//
|
|
fReturn = TRUE;
|
|
|
|
pReadIOData->m_dwWin9xReceiveErrorReturn = ERROR_SUCCESS;
|
|
pReadIOData->jkm_dwOverlappedBytesReceived = 0;
|
|
pReadIOData->jkm_dwImmediateBytesReceived = 0;
|
|
pReadIOData->m_ReadState = READ_STATE_UNKNOWN;
|
|
pReadIOData->m_dwBytesToRead = 0;
|
|
pReadIOData->m_dwReadOffset = 0;
|
|
pReadIOData->m_lRefCount = 0;
|
|
pReadIOData->m_pThreadPool = NULL;
|
|
|
|
pReadIOData->m_Sig[0] = 'R';
|
|
pReadIOData->m_Sig[1] = 'I';
|
|
pReadIOData->m_Sig[2] = 'O';
|
|
pReadIOData->m_Sig[3] = 'D';
|
|
|
|
pReadIOData->m_OutstandingReadListLinkage.Initialize();
|
|
memset( &pReadIOData->m_ReceiveBuffer, 0x00, sizeof( pReadIOData->m_ReceiveBuffer ) );
|
|
|
|
#ifdef WIN95
|
|
DNASSERT( pReadIOData->Win9xOperationPending() == FALSE );
|
|
#endif // WIN95
|
|
memset( &pReadIOData->m_SPReceivedBuffer, 0x00, sizeof( pReadIOData->m_SPReceivedBuffer ) );
|
|
pReadIOData->m_SPReceivedBuffer.BufferDesc.pBufferData = &pReadIOData->m_ReceiveBuffer.ReceivedData[ sizeof( pReadIOData->m_ReceiveBuffer.MessageHeader ) ];
|
|
|
|
// Initialize Base Class members
|
|
#ifdef WINNT
|
|
pReadIOData->m_NTIOOperationType = NT_IO_OPERATION_UNKNOWN;
|
|
#endif // WINNT
|
|
#ifdef WIN95
|
|
pReadIOData->m_fWin9xOperationPending = FALSE;
|
|
#endif // WIN95
|
|
pReadIOData->m_pDataPort = NULL;
|
|
|
|
memset( &pReadIOData->m_Overlap, 0x00, sizeof( pReadIOData->m_Overlap ) );
|
|
|
|
//
|
|
// set the appropriate callback
|
|
//
|
|
#ifdef WINNT
|
|
//
|
|
// WinNT, always use IO completion ports
|
|
//
|
|
DNASSERT( hContext == NULL );
|
|
DNASSERT( pReadIOData->NTIOOperationType() == NT_IO_OPERATION_UNKNOWN );
|
|
pReadIOData->SetNTIOOperationType( NT_IO_OPERATION_RECEIVE );
|
|
#else // WIN95
|
|
//
|
|
// Win9x
|
|
//
|
|
DNASSERT( hContext != NULL );
|
|
DNASSERT( pReadIOData->OverlapEvent() == NULL );
|
|
#endif // WINNT
|
|
|
|
return fReturn;
|
|
}
|
|
//**********************************************************************
|
|
|
|
|
|
//**********************************************************************
|
|
// ------------------------------
|
|
// CModemReadIOData::PoolInitFunction - called when new item is grabbed from the pool
|
|
//
|
|
// Entry: Context (read complete event)
|
|
//
|
|
// Exit: Boolean indicating success
|
|
// TRUE = success
|
|
// FALSE = failure
|
|
// ------------------------------
|
|
#undef DPF_MODNAME
|
|
#define DPF_MODNAME "CModemReadIOData::PoolInitFunction"
|
|
|
|
void CModemReadIOData::PoolInitFunction( void* pvItem, void* pvContext )
|
|
{
|
|
CModemReadIOData* pReadIOData = (CModemReadIOData*)pvItem;
|
|
HANDLE hContext = (HANDLE)pvContext;
|
|
|
|
DNASSERT( pReadIOData->m_OutstandingReadListLinkage.IsEmpty() != FALSE );
|
|
|
|
DNASSERT( pReadIOData->m_dwBytesToRead == 0 );
|
|
DNASSERT( pReadIOData->m_dwReadOffset == 0 );
|
|
DNASSERT( pReadIOData->jkm_dwOverlappedBytesReceived == 0 );
|
|
|
|
DNASSERT( pReadIOData->m_SPReceivedBuffer.BufferDesc.pBufferData == &pReadIOData->m_ReceiveBuffer.ReceivedData[ sizeof( pReadIOData->m_ReceiveBuffer.MessageHeader ) ] );
|
|
|
|
DNASSERT( pReadIOData->DataPort() == NULL );
|
|
#ifdef WIN95
|
|
DNASSERT( pReadIOData->Win9xOperationPending() == FALSE );
|
|
pReadIOData->SetOverlapEvent( hContext );
|
|
#endif // WIN95
|
|
|
|
//
|
|
// Initialize internal SPRECEIVEDDATA. When data is received, it's possible
|
|
// that the pointers in the SPRECEIVEDDATA block were manipulated. Reset
|
|
// them to reflect that the entire buffer is available.
|
|
//
|
|
ZeroMemory( &pReadIOData->m_SPReceivedBuffer, sizeof( pReadIOData->m_SPReceivedBuffer ) );
|
|
pReadIOData->m_SPReceivedBuffer.BufferDesc.pBufferData = &pReadIOData->m_ReceiveBuffer.ReceivedData[ sizeof( pReadIOData->m_ReceiveBuffer.MessageHeader ) ];
|
|
|
|
DNASSERT(pReadIOData->m_lRefCount == 0);
|
|
pReadIOData->m_lRefCount = 1;
|
|
}
|
|
//**********************************************************************
|
|
|
|
|
|
//**********************************************************************
|
|
// ------------------------------
|
|
// CModemReadIOData::PoolReleaseFunction - called when CModemReadIOData is returned to pool
|
|
//
|
|
// Entry: Nothing
|
|
//
|
|
// Exit: Nothing
|
|
// ------------------------------
|
|
#undef DPF_MODNAME
|
|
#define DPF_MODNAME "CModemReadIOData::PoolReleaseFunction"
|
|
|
|
void CModemReadIOData::PoolReleaseFunction( void* pvItem )
|
|
{
|
|
CModemReadIOData* pReadIOData = (CModemReadIOData*)pvItem;
|
|
|
|
DNASSERT( pReadIOData->m_OutstandingReadListLinkage.IsEmpty() != FALSE );
|
|
|
|
pReadIOData->m_ReadState = READ_STATE_UNKNOWN;
|
|
pReadIOData->m_dwBytesToRead = 0;
|
|
pReadIOData->m_dwReadOffset = 0;
|
|
pReadIOData->jkm_dwOverlappedBytesReceived = 0;
|
|
#ifdef WIN95
|
|
DNASSERT( pReadIOData->Win9xOperationPending() == FALSE );
|
|
pReadIOData->SetOverlapEvent( NULL );
|
|
#endif // WIN95
|
|
|
|
pReadIOData->SetDataPort( NULL );
|
|
}
|
|
//**********************************************************************
|
|
|
|
|
|
//**********************************************************************
|
|
// ------------------------------
|
|
// CModemReadIOData::PoolDeallocFunction - called when CModemReadIOData is deallocated
|
|
//
|
|
// Entry: Nothing
|
|
//
|
|
// Exit: Nothing
|
|
// ------------------------------
|
|
#undef DPF_MODNAME
|
|
#define DPF_MODNAME "CModemReadIOData::PoolDeallocFunction"
|
|
|
|
void CModemReadIOData::PoolDeallocFunction( void* pvItem )
|
|
{
|
|
const CModemReadIOData* pReadIOData = (CModemReadIOData*)pvItem;
|
|
|
|
DNASSERT( pReadIOData->m_OutstandingReadListLinkage.IsEmpty() != FALSE );
|
|
DNASSERT( pReadIOData->m_dwBytesToRead == 0 );
|
|
DNASSERT( pReadIOData->m_dwReadOffset == 0 );
|
|
|
|
DNASSERT( pReadIOData->m_ReadState == READ_STATE_UNKNOWN );
|
|
DNASSERT( pReadIOData->m_lRefCount == 0 );
|
|
DNASSERT( pReadIOData->m_pThreadPool == NULL );
|
|
|
|
DNASSERT( pReadIOData->DataPort() == NULL );
|
|
|
|
#ifdef WIN95
|
|
DNASSERT( pReadIOData->OverlapEvent() == NULL );
|
|
DNASSERT( pReadIOData->Win9xOperationPending() == FALSE );
|
|
#endif // WIN95
|
|
}
|
|
//**********************************************************************
|
|
|
|
|
|
//**********************************************************************
|
|
// ------------------------------
|
|
// CRedaIOData::ReturnSelfToPool - return this item to the pool
|
|
//
|
|
// Entry: Nothing
|
|
//
|
|
// Exit: Nothing
|
|
// ------------------------------
|
|
#undef DPF_MODNAME
|
|
#define DPF_MODNAME "CModemReadIOData::ReturnSelfToPool"
|
|
|
|
void CModemReadIOData::ReturnSelfToPool( void )
|
|
{
|
|
CModemThreadPool *pThreadPool;
|
|
|
|
|
|
DNASSERT( m_lRefCount == 0 );
|
|
DNASSERT( m_pThreadPool != NULL );
|
|
pThreadPool = m_pThreadPool;
|
|
SetThreadPool( NULL );
|
|
pThreadPool->ReturnReadIOData( this );
|
|
}
|
|
//**********************************************************************
|
|
|
|
|
|
//**********************************************************************
|
|
// ------------------------------
|
|
// CModemWriteIOData::PoolAllocFunction - called when new CModemWriteIOData is allocated
|
|
//
|
|
// Entry: Context (handle of write completion event)
|
|
//
|
|
// Exit: Boolean indicating success
|
|
// TRUE = allocation succeeded
|
|
// FALSE = allocation failed
|
|
//
|
|
// Note: We always want a command structure associated with CModemWriteIOData
|
|
// so we don't need to grab a new command from the command pool each
|
|
// time a CModemWriteIOData entry is removed from its pool. This is done
|
|
// for speed.
|
|
// ------------------------------
|
|
#undef DPF_MODNAME
|
|
#define DPF_MODNAME "CModemWriteIOData::PoolAllocFunction"
|
|
|
|
BOOL CModemWriteIOData::PoolAllocFunction( void* pvItem, void* pvContext )
|
|
{
|
|
BOOL fReturn;
|
|
CModemCommandData *pCommand;
|
|
|
|
CModemWriteIOData* pWriteIOData = (CModemWriteIOData*)pvItem;
|
|
HANDLE hContext = (HANDLE)pvContext;
|
|
|
|
#ifdef WIN95
|
|
DNASSERT( hContext != NULL );
|
|
#endif // WIN95
|
|
|
|
pWriteIOData->m_pNext = NULL;
|
|
pWriteIOData->m_pBuffers = NULL;
|
|
pWriteIOData->m_uBufferCount = 0;
|
|
pWriteIOData->m_pCommand = NULL;
|
|
pWriteIOData->m_SendCompleteAction = SEND_COMPLETE_ACTION_UNKNOWN;
|
|
pWriteIOData->jkm_hSendResult = DPN_OK;
|
|
pWriteIOData->jkm_dwOverlappedBytesSent = 0;
|
|
pWriteIOData->jkm_dwImmediateBytesSent = 0;
|
|
|
|
pWriteIOData->m_Sig[0] = 'W';
|
|
pWriteIOData->m_Sig[1] = 'I';
|
|
pWriteIOData->m_Sig[2] = 'O';
|
|
pWriteIOData->m_Sig[3] = 'D';
|
|
|
|
pWriteIOData->m_OutstandingWriteListLinkage.Initialize();
|
|
memset( &pWriteIOData->m_DataBuffer, 0x00, sizeof( pWriteIOData->m_DataBuffer ) );
|
|
pWriteIOData->m_DataBuffer.MessageHeader.SerialSignature = SERIAL_HEADER_START;
|
|
|
|
// Initialize Base Class members
|
|
#ifdef WINNT
|
|
pWriteIOData->m_NTIOOperationType = NT_IO_OPERATION_UNKNOWN;
|
|
#endif // WINNT
|
|
#ifdef WIN95
|
|
pWriteIOData->m_fWin9xOperationPending = FALSE;
|
|
#endif // WIN95
|
|
pWriteIOData->m_pDataPort = NULL;
|
|
|
|
memset( &pWriteIOData->m_Overlap, 0x00, sizeof( pWriteIOData->m_Overlap ) );
|
|
|
|
//
|
|
// initialize
|
|
//
|
|
fReturn = TRUE;
|
|
|
|
pCommand = (CModemCommandData*)g_ModemCommandDataPool.Get();
|
|
if ( pCommand == NULL )
|
|
{
|
|
DPFX(DPFPREP, 0, "Could not get command when allocating new CModemWriteIOData!" );
|
|
fReturn = FALSE;
|
|
goto Exit;
|
|
}
|
|
|
|
//
|
|
// associate this command with the WriteData, clear the command descriptor
|
|
// because the command isn't really being used yet, and it'll
|
|
// cause an ASSERT when it's removed from the WriteIOData pool.
|
|
//
|
|
pWriteIOData->m_pCommand = pCommand;
|
|
|
|
//
|
|
// set the appropriate IO function
|
|
//
|
|
#ifdef WINNT
|
|
//
|
|
// WinNT, we'll always use completion ports
|
|
//
|
|
DNASSERT( pWriteIOData->NTIOOperationType() == NT_IO_OPERATION_UNKNOWN );
|
|
pWriteIOData->SetNTIOOperationType( NT_IO_OPERATION_SEND );
|
|
#else // WIN95
|
|
//
|
|
// Win9x
|
|
//
|
|
DNASSERT( pWriteIOData->OverlapEvent() == NULL );
|
|
#endif // WINNT
|
|
|
|
Exit:
|
|
return fReturn;
|
|
}
|
|
//**********************************************************************
|
|
|
|
|
|
//**********************************************************************
|
|
// ------------------------------
|
|
// CModemWriteIOData::PoolInitFunction - called when new CModemWriteIOData is removed from pool
|
|
//
|
|
// Entry: Nothing
|
|
//
|
|
// Exit: Boolean indicating success
|
|
// TRUE = success
|
|
// FALSE = failure
|
|
// ------------------------------
|
|
#undef DPF_MODNAME
|
|
#define DPF_MODNAME "CModemWriteIOData::PoolInitFunction"
|
|
|
|
void CModemWriteIOData::PoolInitFunction( void* pvItem, void* pvContext )
|
|
{
|
|
CModemWriteIOData* pWriteIOData = (CModemWriteIOData*)pvItem;
|
|
HANDLE hContext = (HANDLE)pvContext;
|
|
|
|
DNASSERT( pWriteIOData->m_pNext == NULL );
|
|
DNASSERT( pWriteIOData->m_pBuffers == NULL );
|
|
DNASSERT( pWriteIOData->m_uBufferCount == 0 );
|
|
DNASSERT( pWriteIOData->jkm_dwOverlappedBytesSent == 0 );
|
|
|
|
DNASSERT( pWriteIOData->m_pCommand != NULL );
|
|
pWriteIOData->m_pCommand->SetDescriptor();
|
|
|
|
DNASSERT( pWriteIOData->m_pCommand->GetDescriptor() != NULL_DESCRIPTOR );
|
|
DNASSERT( pWriteIOData->m_pCommand->GetUserContext() == NULL );
|
|
|
|
DNASSERT( pWriteIOData->m_SendCompleteAction == SEND_COMPLETE_ACTION_UNKNOWN );
|
|
DNASSERT( pWriteIOData->m_OutstandingWriteListLinkage.IsEmpty() != FALSE );
|
|
DNASSERT( pWriteIOData->DataPort() == NULL );
|
|
#ifdef WIN95
|
|
DNASSERT( pWriteIOData->Win9xOperationPending() == FALSE );
|
|
pWriteIOData->SetOverlapEvent( hContext );
|
|
#endif // WIN95
|
|
}
|
|
//**********************************************************************
|
|
|
|
|
|
//**********************************************************************
|
|
// ------------------------------
|
|
// CModemWriteIOData::PoolReleaseFunction - called when CModemWriteIOData is returned to pool
|
|
//
|
|
// Entry: Nothing
|
|
//
|
|
// Exit: Nothing
|
|
// ------------------------------
|
|
#undef DPF_MODNAME
|
|
#define DPF_MODNAME "CModemWriteIOData::PoolReleaseFunction"
|
|
|
|
void CModemWriteIOData::PoolReleaseFunction( void* pvItem )
|
|
{
|
|
CModemWriteIOData* pWriteIOData = (CModemWriteIOData*)pvItem;
|
|
|
|
DNASSERT( pWriteIOData->m_pCommand != NULL );
|
|
pWriteIOData->m_pCommand->Reset();
|
|
|
|
DNASSERT( pWriteIOData->m_OutstandingWriteListLinkage.IsEmpty() != FALSE );
|
|
#ifdef WIN95
|
|
DNASSERT( pWriteIOData->Win9xOperationPending() == FALSE );
|
|
pWriteIOData->SetOverlapEvent( NULL );
|
|
#endif
|
|
|
|
pWriteIOData->m_pBuffers = NULL;
|
|
pWriteIOData->m_uBufferCount = 0;
|
|
pWriteIOData->jkm_dwOverlappedBytesSent = 0;
|
|
pWriteIOData->m_pNext = NULL;
|
|
pWriteIOData->m_SendCompleteAction = SEND_COMPLETE_ACTION_UNKNOWN;
|
|
pWriteIOData->SetDataPort( NULL );
|
|
|
|
DEBUG_ONLY( memset( &pWriteIOData->m_DataBuffer.Data[ 1 ], 0x00, sizeof( pWriteIOData->m_DataBuffer.Data ) - 1 ) );
|
|
}
|
|
//**********************************************************************
|
|
|
|
|
|
//**********************************************************************
|
|
// ------------------------------
|
|
// CModemWriteIOData::PoolDeallocFunction - called when new CModemWriteIOData is deallocated
|
|
//
|
|
// Entry: Nothing
|
|
//
|
|
// Exit: Nothing
|
|
// ------------------------------
|
|
#undef DPF_MODNAME
|
|
#define DPF_MODNAME "CModemWriteIOData::PoolDeallocFunction"
|
|
|
|
void CModemWriteIOData::PoolDeallocFunction( void* pvItem )
|
|
{
|
|
CModemWriteIOData* pWriteIOData = (CModemWriteIOData*)pvItem;
|
|
|
|
DNASSERT( pWriteIOData->m_pBuffers == NULL );
|
|
DNASSERT( pWriteIOData->m_uBufferCount == 0 );
|
|
DNASSERT( pWriteIOData->m_SendCompleteAction == SEND_COMPLETE_ACTION_UNKNOWN );
|
|
DNASSERT( pWriteIOData->m_OutstandingWriteListLinkage.IsEmpty() != FALSE );
|
|
|
|
DNASSERT( pWriteIOData->m_DataBuffer.MessageHeader.SerialSignature == SERIAL_HEADER_START );
|
|
|
|
|
|
DNASSERT( pWriteIOData->m_pCommand != NULL );
|
|
pWriteIOData->m_pCommand->DecRef();
|
|
pWriteIOData->m_pCommand = NULL;
|
|
|
|
DNASSERT( pWriteIOData->DataPort() == NULL );
|
|
|
|
#ifdef WIN95
|
|
DNASSERT( pWriteIOData->OverlapEvent() == NULL );
|
|
DNASSERT( pWriteIOData->Win9xOperationPending() == FALSE );
|
|
#endif // WIN95
|
|
}
|
|
//**********************************************************************
|
|
|
|
|