NDIS中间层的驱动包截获技术教程

NDIS函数大全手册 无连接微端口的上层函数 DriverEntry 由操作系统调用来激活和初始化微端口驱动程序 MiniportAllocateComple 调用它来指示以前调用的NdisMAllocateMemoryAsync已经完成 MiniportCheckForHang 检查NIC的内部状态 MiniportDisableInterrupt 禁止NIC产生中断 MiniportEnableInterrupt 允许NIC产生中断 MiniportHalt 重新分配和重新注册NIC占用的资源并且终止NIC以使. 阅读详情


NDIS(Network Driver Interface Specification)是网络驱动程序接口规范的简称。它横跨传输层、网络层和数据链路层,定义了网卡或网卡驱动程序与上层协议驱动程序之间的通信接口规范,屏蔽了底层物理硬件的不同,使上层的协议驱动程序可以和底层任何型号的网卡通信。NDIS为网络驱动程序创建了一个完整的开发环境,只需调用NDIS函数,而不用考虑操作系统的内核以及与其他驱动程序的接口问题,从而使得网络驱动程序可以从与操作系统的复杂通讯中分离,极大地方便了网络驱动程序的编写。另外,利用NDIS的封装特性,可以专注于一层驱动的设计,减少了设计的复杂性,同时易于扩展驱动程序栈。

1  NDIS驱动模型简介

NDIS支持的网络驱动程序类型:

网卡驱动程序(NIC Drivers):网卡驱动程序是网卡与上层驱动程序通信的接口,它负责接收来自上层的数据包,或将数据包发送到上层相应的驱动程序,同时它还完成处理中断等工作。

中间驱动程序(Intermediate Protocol Drivers):中间驱动程序位于网卡驱动程序和协议驱动程序之间,它向上提供小端口(Minport)函数集,向下提供协议(protocol)函数集,因此对于上层驱动程序而言,它是小端口驱动程序。对于底层的驱动程序,它是协议驱动程序。

协议驱动程序(Upper Level Protocol Drivers):协议驱动程序执行具体的网络协议,如IPX/SPXTCP/IP等。协议驱动程序为应用层客户程序提供服务,接收来自网卡或中间驱动程序的信息。

防火墙的开发一般采用的是中间驱动程序。通过NDIS中间层驱动,我们可以截获来自网卡的所有原始数据包。图1则是NDIS中间层驱动的工作过程图:


1  NDIS中间层驱动工作过程图

NDIS中间层驱动程序是工作在MINIPROTPROTOCOL接口之间的,驱动程序必须向下导出一个PROTOCOL接口,向上导出一个MINIPORT接口。将自己创建的驱动程序插入到网卡驱动程序与传输驱动程序之间。如此一来,当下层的网卡驱动程序接收到数据后会通过MINIPORT接口发送到导出的PROTOCOL接口上,NDIS中间层驱动程序便接收到了来自网卡的数据并调用准备好的回调函数处理数据包信息。接着NDIS中间层驱动在处理数据包完毕后再继续把数据通过导出的MINIPROT接口向PROTOCOL接口发送,这样就完成了一个截获数据包的过程[1]

2  NDIS中间层驱动的工作流程

在开始学习NDIS中间层驱动之前,我们有必要了解下NDIS是怎样工作的。当然这就包括了它的接收数据包的流程了。那么我们来看看NDIS接收数据包流程到底是怎样的:

1.低层的网卡驱动调用NdisMIndicateReceive或者NdisMEthIndicateReceive函数通知上一层已经它们已经收到数据。

2.接着系统调用自定义的PtReceive或者PtReceivePacket函数,到底系统会调用哪个函数跟机器的网卡有关。接着在函数中调用NdisGetReceivedPacket函数接受低层传上来的数据,如果我们得到了一个完整的packet包,我们就申请一个缓冲区存放下层传上来的数据,接着调用NdisMIndicateReceivePacket通知上层设备。如果此时MyPacketstatusNDIS_STATUS_RESOURCES,我们就在本函数中释放我们分配的缓冲区;否则我们在上层发送4的时候,在MPReturnPacket中释放该缓冲区。

3.如果在PtReceive或者PtReceivePacket函数中无法得到一个完整的packet,那么就调用NdisMEthIndicateReceive等函数通知系统。

4.当上层设备得到了一个完整的数据并且处理完毕以后,它会调用NdisReturnPacket,然后NDIS会调用我们的MPReturnPacket。如果申请的缓冲区没释放,则在MPReturnPacket函数中释放该缓冲区。然后同样的向下层调用NdisReturnPacket。下层会释放他们自己申请的缓冲区。

5.如果3发生,那么系统会调用PtReceiveComplete函数。在PtReceiveComplete函数中我们应该调用NdisMEthIndicateReceiveComplete,通知系统收到了完整的数据。

6.当上层协议驱动得知底层已经收到了完整的数据报文以后,可能会调用NdisTransferData,要求下层把剩余的数据传上来。然后系统调用MPTransferData例程。在MPTransferData中,调用NdisTransferData。必须注意的是该函数的返回值:如果返回success,说明剩余的数据立刻就传上来了。此时会立即返回。7步骤就不会调用;如果返回pending,表明底层在此阻塞,底层会在稍后的时候调用7

7.当底层miniport驱动做好了一个完整的packet,它会调用NdisTransferDataComplete。同样的,系统会调用我们的PtTransferDataComplete函数。这样,整个接收数据的流程就结束了[2]


2  NDIS中间层驱动工作流程图

通过流程图可以知道在PtReceive或者PtReceivePacket中可以得到我们所希望的数据,然后在以上2个函数中加入自己的处理代码,就可以达到截获数据并进行相应处理的目的了。

3  在驱动程序中导出接口

我们首先必须在驱动程序中向系统注册导出虚拟接口。这些工作将在DriverEntry函数中完成,代码如下:

DriverEntry(

              IN   PDRIVER_OBJECT             DriverObject,

              IN   PUNICODE_STRING          RegistryPath

                      )

{

              NDIS_STATUS                                        Status;

              NDIS_PROTOCOL_CHARACTERISTICS  PChars;   //保存有关导出PROTOCOL接口的回调函数地址的结构

              NDIS_MINIPORT_CHARACTERISTICS   MChars;  //保存有关导出MINIPORT接口的回调函数地址的结构

              PNDIS_CONFIGURATION_PARAMETER Param;

              NDIS_STRING                                        Name;

 

NdisMInitializeWrapper(&NdisWrapperHandle, DriverObject, RegistryPath, NULL);  //初始化NdisWrapperHandle

   //设置其他的回调函数

MChars.SendPacketsHandler = MPSendPackets;  //设置发送数据包的回调函数

//NDIS注册我们的MINIPORT接口

              Status = NdisIMRegisterLayeredMiniport(NdisWrapperHandle,

                                                                              &MChars,

                                                                              sizeof(MChars),

                                                                              &DriverHandle);

PChars.ReceivePacketHandler = PtReceivePacket;  //设置接收数据包的回调函数

       //NDIS注册MINIPORT接口

              NdisRegisterProtocol(&Status,

                                                &ProtHandle,

                                                &PChars,

                                                sizeof(NDIS_PROTOCOL_CHARACTERISTICS));

              //通知NDIS生成所注册的2个接口

              NdisIMAssociateMiniport(DriverHandle, ProtHandle);

       }

如此一来,驱动程序可以看成是工作在网卡层与协议层之间了,当底层网卡有数据到来时会先经过驱动程序处理后再往上层设备发送的。那么我们就可以在自己的回调函数中处理来自网络的数据了。

4  回调函数的工作

在向系统注册的回调函数中,比较重要的就是PtReceivePtReceivePacket函数了。为了程序的通用性,2个回调函数的大致处理流程是一样的。我们仅拿PtReceive函数来做例子。PtReceive函数的原型如下:

NDIS_STATUS

PtReceive(

       IN  NDIS_HANDLE  ProtocolBindingContext,

       IN  NDIS_HANDLE    MacReceiveContext,

       IN  PVOID   HeaderBuffer,            

       IN  UINT      HeaderBufferSize,                

       IN  PVOID   LookAheadBuffer,      

       IN  UINT      LookAheadBufferSize,         

       IN  UINT      PacketSize                                 

)

在该函数中,第三个参数的指向帧头的起始缓冲区,第五个参数指向数据体的起始缓冲区,第七个参数的值为缓冲区大小。如果PacketSize大于LookAheadBufferSize,表明数据还未全部拷贝上来。如果这2个参数相等,那么说明数据全部在LookAheadBuffer变量指向的缓冲区内。来看看下面的代码:

NDIS_STATUS

PtReceive(

       IN  NDIS_HANDLE  ProtocolBindingContext,

       IN  NDIS_HANDLE    MacReceiveContext,

       IN  PVOID   HeaderBuffer,             //以太头数据

       IN  UINT      HeaderBufferSize,                 //以太头数据大小

       IN  PVOID   LookAheadBuffer,       //数据体部分

       IN  UINT      LookAheadBufferSize,          //LookAheadBuffer数据大小

       IN  UINT      PacketSize                                         //数据包大小

)

{

       PADAPT               pAdapt =(PADAPT)ProtocolBindingContext;

       PNDIS_PACKET   MyPacket, Packet;

       NDIS_STATUS             Status = NDIS_STATUS_SUCCESS , DataStatus ;

 

if(!pAdapt->MiniportHandle)

       {

              Status = NDIS_STATUS_FAILURE;

       }

       else do

       {

              if(pAdapt->isSecondary)

                      ASSERT(0);

//从下层驱动获取数据包

              Packet = NdisGetReceivedPacket(pAdapt->BindingHandleMacReceiveContext); 

              if(Packet != NULL)

              {

                     //如果数据包不为空那么就为下层即将

                     //发送上来的数据包分配空间

                      NdisDprAllocatePacket(&Status

                             , &MyPacket, pAdapt->RecvPacketPoolHandle);

                      if(Status == NDIS_STATUS_SUCCESS)

                      {

                             //拷贝原下层数据包到我们分配的缓冲中

                            MyPacket->Private.Head = Packet->Private.Head;

                            MyPacket->Private.Tail = Packet->Private.Tail;

                            NDIS_SET_ORIGINAL_PACKET(

MyPacket, NDIS_GET_ORIGINAL_PACKET(Packet));

                            NDIS_SET_PACKET_HEADER_SIZE(MyPacket, HeaderBufferSize);

                            NdisGetPacketFlags(MyPacket) = NdisGetPacketFlags(Packet);

                            NDIS_SET_PACKET_STATUS(MyPacket, DIS_STATUS_RESOURCES);

                            ASSERT(NDIS_GET_PACKET_STATUS(MyPacket) == NDIS_STATUS_RESOURCES);

                            //拷贝数据包完成

                            //数据包分析处理函数

                            PacketAnalysis(MyPacket);

       //处理代码

       //通知NDIS已复制数据包到缓冲区中

NdisMIndicateReceivePacket(pAdapt->MiniportHandle, &MyPacket, 1);

//释放数据包

                            NdisDprFreePacket(MyPacket);

                            break;

PtReceive函数中我们要做的就是为从下层传上来的数据分配缓冲区,然后将收到的数据拷贝到分配的缓冲区中,接着调用NdisMIndicateReceivePacket函数将数据传给上一层。PacketAnalysis函数就是包分析函数,在该函数中我们就可以对传来的数据进行处理,过滤和拦截了。

5  数据包的分析与处理

在以上代码中,其实在MyPacket这个结构中就储存了所希望得到的数据包地址,但是如何得到数据呢?我们在得到数据的过程中需要了解NDIS_PACKETNDIS_BUFFER这两个结构。下面给出这两个结构的定义:

 


// NDIS_PACKET
结构的定义  
typedef struct _NDIS_PACKET  
{  
NDIS_PACKET_PRIVATE Private;  
//
这个其实是一个链表结构,Private.Head指向第一个链表,Private.Tail指向最后一个
  
//
以下有关于这个结构的解释
  
union  
{  
struct // For Connection-less miniports   
{  
UCHAR MiniportReserved[2*sizeof(PVOID)];  
UCHAR WrapperReserved[2*sizeof(PVOID)];  
};  
struct  
{   
// For de-serialized miniports. And by implication conn-oriented miniports.   
// This is for the send-path only. Packets indicated will use WrapperReserved   
// instead of WrapperReservedEx   
UCHAR MiniportReservedEx[3*sizeof(PVOID)];  
UCHAR WrapperReservedEx[sizeof(PVOID)];  

struct  
UCHAR MacReserved[4*sizeof(PVOID)];  
ULONG_PTR Reserved[2]; // For compatibility with Win95   
UCHAR ProtocolReserved[1];  
} NDIS_PACKET, *PNDIS_PACKET, **PPNDIS_PACKET;  
// NDIS_PACKET_PRIVATE 
的定义
  
typedef struct _NDIS_PACKET_PRIVATE  
{  
UINT PhysicalCount; // number of physical pages in packet.   
UINT TotalLength; // Total amount of data in the packet.   
PNDIS_BUFFER Head; // 
链表指针,指向下一个
  
PNDIS_BUFFER Tail; // 
链表指针,指向前面一个
  
// if Head is NULL the chain is empty; Tail doesn/'t have to be NULL also   
PNDIS_PACKET_POOL Pool; // so we know where to free it back to   
UINT Count;  
ULONG Flags;  
BOOLEAN ValidCounts;  
UCHAR NdisPacketFlags; // See fPACKET_xxx bits below   
USHORT NdisPacketOobOffset;  
} NDIS_PACKET_PRIVATE, * PNDIS_PACKET_PRIVATE;  
//NDIS_BUFFER
定义 其实就是一个内存描述符
 
typedef struct _NDIS_BUFFER {  
struct _NDIS_BUFFER *Next; //
指向下一个节点的指针
 
PVOID VirtualAddress;      //
指向报文首地址
 
PNDIS_BUFFER_POOL Pool;  
UINT Length;               //
报文数据长度
 
UINT Signature;  
} NDIS_BUFFER, * PNDIS_BUFFER;  

我们要的数据就储存在NDIS_BUFFER这个结构中的VirtualAddress成员里面,这个指针指向数据包的首地址。关系图如图3所示:


3  结构关系图

NDIS_PACKET是一个描述NDIS_BUFFER链表的结构,在NDIS_PACKET中的成员Private中有指向第一个NDIS_BUFFER的指针和指向最后一个NDIS_BUFFER的指针分别是Private.HeadPrivate.Tail[3][4]。而NDIS_BUFFER中就记录了我们数据包的地址和下一个NDIS_BUFFER的地址。操作有很多种方法,但是由于这些结构体本来对我们是不透明的,所以最安全的方法是用微软提供的一系列函数来操作NDIS_PACKETNDIS_BUFFER。这些函数都可以在DDK中查得到。

获取数据包内容的代码如下:

NDIS_STATUS status ; 
   PNDIS_BUFFER NdisBuffer ; 
   UINT TotalPacketLength = 0 , copysize = 0 , DataOffset = 0 , PhysicalBufferCount  ,  BufferCount   ; 
   PUCHAR mybuffer = NULL ,tembuffer = NULL ;  
//
假设这个是在PtReceive等函数中得到的
PACKET 
NdisQueryPacket(packet                     //
先得到第一个NDISBUFFER的指针
   
        , &PhysicalBufferCount              
        , &BufferCount                           
        ,&NdisBuffer                               //NdisBuffer
就是指向链表头
 
        , &TotalPacketLength 
        ); 
其实也可以直接  NdisBuffer = packet->Private.Head ;就可以取得第一个BUFFER
 
    status = NdisAllocateMemory( &mybuffer, 2048, 0, HighestAcceptableMax );  //
分配内存块
 
    if( status != NDIS_STATUS_SUCCESS ) 
        return NDIS_STATUS_FAILURE ; 
    NdisZeroMemory( mybuffer, 2048 ) ; 
    NdisQueryBufferSafe(  //
取得NDIS_BUFFER描述符中数据的首地址和大小
 
                                NdisBuffer, 
                                &tembuffer, 
                                &copysize, 
                                NormalPagePriority 
        //
将数据复制到内存中
 
    NdisMoveMemory(mybuffer, tembuffer, copysize) ; 
    DataOffset = copysize ; 
    while(1) 
    { 
    
也可以这样操作而不用
NdisGetNextBuffer 
        if(NdisBuffer->Next == packet->Private.Tail ) 
            break ; 
        NdisBuffer = NdisBuffer->Next ; 
        if(pmdl == NULL ) 
           break ; 
        //
获得下一个NDIS_BUFFER的的指针
 
    NdisGetNextBuffer(NdisBuffer , &NdisBuffer ) ; 
        
如果指针是NULL那么表示到链表尾了
 
    if( NdisBuffer == NULL ) 
        break ; 
    NdisQueryBufferSafe( 
                                NdisBuffer, 
                                &tembuffer, 
                                &copysize, 
                                NormalPagePriority 
                                ) ; 
    NdisMoveMemory( mybuffer + DataOffset , tembuffer, copysize) ; 
    DataOffset += copysize  ; 
//
我们要的数据就全部都在申请的内存mybuffer中,数据大小为DataOffset

我们想要的截获数据包的功能就达到了,如果想要过滤数据包,那么就只需要对数据包的内容进行判断就可以了。但是需要注意的是mybuffer里面的数据为原始数据包的数据,也就是包括了包头等一系列信息,需要自己分析包头信息来获取希望的数据。

6  结束语

本文只通过简单的一些示例代码阐述了如何利用驱动来截获数据包的方法。大部分防火墙就是通过该技术截获网络数据并判断数据的合法性实现保护的。但是要写出很具有通用性的代码还需要更广泛的知识作为基础。在这里仅给大家抛砖引玉,至于关于NDIS中间驱动更详细的信息读者们可以去参考微软提供的WDK文档。

Windows内核原理与实现之 NDIS(网络驱动程序接口规范) 文章摘录自《Windows内核原理与实现》一书。 在Windows的网络栈中,网络协议与网络适配器是分离的,协议驱动程序并不针对特定的网络适配器而设计,然而,当协议驱动程序正真运行时,它必须通过一个网络适配器才能发送和接收数据。协议驱动程序通过统一的接口与网络适配器驱动程序进行通信,此接口即为 Microsoft 和 3COM 于 1989 年联手开发的NDIS(Network Driver I... 阅读详情

相关推荐

别再傻傻分不清了!一文搞懂USB 4G/5G模块的NDIS、ECM、MBIM、RNDIS拨号区别(附Linux/Windows选型指南)

本文深度解析USB 4G/5G模块的NDIS、ECM、MBIM、RNDIS等拨号协议的技术差异与选型策略,涵盖Linux/Windows平台的驱动支持、性能对比及实战配置示例。通过实测数据揭示MBIM协议在5G环境下的性能优势,并提供工业网关、车载设备等典型场景的优化方案,帮助开发者实现高效稳定的蜂窝网络连接。

weixin_30764771的博客 269

Ndis 网络发包收包

<br />版权信息:<br /><br />本文来自internet,转载这里供网络编程爱好者学习和研究使用,请尊重作者的劳动成果。未经授权而在商业上使用原作者的文章属侵权行为,后果由使用者自负,本人不承担任何法律责任。<br /> <br /> <br />window网口驱动编程<br /> <br />一、    前言<br /> <br />RTL8139 可能是目前最受欢迎的网卡,它的价格便宜,功能上也还能接受。虽然在效能上有时会略不及Intel 的 eepro100,但因为价格实在太便宜了,所

smilestone322的专栏 3666

嵌入式设备RNDIS驱动安装指南:从原理到实战

USB网络通信是嵌入式设备与主机进行数据传输和调试的重要方式,其核心在于实现设备与主机之间的网络协议互通。RNDIS(Remote Network Driver Interface Specification)协议作为微软定义的远程网络驱动接口规范,允许USB设备在Windows系统上虚拟出标准网络适配器,从而通过TCP/IP协议栈进行通信。这一技术的价值在于为缺乏有线或无线网络接口的嵌入式设备提供了便捷、稳定的网络连接方案,仅需一根USB线即可同时解决供电、调试和网络连接需求。在物联网终端、智能硬件和工控

weixin_30907935的博客 399

NDIS中间层驱动程序

概要:开发一个NDIS驱动是一项相对复杂的工作,这一方面是由于核心驱动本身有更多的限制和要求,有更多的“游戏规则”要求开发者理解和掌 握,NDIS的复杂性把难度更是提高了,本文以PassThru为例,加上自己的理解,讲述了NDIS驱动的处理过程和在PassThru的基础上进行扩 展的基本方法,本文并不是一个入门读物,所以没有提及任何核心驱动开发的相关知识,本文主要讲述的是NDIS中间层对数据包处理

firebird321的专栏 4305

基于IMD的包过滤防火墙原理与实现

一、前言二、IMD中间层技术介绍三、passthru例程分析四、部分演示代码五、驱动编译与安装六. 总结一、前言    前段时间,在安全焦点上看到了TOo2y朋友写的《基于SPI的数据报过滤原理与实现》,很是不错。文章中提到的基于SPI的数据报拦截技术是在用户级的。用户级的拦截有其优势,实现方便、便于移植、通用性强,但是,用户级并不能得到所有的数据报。本文提到的基于IMD的数据报过滤则是属于内核级

小猪的网络编程 5119

ndis中间层驱动总结

1.NDIS_PACKET 包描述符结构 结构中包含3个域,Head,Tail,NdisPacketOobOffset,包描述符和一个或者多个链式数据缓冲区(MDL)关联,这个缓冲区包含真正的网咯数据。Head指向第一个缓冲区地址,Tail指向最后一个为NULL ,可以通过NdisQueryPacket,NdisGetNextBufferNdisGetFirstBufferFromPa...

研究源码的最底层,只持有正确的仓位 1438

[转帖]WinCE的网络驱动实现原理

原来一直对NDIS不太清楚,DM9000AEP能用了后也没再仔细研究这部分的工作原理。今天恰好看到这篇文章,分析了NDIS,MiniPort以及网卡驱动的实现原理。原文地址:http://www.cnblogs.com/sankye/articles/1651280.htmlWinCE的网络驱动实现原理<br />1.WinCE的网络通信架构<br />WinCE的网络通信架构如图1所示,WinCE的网络通信架构中一个重要的角色是网络结构规范(NetworkDriver Interface Specific

lbqhope的专栏 1141

TAP-Windows V9驱动源码工程包(含VS2019+WDK10完整编译支持)

一套开箱即用的Windows虚拟网卡驱动开发资源,聚焦TAP-Windows Adapter V9版本,覆盖从驱动初始化、设备对象管理、数据收发(rx/tx路径)、OID请求响应、DHCP协议交互到内存与错误处理等全部核心模块。源码结构清晰,包含adapter.c、device.c、rxpath.c、txpath.c、oidrequest.c、dhcp.c、tapdrvr.c等主逻辑文件,以及配套头文件如tap-windows.h、constants.h、lock.h、mem.h等,定义了类型映射、同步机制

yy01234的博客 244

适用于Windows 7的REALTEK全系列网卡驱动程序(经实测可用)

htmltable {th, td {th {pre {简介:本文介绍的“WIN7 REALTEK系列网卡驱动”是专为Windows 7操作系统设计的REALTEK品牌网络适配器驱动合集,经过实际测试验证可稳定运行。该驱动包包含版本1.12.0022,发布于2011年9月22日,支持多种REALTEK网卡型号,有效解决兼容性问题、网络连接异常及性能瓶颈。

weixin_28809949的博客 2176

[教程]在Windows 2012 R2上安装Intel I217-V/I218-V/I219-V网卡驱动

由于Intel坑爹的在Server版不支持I217-V/I218-V网卡,研究了一番,终于把驱动装上咯。网卡型号去主板官网查看参数即可看到 以下以I218-V网卡为例。因为我是x299 1、下载Intel官方驱动: https://downloadcenter.intel.com/Detail_Desc.aspx?agr=Y&

AI架构师-CJF 4万+

避坑指南:RoboMaster客户端与DJI驱动安装的那些‘神坑’及一键解决方案

本文详细解析了RoboMaster客户端与DJI驱动安装过程中的常见问题及解决方案,包括驱动安装超时、USB设备识别异常、图传卡顿等‘神坑’。提供了一键修复脚本和硬件选型建议,帮助参赛团队快速搭建稳定的软件环境,提升比赛准备效率。

weixin_30412167的博客 463

华为MH5000-31 5G模组Windows 10驱动安装与AT指令拨号3步实测

本文详细介绍了华为MH5000-31 5G模组在Windows 10系统下的驱动安装与AT指令拨号全流程。通过巴龙5000芯片支持NSA/SA双模组网,适用于工业物联网等高带宽场景。文章包含硬件连接要点、驱动安装步骤、AT指令拨号配置及常见问题解决方案,帮助用户快速实现5G模组的稳定连接与高效使用。

weixin_31887307的博客 251

Windows 10 WiFi适配器消失问题的全面解决方案

无线网络适配器是计算机连接WiFi网络的核心硬件组件,其工作原理是通过驱动程序与操作系统进行通信。在Windows系统中,驱动签名验证和电源管理机制是确保硬件稳定运行的关键技术。当遇到WiFi适配器无故消失的问题时,通常涉及驱动冲突、电源设置错误或注册表损坏等技术环节。这类问题在Windows 10/11系统中尤为常见,特别是在系统更新或非正常关机后。通过彻底卸载驱动、安装官方版本、调整电源管理设置等方法,可以有效解决设备管理器不显示无线网卡的问题。对于企业IT管理员和普通用户而言,理解这些底层原理有助于快

weixin_30888413的博客 313

华为 MH5000-31 5G模组 Windows/Linux 双平台部署:从驱动安装到AT指令上网全流程

本文详细解析华为MH5000-31 5G模组在Windows和Linux双平台下的全流程部署,包括驱动安装、AT指令配置及网络拨号等关键步骤。该工业级模组支持NSA/SA双模组网,具备-40℃~+85℃宽温工作能力,适用于智能电网等严苛环境。文章特别提供AT指令优化技巧和实际项目经验,助力开发者快速实现5G网络接入。

注重长远 天天积累 cqujsjcyj 775

戴尔Vostro 3400专用BCM DW1501无线网卡驱动(WinXP/Win7双平台)

专为戴尔Vostro 3400笔记本适配的Broadcom BCM DW1501无线网卡官方驱动包,解决系统无法识别Wi-Fi硬件、无线开关无效、连接频繁断开或网络列表空白等问题。包含两个独立安装程序:WLAN_BCM_5.60.48.35XP.exe支持Windows XP(2011年1月发布),WLAN_BCM_5.60.48.35W7.exe支持Windows 7,均来自戴尔原始固件,数字签名完整,无需额外运行库或管理员权限即可完成静默安装。安装后可启用无线开关、正常扫描并连接2.4GHz Wi-Fi

vim8coder的博客 199

Windows 10 Miracast无线投屏失败?从硬件兼容性到系统服务的全方位排查指南

本文详细解析了Windows 10 Miracast无线投屏失败的常见原因及解决方案,从硬件兼容性检查到系统服务配置,再到驱动更新与网络设置优化,提供全方位的排查指南。特别针对无线投影功能无法使用的典型问题,给出了实用的诊断步骤和修复建议,帮助用户快速恢复Miracast投屏功能。

weixin_30480075的博客 323

Intel(R) Ethernet Connection I218 V及Intel(R) Ethernet Connection I219 V不能安装windows Server解决方法

该网卡在安装windows Server系列系统(如windows server2012 、windows server2016、windows server2019等)时无法安装驱动。 Intel® Ethernet Connection I218-LM有windows server驱动。 也兼容多种网卡所以也应该是通用的驱动,经过测试果然可以使用,,发现只是官方不给装。会报错而已 下面提供解决...

dilinguo的博客 3万+
上一篇: 防御能力(Power of Defense)游戏修改器
下一篇: ntsd教程
yxyhack
博客等级 码龄19年 296粉丝 58原创
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值