windows驱动_windows驱动开发 - CSDN
精华内容
参与话题
  • Windows驱动程序开发比较复杂,我将带领大家一起领略内核模式下编程的奥妙。 您将真正掌握内核编程的原理与技术,将技术水平提升一个档次,学会核心技术。 您将掌握Windows驱动开发的基本技术;灵活应用IRP、IO堆栈...
  • 详解Windows驱动程序的发展由来,实战NT驱动、WDM驱动程序的开发制作,让学员掌握驱动开发的全部流程,整体架构,快速学会Windows驱动程序开发
  • Windows驱动学习(一)-- 环境搭建

    千次阅读 2018-09-19 09:27:14
    1.安装WDK 在Microsoft官网上下载WDK最新版本,按...WDK安装成功后会在Visual Studio上显示驱动类项目,在Visual C++目录下的Driver目录中(我这里不知道什么bug,被移到测试目录下了)。接下来点击创建Empty WDM...

    教程参考自:https://www.bilibili.com/video/av26193169/?p=1
    代码地址:https://github.com/G4rb3n/Windows-Driver/tree/master/MT-Test

    1.安装WDK

    在Microsoft官网上下载WDK最新版本,按步骤安装就行了。
    1

    2.创建驱动项目

    WDK安装成功后会在Visual Studio上显示驱动类项目,在Visual C++目录下的Driver目录中(我这里不知道什么bug,被移到测试目录下了)。接下来点击创建Empty WDM Driver项目。
    2

    然后在刚创建的项目MTDriver_Test的源文件文件夹上右键,添加新建项。选择C++文件,取名为main.c。
    3

    下面是一个测试代码,首先需要包含头文件<ntddk.h>,然后编写驱动入口函数,驱动的入口函数为DriverEntry,Drvier为默认的驱动对象,RegPath为对应的注册表位置。代码功能如下。
    4

    代码写好了,下面来介绍两个坑,第一个,要在项目->属性->Driver Setting中选择要安装驱动的操作系统的类型,我要在32位Win7下测试,所以选择Windows7。
    5

    然后在C/C++中将支持仅我的代码调试,和将警告视为错误都设置为“否”。
    6

    编译成功后,就生成了我们的驱动文件MTDriver_Test.sys了。
    7

    3.测试机环境准备

    开始讲解测试机的环境准备,需要两个软件,Dbgview和DriverMonitor,Dbgview用来查看调试信息,DriverMonitor用来加载和卸载驱动。
    8

    DbgView需要勾选Capture Kernel和Enable Verbose Kernel Output选项。
    9

    4.开始测试

    使用DriverMonitor加载驱动MTDriver_Test.sys,然后点击Start Driver,便会开始运行驱动。随着驱动运行成功,DbgView也捕捉到了我们的调试信息(打印注册表路径)。
    10

    卸载驱动时,驱动会调用DriverUnload函数,DbgView也捕捉到了调试信息“This driver is unloading”。
    11

    展开全文
  • Windows驱动开发之入门篇(一)

    千次阅读 2017-11-24 11:05:46
    本文主要介绍“如何入门Windows驱动开发”和“新手需要掌握哪些知识和动手技能”,大部分是本人探索Windows驱动开发近一月时间的经验之谈。大致包括如下几个方面: 1,开发工具、调试工具和调试手段; 2,Windows...


    原文链接:http://blog.csdn.net/sagittarius_warrior/article/details/51000241


    本文主要介绍“如何入门Windows驱动开发”和“新手需要掌握哪些知识和动手技能”,大部分是本人探索Windows驱动开发近一月时间的经验之谈。大致包括如下几个方面:

    1,开发工具、调试工具和调试手段;

    2,Windows驱动开发框架;

    3,驱动程序基本知识;

    4,PCIE驱动程序;

    5,学习资料

            以上内容在本文仅做简单介绍,后续随着本人经验的增加,将经常更新本文,并对有些内容单独开篇进行讲解。

            参考MSDN文档:点击打开链接

    一、开发工具

    1,虚拟机和操作系统

            本人使用的win10操作系统,并安装了“VMware Station11”,在虚拟机中暂时只安装了一个“win7 x64”操作系统,后续将安装一个win10虚拟机系统。一般情况下,我都是在虚拟机操作进行驱动的安装和调试,这样可以防止将本机的操作系统弄乱。

            后续将尝试“通过本机winDbg来调试虚拟机中的驱动”。这是一个比较高级的调试方法,点击打开链接

    2,开发工具

            本人主要使用“WDK7600”(点击打开链接)和"VS2015+wdk10"(点击打开链接)。我把前者安装在“win7 X64”虚拟机中安装,把后者安装在本机和实验室电脑上。由于我使用的教材《Windows驱动开发详解》和学习博客都是用wdk7这个版本开发,为了环境一致,故选择了在虚拟机上试验这些教材上的示例代码。

            关于wdk7,参考博客:点击打开链接

            关于“VS2015+wdk10”,需要在win10系统下,先安装VS2015,再安装wdk10,此外还要安装VS2015的update。(winDbg集成到了wdk10下,路径:C:\Program Files (x86)\Windows Kits\10\Debuggers\x64)。

    注意事项:

    1)VS2015默认安装,是不安装c++和sdk的,需要选择自定义安装;

    2)如果已经默认安装了,这个时候再安装wdk10,会给出警告;

    3)此时,可以选择先用VS2015新建一个c++项目,然后会提示你安装c++部分的模块;

    4)安装好后,就可以正常安装wdk10了,如果wdk10安装好后,还有编译问题,也需要先去VS下看看是否却c++相关模块,并按上述3安装完整。

    另一个需要注意的是,编译报“Inf2Cat error -2: "Inf2Cat, signability test failed. "Double click to see the tool output”,

    参考博客:点击打开链接

    是因为inf文件的“DriverVer”的时间不对,VS2015默认的“Inf2cat”中的时间为UTF,需要在工程属性-》“inf2cat”选择中,将local时间打开。

    3,调试工具

    1)debugview

            在驱动程序中,调用KdPrint函数(类似C语言中printf),然后通过debugview查看打印信息。这是最常用的一种调试方法。

    需要注意的是:首先要在“capture”菜单中勾选“kernel”相关的选项,表示抓取内核的信息。然后,需要使用“管理员身份”运行该软件。Debugview在win10下经常报错:


    需要到“C:\Windows\System32\drivers”中找到“dbgv.sys”,删除它,再使用“管理员身份”运行该软件。

    2)


    4,调试手段

    1)驱动安装阶段,可以到“C:\Windows\System32\drivers”目录下看相应的“sys”文件是否到位。

    2)cmd->regedit打开注册表,再在“编辑”菜单下“查找”对应的设备信息。

    3)使用KdPrint函数打印log和DebugView软件抓取log(最常用的手段);

    4)在驱动代码中写log文件(理论上可行,待探索);

    5)存储dump信息。所谓dump信息,就是在系统奔溃之前,操作系统会将当前的调用堆栈记录成一个dump文件。(详细设置系统转存dump信息,可以参考《Windows驱动开发技术详解》最后一章,或博客:点击打开链接)。设置好dump文件后,遇到蓝屏,再将dump文件放到WinDbg中查看,这也是一个中常用的调试手段。

    6)IRPTrace,这个软件可以跟踪IRP,但是win7及后续版本都不可用,可以尝试自己写程序跟踪。

    7)PCITree,查看设备挂载;

    8)WinObject,查看驱动中的各种对象信息。

    9)WinDbg调试虚拟机,这是一个高级应用。配合VS2015可以查看“内存”、“调用堆栈”、“线程”和“反汇编”。

    注:在驱动的开发过程,需要逐渐掌握各种工具和调试手段。


    二、开发框架

            从我最近的浏览的资料来看,Windows驱动程序大致有三种类型:NT驱动、WDM驱动和WDF驱动。其中,NT驱动是非即插即用(Plug-in-and-Play,PNP)式的,它是一项系统服务,目前的设备类驱动大都不是这种类型,不是我的关注点,后面将不展开介绍。WDM驱动和WDF驱动都是即插即用的驱动,后者是前者的升级版。

    1,WDM框架

            WDM是早前的Windows驱动开发框架,虽然现在微软推荐用WDF,但是,学习WDM一是能够更对地了解操作系统的内部机制(WDF是对WDM更高层次的封装),二是《Windows驱动开发技术详解》以及网上的很多博文都是用的WDM,从学习角度出发也需要掌握一定的WDM知识。

            WDM框架的基本知识,可以参考博文:点击打开链接。后续我也用单独的博文来讲解这方面的内容,主要包括:

    1)驱动对象与设备对象(DriverObject vs Device Object);

    2)物理设备对象(PDO)和功能设备对象(FDO);

    3)驱动的层次结构:水平层次(eg:FDO之间)和垂直层次(FDO到PDO);

    4)入口函数(DriverEntry);

    5)设备扩展(DRIVER_EXTENSION);

    6)重要的例程(routine):AddDevice

    7)IRP机制(I/O Request Package):MajorFunction(MJ))和MinorFunction(MN);


    2,WDF框架

            对于WDF框架,可以参考《Window7设备驱动开发》这本书。WDF框架可以分为KMDF(Kernel Model Driver Frame)和UMDF(User Model Driver Frame),其驱动模型如下:

    1)WDF对象(属性、方法和事件);

    2)即插即用和电源管理的集成;

    3)集成的I/O排队和取消(queue);

    4)I/O模型。在Windows中,IRP的功能不仅仅是向驱动程序提供传统的I/O请求(读、写、创建等)。它是操作系统和驱动程序、驱动程序和驱动程序之间一种基于数据包的通信机制。


    3,一个典型的KMDF驱动程序

            通过VS2015新建一个项目,选择“KMDF”,它会产生如下文件:


    1)public.h中定义GUID和CTL_CODE,并提供给应用程序使用;

    2)trace.h定义的调试宏和函数,暂不关注;

    3)driver.h和driver.c定义了主要的框架代码。包括:入口函数(DriverEntry)、加载设备的例程(KMDFDriver1EvtDeviceAdd)和清理上下文区的函数。该文件都是框架性的代码,在驱动开发的过程中,可以选择一个框架,选定框架后,一般不在该文件中添加功能,而是放到“device.c”和“queue.c”。

    4)device.h和device.c,主要处理设备相关的功能,与设备交互的实现放在该文件中。主要包括设备初始化和资源释放;

    5)queue.h和queue.c,主要处理IRP,包括KMDFDriver1EvtIoDeviceControl;

    展开全文
  • Windows驱动模型

    千次阅读 2015-03-19 09:54:58
    Windows有两种驱动类型,一种是NT式驱动,另一种是WDM式驱动,两者最大不同是WDM式驱动支持即插...Windows驱动中有两个重要的数据结构:DRIVER_OBJECT和DEVICE_OBJECT,两者结构中部分成员如下[19]:   typedef struct

    Windows有两种驱动类型,一种是NT式驱动,另一种是WDM式驱动,两者最大不同是WDM式驱动支持即插即用(PNP)而NT式驱动则不支持。由于USB设备为即插即用设备,因此选择WDM为设计所用类型。

     

    一、数据结构

    Windows驱动中有两个重要的数据结构:DRIVER_OBJECT和DEVICE_OBJECT,两者结构中部分成员如下:

    typedef struct _DRIVER_OBJECT
    {
    PDEVICE_OBJECT		DeviceObject;
    PVOID			DriverStart;
    ULONG			DriverSize;
    PVOID			DriverSection;
    PDRIVER_EXTENSION	DriverExtension;
    UNICODE_STRING		DriverName;
    PFAST_IO_DISPATCH	FastIoDispatch;
    PDRIVER_UNLOAD		DriverUnload;
    PDRIVER_DISPATCH	MajorFunction[IRP_MJ_MAXIMUM_FUNCTION+ 1];
    ……
    } DRIVER_OBJECT, *PDRIVER_OBJECT;
    其中重要的部分有:

    DeviceObject:每个驱动都会有一个或多个设备对象。每个设备对象中都有一个指针指向下一对象,最后一个设备对象的该指针为空,这类似于单向链表。驱动对象中的DeviceObject指向的则是这个链表中的第一个。通过DeviceObject即可遍历所有设备对象。

    DriverName:驱动的名字,用UNICODE字符串进行记录,该字符串一般为\Driver\[驱动程序名称]。

    DriverUnload:指定该驱动卸载时的回调函数。

    MajorFunction:此为一个函数指针数组,每个指针成员的记录一个I/O请求包的派遣函数。这一点和Linux下struct usb_driver结构体的接口函数是一样的原理。如MajorFunction[IRP_MJ_READ]指向的是处理读请求包的派遣函数,MajorFunction[IRP_MJ_WRITE]指向的是处理写请求包的派遣函数。这些函数是需要驱动开发者自行编写并将函数地址赋值给MajorFunction数组的。

    typedef struct _DEVICE_OBJECT
    {
    PDRIVER_OBJECT		DriverObject;
    PDEVICE_OBJECT		NextDevice;
    PDEVICE_OBJECT		AttachedDevice;
    PIRP			CurrentIrp;
    PVOID			DeviceExtension;
    DEVICE_TYPE		DeviceType;
    CCHAR			StackSize;
    ……
    } DEVICE_OBJECT, *PDEVICE_OBJECT;
     其中重要的部分有:

    DriverObject:回指该产生设备的驱动对象。

    NextDevice:指向下一个由同样驱动产生的设备对象。通过这个指针产生了上面提到的设备对象链表。

    AttachedDevice:WDM驱动模型中驱动和设备都是分层的。本层驱动产生的设备可能会有高一层驱动产生的设备依附在其上面,而AttachedDevice则指向高一层的设备。该结构也称为驱动程序的垂直结构,此概念将在下面讲述。

    Flags:设备对象的标志,32个位每一位都代表相应的性质。

    DeviceType:指明设备类型。

    DeviceExtension:此指针指向驱动开发者自己定义的数据结构,大小不限,用于存储一些针对该设备的特殊信息。另外驱动程序中避免使用全局变量,因为全局变量不易同步,办法便是将其存入设备扩展中。

    StackSize:由于WDM驱动模型中驱动和设备都是分层的,形成堆栈结构。StackSize会指出当前驱动为堆栈结构的第几层。

    设备对象和驱动对象这两种数据结构为Windows驱动结构的形成奠定了基础。

     

    二、驱动结构

    WDM模型中,完成一个设备的操作,至少需要两个设备对象:物理设备对象(Physical Device Object,PDO)和功能设备对象(Function Device Object,FDO)。当某设备被插入时,物理设备对象被创建,这是由总线驱动创建的。该设备不可被单独操作,需要功能设备对象。实际应用中,插入设备Windows会提示检测到新设备并要求安装驱动,指的就是WDM驱动。此驱动创建功能设备对象并附加到物理设备对象之上。物理设备对象中的AttachedDevice指针会指向功能设备对象,但实际情况比上述情况复杂。物理设备对象和功能设备对象间可能会存在过滤设备对象,如图3.3所示。产生这些设备对象的驱动,有些是系统自带,而有些需要程序员编写。通过设备对象的AttachedDevice指针可以找到在其上方的设备对象;通过在DeviceExtension中定义下层设备对象的指针可以找到在其下方的设备对象。


    (本文是将相关材料整理后写出的,来源:张帆. Windows驱动开发技术详解[M]. 北京:电子工业出版社,2008)

    展开全文
  • 一个简单的Windows驱动例程

    千次阅读 2013-12-27 15:23:00
    一个简单的Windows驱动例程 本文所需代码在这里下载: 一、Windows驱动程序对于我们来说经常使用,却又了解很少,给我们的感觉好像是很神秘。这里我们通过一个简单的例程来说明,Windows驱动程序的工作原理。在例程...

    一个简单的Windows驱动例程

    本文所需代码在这里下载:http://download.csdn.net/detail/li171049/6777587

    一、Windows驱动程序对于我们来说经常使用,却又了解很少,给我们的感觉好像是很神秘。这里我们通过一个简单的例程来说明,Windows驱动程序的工作原理。在例程没有贴出来前,我们需要了解Windows与之相关的基本概念。

    一、如下图,我们需要了解Windows的应用程序和驱动程序在Windows系统中的位置。


    二、Windows内存管理

    1. 物理内存地址(Physical Memory Address)。32位的CPU的寻址能力为4GB个字节。用户最多可以使用4GB的真是的物理内存。

    2. 虚拟内存地址(Virtual Memory Address)。硬件上MMU和软件上操作系统,为使用者提供了虚拟内存的概念。对虚拟内存的操作,最终会变成一系列对真实物理内存的操作。


    3.Windows的核心代码和Windows的驱动程序加载的位置都是在高2GB的内核地址里。                           

    三、具体例程实现个人电脑上喇叭响

    这个例程最终是实现对电脑上的I/O端口操作,每个PC系统至少包含一个8253可编程时钟或等价的芯片。这个芯片控制系统喇叭。这里的总做就像单片机操作自身I/O前,要去配置寄存器一样的过程。只不过这里隔着Windows操作系统。所以,第一步我们应该知道,需要配置哪些寄存器,都配置成什么值。这里我们不细说具体要配置寄存器,有兴趣的读者可以参考《Windows驱动开发技术详解》第十五章。

    这里我们把整个历程的流程图画出:


    应用程序的函数最终能够读写硬件层寄存器的数据,还要靠IOCTL派遣函数调用DDK提供的函数。如READ_PORT_UCHAR READ_PORT_USHORT READ_PORT_ULONG WRITE_PORT_UCHARWRITE_PORT_USHORT WRITE_PORT_ULONG

    代码如下:

    应用程序(vs2008)

    //winows应用程序

    #include <windows.h>

    #include <stdio.h>

    //使用CTL_CODE必须加入winioctl.h

    #include <winioctl.h>

    #include "..\NT_Driver\Ioctls.h"

     

     

    UCHAR In_8(HANDLE hDevice,USHORT port)

    {

         DWORD dwOutput ;

         DWORD inputBuffer[2] =

         {

             port,//对port进行操作

             1//1代表位操作,代表位操作,代表位操作

         };

         DWORD dResult;

     

         DeviceIoControl(hDevice,READ_PORT, inputBuffer, sizeof(inputBuffer),&dResult, sizeof(DWORD), &dwOutput,NULL);

     

         return(UCHAR) dResult;

        

    }

    void Out_8(HANDLE hDevice,USHORT port,UCHAR value)

    {

         DWORD dwOutput ;

         DWORD inputBuffer[3] =

         {

             port,//对port进行操作

             1,//1代表位操作,代表位操作,代表位操作

             value//输出字节

         };

     

         DeviceIoControl(hDevice,WRITE_PORT, inputBuffer, sizeof(inputBuffer),NULL, 0, &dwOutput, NULL);

    }

     

    //发音程序,参数f代表频率

    void Sound(HANDLE hDevice,int f)

         //计数为/F

         USHORT   B=1193180/f;

     

         //从端口x61取数

         UCHAR temp = In_8(hDevice,0x61);

         //两低位置

         temp = temp | 3;

         //输出到x61端口

         Out_8(hDevice,0x61,temp);

     

         //输出到x61端口

         Out_8(hDevice,0x43,0xB6);

         //输出到x42端口,写低位

         Out_8(hDevice,0x42,B&0xF);

         //输出到x42端口,写高位

         Out_8(hDevice,0x42,(B>>8)&0xF);

    }

     

    // 关闭声音

    void SoundOff(HANDLE hDevice)                              

    {

         //取端口x61的字节

         UCHAR value =In_8(hDevice,0x61);

     

         //强制置最后两位为

         value = value & 0xFC;

     

         //返送端口x61 

         Out_8(hDevice,0x61,value);

    }

     

    int main()

    {

         HANDLE hDevice =

             CreateFile("\\\\.\\HelloDDK",

                           GENERIC_READ |GENERIC_WRITE,

                           0,       // share modenone

                           NULL,    // no security

                           OPEN_EXISTING,

                           FILE_ATTRIBUTE_NORMAL,//

                           NULL );       // no template

     

         if(hDevice == INVALID_HANDLE_VALUE)

         {

             printf("Failed to obtain file handle to device: "

                  "%s with Win32 error code: %d\n",

                  "MyWDMDevice", GetLastError() );

             return1;

         }

     

         //产生KHz频率的声音

         Sound(hDevice,2000);

         //持续毫秒

         Sleep(200);

         //产生KHz频率的声音

         Sound(hDevice,2000);

         //持续毫秒

         Sleep(200);

         //产生KHz频率的声音

         Sound(hDevice,2000);

         //持续毫秒

         Sleep(200);

         //产生KHz频率的声音

         Sound(hDevice,2000);

         //持续毫秒

         Sleep(200);

         SoundOff(hDevice);

     

         CloseHandle(hDevice);

     

         return0;

    }

    驱动程序(vs2008+DDK):仅仅贴出关键代码

    定义IOCTLCODE

    #define READ_PORT CTL_CODE(\

                  FILE_DEVICE_UNKNOWN, \

                  0x800, \

                  METHOD_BUFFERED, \

                  FILE_ANY_ACCESS)

     

    #define WRITE_PORT CTL_CODE(\

                  FILE_DEVICE_UNKNOWN, \

                  0x801, \

                  METHOD_BUFFERED, \

                  FILE_ANY_ACCESS)

    设置派遣函数

    pDriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL]= HelloDDKDeviceIOControl;

    派遣函数(HelloDDKDeviceIOControl)判断动作是读写

         switch(code)

         {                           // processrequest

             caseREAD_PORT:

             {

                  KdPrint(("READ_PORT\n"));

                  //缓冲区方式IOCTL

                  //显示输入缓冲区数据

                  PULONGInputBuffer = (PULONG)pIrp->AssociatedIrp.SystemBuffer;

                  ULONG port =(ULONG)(*InputBuffer);

                  InputBuffer++;

                  UCHAR method =(UCHAR)(*InputBuffer);

     

                  KdPrint(("port:%x\n",port));

                  KdPrint(("method:%x\n",method));

                  //操作输出缓冲区

                  PULONG OutputBuffer =(PULONG)pIrp->AssociatedIrp.SystemBuffer;

     

                  if (method==1)//8位操作

                  {

                       *OutputBuffer =READ_PORT_UCHAR((PUCHAR)port);

                  }else if(method==2)//16位操作

                  {

                       *OutputBuffer =READ_PORT_USHORT((PUSHORT)port);

                  }else if(method==4)//32位操作

                  {

                       *OutputBuffer =READ_PORT_ULONG((PULONG)port);

                  }

     

                  //设置实际操作输出缓冲区长度

                  info= 4;

     

                  break;

             }

             caseWRITE_PORT:

             {

                  KdPrint(("WRITE_PORT\n"));

                  //缓冲区方式IOCTL

                  //显示输入缓冲区数据

                  PULONGInputBuffer = (PULONG)pIrp->AssociatedIrp.SystemBuffer;

                  ULONG port =(ULONG)(*InputBuffer);

                  InputBuffer++;

                  UCHAR method =(UCHAR)(*InputBuffer);

                  InputBuffer++;

                  ULONG value =(ULONG)(*InputBuffer);

     

                  KdPrint(("port:%x\n",port));

                  KdPrint(("method:%x\n",method));

                  KdPrint(("value:%x\n",value));

     

                  //操作输出缓冲区

                  PULONG OutputBuffer =(PULONG)pIrp->AssociatedIrp.SystemBuffer;

     

                  if (method==1)//8位操作

                  {

                       WRITE_PORT_UCHAR((PUCHAR)port,(UCHAR)value);

                  }else if(method==2)//16位操作

                  {

                       WRITE_PORT_USHORT((PUSHORT)port,(USHORT)value);

                  }else if(method==4)//32位操作

                  {

                       WRITE_PORT_ULONG((PULONG)port,(ULONG)value);

                  }

     

                  //设置实际操作输出缓冲区长度

                  info= 0;

                  break;

             }

     

     

             default:

                  status = STATUS_INVALID_VARIANT;

    展开全文
  • Windows驱动程序框架

    2019-06-13 21:25:20
    2019独角兽企业重金招聘Python工程师标准>>> ...
  • Windows驱动学习笔记

    2018-03-27 23:10:49
    微软在线MSDN.txthttp://msdn.microsoft.com/en-us/library/default.aspxMmIsAddressValid 检查对一个给定的虚拟地址进程读写操作会不会导致错误DbgBreakPoint 调试版本发布程序中触发一个异常...
  • Windows驱动开发之第一个驱动程序

    千次阅读 2016-07-05 10:18:09
    一个简单的驱动程序
  • Windows下usb接口驱动技术

    千次阅读 2019-08-16 10:00:04
    一、USB概述 USB的英文全称为Universal Serial Bus,中文含义是通用串行总线,是由Conpaq、DEC、IBM、Inter、Microsoft、NEC和Northen Telecom等公司为简化PC与外设之间的互连而共同研究开发的一种免费的标准化连接...
  • Windows驱动开发技术详解》学习笔记

    万次阅读 多人点赞 2019-02-21 09:55:36
      如果推荐 Windows 驱动开发的入门书,我强烈推荐《Windows驱动开发技术详解》。但是由于成书的时间较早,该书中提到的很多工具和环境都已不可用或找不到,而本文搜集了大部分的工具,并在 win10X64 上安装开发...
  • u盘插入后,系统提示设备驱动程序无法安装 进去设备管理器找到有叹号的的设备,右键选择更新驱动程序, 选择浏览计算机以查找驱动程序软件输入 C:\Windows\System32\DriverStore\FileRepository 不行的...
  • mac 安装windows10以后发现无线不能用,很多驱动都没有装 这个时候我们可以在一个包含了这些驱动的文件windows support里面找到, 我就开始一个一个的安装驱动,在安装到AppleKeyboardInstaller64.exe这个文件的...
  • 在装显卡驱动的时候,一致提示此nvidia驱动程序与此windows版本不兼容。【不想看啰嗦,直接跳到文章最后吧!】 1.鲁大师:直接就没发现显卡驱动没装。 2.驱动精灵:检测到显卡驱动异常,那就下载安装呗,却报错 ...
  • 此nvidia驱动程序与此Windows版本不兼容   解决方案 最后在某个论坛上找到了解决方法: 1.非企业版下载微软自己的一个软件叫 “Windows 10 易升”,下载完之后。更新至最新win10系统。  然后,在通过驱动精灵...
  • 做软件的最恨别人问:你会不会修电脑。所以我需要学习组装一台新的电脑,会一些基本功 此处我使用的显卡是华硕的ROG-STRIX-RTX2060-O6G-GAMING 官网下载驱动地址:...此处下载的驱动版本是: 417.71 ...
  • 两篇博文搞定! https://www.chiphell.com/thread-1076360-1-1.html ... 原版驱动下载地址 https://downloadcenter.intel.com/zh-cn/download/23071/Ethernet--Windows-...
  • 安装win8/win10提示无法在驱动器0分区上安装windows解决方法 在通过U盘或光盘安装win8/win8.1/win10系统时,不少用户遇到无法安装的问题,提示“无法在驱动器0的分区1上安装windows”,格式化分区1也不...
  • Windows要求已数字签名的驱动程序

    万次阅读 2019-05-16 20:26:48
    电脑在安装一个外接声卡的驱动程序时,报错“Windows要求已数字签名的驱动程序”,具体如下: 这是Windows下的一个安全警告,正常情况下我们可以通过关闭系统的数字签名验证,避免这个错误,重新安装驱动即可,关闭...
  • (三)Windows Server 2008 R2 无网卡驱动

    万次阅读 2019-09-10 14:23:59
    计算机安装win server2008 r2后,此计算机无网卡驱动,网络无法使用 解决方法: 1.intel官网(https://downloadcenter.intel.com/zh-cn/)下载Windows Server 2008 R2的网卡驱动,用压缩软件从exe或其它文件中提取出...
1 2 3 4 5 ... 20
收藏数 361,276
精华内容 144,510
关键字:

windows驱动