驱动开发起步

工业自动化开发起步:STLink驱动安装手把手教程 手把手教你完成STLink驱动安装,解决工业自动化开发中的常见问题,让初学者也能轻松上手嵌入式调试工具,快速进入开发状态。 阅读详情
驱动开发起步

看了近半个月的书,有了一小点的进步。主要是熟悉了一下驱动开发的环境和配置,USB的协议传输等等。下面是这段时间的体会。以开发一个简单的"hello world"为例。

1、先装VC,然后装DDK,我装的是2000DDK,这个顺序不要弄反。

2、配置好环境(1)在setting->link->libary modules添加ntoskrnl.lib hal.lib usbd.lib wdm.lib 。可能不需要这么多。(2)在setting->C/C++->category选preprocessor->additional include directories中添加c:/NTDDK/inc,c:/NTDDK/inc/ddk(3)在option中添加合适的lib,include路径.option->directories选include files添加C:/NTDDK/INC和C:/NTDDK/INC/DDK,在选library files中添加C:/NTDDK/libchk/i386和C:/NTDDK/libfre/i386。整个环境基本上就搭建好了。

3、然后添加代码。

//1.c


#ifdef _cplusplus
extern "C"
{
#endif
#include "1.h"
#ifdef _cplusplus
}
#endif


NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject,
      IN PUNICODE_STRING RegistryPath)
{
 DriverObject->DriverExtension->AddDevice = WDMAddDevice;
 DriverObject->MajorFunction[IRP_MJ_PNP] = WDMPnp;
 return STATUS_SUCCESS;
 
}

NTSTATUS WDMAddDevice(IN PDRIVER_OBJECT DriverObject,
       IN PDEVICE_OBJECT PhysicalDeviceObject)
{
 NTSTATUS status;
 PDEVICE_OBJECT fdo;
 PDEVICE_EXTENSION dx;
 status = IoCreateDevice(
  DriverObject,
  sizeof(DEVICE_EXTENSION),
  NULL,
  FILE_DEVICE_UNKNOWN,
  0,
  FALSE,
  &fdo);
 if(!NT_SUCCESS(status))
  return status;
 dx = (PDEVICE_EXTENSION)fdo->DeviceExtension;
 dx->fdo=fdo;
 dx->NextStackDevice = IoAttachDeviceToDeviceStack(fdo,PhysicalDeviceObject);
 fdo->Flags |= DO_BUFFERED_IO|DO_POWER_PAGABLE;
 fdo->Flags &= ~DO_DEVICE_INITIALIZING;
 return STATUS_SUCCESS;
}

NTSTATUS WDMPnp( IN PDEVICE_OBJECT fdo,
    IN PIRP Irp)
{
 PDEVICE_EXTENSION dx = (PDEVICE_EXTENSION)fdo->DeviceExtension;
 PIO_STACK_LOCATION IrpStack = IoGetCurrentIrpStackLocation(Irp);
 NTSTATUS status;

 ULONG MinorFunction = IrpStack->MinorFunction;
 IoSkipCurrentIrpStackLocation(Irp);
 status = IoCallDriver(dx->NextStackDevice,Irp);
 if( MinorFunction==IRP_MN_REMOVE_DEVICE)
 {
  IoSetDeviceInterfaceState(&dx->ifSymLinkName,FALSE);
  RtlFreeUnicodeString(&dx->ifSymLinkName);
  if(dx->NextStackDevice)
   IoDetachDevice(dx->NextStackDevice);
  IoDeleteDevice(fdo);
 }
 return status;
}

1.h


#ifdef _cplusplus
extern "C"
{
#endif
#include "ntddk.h"
#ifdef _cplusplus
}
#endif

typedef struct _DEVICE_EXTENSION
{
    PDEVICE_OBJECT    fdo;
    PDEVICE_OBJECT    NextStackDevice;
    UNICODE_STRING    ifSymLinkName;

} DEVICE_EXTENSION, *PDEVICE_EXTENSION;

NTSTATUS WDMAddDevice(IN PDRIVER_OBJECT DriverObject,
       IN PDEVICE_OBJECT PhysicalDeviceObject);

NTSTATUS WDMPnp( IN PDEVICE_OBJECT fdo,
    IN PIRP Irp);

4、在文件中添加makefile和source,makefile从其它驱动程序中就可以原封不动的考过来,source需要改一点,我的source是:

TARGETNAME=1
TARGETTYPE=DRIVER
DRIVERTYPE=WDM
TARGETPATH=OBJ

INCLUDES=$(BASEDIR)/inc;/
         $(BASEDIR)/inc/ddk;/

TARGETLIBS=$(DDKROOT)/libfre/i386/ntoskrnl.lib/
           $(DDKROOT)/libfre/i386/hal.lib/
           $(DDKROOT)/libfre/i386/wdm.lib
         
SOURCES=1.c/

makefile为(不用改地):

#
# DO NOT EDIT THIS FILE!!!  Edit ./sources. if you want to add a new source
# file to this component.  This file merely indirects to the real make file
# that is shared by all the driver components of the Windows NT DDK
#

!INCLUDE $(NTMAKEENV)/makefile.def

5、编译,用DDK中的checked(free) build environment来编译。进入控制台后执行build -cz,其中如果编译不通可以用nmake来调试。

6、build完成后,就会生成一个1.sys文件。

7、给设备写inf文件,即安装驱动,inf文件可以从其它驱动文件中拷贝过来,做点小改动就可以了。下面是我写的,

[Version]
Signature="$Chicago$"
Class=Unknown
Provider=%THU%

[Manufacturer]
%THU% = WdmDriver

[WdmDriver]
%WdmDriver%=WdmDriver.Install, *WdmDriver

[DestinationDirs]
WdmDriver.Files.Driver=10, System32/Drivers
WdmDriver.Files.Driver.NT=10, System32/Drivers

[SourceDisksNames]
1="WdmDriver directory",,,obj/i386/

[SourceDisksFiles]
1.sys=1
;; The Win2K DDK documentation contains an excellent INF reference.

;--------- Version Section ---------------------------------------------------

[Version]
Signature="$CHICAGO$"
Provider=LC_Device
DriverVer=8/21/2002,3.0.0.3

; If device fits one of the standard classes, use the name and GUID here,
; otherwise create your own device class and GUID as this example shows.

Class=Unknown
ClassGUID={ff646f80-8def-11d2-9449-00105a075f6b}

;--------- SourceDiskNames and SourceDiskFiles Section -----------------------

; These sections identify source disks and files for installation. They are
; shown here as an example, but commented out.

[SourceDisksNames]
1 = "1",Disk1,,

[SourceDisksFiles]
1.sys = 1,objfre/i386,

;--------- ClassInstall/ClassInstall32 Section -------------------------------

; Not necessary if using a standard class

; 9X Style
[ClassInstall]
Addreg=Class_AddReg

; NT Style
[ClassInstall32]
Addreg=Class_AddReg

[Class_AddReg]
HKR,,,,%DeviceClassName%
HKR,,Icon,,"-5"

;--------- DestinationDirs Section -------------------------------------------

[DestinationDirs]
YouMark_Files_Driver = 10,System32/Drivers

;--------- Manufacturer and Models Sections ----------------------------------

[Manufacturer]
%MfgName%=Mfg0

[Mfg0]

; PCI hardware Ids use the form
; PCI/VEN_aaaa&DEV_bbbb&SUBSYS_cccccccc&REV_dd
;改成你自己的ID
%DeviceDesc%=YouMark_DDI, PCI/VEN_9999&DEV_9999

;---------- DDInstall Sections -----------------------------------------------
; --------- Windows 9X -----------------

; Experimentation has shown that DDInstall root names greater than 19 characters
; cause problems in Windows 98

[YouMark_DDI]
CopyFiles=YouMark_Files_Driver
AddReg=YouMark_9X_AddReg

[YouMark_9X_AddReg]
HKR,,DevLoader,,*ntkern
HKR,,NTMPDriver,,HelloWDM.sys
HKR, "Parameters", "BreakOnEntry", 0x00010001, 0

; --------- Windows NT -----------------

[YouMark_DDI.NT]
CopyFiles=YouMark_Files_Driver
AddReg=YouMark_NT_AddReg

[YouMark_DDI.NT.Services]
Addservice = HelloWDM, 0x00000002, YouMark_AddService

[YouMark_AddService]
DisplayName = %SvcDesc%
ServiceType = 1 ; SERVICE_KERNEL_DRIVER
StartType = 3 ; SERVICE_DEMAND_START
ErrorControl = 1 ; SERVICE_ERROR_NORMAL
ServiceBinary = %10%/System32/Drivers/1.sys

[YouMark_NT_AddReg]
HKLM, "System/CurrentControlSet/Services/HelloWDM/Parameters",/
"BreakOnEntry", 0x00010001, 0


; --------- Files (common) -------------

[YouMark_Files_Driver]
1.sys

;--------- Strings Section ---------------------------------------------------

[Strings]
ProviderName="Flying L Co.,Ltd."
MfgName="LC Soft"
DeviceDesc="Hello World WDM!"
DeviceClassName="LC_Device"
SvcDesc="???"
对inf文件的一点小注释,:),inf文件是按照部分来划分的,每个部分用[]来标记。分号;表示注释,%表示(%文本%)表示一个字符串。

一个最基本的起步,未来还有很多工作要做,继续努力!

告别仿真报错!手把手教你为Intel MAX10 FPGA定制IBIS模型(附Allegro Skill工具) 本文详细介绍了为Intel MAX10 FPGA定制IBIS模型的完整流程,解决信号完整性仿真中的管脚映射问题。通过Allegro Skill工具自动化处理管脚信息,优化IBIS模型关键段落,提升仿真效率和精度,适用于高速数字电路设计。 阅读详情

相关推荐

全网最详细Seurat v5 流程复现(拿来即用)

本文是基于seurat v5版本的教程复现,主要依据来源于官网seurat v5建议大家有时间的话可以去官网进行详细阅读学习!本节内容在之前seurat v4的教程都很多都有提到,文章所用到的数据及代码已经给各位放在这里了,有需要自取!请点击这里哦提取码:bui1。

ZxVSaccount的博客 1万+

sys文件生成

 目录:    ☆ 概述    ☆ 编写hello.c文件    ☆ 编写dirs文件    ☆ 编写sources文件    ☆ 编写makefile文件    ☆ 编译产生hello.sys文件    ☆ 编写hello.inf文件    ☆ 安装hello.inf文件    ☆ 卸载hello.sys及相关设置    ☆ 察看KdPrint输出    ☆ 使用DriverMonitor 

coderli的专栏 4817

CCF CSP历年题解(python)

菜鸡一枚,没参加过算法竞赛,单纯为了抵研究生考试复试才刷题,通过写博客记录下来,希望能和大家互相交流,代码质量不高,大家见谅。 因为考研等原因,题目不定期更新… 第一题 201312-1出现最多次数的数 ...

weixin_44690402的博客 5004

XP系统安装WDK

XP系统安装WDK 在XP系统安装WDK7.1.0,装的脑袋疼;最后还是得慢慢的找提示错误日志;效率高 官网下载的文件,解压后安装,在编译后依然出现错误,根据网上进行重新下载后,还是不能够进行解决;最后还是自己搞吧; 具体安装过程如下: 还是在官网下载WDK安装包;解压安装、安装完成后肯定是不成功的,修改方法有以下:,如果以下方法不能解决,可能是安装包不是在官网下载的,重新从官网进行下载; 选择W...

W_CCSSDDNN的博客 798

解决创建conda环境时Solving environment: failed 和 ResolvePackageNotFound 的错误

环境配置文件是在别的机器上导出的,文件里的软件包是按照导出文件的机器配置的,因此导出的时候,把这些包的详细信息也导了出来,即第二个等号后面跟着的信息,当我们按照这个文件创建环境时,conda就会根据我们机器的配置信息,按照配置文件里包的详细信息,去找这个包,那当然找不到,结果发现“查无此包”,因此也就会报上面的错误。上面找到了问题的所在之处,解决起来就很简单了,只需要在配置文件 environment.yml 中将包的详细信息删除,也就是第二个等号后面的内容。然而升级超级慢不说,也没有解决我的问题。...

番茄炒蛋三分糖 4万+

【BlueZ】编译产物详解:可执行文件/库文件/工具的生成路径与用途

BlueZ二次开发编译产物机制解析 摘要:在BlueZ蓝牙协议栈二次开发中,90%的报错源于对编译产物类型和路径的混淆。本文系统剖析BlueZ的三阶段编译机制:1)配置阶段生成Makefile;2)编译阶段在.libs目录下产生临时库和可执行文件(不可直接运行);3)安装阶段将产物部署到系统标准路径。重点解析守护进程、命令行工具、动态库的核心路径差异,并针对五大高频问题(如临时库运行崩溃、动态库不匹配、系统覆盖等)给出解决方案。

byte轻骑兵的技术小窝 1万+

NT式驱动和WDM式驱动程序

1.Windows驱动程序分为两类,一类是不支持即插即用功能的NT式的驱动程序;另一类是支持即插即用功能的WDM式的驱动程序。   2.NT式的驱动程序要导入的头文件时NTDDK.H,而WDM式的驱动要导入的头文件为WDM.H.   3.DriverEntry需要放在INIT标志的内存中。INIT标志指明该函数只是在加载的时候需要载入内存,而当驱动程序加载成功后,该函数可以

whatday的专栏 5029

学Simulink--基于Simulink的无迹卡尔曼滤波(UKF)目标跟踪仿真建模示例

本文详细介绍了基于Simulink的无迹卡尔曼滤波(UKF)目标跟踪仿真建模方法。首先分析了UKF相比EKF在强非线性场景下的优势,包括无线性化误差、计算效率高和鲁棒性强等特点。接着阐述了UKF的核心原理,重点讲解了无迹变换(UT)的三个关键步骤:Sigma点生成、非线性传播和加权统计重构。文章还详细说明了二维机动目标的状态向量定义、非线性状态转移模型和雷达观测模型。 在Simulink实现部分,提供了完整的建模步骤和核心代码,包括目标运动模型、雷达传感器模型和UKF算法模块的实现。通过蛇形机动场景的仿真实

xiaoheshang_123的博客 89

Window XP驱动开发(二十四)虚拟串口设备驱动

转载请标明是引用于 http://blog.youkuaiyun.com/chenyujing1234  欢迎大家拍砖    在我的一篇文章winCE中实现虚拟串口的方法 >>中,讲到在wince 下开发虚拟串口驱动的方法,现在介绍在windows XP下开发虚拟串口的方法。   可以开发一个虚拟串口,将读写请求传递给USB驱动,这样就可以利用现成的串口调试工具向USB设备读取了。 1、DDK串

chenyujing1234的专栏 1万+

hadoop 切片机制详解

hadoop切片机制详解

congge 1万+

使用YubiKey进行全盘加密、加密启动分区以及利用UEFI安全启动的详细指南

在本教程中,我们将使用YubiKey来增强电脑的安全性,通过加密整个硬盘,确保只有持有正确YubiKey的人才能访问。UEFI安全启动是一种在UEFI固件级别实施的安全标准,确保计算机仅启动签名的启动加载程序。为了符合您的要求,我将以此方式分配内容,确保每部分都有详尽的说明和代码。现在,您已经成功地使用YubiKey设置了全盘加密,并使用UEFI安全启动为系统增加了额外的安全层。注意:为了简洁和清晰,本文中的代码可能不是最优的或最完整的实现。注意:为了简洁和清晰,本文中的代码可能不是最优的或最完整的实现。

qq_38334677的博客 1006

WDK介绍与安装

WDK介绍与安装     如果你要开发驱动,你可以在我的另外一篇博文《VS2008+WDK 文件驱动过滤程序 开发环境配置》中找到VS2008+WDK+DDKWizard的配置方案,祝你工作愉快!      WDK是微软提供的DDK的最新版本,它已经可以支持到WINDOWS7的驱动开发了,其兼容情况如下:                 ·

心之所向,身之所往 7949

新手也能写复杂爬虫!AI+Python自动分析京东商品,提取数据不用F12

不用F12:AI自动分析京东页面,生成选择器;不用懂JS:Playwright自动渲染动态数据;不用改代码:只需配置3个参数,复制运行就能出结果。这套方案不仅适用于京东,修改提示词后还能爬取淘宝、拼多多、亚马逊等电商网站,新手只需掌握“配置参数→运行代码→查看CSV”3步,就能轻松获取任意网站的结构化数据。未来,AI会让爬虫彻底进入“零代码、零门槛”时代,新手也能轻松搞定复杂数据爬取需求。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 1341

Windows驱动开发起步

一、安装DDK DDK下载地址 ed2k://|file|%5Bwindows%E9%A9%B1%E5%8A%A8%E5%BC%80%E5%8F%91%E5%8C%85%5D.Windows.Server.2003.DDK.iso|203356160|ab0885514b9d67cc7be448359f57132e|h=BUOXVNU5UAR5MUHVW642J3SNJFKCGQLP| 如果是

东子的博客 971

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

linux驱动开发之-helloworld起步

开发平台:pc(xp),虚拟机vwmare6.5、Linux操作系统Fedora9转自研发客:http://www.yanfake.com 需要知道的知识: 1、printk打印输出的优先级 #define KERN_EMERG "<0>"/*紧急事件消息,系统崩溃之前提示,表示系统不可用*/#define KERN_ALERT "<1>"/*...

weixin_30650039的博客 98

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

嵌入式状态机开发起步套件:从表驱动到多按键识别实战

状态机是嵌入式系统开发中管理复杂逻辑的核心思想,它通过有限状态、事件驱动与显式转移,将散乱的if-else流程转化为可审计的表格化设计。在单片机与RTOS环境下,表驱动状态机配合事件队列、超时机制和调试日志,能够显著提升代码的可维护性与健壮性,广泛适用于按键识别、UART帧解析、充电管理等场景。本文以一套嵌入式状态机Starter Kit为线索,从核心引擎的目录结构、查表实现、队列与超时处理,到多按键长按/短按识别的完整实战,展示如何将状态机方法论落地为可复用的工程骨架,帮助开发者告别条件分支混乱,构建清晰

weixin_29194817的博客 331

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

SpringBoot核心特性:自动配置与起步依赖

Spring Boot 的最大魅力在于它能够最大限度地减少开发者的手动配置工作。起步依赖(Starter)是 Spring Boot 提供的一组预定义的 Maven 依赖集合。是 Spring Boot 自动配置的核心注解。它告诉 Spring Boot 根据classpath中的依赖,自动加载相应的配置类(Configuration Class)。是 Spring Boot 最为核心的功能之一。Spring Boot 通过一系列创新的设计和特性,极大地简化了 Spring 应用的开发和配置工作。

2302_76552486的博客 1705

嵌入式Linux征稿

寻具有多年嵌入式Linux开发经验,并在某一方面具有特长的专业人士合作,出版嵌入式Linux方面的图书。初步含如下方面:        嵌入式Linux开发起步        嵌入式Linux应用开发        嵌入式Linux系统开发        嵌入式Linux驱动开发        QQ:49729348  MSN:choice103@sohu.com     

choice103的专栏 493

Android手机嵌入式驱动开发课程教程

亲爱的网友,我这里有套课程想和大家分享,如果对这个课程有兴趣的,可以加我的QQ2059055336和我联系。   基于Linux/Android 双平台开发环境 掌握Android1.5-4.x ARM9和Cortex A8平台移植设备驱动开发 Android4.x应用开发 课程内容简介 本套课程从最础的C语言和数据结构起步,一步步学习ARM裸机开发、Linux应用开发、Linux系

u013053333的专栏 1074

从domino开发到驱动开发

<br />   说起domino估计对这个有相关了解的程序员也不会多,毕竟这个东西只是IBM玩的比较多。我刚毕业那年,计划是找份C++的工作的,不过事情就是那么有姻缘,有个公司想叫我过去搞domino开发,我稍微了解了一下,感觉还蛮有意思的,就答应了。其实编程都是一通百通的,多

Windows Kernel Research 403

Flutter 三方库 gits_cli 的鸿蒙化适配指南 - 自动化脚手架驱动开发提效、规范鸿蒙工业级工程起步实战

在进行 Flutter for OpenHarmony 的企业级重构或新项目启动时,重复创建 Repository、BLoC、Model 文件夹以及编写样板文件不仅枯燥,还极易出现命名不规范的问题。同时,面对鸿蒙端多环境(Dev/Staging/Prod)的配置管理,手动操作风险极大。gits_cli作为一个专门为 Flutter 开发者打造的效率引擎,能显著简化这些流程。本文将分享如何在鸿蒙适配征程中,利用自动化工具跑出“推背感”。gits_cli是一个基于命令行界面的自动化工具集。

大山哥 2375

“深入理解SpringBoot:从入门到精通的几个关键要点“

例如,如果你在项目中引入了Spring MVC依赖,Spring Boot将自动配置一个DispatcherServlet,并注册一些常用的Bean。我们将从Spring Boot的基本概念开始,介绍自动配置、起步依赖、注解驱动开发等特性,并通过示例代码演示如何使用Spring Boot构建一个简单的Web应用程序。本文介绍了Spring Boot的关键要点,包括自动配置、起步依赖和注解驱动开发。Spring Boot是一个快速开发框架,基于Spring框架,旨在简化应用程序的配置和部署。

coder_jh的博客 359

云捷平台

云捷平台包含业务层和界面层,业务层包括数据概念模型、流程模型,通过数据模型引擎和工作流引擎

qianpou的博客 1303

学习springboot和mybatisplus相关知识

最新版本

weixin_68722398的博客 986

麒麟操作系统 Java 数据库应用开发起步指南

本文详细介绍了Java开发环境搭建与数据库连接开发的全流程。主要内容包括:1)环境准备(JDK安装配置、MySQL/MariaDB数据库安装及IDE工具配置);2)JDBC驱动配置与数据库连接实现(含连接池优化);3)性能优化策略(JVM调优、数据库索引优化及麒麟系统特性优化);4)开发规范与工具链(代码规范检查、持续集成及监控工具)。

软件行业技术文化交流。 974

Spring Boot 2 学习全攻略

尽管 Spring Boot 提供了强大的自动配置功能,但在某些情况下,你可能需要根据项目的特殊需求进行自定义配置。这可以通过 application.properties 或 application.yml 文件来实现。例如,如果你想修改服务器端口,可以在 application.properties 中添加 “server.port=8888”。在代码中,通过使用 @Value 注解或 @ConfigurationProperties 注解来读取这些配置值,注入到相应的组件中,实现灵活的配置管理。

zsnandzmn的博客 1450
上一篇: USB驱动开发任务
下一篇: Pragma是什么?
普通网友
博客等级 码龄22年 1万+粉丝 3156原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值