?? cipdrvr.c
字號:
return NDIS_STATUS_RESOURCES; } //================================================== // Associate symbolic link with new device //================================================== if (! NT_SUCCESS (IoCreateSymbolicLink (&p_Adapter->m_UnicodeLinkName, &l_TapUnicode))) { DbgPrint ("[%s] symbolic link couldn't be created\n", l_LinkString.Buffer); IoDeleteDevice (p_Adapter->m_TapDevice); RtlFreeUnicodeString (&p_Adapter->m_UnicodeLinkName); RtlFreeUnicodeString (&l_TapUnicode); ExFreePool (l_LinkString.Buffer); ExFreePool (p_Adapter->m_TapName); return NDIS_STATUS_RESOURCES; } l_Extension = ((CipeTapExtensionPointer) p_Adapter->m_TapDevice->DeviceExtension); NdisZeroMemory (l_Extension, sizeof (CipeTapExtension)); ListActivate (&l_Extension->m_PacketQueue, PACKET_QUEUE_SIZE); ListActivate (&l_Extension->m_IrpQueue, IRP_QUEUE_SIZE); l_Extension->m_Adapter = p_Adapter; p_Adapter->m_TapDevice->Flags &= ~DO_DEVICE_INITIALIZING; p_Adapter->m_TapDevice->Flags |= DO_DIRECT_IO; /* instead of DO_BUFFERED_IO */ RtlFreeUnicodeString (&l_TapUnicode); ExFreePool (l_LinkString.Buffer); DbgPrint ("[%s] successfully created TAP device [%s]\n", p_Adapter->m_Name, p_Adapter->m_TapName); p_Adapter->m_TapIsRunning = TRUE; return NDIS_STATUS_SUCCESS; }VOID DestroyTapDevice (CipeAdapterPointer p_Adapter) { CipeTapExtensionPointer l_Extension = (CipeTapExtensionPointer) p_Adapter->m_TapDevice->DeviceExtension; CipePacketPointer l_PacketBuffer; PIRP l_IRP; DbgPrint ("[%s] Destroying tap device\n", p_Adapter->m_TapName); p_Adapter->m_TapIsRunning = FALSE; p_Adapter->m_TapOpens = 0; while (QueueCount (&l_Extension->m_IrpQueue)) if (l_IRP = QueuePop (&l_Extension->m_IrpQueue)) { CancelIRP (p_Adapter->m_TapDevice, l_IRP); } while (QueueCount (&l_Extension->m_PacketQueue)) if (l_PacketBuffer = QueuePop (&l_Extension->m_PacketQueue)) { MemFree (l_PacketBuffer, sizeof (CipePacket) + l_PacketBuffer->m_Size); } ListDeactivate (&l_Extension->m_PacketQueue); ListDeactivate (&l_Extension->m_IrpQueue); IoDeleteSymbolicLink (&p_Adapter->m_UnicodeLinkName); RtlFreeUnicodeString (&p_Adapter->m_UnicodeLinkName); IoDeleteDevice (p_Adapter->m_TapDevice); ExFreePool (p_Adapter->m_TapName); p_Adapter->m_TapDevice = 0; p_Adapter->m_TapName = 0; }//===========================================================================================// Adapter Control//===========================================================================================NDIS_STATUS AdapterReset (OUT PBOOLEAN p_AddressingReset, IN NDIS_HANDLE p_AdapterContext) { CipeAdapterPointer l_Adapter = (CipeAdapterPointer) p_AdapterContext; DbgPrint ("[%s] is resetting\n", l_Adapter->m_Name); return NDIS_STATUS_SUCCESS; }VOID AdapterStop (IN NDIS_HANDLE p_AdapterContext) { CipeAdapterPointer l_Adapter = (CipeAdapterPointer) p_AdapterContext; DbgPrint ("[%s] is stopping\n", l_Adapter->m_Name); l_Adapter->m_InterfaceIsRunning = FALSE; }NDIS_STATUS AdapterReceive ( OUT PNDIS_PACKET p_Packet, OUT PUINT p_Transferred, IN NDIS_HANDLE p_AdapterContext, IN NDIS_HANDLE p_ReceiveContext, IN UINT p_Offset, IN UINT p_ToTransfer ) { return NDIS_STATUS_SUCCESS; }//===========================================================================================// Adapter Option Query/Modification//===========================================================================================NDIS_STATUS AdapterQuery ( IN NDIS_HANDLE p_AdapterContext, IN NDIS_OID p_OID, IN PVOID p_Buffer, IN ULONG p_BufferLength, OUT PULONG p_BytesWritten, OUT PULONG p_BytesNeeded ) { CipeAdapterPointer l_Adapter = (CipeAdapterPointer) p_AdapterContext; CipeAdapterQuery l_Query, *l_QueryPtr = &l_Query; NDIS_STATUS l_Status = NDIS_STATUS_SUCCESS; UINT l_QueryLength = 4; NdisZeroMemory (&l_Query, sizeof (l_Query)); NdisAcquireSpinLock (&l_Adapter->m_Lock); switch (p_OID) { //=========================================================================== // Vendor & Driver version Info //=========================================================================== case OID_GEN_VENDOR_DESCRIPTION: l_QueryPtr = (CipeAdapterQueryPointer) PRODUCT_STRING; l_QueryLength = strlen (PRODUCT_STRING) + 1; break; case OID_GEN_VENDOR_ID: l_Query.m_Long = 0xffffff; break; case OID_GEN_DRIVER_VERSION: l_Query.m_Short = (((USHORT) CIPE_NDIS_MAJOR_VERSION) << 8 | (USHORT) CIPE_NDIS_MINOR_VERSION); l_QueryLength = sizeof (unsigned short); break; case OID_GEN_VENDOR_DRIVER_VERSION: l_Query.m_Long = (((USHORT) CIPE_DRIVER_MAJOR_VERSION) << 8 | (USHORT) CIPE_DRIVER_MINOR_VERSION); break; //=========================================================================== // Statistics //=========================================================================== case OID_GEN_RCV_NO_BUFFER: l_Query.m_Long = 0; break; case OID_802_3_RCV_ERROR_ALIGNMENT: l_Query.m_Long = 0; break; case OID_802_3_XMIT_ONE_COLLISION: l_Query.m_Long = 0; break; case OID_802_3_XMIT_MORE_COLLISIONS: l_Query.m_Long = 0; break; case OID_GEN_XMIT_OK: l_Query.m_Long = l_Adapter->m_Tx; break; case OID_GEN_RCV_OK: l_Query.m_Long = l_Adapter->m_Rx; break; case OID_GEN_XMIT_ERROR: l_Query.m_Long = l_Adapter->m_TxErr; break; case OID_GEN_RCV_ERROR: l_Query.m_Long = l_Adapter->m_RxErr; break; //=========================================================================== // Device & Protocol Options //=========================================================================== case OID_GEN_SUPPORTED_LIST: l_QueryPtr = (CipeAdapterQueryPointer) g_SupportedOIDList; l_QueryLength = sizeof (g_SupportedOIDList); break; case OID_GEN_MAC_OPTIONS: l_Query.m_Long = ( NDIS_MAC_OPTION_RECEIVE_SERIALIZED | NDIS_MAC_OPTION_COPY_LOOKAHEAD_DATA | // This MUST be here !!! NDIS_MAC_OPTION_NO_LOOPBACK | NDIS_MAC_OPTION_TRANSFERS_NOT_PEND ); break; case OID_GEN_CURRENT_PACKET_FILTER: l_Query.m_Long = ( NDIS_PACKET_TYPE_ALL_LOCAL | NDIS_PACKET_TYPE_BROADCAST | NDIS_PACKET_TYPE_DIRECTED | NDIS_PACKET_TYPE_ALL_FUNCTIONAL ); break; case OID_GEN_PROTOCOL_OPTIONS: l_Query.m_Long = 0; break; //=========================================================================== // Device Info //=========================================================================== case OID_GEN_MEDIA_CONNECT_STATUS: l_Query.m_Long = NdisMediaStateConnected; break; case OID_GEN_HARDWARE_STATUS: l_Query.m_HardwareStatus = NdisHardwareStatusReady; l_QueryLength = sizeof (NDIS_HARDWARE_STATUS); break; case OID_GEN_MEDIA_SUPPORTED: case OID_GEN_MEDIA_IN_USE: l_Query.m_Medium = l_Adapter->m_Medium; l_QueryLength = sizeof (NDIS_MEDIUM); break; case OID_GEN_LINK_SPEED: l_Query.m_Long = 100000; break; case OID_802_3_MULTICAST_LIST: l_Query.m_Long = 0; break; case OID_802_3_PERMANENT_ADDRESS: case OID_802_3_CURRENT_ADDRESS: memcpy (l_Query.m_MacAddress, l_Adapter->m_MAC, 6); l_QueryLength = 6; break; //=========================================================================== // Limits //=========================================================================== case OID_GEN_MAXIMUM_SEND_PACKETS: l_Query.m_Long = 1; break; case OID_802_3_MAXIMUM_LIST_SIZE: l_Query.m_Long = 0; break; case OID_GEN_MAXIMUM_TOTAL_SIZE: l_Query.m_Long = DEFAULT_PACKET_LOOKAHEAD; break; case OID_GEN_TRANSMIT_BUFFER_SPACE: case OID_GEN_RECEIVE_BUFFER_SPACE: case OID_GEN_CURRENT_LOOKAHEAD: case OID_GEN_RECEIVE_BLOCK_SIZE: l_Query.m_Long = l_Adapter->m_Lookahead; break; case OID_GEN_TRANSMIT_BLOCK_SIZE: case OID_GEN_MAXIMUM_FRAME_SIZE: case OID_GEN_MAXIMUM_LOOKAHEAD: l_Query.m_Long = DEFAULT_PACKET_LOOKAHEAD - 14; break; //=========================================================================== // Not Handled //=========================================================================== default: DbgPrint ("[%s] Unhandled OID %lx\n", l_Adapter->m_Name, p_OID); l_Status = NDIS_STATUS_INVALID_OID; break; } if (l_Status != NDIS_STATUS_SUCCESS) ; else if (l_QueryLength > p_BufferLength) l_Status = NDIS_STATUS_INVALID_LENGTH, *p_BytesNeeded = l_QueryLength; else NdisMoveMemory (p_Buffer, (PVOID) l_QueryPtr, (*p_BytesWritten = l_QueryLength)); NdisReleaseSpinLock (&l_Adapter->m_Lock); return l_Status; }NDIS_STATUS AdapterModify ( IN NDIS_HANDLE p_AdapterContext, IN NDIS_OID p_OID, IN PVOID p_Buffer, IN ULONG p_BufferLength, OUT PULONG p_BytesRead, OUT PULONG p_BytesNeeded ) { CipeAdapterQueryPointer l_Query = (CipeAdapterQueryPointer) p_Buffer; CipeAdapterPointer l_Adapter = (CipeAdapterPointer) p_AdapterContext; NDIS_STATUS l_Status = NDIS_STATUS_INVALID_OID; ULONG l_Long; NdisAcquireSpinLock (&l_Adapter->m_Lock); switch (p_OID) { //=========================================================================== // Device Info //=========================================================================== case OID_802_3_MULTICAST_LIST: DbgPrint ("[%s] Setting [OID_802_3_MAXIMUM_LIST_SIZE]\n", l_Adapter->m_Name); l_Status = NDIS_STATUS_SUCCESS; break; case OID_GEN_CURRENT_PACKET_FILTER:
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -