📄 driver.cpp
字号:
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){ PERF_PROBE_ON(PROBE_SEND);#if defined(PERF_TEST) return NDIS_STATUS_SUCCESS;#else PCQUEUE_GEN_HEADER pobj; //DEBUG_PRINT((TEXT("TQ size=%d"), m_TQueue.Size())); 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; PERF_PROBE_ON(PROBE_SEND+1); 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;#if 0 || defined(PATCH_001) /* do it twice */ dummy_copy((PU8)CQueueGetUserPointer(pobj), uTotalPacketLength);#endif PERF_PROBE_OFF(PROBE_SEND+1); pobj->pPacket = (PVOID)pPacket; pobj->uFlags = uFlags; pobj->nLength = uTotalPacketLength; m_pLower->DeviceSend(pobj); PERF_PROBE_OFF(PROBE_SEND);#ifdef IMPL_SEND_INDICATION return NDIS_STATUS_PENDING;#else return NDIS_STATUS_SUCCESS;#endif#endif // of !PERF_TEST}void NIC_DRIVER_OBJECT::DriverReceiveIndication( int nCurr, PVOID pVoid, int nLength){#if !defined(PERF_TEST) PERF_PROBE_ON(PROBE_RECV); 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); PERF_PROBE_OFF(PROBE_RECV); return; #elif defined(PERF_TX_MODE) m_pLower->DeviceDisableReceive(); return;#elif defined(PERF_ECHO_MODE) PCQUEUE_GEN_HEADER pobj; if(!(pobj = m_TQueue.Dequeue())) return; PU8 pcurr; pcurr = (PU8)CQueueGetUserPointer(pobj); memcpy((void*)pcurr,pVoid,pobj->nLength=nLength); PU16 pshort; pshort = (PU16)pcurr; // save SA to tmp U16 sa0,sa1,sa2; sa0 = *(pshort+0); sa1 = *(pshort+1); sa2 = *(pshort+2); // copy DA to SA *(pshort+0) = *(pshort+3); *(pshort+1) = *(pshort+4); *(pshort+2) = *(pshort+5); // restore DA from tmp *(pshort+3) = sa0; *(pshort+4) = sa1; *(pshort+5) = sa2; m_pLower->DeviceSend(pobj); return; #endif} void NIC_DRIVER_OBJECT::DriverSendCompleted( PCQUEUE_GEN_HEADER pObject){#if defined(PERF_TX_MODE) m_pLower->DeviceSend(pObject); return;#endif 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"));#if defined(DM9601) USB_NIC_DRIVER *pnic; if(!(pnic = new USB_NIC_DRIVER( MiniportHandle, WrapperConfigHandle, ghDevice, glpUsbFuncs, glpUsbDevice, glpInterface))) return NDIS_STATUS_FAILURE; glpUsbFuncs->lpRegisterNotificationRoutine( ghDevice, (LPDEVICE_NOTIFY_ROUTINE)USBNotificationRoutine, (LPVOID)pnic);#else NIC_DRIVER_OBJECT *pnic; if(!(pnic = new NIC_DRIVER_OBJECT( MiniportHandle,WrapperConfigHandle))) return NDIS_STATUS_FAILURE;#endif 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 * ********************************************************************************************/DWORD MesurePerformance( DWORD nLoop){ /* performance evaluation */ LARGE_INTEGER freq; LARGE_INTEGER listart, listop; DWORD dwstart, dwstop; QueryPerformanceFrequency(&freq); DWORD i,j; WORD sum, sz[1512]; memset((void*)sz, 0x5a, sizeof(sz)); dwstart = GetTickCount(); QueryPerformanceCounter(&listart); for(i=0;i<nLoop;i++) for(j=0,sum=0;j<1512;j++) sum += sz[j]; QueryPerformanceCounter(&listop); dwstop = GetTickCount(); return (listop.LowPart - listart.LowPart);}extern "C" NTSTATUS DriverEntry( IN PDRIVER_OBJECT pDriverObject, IN PUNICODE_STRING pRegistryPath){ NDIS_STATUS status; NDIS_HANDLE hwrapper; NDIS40_MINIPORT_CHARACTERISTICS ndischar;#if defined(DM9000) PUTS(("<Davicom DM9000 driver v3.2.7 for WinCE 4.2/5.0>\r\n"));#elif defined(DM9102) PUTS(("<Davicom DM9102 driver v3.2.7 for WinCE 4.2/5.0>\r\n"));#elif defined(DM9601) PUTS(("<Davicom DM9601 driver v3.2.7 for WinCE 4.2/5.0>\r\n"));#endif 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 defined(DM9601) if((status = NdisIMRegisterLayeredMiniport( hwrapper, (PNDIS_MINIPORT_CHARACTERISTICS)&ndischar, sizeof(ndischar), &ghNdisIntermediateHandle ) != NDIS_STATUS_SUCCESS))#else if((status = NdisMRegisterMiniport( hwrapper, (PNDIS_MINIPORT_CHARACTERISTICS)&ndischar, sizeof(ndischar)) != NDIS_STATUS_SUCCESS))#endif { NdisTerminateWrapper(hwrapper,NULL); return status; }#ifndef IMPL_DLL_ENTRY INIT_EXCEPTION();#endif return NDIS_STATUS_SUCCESS;}#if defined(DM9601)#include <usb100.h>#include <usbdi.h>#include <usbtypes.h>LPCWSTR glpcwstrDriverID = TEXT("DavicomUsb");extern "C" BOOL USBInstallDriver( LPCWSTR lpcwstrDriverName){ int ret; // register unique client driver identifier ret = RegisterClientDriverID( glpcwstrDriverID); // sets up the LoadClients registry keys USB_DRIVER_SETTINGS settings; settings.dwCount = sizeof(settings); settings.dwVendorId = 0x0A46; settings.dwProductId = 0x9601; settings.dwReleaseNumber = 0x0101; settings.dwDeviceClass = USB_NO_INFO;//USB_DEVICE_CLASS_COMMUNICATIONS; settings.dwDeviceSubClass = USB_NO_INFO; settings.dwDeviceProtocol = USB_NO_INFO; settings.dwInterfaceClass = USB_NO_INFO;//USB_DEVICE_CLASS_COMMUNICATIONS; settings.dwInterfaceSubClass = USB_NO_INFO;//0x06; // Ethernet model settings.dwInterfaceProtocol = USB_NO_INFO;//0x00; // no class specific ret = RegisterClientSettings( lpcwstrDriverName, glpcwstrDriverID, NULL, &settings); if(!ret) return FALSE; return TRUE;}extern "C" BOOL USBUnInstallDriver(void){ return TRUE;}extern "C" NTSTATUS PostDriverEntry( USB_HANDLE hDevice, LPCUSB_FUNCS lpUsbFuncs, LPCUSB_DEVICE lpUsbDevice, LPCUSB_INTERFACE lpInterface){ if(!ghNdisIntermediateHandle) return NDIS_STATUS_FAILURE; ghDevice = hDevice; glpUsbFuncs = lpUsbFuncs; glpUsbDevice = lpUsbDevice; glpInterface = lpInterface; NDIS_STATUS status; if((status = NdisIMInitializeDeviceInstanceEx( ghNdisIntermediateHandle, &guniRegistryPath, NULL ) != NDIS_STATUS_SUCCESS)) { return status; } return NDIS_STATUS_SUCCESS;}extern "C" BOOL USBDeviceAttach( USB_HANDLE hDevice, LPCUSB_FUNCS lpUsbFuncs, LPCUSB_INTERFACE lpInterface, LPCWSTR szUniqueDriverId, LPBOOL fAcceptControl, LPCUSB_DRIVER_SETTINGS lpDriverSettings, DWORD dwUnused ){ *fAcceptControl = TRUE; LPCUSB_DEVICE pusbdev; LPCUSB_INTERFACE pusbif; // retrive device and interface information for(pusbif=lpInterface;!pusbif;) { if(!(pusbdev = lpUsbFuncs->lpGetDeviceInfo(hDevice))) return FALSE; if(!(pusbif = lpUsbFuncs->lpFindInterface(pusbdev,0,0))) return FALSE; } // of for pusbif // check vendor and product IDs if( (pusbdev->Descriptor.idVendor != 0x0A46) || (pusbdev->Descriptor.idProduct != 0x9601)) return FALSE; unsigned short wsz[512]; wsprintf(wsz,TEXT("%s%d"),szUniqueDriverId,++gnInstance); NdisInitUnicodeString( &guniRegistryPath, wsz); if(PostDriverEntry(hDevice,lpUsbFuncs,pusbdev,pusbif) != NDIS_STATUS_SUCCESS) return (*fAcceptControl=FALSE); return *fAcceptControl; }#endif#if 0/* performance result * * * Pentium-S 133 MHz * 1,000,000 times, 163,472,385 uS * */LARGE_INTEGER lp1, lp2, lp;DWORD dw1, dw2;DWORD q1;DWORD iloops = 10*1000;dw1 = MesurePerformance(iloops);q1 = dw1 / iloops;QueryPerformanceFrequency( &lp);dw1 = GetTickCount();QueryPerformanceCounter(&lp1);NdisMSleep(2*1000*1000);if(0){ int i; for(i=0;i<0x70000000;i++);}dw2 = GetTickCount(); QueryPerformanceCounter(&lp2);DWORD delta=dw2-dw1;DWORD deltap = lp2.LowPart - lp1.LowPart;DWORD deltah = lp2.HighPart - lp1.HighPart;#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -