⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cipdrvr.c

📁 DKW Heavy Industries VPN network driver
💻 C
📖 第 1 页 / 共 4 页
字号:
        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 + -