📄 driver.cpp
字号:
NDIS_STATUS NIC_DRIVER_OBJECT::DriverSetInformation( IN NDIS_OID Oid, IN PVOID InfoBuffer, IN ULONG InfoBufferLength, OUT PULONG BytesRead, OUT PULONG BytesNeeded){ NDIS_STATUS status = NDIS_STATUS_SUCCESS; // pass to lower object, to see if it can handle this request, // if it can, return TRUE and set status. if(m_pLower->DeviceSetInformation( &status, Oid, InfoBuffer, InfoBufferLength, BytesRead, BytesNeeded)) return status; switch (Oid) { HANDLE_SET( OID_GEN_CURRENT_PACKET_FILTER,sizeof(U32)); case OID_802_3_MULTICAST_LIST: NdisMoveMemory( &m_pLower->m_szMulticastList[0][0], InfoBuffer, InfoBufferLength); m_pLower->m_nMulticasts = InfoBufferLength / ETH_ADDRESS_LENGTH; m_pLower->DeviceOnSetupFilter( m_pLower->m_szCurrentSettings[SID_GEN_CURRENT_PACKET_FILTER] | NDIS_PACKET_TYPE_MULTICAST); break; // don't care oids case OID_GEN_CURRENT_LOOKAHEAD: break; case OID_GEN_NETWORK_LAYER_ADDRESSES: default: status = NDIS_STATUS_INVALID_OID; } // of switch Oid return status;}void NIC_DRIVER_OBJECT::DriverEnableInterrupt(void){ m_pLower->DeviceEnableInterrupt();}void NIC_DRIVER_OBJECT::DriverDisableInterrupt(void){ m_pLower->DeviceDisableInterrupt();}BOOL NIC_DRIVER_OBJECT::DriverCheckForHang(void){ if(m_bSystemHang) return TRUE; return m_pLower->DeviceCheckForHang();}VOID NIC_DRIVER_OBJECT::DriverHalt(void){ m_pLower->DeviceHalt();}NDIS_STATUS NIC_DRIVER_OBJECT::DriverReset( OUT PBOOLEAN pbAddressingReset){ // Reset activities // 1. Abort all current tx and rx. // 2. Cleanup waiting and standby queues. // 3. Re-init tx and rx descriptors. // 4. Softreset MAC, PHY and set registers angain. *pbAddressingReset = TRUE;#ifndef IMPL_RESET return NDIS_STATUS_SUCCESS;#endif m_pLower->DeviceReset(); DriverStart(); m_bSystemHang = 0; m_bOutofResources = 0; return NDIS_STATUS_SUCCESS;}NDIS_STATUS NIC_DRIVER_OBJECT::DriverSend( IN PNDIS_PACKET pPacket, IN UINT uFlags){#if !defined(IMPL_TX_QUEUE) if(!m_pLower->DeviceQueryTxResources())
return NDIS_STATUS_RESOURCES; #endif PCQUEUE_GEN_HEADER pobj; if(!(pobj = m_TQueue.Dequeue())) { m_bOutofResources = 1; DEBUG_PRINT((TEXT("<DM9:m_bOutofResources\n"))); return NDIS_STATUS_RESOURCES; } PNDIS_BUFFER pndisFirstBuffer; UINT uPhysicalBufferCount; UINT uBufferCount; UINT uTotalPacketLength; PNDIS_BUFFER pndisCurrBuffer; PU8 pcurr = (PU8)CQueueGetUserPointer(pobj); PVOID ptrBuffer; UINT nBuffer; U32 idx,check; NdisQueryPacket( pPacket, &uPhysicalBufferCount, &uBufferCount, &pndisFirstBuffer, &uTotalPacketLength); if (uTotalPacketLength > ETH_MAX_FRAME_SIZE) { return NDIS_STATUS_FAILURE; } uPhysicalBufferCount &= 0xFFFF; for(idx=0,check=0,pndisCurrBuffer=pndisFirstBuffer; idx < uBufferCount; idx++, pndisCurrBuffer = pndisCurrBuffer->Next) { NdisQueryBuffer( pndisCurrBuffer, &ptrBuffer, &nBuffer); if(!nBuffer) continue; NdisMoveMemory(pcurr, ptrBuffer, nBuffer); pcurr += nBuffer; check += nBuffer; } // of for gathering buffer if(uTotalPacketLength != check) return NDIS_STATUS_FAILURE; pobj->pPacket = (PVOID)pPacket; pobj->uFlags = uFlags; pobj->nLength = uTotalPacketLength; m_pLower->DeviceSend(pobj); #ifdef IMPL_SEND_INDICATION return NDIS_STATUS_PENDING;#else return NDIS_STATUS_SUCCESS;#endif}void NIC_DRIVER_OBJECT::DriverReceiveIndication( int nCurr, PVOID pVoid, int nLength){ NdisMEthIndicateReceive( m_NdisHandle, (PNDIS_HANDLE)nCurr, (char*)pVoid, ETH_HEADER_SIZE, ((char*)pVoid + ETH_HEADER_SIZE), nLength - ETH_HEADER_SIZE, nLength - ETH_HEADER_SIZE); NdisMEthIndicateReceiveComplete(m_NdisHandle); return;} void NIC_DRIVER_OBJECT::DriverSendCompleted( PCQUEUE_GEN_HEADER pObject){ m_TQueue.Enqueue(pObject); #ifdef IMPL_SEND_INDICATION NdisMSendResourcesAvailable(m_NdisHandle); NdisMSendComplete( m_NdisHandle, (PNDIS_PACKET)(pObject->pPacket), NDIS_STATUS_SUCCESS);#endif} /******************************************************************************************** * * Trunk Functions * ********************************************************************************************/#ifdef __cplusplusextern "C" { // miniport driver trunk functions#endifNDIS_STATUS MiniportInitialize( OUT PNDIS_STATUS OpenErrorStatus, OUT PUINT SelectedMediaIndex, IN PNDIS_MEDIUM MediaArray, IN UINT MediaArraySize, IN NDIS_HANDLE MiniportHandle, IN NDIS_HANDLE WrapperConfigHandle){ PUTS(("<DM9:++MiniportIntialize>\n")); NIC_DRIVER_OBJECT *pnic; if(!(pnic = new NIC_DRIVER_OBJECT( MiniportHandle,WrapperConfigHandle))) return NDIS_STATUS_FAILURE; C_Exception *pexp; TRY { pnic->EDriverInitialize( OpenErrorStatus, SelectedMediaIndex, MediaArray, MediaArraySize); pnic->DriverStart(); FI; } CATCH(pexp) { pexp->PrintErrorMessage(); CLEAN(pexp); delete pnic; return NDIS_STATUS_FAILURE; } PUTS(("<DM9:--MiniportInitialize>\n")); return NDIS_STATUS_SUCCESS;}void MiniportISRHandler( OUT PBOOLEAN InterruptRecognized, OUT PBOOLEAN QueueInterrupt, IN NDIS_HANDLE MiniportContext){ ((NIC_DRIVER_OBJECT*)MiniportContext)->DriverIsr( InterruptRecognized, QueueInterrupt);}VOID MiniportInterruptHandler( IN NDIS_HANDLE MiniportContext){ ((NIC_DRIVER_OBJECT*)MiniportContext)->DriverInterruptHandler();}NDIS_STATUS MiniportQueryInformation( IN NDIS_HANDLE MiniportContext, IN NDIS_OID Oid, IN PVOID InfoBuffer, IN ULONG InfoBufferLength, OUT PULONG BytesWritten, OUT PULONG BytesNeeded){ return ((NIC_DRIVER_OBJECT*)MiniportContext)->DriverQueryInformation( Oid, InfoBuffer, InfoBufferLength, BytesWritten, BytesNeeded);}NDIS_STATUS MiniportSetInformation( IN NDIS_HANDLE MiniportContext, IN NDIS_OID Oid, IN PVOID InfoBuffer, IN ULONG InfoBufferLength, OUT PULONG BytesRead, OUT PULONG BytesNeeded){ return ((NIC_DRIVER_OBJECT*)MiniportContext)->DriverSetInformation( Oid, InfoBuffer, InfoBufferLength, BytesRead, BytesNeeded);}VOID MiniportEnableInterrupt( IN NDIS_HANDLE MiniportContext){ ((NIC_DRIVER_OBJECT*)MiniportContext)->DriverEnableInterrupt();}VOID MiniportDisableInterrupt( IN NDIS_HANDLE MiniportContext){ ((NIC_DRIVER_OBJECT*)MiniportContext)->DriverDisableInterrupt();}BOOLEAN MiniportCheckForHang( IN NDIS_HANDLE MiniportContext){ return ((NIC_DRIVER_OBJECT*)MiniportContext)->DriverCheckForHang();} VOID MiniportHalt( IN NDIS_HANDLE MiniportContext){ ((NIC_DRIVER_OBJECT*)MiniportContext)->DriverHalt();} NDIS_STATUS MiniportReset( OUT PBOOLEAN AddressingReset, IN NDIS_HANDLE MiniportContext){ return ((NIC_DRIVER_OBJECT*)MiniportContext)->DriverReset(AddressingReset);}NDIS_STATUS MiniportSend( IN NDIS_HANDLE MiniportContext, IN PNDIS_PACKET Packet, IN UINT Flags){ return ((NIC_DRIVER_OBJECT*)MiniportContext)->DriverSend(Packet,Flags);}#ifdef __cplusplus } // of miniport trunk functions#endif/******************************************************************************************** * * DriverEntry * ********************************************************************************************/extern "C" NTSTATUS DriverEntry( IN PDRIVER_OBJECT pDriverObject, IN PUNICODE_STRING pRegistryPath){ NDIS_STATUS status; NDIS_HANDLE hwrapper; NDIS40_MINIPORT_CHARACTERISTICS ndischar; PUTS(("<Davicom DM9000/9000A/9010 driver v3.2.9 for WinCE 5.0>\r\n")); NdisMInitializeWrapper( &hwrapper, pDriverObject, pRegistryPath, NULL); memset((void*)&ndischar,0,sizeof(ndischar)); ndischar.Ndis30Chars.MajorNdisVersion = PRJ_NDIS_MAJOR_VERSION; ndischar.Ndis30Chars.MinorNdisVersion = PRJ_NDIS_MINOR_VERSION; ndischar.Ndis30Chars.InitializeHandler = MiniportInitialize; ndischar.Ndis30Chars.ResetHandler = MiniportReset; ndischar.Ndis30Chars.CheckForHangHandler = MiniportCheckForHang; ndischar.Ndis30Chars.HaltHandler = MiniportHalt; ndischar.Ndis30Chars.HandleInterruptHandler = MiniportInterruptHandler; ndischar.Ndis30Chars.ISRHandler = MiniportISRHandler; ndischar.Ndis30Chars.QueryInformationHandler = MiniportQueryInformation; ndischar.Ndis30Chars.SetInformationHandler = MiniportSetInformation; ndischar.Ndis30Chars.SendHandler = MiniportSend; if((status = NdisMRegisterMiniport( hwrapper, (PNDIS_MINIPORT_CHARACTERISTICS)&ndischar, sizeof(ndischar)) != NDIS_STATUS_SUCCESS)) { NdisTerminateWrapper(hwrapper,NULL); return status; }#ifndef IMPL_DLL_ENTRY INIT_EXCEPTION();#endif return NDIS_STATUS_SUCCESS;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -