【驱动】WinDriver学习

例如:第一章 WinDriver 入门介绍


WinDriver是一款用于Windows操作系统的驱动程序开发工具。它提供了一个简单而强大的接口,使开发人员能够轻松地创建和调试设备驱动程序。WinDriver支持多种硬件接口,包括PCI、USB、PCI Express、Ethernet等。

使用WinDriver,开发人员可以编写设备驱动程序,以便与硬件设备进行通信。它提供了丰富的API和工具,使驱动程序的开发变得更加高效和可靠。WinDriver还提供了调试和测试工具,帮助开发人员快速定位和解决问题。

WinDriver的主要特点包括:

支持多种硬件接口:PCI、USB、PCI Express、Ethernet等。
提供丰富的API和工具,简化驱动程序的开发过程。
支持Windows操作系统的各个版本。
提供调试和测试工具,帮助开发人员快速定位和解决问题。
具有良好的兼容性和稳定性。

WinDriver是一款用于Windows操作系统的驱动程序开发工具。它由ungo公司开发,旨在简化驱动程序的开发过程。WinDriver提供了一套丰富的API和工具,使开发人员能够快速、高效地创建稳定可靠的驱动程序。

WinDriver的最新版本是WinDriver 14.7.0,发布于2021年6月。该版本带来了一些新功能和改进,包括对最新Windows操作系统的支持、增强的性能和稳定性、更好的兼容性等。此外,WinDriver还提供了对多种硬件接口和设备的支持,包括USB、PCI、PCI Express、Ethernet等。

WinDriver 10.3 下载使用用报错!
WinDriver 12.1 可在WIN7以上系统使用,30天使用版,未发现注册版。
下载:WinDriver ™ Version v12.1.1
© Jungo Connectivity Ltd. 2019 All Rights Reservedh

下载:WinDriver ™ Version v16.2.0
© Jungo Connectivity Ltd. 2024 All Rights Reservedh
ttps://jungo.com/windriver/
在这里插入图片描述

前言

WinDriver是一款用于Windows操作系统的驱动程序开发工具。它提供了一个简单而强大的接口,使开发人员能够轻松地创建和调试设备驱动程序。WinDriver支持多种硬件接口,包括PCI、USB、PCI Express、Ethernet等。
一、WinDriver是什么?
WinDriver是一款用于Windows操作系统的驱动程序开发工具
二、使用步骤
打开WinDriver设备。
在这里插入图片描述
打开New host driver project。
找到该设备。双击进入该设备。
找到两个BAR空间。
读写BAR空间。
这里完成了简单的硬件读写测试。

下面我们使用WinDriver生成驱动。
river,点击project。生成代码。
下一步生成代码,选择如下。
续选择。

生成的文件夹如下。x86里面就是生成的代码。

下面我们为硬件设备安装驱动文件,生成的驱动就是你保存的文件下面的.inf文件。点击更新驱动文件。

接下来,我们打开工程。pci_driver_diag.c就是我们需要看的。在此里面添加简单的测试代码,来测试我们的硬件设备。

打开工程后如下。
下面是我添加部分的代码。

这里主要说明两个函数。

 WDC_ReadAddr32(hDev, dwAddrSpace, dwOffset, &u32Data) :
 WDC_WriteAddr32(hDev, dwAddrSpace, dwOffset, u32Data);

WDC_WriteAddr32:向目标设备写入值。

WDC_ReadAddr32:从目标设备读出值。

hDev

dwAddrSpace

dwOffset

u32Data

外部设备的句柄

外部设备上的BAR空间。

偏移地址

Write:写入值。

Read:读出值。

这里我在源代码基础上添加了一个for循环来循环向一个地址写入和读出。判断两者是否相等。不相等就报错。说明pci写入或者读取失败。

