asyncmac.c
来自「wince下的源代码集合打包」· C语言 代码 · 共 1,603 行 · 第 1/4 页
C
1,603 行
MiniportAdapterContext - A pointer to the adapter.Return Value: The function value is the status of the operation.--*/{ PASYNCMAC_ADAPTER pAdapter = (PASYNCMAC_ADAPTER)MiniportAdapterContext; NDIS_STATUS StatusToReturn = NDIS_STATUS_SUCCESS; DEBUGMSG (ZONE_INIT|ZONE_INTERFACE, (TEXT("+ASYNCMAC:MpSetInfo(0x%X, 0x%X, 0x%X, %d, 0x%X, 0x%X)\r\n"), MiniportAdapterContext, Oid, InformationBuffer, InformationBufferLength, BytesRead, BytesNeeded)); ASSERT(CHK_AA(pAdapter)); switch ( Oid ) { case OID_WAN_SET_LINK_INFO : if (InformationBufferLength < sizeof (NDIS_WAN_GET_LINK_INFO)) { StatusToReturn = NDIS_STATUS_BUFFER_TOO_SHORT; *BytesNeeded = sizeof(NDIS_WAN_GET_LINK_INFO); break; } else { PNDIS_WAN_GET_LINK_INFO pLinkInfo = (PNDIS_WAN_GET_LINK_INFO)InformationBuffer; PASYNCMAC_OPEN_LINE pOpenLine; pOpenLine = (PASYNCMAC_OPEN_LINE)pLinkInfo->NdisLinkHandle; ASSERT(CHK_AOL(pOpenLine)); DEBUGMSG (1, (TEXT("MpSetInfo: Orig ACCM=0x%X\r\n"), pOpenLine->WanLinkInfo.SendACCM)); // Let's just save this away. memcpy ((char *)&(pOpenLine->WanLinkInfo), (char *)pLinkInfo, sizeof (pOpenLine->WanLinkInfo)); DEBUGMSG (1, (TEXT("MpSetInfo: New ACCM=0x%X\r\n"), pOpenLine->WanLinkInfo.SendACCM)); } break; case OID_TAPI_SET_DEV_CONFIG : if (InformationBufferLength < sizeof(NDIS_TAPI_SET_DEV_CONFIG)) { DEBUGMSG (ZONE_TAPI, (TEXT("ASYNCMAC: Buffer too short (%d < %d)\n"), InformationBufferLength, sizeof(NDIS_TAPI_SET_DEV_CONFIG))); StatusToReturn = NDIS_STATUS_BUFFER_TOO_SHORT; *BytesNeeded = sizeof(NDIS_TAPI_SET_DEV_CONFIG); break; } else { PNDIS_TAPI_SET_DEV_CONFIG pTapiDevConfig = (PNDIS_TAPI_SET_DEV_CONFIG)InformationBuffer; LONG lResult; if (pTapiDevConfig->ulDeviceConfigSize > 0) { DEBUGMSG (ZONE_TAPI, (TEXT("ASYNCMAC: Calling lineSetDevConfig\n"))); lResult = lineSetDevConfig ( pTapiDevConfig->ulDeviceID, &pTapiDevConfig->DeviceConfig[0], pTapiDevConfig->ulDeviceConfigSize, DEV_CLASS_COMM_DATAMODEM); if (lResult != 0) { DEBUGMSG (ZONE_TAPI|ZONE_ERROR, (TEXT("lineSetDevConfig failed (%d)\n"), lResult)); StatusToReturn = NDIS_STATUS_TAPI_INVALPARAM; } } } break; case OID_TAPI_DROP : DEBUGMSG(ZONE_INTERFACE, (TEXT("ASYNCMAC: OID_TAPI_DROP\n"))); if (InformationBufferLength < sizeof (NDIS_TAPI_DROP)) { StatusToReturn = NDIS_STATUS_BUFFER_TOO_SHORT; *BytesNeeded = sizeof(NDIS_TAPI_DROP); break; } else { PNDIS_TAPI_DROP pTapiDrop = (PNDIS_TAPI_DROP)InformationBuffer; PASYNCMAC_OPEN_LINE pOpenLine; long lResult; // We return the pOpenLine for the hdCall. pOpenLine = (PASYNCMAC_OPEN_LINE)pTapiDrop->hdCall; ASSERT(CHK_AOL(pOpenLine)); // Forward on the info. lResult = lineDrop(pOpenLine->hCall, pTapiDrop->UserUserInfo, pTapiDrop->ulUserUserInfoSize); DEBUGMSG( ZONE_TAPI, (TEXT("Return from lineDrop()=%d\r\n"), lResult)); } break; case OID_TAPI_CLOSE_CALL : DEBUGMSG(ZONE_INTERFACE, (TEXT("ASYNCMAC: OID_TAPI_CLOSE_CALL\n"))); if (InformationBufferLength < sizeof (NDIS_TAPI_CLOSE_CALL)) { StatusToReturn = NDIS_STATUS_BUFFER_TOO_SHORT; *BytesNeeded = sizeof(NDIS_TAPI_CLOSE_CALL); break; } else { PNDIS_TAPI_CLOSE_CALL pTapiCloseCall = (PNDIS_TAPI_CLOSE_CALL)InformationBuffer; PASYNCMAC_OPEN_LINE pOpenLine; long lResult; // We return the pOpenLine for the hdCall. pOpenLine = (PASYNCMAC_OPEN_LINE)pTapiCloseCall->hdCall; ASSERT(CHK_AOL(pOpenLine)); // TAPI docs state that CloseHandle must be done on the hPort before // calling lineDeallocateCall. if (pOpenLine->hPort != NULL) { CloseHandle(pOpenLine->hPort); pOpenLine->hPort = NULL; } lResult = lineDeallocateCall( pOpenLine->hCall ); pOpenLine->hCall = NULL; // We don't actually free the pOpenLine until the OID_TAPI_CLOSE. DEBUGMSG( ZONE_TAPI, (TEXT("Return from lineDeallocateCall()=%d\r\n"), lResult)); } break; case OID_TAPI_CLOSE : DEBUGMSG(ZONE_INTERFACE, (TEXT("ASYNCMAC: OID_TAPI_CLOSE\n"))); if (InformationBufferLength < sizeof (NDIS_TAPI_CLOSE)) { StatusToReturn = NDIS_STATUS_BUFFER_TOO_SHORT; *BytesNeeded = sizeof(NDIS_TAPI_CLOSE); break; } else { PNDIS_TAPI_CLOSE pTapiClose = (PNDIS_TAPI_CLOSE)InformationBuffer; PASYNCMAC_OPEN_LINE pOpenLine; long lResult; // We return the pOpenLine for the hdLine. pOpenLine = (PASYNCMAC_OPEN_LINE)pTapiClose->hdLine; ASSERT(CHK_AOL(pOpenLine)); // Ok, now it's removed from the list. lResult = lineClose (pOpenLine->hLine); ReleaseOpenLinePtr (pOpenLine); DEBUGMSG( ZONE_TAPI, (TEXT("Return from lineClose()=%d\r\n"), lResult)); } break; default: StatusToReturn = NDIS_STATUS_INVALID_OID; *BytesRead = 0; *BytesNeeded = 0; break; } DEBUGMSG (ZONE_INIT|ZONE_INTERFACE, (TEXT("-ASYNCMAC:MpSetInfo: Returning 0x%X\r\n"), StatusToReturn)); return StatusToReturn;}NDIS_STATUSMpReconfigure( OUT PNDIS_STATUS OpenErrorStatus, IN NDIS_HANDLE MiniportAdapterContext, IN NDIS_HANDLE WrapperConfigurationContext ){ DEBUGMSG (ZONE_INIT|ZONE_INTERFACE, (TEXT("+/-ASYNCMAC:MpReconfigure(0x%X, 0x%X, 0x%X)\r\n"), OpenErrorStatus, MiniportAdapterContext, WrapperConfigurationContext)); return (NDIS_STATUS_SUCCESS);}NDIS_STATUSMpReset( OUT PBOOLEAN AddressingReset, IN NDIS_HANDLE MiniportAdapterContext ){ DEBUGMSG (ZONE_INIT|ZONE_INTERFACE, (TEXT("+/-ASYNCMAC:MpReset(0x%X, 0x%X)\r\n"), AddressingReset, MiniportAdapterContext)); *AddressingReset = FALSE; return (NDIS_STATUS_SUCCESS);}NDIS_STATUSMpSend( IN NDIS_HANDLE MacBindingHandle, IN NDIS_HANDLE NdisLinkHandle, IN PNDIS_WAN_PACKET pPacket){ PASYNCMAC_OPEN_LINE pOpenLine = (PASYNCMAC_OPEN_LINE) NdisLinkHandle; NDIS_STATUS Status = NDIS_STATUS_SUCCESS; DWORD bytesWritten; // bytes written per WriteFile call DWORD packetBytesSent; // sum of prior WriteFile bytesWritten DEBUGMSG (ZONE_INIT|ZONE_INTERFACE, (TEXT("ASYNCMAC:+MpSend(0x%X, 0x%X, 0x%X)\r\n"), MacBindingHandle, NdisLinkHandle, pPacket)); if (pOpenLine == NULL) { // // This can happen if the connection is closed by RAS/PPP just as it is // sending a packet. In this case, we don't want to send anything. // Status = NDIS_STATUS_FAILURE; } else { ASSERT(CHK_AOL(pOpenLine)); // Let's just send it for now. if (pOpenLine->hPort == NULL) { Status = NDIS_STATUS_FAILURE; } else {#ifdef DEBUG if (ZONE_SEND) { DEBUGMSG (1, (TEXT("ASYNCMAC: MpSend: About to frame packet (%d):\n"), pPacket->CurrentLength)); DumpMem (pPacket->CurrentBuffer, pPacket->CurrentLength); }#endif if (pOpenLine->WanLinkInfo.SendFramingBits & PPP_FRAMING) { // Do CRC generation and escape byte insertion AssemblePPPFrame (pOpenLine, pPacket); } else { // Do SLIP escape byte insertion AssembleSLIPFrame(pOpenLine, pPacket); }#ifdef DEBUG // DEBUGMSG (1, (TEXT("MpSend: After frame packet (%d):\r\n"), pPacket->CurrentLength)); // DumpMem (pPacket->CurrentBuffer, pPacket->CurrentLength);#endif for (packetBytesSent = 0; packetBytesSent < pPacket->CurrentLength; packetBytesSent += bytesWritten) { if (!WriteFile (pOpenLine->hPort, pPacket->CurrentBuffer + packetBytesSent, pPacket->CurrentLength - packetBytesSent, &bytesWritten, 0) || bytesWritten == 0) { DEBUGMSG(ZONE_SEND | ZONE_ERROR, ( TEXT( "AsyncMac:WriteFile Error %d Aborting Packet after sending %d of %d bytes\r\n" ), GetLastError(), packetBytesSent, pPacket->CurrentLength) ); Status = NDIS_STATUS_FAILURE; break; } DEBUGMSG (ZONE_SEND, (TEXT("AsyncMac: MpSend wrote %d bytes\r\n"), bytesWritten)); } } } DEBUGMSG ((ZONE_INIT|ZONE_INTERFACE) || (ZONE_ERROR && Status), (TEXT("ASYNCMAC:-MpSend: Returning 0x%X\r\n"), Status)); return Status;}BOOLIsValidOpenLinePtr(PASYNCMAC_OPEN_LINE pOpenLine)//// Validate pOpenLine.// Return TRUE if it is valid, FALSE otherwise.//// This function must be called with v_AdapterCS held.{ BOOL bValid = FALSE; PASYNCMAC_OPEN_LINE pOLCurrent; DEBUGMSG(ZONE_FUNCTION, (TEXT("+IsValidOpenLinePtr %x\n"), pOpenLine)); DEBUGMSG(ZONE_MISC, (TEXT(" IsValidOpenLinePtr v_pAdapter=%x\n"), v_pAdapter)); if (v_pAdapter) { DEBUGMSG(ZONE_MISC, (TEXT(" IsValidOpenLinePtr pHead=%x\n"), v_pAdapter->pHead)); for (pOLCurrent = v_pAdapter->pHead; pOLCurrent; pOLCurrent = pOLCurrent->pNext) { DEBUGMSG(ZONE_MISC, (TEXT(" IsValidOpenLinePtr pOLCurrent=%x\n"), pOLCurrent)); if (pOLCurrent == pOpenLine) { bValid = TRUE; break; } } } DEBUGMSG(ZONE_FUNCTION, (TEXT("-IsValidOpenLinePtr %x result=%d\n"), pOpenLine, bValid)); return bValid;}voidReleaseOpenLinePtr (PASYNCMAC_OPEN_LINE pOpenLine)//// Decrement the refcnt for the OpenLine parameter.// If the refcnt reaches zero, then no threads are using the OpenLine and so it is freed.//{ PASYNCMAC_OPEN_LINE pOLTemp; DEBUGMSG(ZONE_FUNCTION, (TEXT("+ReleaseOpenLinePtr %x\n"), pOpenLine)); EnterCriticalSection(&v_AdapterCS); if (IsValidOpenLinePtr(pOpenLine)) { pOpenLine->dwRefCnt--; DEBUGMSG(ZONE_MISC, (TEXT(" ReleaseOpenLinePtr refcnt now %d\n"), pOpenLine->dwRefCnt)); if (0 == pOpenLine->dwRefCnt) { DEBUGMSG(ZONE_MISC, (TEXT(" ReleaseOpenLinePtr removing pOpenLine=%x\n"), pOpenLine)); // Remove this from the adapter list. if (pOpenLine == pOpenLine->pAdapter->pHead) { // Trivial case, remove from head. pOpenLine->pAdapter->pHead = pOpenLine->pNext; DEBUGMSG(ZONE_MISC, (TEXT(" ReleaseOpenLinePtr trivial remove from head\n"))); } else { for (pOLTemp = pOpenLine->pAdapter->pHead; pOLTemp; pOLTemp = pOLTemp->pNext) { if (pOLTemp->pNext == pOpenLine) { pOLTemp->pNext = pOpenLine->pNext; break; } } ASSERT (pOLTemp); } DEBUGMSG(ZONE_MISC, (TEXT("***ReleaseOpenLinePtr FREEING pOpenLine=%x\n"), pOpenLine)); AsyncMacFreeMemory (pOpenLine, sizeof(ASYNCMAC_OPEN_LINE)); } } LeaveCriticalSection(&v_AdapterCS); DEBUGMSG(ZONE_FUNCTION, (TEXT("-ReleaseOpenLinePtr %x\n"), pOpenLine));}PASYNCMAC_OPEN_LINEGetOpenLinePtr (void *context)//// Return an OPEN_LINE ptr if the context is valid, NULL if not.//// Increments the refcnt to the OPEN_LINE.//// The caller of this function must call ReleaseOpenLinePtr if this// function returns non-NULL, in order to decrement the refcnt.//{ PASYNCMAC_OPEN_LINE pOpenLine = (PASYNCMAC_OPEN_LINE) context; DEBUGMSG(ZONE_FUNCTION, (TEXT("+GetOpenLinePtr %x\n"), pOpenLine)); EnterCriticalSection(&v_AdapterCS); if (IsValidOpenLinePtr(pOpenLine)) { // Increment refcnt to make sure it doesn't go away while in use. pOpenLine->dwRefCnt++; DEBUGMSG(ZONE_FUNCTION, (TEXT(" GetOpenLinePtr refcnt now %d\n"), pOpenLine->dwRefCnt)); } else pOpenLine = NULL; LeaveCriticalSection(&v_AdapterCS); DEBUGMSG(ZONE_FUNCTION, (TEXT("-GetOpenLinePtr result=%x\n"), pOpenLine)); return pOpenLine;}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?