精华内容
下载资源
问答
  • 可用于串口虚拟驱动开发,用于HID相关东西的开发,可以作为参考代码
  • 基于PC的虚拟总线驱动开发 实现了 pxl9054硬件DMA驱动 wdm实现 虚拟总线程序
  • windows虚拟串口驱动开发,windows下驱动程序设计。
  • windows虚拟网卡驱动开发

    千次阅读 热门讨论 2017-04-06 19:05:24
    by fanxiushu 2017-04-06 转载或...很早前的文章介绍过windows和linux平台的虚拟网卡技术, 详见 http://blog.csdn.net/fanxiushu/article/details/8526708 http://blog.csdn.net/fanxiushu/article/details/8526
     
                                                                                                                              by fanxiushu   2017-04-06 转载或引用请注明原始作者。

    很早前的文章介绍过windows和linux平台的虚拟网卡技术,
    详见
         http://blog.csdn.net/fanxiushu/article/details/8526708
          http://blog.csdn.net/fanxiushu/article/details/8526719
          http://blog.csdn.net/fanxiushu/article/details/8525749
         http://blog.csdn.net/fanxiushu/article/details/8507638
    前两个是讲述如何组成一个虚拟局域网,后边的是如何在linux平台下开发一个虚拟网卡
    (当时提供的代码比较老,需要修改才能在新版本linux下使用,
    或者懒得自己开发,直接使
    展开全文
  • by fanxiushu 2020-03-25 转载或引用请注明原始作者。...以前的文章阐述过基于windows平台和基于linux平台中的USB虚拟总线驱动开发, 比如如下链接阐述的是在linux平台中的虚拟USB总线驱动开发原理:https://blo...

                                    by fanxiushu 2020-03-25 转载或引用请注明原始作者。

    USB虚拟总线驱动的使用范围是非常广泛的,可以使用它来模拟各种通用的USB设备。
    以前的文章阐述过基于windows平台和基于linux平台中的USB虚拟总线驱动开发,
    比如如下链接阐述的是在linux平台中的虚拟USB总线驱动开发原理:
    https://blog.csdn.net/fanxiushu/article/details/102967402
    稍微再早一点的文章阐述了windows平台中的虚拟USB总线驱动开发,但是windows中的虚拟USB总线驱动实现起来比起linux复杂得多。

    到目前为止,使用虚拟USB总线驱动模拟了虚拟摄像头,虚拟声卡和虚拟麦克风,虚拟鼠标键盘,虚拟触摸屏,。。。
    好像日常用到的都模拟遍了,不对,U盘还没模拟。
    因此这篇文章就是阐述模拟U盘的具体通讯协议过程。

    绝大部分U盘通讯协议都是基于SCSI通讯的,也就是在底层的USB通讯协议中封装了SCSI协议来实现U盘的功能。

    正如上一篇文章在阐述windows平台实现基于AVStream框架的虚拟摄像头的时候所说的一样。
    如果你的需求只是实现一个即插即用的移动硬盘,
    不应该采用这种通过虚拟USB总线驱动模拟U盘的办法,因为同样的原因:代价是高昂的,过程是冗余的。
    因此本文介绍的内容研究意义可能大于实际使用价值,不过对掌握硬件U盘实际通讯过程也有一定参考意义。
    当然这里还有一个好处就是基于USB通讯封装的SCSI协议是跨平台的。
    因此本尽量阐述协议部分,不与具体的(比如windows或linux)虚拟USB总线驱动联系起来。

    实际上,在windows这样的系统中,可以直接使用Storport 这样的磁盘驱动框架来实现虚拟磁盘。
    而且基本上几百行代码就能实现一个基于 Storport的虚拟磁盘驱动框架。
    具体原理可以查看我很早前发布的文章,如下所示,
    同时本文介绍的利用USB总线驱动模拟U盘,使用的SCSI通讯协议和下面链接中使用的SCSI基本上是一样的。
    https://blog.csdn.net/fanxiushu/article/details/9903123  (磁盘驱动与虚拟磁盘MINIPORT驱动一)
    https://blog.csdn.net/fanxiushu/article/details/11713357  (磁盘驱动与虚拟磁盘MINIPORT驱动二)
    上面的文章,尤其是第二篇介绍的SCSI命令,在本文中会同样使用到。

    要成功模拟U盘,当然第一步肯定是正确模拟出USB的设备描述符,配置描述符,接口描述符,端口描述符。
    U盘的这些描述符其实是挺简单的。我们可以直接把某个现成的U盘的描述符copy过来,直接使用。
    绝大部分U盘都是基于 Bulk-Only 方式来传输数据的,这种方式简单而且容易理解。
    也就是主机用 ”控制传输方式“ 从U盘获取各种描述符等基本信息之后,
    之后所有基于SCSI的命令,都是封装到 ”Bulk传输“ 中进行通讯的。
    BULK传输需要有两个方向:从U盘传输到主机,从主机传输到U盘,需要两个BULK端点。
    (为了下文引用的方便,这里把从U盘到主机端点定义成 Bulk-In, 把从主机到U盘的端点定义成 Bulk-Out)
    因此U盘通常是包含设备描述符,一个配置描述符,配置描述符中包含一个接口描述符,接口描述符中包含两个端点描述符。

    接着就是如何在Bulk传输中通讯SCSI协议命令。
    我们知道,USB通讯都是主机主动发起USB通讯,USB设备响应命令的主-从方式。
    因此第一个数据包数由主机首先发起,使用 Bulk-Out端点传输,是一个CBW头(Command Block Wraper),
    这个头用于指示接下来需要传输多少传输多少数据,数据传输方向,SCSI的CBD头信息等,如下定义:
    struct usb_cbw_t
    {
        __u32  sig; /// fixd  'USBC'
        __u32  tag; ///
        __u32  data_transfer_length;
        __u8   dir; ///方向 0x80 从设备到主机,  0x00 host -> device
        __u8   lun;   ///
        __u8   cb_length;
        __u8   cb_data[16];
    };
    总共31个字节。
    其中 sig固定为 0x43425355(‘USBC’),tag是主机随机生成的一个数字,用于在回复CSW的时候使用。
    data_transfer_length 就是表示接下来需要传输的数据大小,如果为0,表示就只传输CBW头,不传输数据。
    dir是接下来的数据传输方向,
    如果0x80表示从设备传输到主机,这个时候使用Bulk-IN端点传输。如果0 表示从主机传输到设备,使用Bulk-Out传输。
    lun表示 SCSI磁盘设备的逻辑位置,一般一个U盘就设置一个SCSI磁盘,因此通常都是 0,
    cb_data 就是SCSI通讯定义的CDB头,不超过16字节,具体大小由cb_length指定。
    我们可以通过CDB头,指定发起了哪个SCSI命令。

    主机通过BULK-Out发起了一个CBW包之后,接下来,如果data_transfer_length 大于0, 则开始传输实际的数据。
    然后根据CBW中的dir参数判断方向, 从而判断是采用 Bulk-In,还是Bulk-Out传输。
    如果指定的data_transfer_length长度数据传输完成,U盘会通过 Bulk-IN端点,回复主机一个CSW包。
    如果传输过程中,U盘出现故障等问题,则直接回复 STALL的USB通讯错误。
    如果data_transfer_length长度为0,则不需要传数据,但是U盘同样需要通过 Bulk-In端点回复CSW数据包。
    CSW(Command Status Wrapper)数据包定义如下:
    struct usb_csw_t
    {
        __u32  sig;  /// 'USBS'
        __u32  tag; 
        __u32  data_rest;  ///还剩下多少字节需要传输
        __u8   status;     0 success, 1 error
    };
    一共13个字节。
    其中sig固定为0x53425355(‘USBS’),tag跟主机发起的CWB包中的tag保持一致。
    data_reset表示回复的时候,还需要多少数据需要传输。
    status表示本次SCSI传输是成功,还是失败, 0 表示成功,非0表示失败。

    总结一下,通过Bulk-In和Bulk-Out两个端点,完成一个SCSI命令的传输过程:
    1,主机  发送 31个字节的 CBW 头(通过 Bulk-Out)
    2,传输数据(如果有的话),(通过Bulk-In或Bulk-Out,具体根本CBW中的参数决定。)
    3,U盘回复13个字节的CSW包,(通过Bulk-In)

    以上传输需要严格按照顺序进行,如果出现错乱,通常主机就会发起 reset device 的USB命令。

    接下来,拨开USB通讯部分,分析SCSI命令。
    SCSI命令是非常多的,好在我们实现U盘,其实只需关心其中几个比较关键的命令。
    SCSI的CDB头的第一个字节表示的就是当前命令类型,
    比如 Inquiry 是SCSIOP_INQUIRY(0x12),这个是主机获取SCSI设备的基本信息,U盘需要回复一个INQUIRYDATA结构。
    结构描述可直接查询 WDK驱动的 storport.h 头文件的描述。
    因为SCSI命令是跨平台,所以在WDK中描述的这些结构同样适合于 linux 这样的平台。
    通常实现一个U盘需要使用到的SCSI命令如下:
    SCSIOP_INQUIRY                      扫描磁盘
    SCSIOP_READ_CAPACITY       获得磁盘容量
    SCSIOP_READ                          读磁盘
    SCSIOP_WRITE                         写磁盘
    SCSIOP_MODE_SENSE             获得磁盘相关参数

    SCSIOP_TEST_UNIT_READY
    SCSIOP_SYNCHRONIZE_CACHE
    SCSIOP_START_STOP_UNIT
    SCSIOP_VERIFY           以上4个命令跟首次使用磁盘时候,检查磁盘单元有关。
    这个与在
    https://blog.csdn.net/fanxiushu/article/details/11713357  (磁盘驱动与虚拟磁盘MINIPORT驱动二)
    中描述的基本一致,因此要了解详细信息,可去查阅如上链接的文章。

    下图是利用前段时间开发的基于linux平台的虚拟USB总线驱动,模拟出来的一个U盘。
    估计是大家对windows平台都烂熟了,所以来个比较新奇的linux平台下的模拟效果图。





     

    展开全文
  • 虚拟光驱源代码(驱动开发源代码).zip
  • 虚拟设备驱动程序开发起步与进阶.pdf 虚拟设备驱动程序开发起步与进阶.pdf
  • 美国微软公司出品的Windows98以其友好的图形用户界面,在我国赢得了广泛的市场。在给广大办公环境工作人员...Windows98内核管理机制非常复杂,因而编写虚拟驱动程序也变得十分困难,要想编写虚拟驱动程序,就必须对Wind
  • 虚拟设备驱动程序开发起步与进阶.pdf 虚拟设备驱动程序开发起步与进阶.pdf
  • 我现在在做一个C#的桌面软件,需要使用虚拟摄像头,查了些关于虚拟摄像头开发的资料,稍微了解了一点,但是还是不是很清楚具体该怎么着手做。 请问下如何对虚拟摄像头采用什么编程语言,什么开发工具比较合适,...
  • 但是windows操作系统不像Linux操作系统,它的代码不开源,导致这方面的资料很少,因此花费了较长时间来寻找相关实现框架,最终找到了两款开源项目的虚拟接口驱动: Wireguard项目的Wintun接口 OpenVPN的Tap接口 这...

    前一段时间,一直在找寻windows操作系统上的虚拟网卡接口,主要是为了搭建隧道使用。但是windows操作系统不像Linux操作系统,它的代码不开源,导致这方面的资料很少,因此花费了较长时间来寻找相关实现框架,最终找到了两款开源项目的虚拟接口驱动:

    这两个项目都是非常出名的搭建隧道的开源V.P.N项目。由于目前对openVPN项目不太了解,也没有适配Tap接口,因此这里重点介绍下WinTun接口。此接口实现我是非常非常的喜欢,喜欢到简直不要不要的。

    1.简介

    说到Wintun项目,就不得不说到它的父亲:WireGuard项目(以下简称WG)。Github传送门

    WG项目作为开源V.P.N项目,不同于OpenVPN, Openswan, Strongswan等,它的实现非常简介,Linux内核代码实现不到4000行。相对于上述的三个“按行收费”的项目(代码10万行起步),它简直是太简洁了。故而得到了众多好评,其中就包括Linux鼻祖:Linus Torvalds。他的评价如下:

    Btw, on an unrelated issue: I see that Jason actually made the pull request to have wireguard included in the kernel.

    Can I just once again state my love for it and hope it gets merged soon? Maybe the code isn’t perfect, but I’ve skimmed it, and compared to the horrors that are OpenVPN and IPSec, it’s a work of art.

    Linus

     简而言之就是:劳资稀罕你,要把你合入我的Linux项目中。因此Linux内核自5.6之后便自带WG隧道功能,配置非常的简单。通过几行代码便可以完成一个WG隧道:

    ip link add dev wg0 type wireguard
    ip address add dev wg0 10.0.0.1/24
    wg set wg0 listen-port 51820 private-key ./private.key peer NIk5TyDpRDoU9tfIckTTXCsz1eht2aEmdN7l0Q31ow0= allowed-ips 10.0.0.2/32 endpoint 192.168.1.5:51820
    ip link set dev wg0 up

    官网上的配置如下:

    配置非常简单。除此之外,还提供了Windows客户端,这也是此项目为何包含Wintun虚拟网络接口的原因。

    客户端页面也是非常简洁,没有多余的东西(客户端链接):

    客户端上隧道协商成功之后,会根据隧道名称建立一个虚拟网卡,隧道拆除后接口自动删除。由于我的隧道名称为Tun-1,因此在“控制版面”的“网络连接”中出现了一个Tun-1的网络接口:

    好了,下面开始介绍此虚拟网络接口。

     

    2.WinTun虚拟网络接口

    Github传送门

    wintun官网传送门

    常见的windwos的接口驱动开发、安装比较复杂。常见的驱动安装包有:.inf文件、.sys文件、.cat文件; 除此之外还涉及驱动程序签名,否则无法安装成功。尤其在开发调试阶段,每次都得签名,太磨叽了。

    但是WinTun接口用法非常简单高效非常简单高效非常简单高效

    1. 引入头文件:wintun.h

    2. 加载动态库,解析动态库中的函数指针

    它通过动态库中方式来提供接口,我们可以加载此动态库,然后调用动态库中的函数指针来完成虚拟接口的创建、销毁、收发数据包等工作。此外它提供了一个示例供大家学习,我便是通过参考开源代码中的示例(example.c),将Wintun接口移植到我的工程之中。非常简单,我太喜欢它了。

    实例代码就400行,其中大部分为log信息,供大家查看程序运行状态和报文收发信息。

    2.1加载动态库中的函数指针

    此函数的作用:

    • 加载动态库,获取到动态库中的函数指针,后面通过函数指针来操作虚拟网卡接口。
    static HMODULE
    InitializeWintun(void)
    {
        HMODULE Wintun =
            LoadLibraryExW(L"wintun.dll", NULL, LOAD_LIBRARY_SEARCH_APPLICATION_DIR | LOAD_LIBRARY_SEARCH_SYSTEM32);
        if (!Wintun)
            return NULL;
    #define X(Name, Type) ((Name = (Type)GetProcAddress(Wintun, #Name)) == NULL)
        if (X(WintunCreateAdapter, WINTUN_CREATE_ADAPTER_FUNC) || X(WintunDeleteAdapter, WINTUN_DELETE_ADAPTER_FUNC) ||
            X(WintunDeletePoolDriver, WINTUN_DELETE_POOL_DRIVER_FUNC) || X(WintunEnumAdapters, WINTUN_ENUM_ADAPTERS_FUNC) ||
            X(WintunFreeAdapter, WINTUN_FREE_ADAPTER_FUNC) || X(WintunOpenAdapter, WINTUN_OPEN_ADAPTER_FUNC) ||
            X(WintunGetAdapterLUID, WINTUN_GET_ADAPTER_LUID_FUNC) ||
            X(WintunGetAdapterName, WINTUN_GET_ADAPTER_NAME_FUNC) ||
            X(WintunSetAdapterName, WINTUN_SET_ADAPTER_NAME_FUNC) ||
            X(WintunGetRunningDriverVersion, WINTUN_GET_RUNNING_DRIVER_VERSION_FUNC) ||
            X(WintunSetLogger, WINTUN_SET_LOGGER_FUNC) || X(WintunStartSession, WINTUN_START_SESSION_FUNC) ||
            X(WintunEndSession, WINTUN_END_SESSION_FUNC) || X(WintunGetReadWaitEvent, WINTUN_GET_READ_WAIT_EVENT_FUNC) ||
            X(WintunReceivePacket, WINTUN_RECEIVE_PACKET_FUNC) ||
            X(WintunReleaseReceivePacket, WINTUN_RELEASE_RECEIVE_PACKET_FUNC) ||
            X(WintunAllocateSendPacket, WINTUN_ALLOCATE_SEND_PACKET_FUNC) || X(WintunSendPacket, WINTUN_SEND_PACKET_FUNC))
    #undef X
        {
            DWORD LastError = GetLastError();
            FreeLibrary(Wintun);
            SetLastError(LastError);
            return NULL;
        }
        return Wintun;
    }

    2.2 main()函数

    作用:

    • 通过函数指针创建虚拟网卡
    • 创建虚拟网卡的收发线程
    int
    main(void)
    {
        HMODULE Wintun = InitializeWintun();
        if (!Wintun)
            return LogError(L"Failed to initialize Wintun", GetLastError());
        WintunSetLogger(ConsoleLogger);
        Log(WINTUN_LOG_INFO, L"Wintun library loaded");
        WintunEnumAdapters(L"Example", PrintAdapter, 0);
    
        DWORD LastError;
        HaveQuit = FALSE;
        QuitEvent = CreateEventW(NULL, TRUE, FALSE, NULL);
        if (!QuitEvent)
        {
            LastError = LogError(L"Failed to create event", GetLastError());
            goto cleanupWintun;
        }
        if (!SetConsoleCtrlHandler(CtrlHandler, TRUE))
        {
            LastError = LogError(L"Failed to set console handler", GetLastError());
            goto cleanupQuit;
        }
    
        GUID ExampleGuid = { 0xdeadbabe, 0xcafe, 0xbeef, { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef } };
        WINTUN_ADAPTER_HANDLE Adapter = WintunOpenAdapter(L"Example", L"Demo");
        if (!Adapter)
        {
            Adapter = WintunCreateAdapter(L"Example", L"Demo", &ExampleGuid, NULL);
            if (!Adapter)
            {
                LastError = GetLastError();
                LogError(L"Failed to create adapter", LastError);
                goto cleanupQuit;
            }
        }
    
        DWORD Version = WintunGetRunningDriverVersion();
        Log(WINTUN_LOG_INFO, L"Wintun v%u.%u loaded", (Version >> 16) & 0xff, (Version >> 0) & 0xff);
    
        MIB_UNICASTIPADDRESS_ROW AddressRow;
        InitializeUnicastIpAddressEntry(&AddressRow);
        WintunGetAdapterLUID(Adapter, &AddressRow.InterfaceLuid);
        AddressRow.Address.Ipv4.sin_family = AF_INET;
        AddressRow.Address.Ipv4.sin_addr.S_un.S_addr = htonl((10 << 24) | (6 << 16) | (7 << 8) | (7 << 0)); /* 10.6.7.7 */
        AddressRow.OnLinkPrefixLength = 24; /* This is a /24 network */
        LastError = CreateUnicastIpAddressEntry(&AddressRow);
        if (LastError != ERROR_SUCCESS && LastError != ERROR_OBJECT_ALREADY_EXISTS)
        {
            LogError(L"Failed to set IP address", LastError);
            goto cleanupAdapter;
        }
    
        WINTUN_SESSION_HANDLE Session = WintunStartSession(Adapter, 0x400000);
        if (!Session)
        {
            LastError = LogLastError(L"Failed to create adapter");
            goto cleanupAdapter;
        }
    
        Log(WINTUN_LOG_INFO, L"Launching threads and mangling packets...");
    
        HANDLE Workers[] = { CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)ReceivePackets, (LPVOID)Session, 0, NULL),
                             CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)SendPackets, (LPVOID)Session, 0, NULL) };
        if (!Workers[0] || !Workers[1])
        {
            LastError = LogError(L"Failed to create threads", GetLastError());
            goto cleanupWorkers;
        }
        WaitForMultipleObjectsEx(_countof(Workers), Workers, TRUE, INFINITE, TRUE);
        LastError = ERROR_SUCCESS;
    
    cleanupWorkers:
        HaveQuit = TRUE;
        SetEvent(QuitEvent);
        for (size_t i = 0; i < _countof(Workers); ++i)
        {
            if (Workers[i])
            {
                WaitForSingleObject(Workers[i], INFINITE);
                CloseHandle(Workers[i]);
            }
        }
        WintunEndSession(Session);
    cleanupAdapter:
        WintunDeleteAdapter(Adapter, FALSE, NULL);
        WintunFreeAdapter(Adapter);
    cleanupQuit:
        SetConsoleCtrlHandler(CtrlHandler, FALSE);
        CloseHandle(QuitEvent);
    cleanupWintun:
        FreeLibrary(Wintun);
        return LastError;
    }

    收发报文的接口操作也非常简单,但是与windows网络协议栈之间的关系仍需要继续摸索。

     

    2.3 特别说明

    Wintun接口是严格意义上的3层逻辑接口。原文如下:

    Wintun is a very simple and minimal TUN driver for the Windows kernel, which provides userspace programs with a simple network adapter for reading and writing packets. It is akin to Linux's /dev/net/tun and BSD's /dev/tun. Originally designed for use in WireGuard, Wintun is meant to be generally useful for a wide variety of layer 3 networking protocols and experiments. The driver is open source, so anybody can inspect and build it. Due to Microsoft's driver signing requirements, we provide precompiled and signed versions that may be distributed with your software. The goal of the project is to be as simple as possible, opting to do things in the most pure and straight-forward way provided by NDIS.

     

     

    这里出现了一个小小的问题:Wireshark上无法抓取此接口报文。如果想看封装后的报文信息,则需要单独记录日志而非抓包来完成。

    导致这个问题原因没有找到,我认为是:wireshark抓取的报文是二层报文(一个完整的以太网帧),而3层逻辑接口上的报文尚未封装以太网帧,故无法抓取此接口。这只是个人猜测,根本原因不得而知。


    好了,基本介绍完毕,重新表达下我对WireGuard和WinTun的态度: 劳资稀罕你,very喜欢

     

     

     

    展开全文
  • by fanxiushu 202-03-01 转载或引用请注明原始作者。...从CSDN上的第一篇文章开始:https://blog.csdn.net/fanxiushu/article/details/8496747 (虚拟摄像头驱动原理开发) 文章描述的是利用老的流内核来...

    by fanxiushu 202-03-01 转载或引用请注明原始作者。

    对于windows平台下的虚拟摄像头实现方式的研究比较多,范围也比较广,曾采用各种方式来实现windows平台下的虚拟摄像头。
    从CSDN上的第一篇文章开始:
    https://blog.csdn.net/fanxiushu/article/details/8496747 (虚拟摄像头驱动原理开发)
    文章描述的是利用老的流内核来实现的虚拟摄像头,调用stream.sys中导出的StreamClassRegisterAdapter 来注册和初始化摄像头。
    这种摄像头其实依然是WDM基于内核驱动模式的摄像头,绝大部分程序会把他当成硬件摄像头,只是直到WIN10以上的系统中,
    特别是UWP程序,由于放弃了老旧流内核,因此UWP程序基本上不能识别这种基于stream.sys的摄像头。

    再后来,实现了虚拟USB总线驱动之后,利用虚拟USB总线驱动模拟出了虚拟USB摄像头。
    https://blog.csdn.net/fanxiushu/article/details/52761644 ( USB设备驱动开发之扩展(利用USB虚拟总线驱动模拟USB摄像头)
    而这种驱动,本质上是调用windows自己提供的usbvideo.sys驱动,usbvideo.sys驱动根据USB通讯中描述符提供的信息,
    动态生成硬件摄像头,俗称USB摄像头。而我们再研究usbvideo.sys驱动,本质上它

    展开全文
  • Windows 2000下虚拟串口 WDM 驱动程序的开发 孙筱萌,夏 斌,韩德红,方 晓 (空军雷达学院电子对抗系,武汉 430019 摘 要:针对传统 RS-232串行通信存在的通信距离 端口数量等多个方面的限制, 提出了在 Windows 2000 操作...
  • 鼠标映射虚拟位置传感器的驱动开发模型,把鼠标虚拟成自定义的HID设备
  • 摘要:介绍虚拟设备驱动程序开发的基本知识以及VxDs与WIN32应用程序通讯的几种常用方法,并给出了用VtoolsD开发VxDs的具体实例。 Windows自面世以来,即以其强大而友好的图形界面占据了操作系统(尤其是微机操作...
  • by fanxiushu 2019-06-24 转载或引用请注明原始作者。...这里与远程桌面关系不是太大,但这个部分是xdisp_virt远程控制程序的实现多显示器桌面扩展的子功能,因此也归为远程桌面开发一类。 这篇文章与之前发布的...
  • VC Mirror Driver显示虚拟驱动经典开发

    千次阅读 2016-11-06 10:44:05
    一个简单的显示驱动实例 windows wdk 7600的 mirror(镜像) 显示驱动部分 Mirror Driver程序的基本流程 Windows 2000 DDK包含了一个例子镜像驱动程序,在下面3个目录中包括了组件源文件。 目录 包含的...
  • 虚拟驱动程序源代码

    2018-11-26 12:07:08
    本资源包含 虚拟鼠标 及 键盘驱动程序源代码 及 最新驱动程序开发包WDK(WDK是WIN10平台下的SDK,如在其他平台,请下载相应的开发包),为开发虚拟驱动的人提供极好参考价值。安装SDK成功后,可在Visual Studio 2017下...
  • 虚拟摄像头驱动原理及开发

    万次阅读 热门讨论 2013-01-12 19:23:57
     类似功能的产品,如著名的e2eSoft的 VCam,国内新浪的9518虚拟视频, 新浪的虚拟视频是DirectShow应用层上的视频模拟,大概的思路就是: 因为所有的摄像头WDM驱动,都需要通过运行在应用层的ksproxy.ax与...
  • 3 驱动开发工具:WDK10 4Windows SDK:SDK10(安装的时候必须全部勾选安装,否则编译会出现缺少waring.h等头文件之类的错误) 5 VM虚拟机:VMware WorkStation 12 Win10、WDK10、SDK10的版本必须一致我的用的都是...
  • fanxiushu 2016-10-08 转载或引用,请注明原始作者 做这个事情写这篇文章之前,压根没朝模拟USB摄像头这方面去想过。 直到CSDN上一位朋友...记得最早的一篇文章也是介绍虚拟摄像头驱动开发的,只是当时采用的是wi
  • WinXP下虚拟摄像头驱动程序开发

    千次阅读 2010-01-04 19:51:00
    WinXP下虚拟摄像头驱动程序开发摄像头驱动程序的主要目的是通过硬件捕捉视频信号。微软公司提供了一套视频驱动的接口,可以满足这个接口的视频驱动程序。第三方厂商开发的软件,如QQ和MSN等软件,都可以通过这个接口...
  • by fanxiushu 2018-09-16 转载或引用请注明原始作者。  这里讨论的都是win7以上平台的WDDM模型的显卡驱动,而不是WINXP之前的XPDM模型的显卡驱动。 实际上没有"显卡过滤驱动...
  • 虚拟磁盘源码大合集(驱动开发

    热门讨论 2011-08-10 16:10:51
    包含20个中、外关于虚拟磁盘的源码。大家可以放心下。
  • 美国微软公司出品的Windows98以其友好的图形用户界面,在我国赢得了广泛的市场。在给广大办公环境工作人员...Windows98内核管理机制非常复杂,因而编写虚拟驱动程序也变得十分困难,要想编写虚拟驱动程序,就必须对Wind
  • 上文简单介绍过,需要开发虚拟总线驱动来模拟USB设备。 所谓虚拟总线驱动,就是安装于System系统设备下的一个驱动,由PnP管理器创建出一个虚拟的总线PDO设备, 我们的虚拟总线驱动Attach到这个PDO上,形成一
  • >>中,讲到在wince 下开发虚拟串口驱动的方法,现在介绍在windows XP下开发虚拟串口的方法。   可以开发一个虚拟串口,将读写请求传递给USB驱动,这样就可以利用现成的串口调试工具向USB设备读取了。 1、DDK串

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 137,353
精华内容 54,941
关键字:

虚拟驱动开发