/* Read/write memory or I/O space address menu */
static void MenuReadWriteAddr(WDC_DEVICE_HANDLE hDev)
{
DWORD option;
static DWORD dwAddrSpace = ACTIVE_ADDR_SPACE_NEEDS_INIT;
static WDC_ADDR_MODE mode = WDC_MODE_32;
static BOOL fBlock = FALSE;

UINT32 u32Data = 0;

/* Initialize active address space */
if (ACTIVE_ADDR_SPACE_NEEDS_INIT == dwAddrSpace)
{
    DWORD dwNumAddrSpaces = PXI_DRIVER_GetNumAddrSpaces(hDev);
    
    /* Find the first active address space */
    for (dwAddrSpace = 0; dwAddrSpace < dwNumAddrSpaces; dwAddrSpace++)
    {
        if (WDC_AddrSpaceIsActive(hDev, dwAddrSpace))
            break;
    }
    
    /* Sanity check */
    if (dwAddrSpace == dwNumAddrSpaces)
    {
        PXI_DRIVER_ERR("MenuReadWriteAddr: Error - no active address spaces found\n");
        dwAddrSpace = ACTIVE_ADDR_SPACE_NEEDS_INIT;
        return;
    }
}

do
{
    printf("\n");
    printf("Read/write the device's memory and IO ranges\n");
    printf("---------------------------------------------\n");
    printf("%d. Change active address space for read/write "
        "(currently: BAR %ld)\n", MENU_RW_ADDR_SET_ADDR_SPACE, dwAddrSpace);
    printf("%d. Change active read/write mode (currently: %s)\n",
        MENU_RW_ADDR_SET_MODE,
        (WDC_MODE_8 == mode) ? "8 bit" : (WDC_MODE_16 == mode) ? "16 bit" :
        (WDC_MODE_32 == mode) ? "32 bit" : "64 bit");
    printf("%d. Toggle active transfer type (currently: %s)\n",
        MENU_RW_ADDR_SET_TRANS_TYPE,
        (fBlock ? "block transfers" : "non-block transfers"));
    printf("%d. Read from active address space\n", MENU_RW_ADDR_READ);
    printf("%d. Write to active address space\n", MENU_RW_ADDR_WRITE);
    printf("%d. Exit menu\n", MENU_RW_ADDR_EXIT);
    printf("\n");
    
    if (DIAG_INPUT_FAIL == DIAG_GetMenuOption(&option,
        MENU_RW_ADDR_WRITE))
    {
        continue;
    }
    
    switch (option)
    {
    case MENU_RW_ADDR_EXIT: /* Exit menu */
        break;
    case MENU_RW_ADDR_SET_ADDR_SPACE: /* Set active address space for read/write address requests */
    {
        SetAddrSpace(hDev, &dwAddrSpace);
        break;
    }
    case MENU_RW_ADDR_SET_MODE: /* Set active mode for read/write address requests */
        WDC_DIAG_SetMode(&mode);
        break;
    case MENU_RW_ADDR_SET_TRANS_TYPE: /* Toggle active transfer type */
        fBlock = !fBlock;
        break;
    case MENU_RW_ADDR_READ:  /* Read from a memory or I/O address */
    case MENU_RW_ADDR_WRITE: /* Write to a memory or I/O address */
    {
        WDC_DIRECTION direction =
            (MENU_RW_ADDR_READ == option) ? WDC_READ : WDC_WRITE;

        if (fBlock)
            WDC_DIAG_ReadWriteBlock(hDev, direction, dwAddrSpace);
        else
            WDC_DIAG_ReadWriteAddr(hDev, direction, dwAddrSpace, mode);

		for (int i = 0; i <= 10; i++)
		{
			WDC_WriteAddr32(hDev, dwAddrSpace, 0x00000000, 0x00005555);
			WDC_ReadAddr32(hDev, dwAddrSpace, 0x00000000, &u32Data);
			printf(" from = %i read bar0 0x00 =%x write data is  =%x\n", i, u32Data, 0x00005555);
			if (u32Data != 0x00005555)
				printf("diffenent from = %i read bar0 0x00 =%x write data is  =%x\n", i, u32Data, 0x00005555);
			WDC_WriteAddr32(hDev, dwAddrSpace, 0x00000000, 0x0000aaaa);
			WDC_ReadAddr32(hDev, dwAddrSpace, 0x00000000, &u32Data);
			if (u32Data != 0x0000aaaa)
				printf("diffenent from = %i read bar0 0x00 =%x write data is  =%x\n", i, u32Data, 0x0000aaaa);
		}
        
        break;
    }
    }
} while (MENU_RW_ADDR_EXIT != option);

}

运行代码。

这里我们输入3:Read/write memory and IO addresses on the device

我们可以看到这里bar空间选择的为BAR0,读写方式选择的为32位读写。

我们选择:Read from active address space。

继续输入偏移地址:00。

我们看到没有报错,说明读写正常。

总结

以上就是今天要讲的内容,本文仅仅简单介绍了WinDriver的使用,而WinDriver提供了大量能使我们快速便捷地处理数据的函数和方法。

在Windows驱动开发领域,有几本书被广泛推荐:

1.《深入浅出Windows驱动开发》:

作者:张佩、马勇、董鉴源。
出版社:电子工业出版社。
出版时间:2011年3月。
特色:本书基于作者多年的工作经验总结,特别强调了WDF框架的应用,内容包括WDF驱动的开发、USB和1394驱动开发、音视频驱动开发、设备驱动安装等。适合入门级内核程序员以及有一定经验的程序员。

2.《Windows驱动开发技术详解》:

作者:张帆、史彩成。
出版社:电子工业出版社。
出版时间:2008年7月1日。
内容:本书深入介绍了Windows内核原理、编程技巧和应用实例,适用于中、高级系统程序员,也可用作高校计算机专业操作系统实验课的补充教材。
其他推荐书籍:

3.《天书夜读:从汇编语言到Windows内核编程》。
4.《寒江独钓:Windows内核安全编程》。
在选择书籍时,你可以根据自己的需求和背景来决定。如果你是初学者,可能会更倾向于选择《深入浅出Windows驱动开发》,因为它详细介绍了WDF框架,并且适合初学者和有一定经验的程序员。而《Windows驱动开发技术详解》则更适合有一定基础的程序员,它提供了更深入的技术细节和案例分析。其他书籍如《天书夜读》和《寒江独钓》则提供了更专业的安全编程和内核编程知识,可能适合需要进一步深入研究的开发者。

  • 7
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值