Windows NT驱动
来源:互联网 发布:二阶矩阵 编辑:程序博客网 时间:2024/06/04 20:13
- //hello_nt.h
- #pragma once
- #ifdef __cplusplus
- extern "C" {
- #endif
- #include <ntddk.h>
- #ifdef __cplusplus
- }
- #endif
- #define PAGEDCODE code_seg("PAGE")
- #define LOCKEDCODE code_seg()
- #define INITCODE code_seg("INIT")
- #define PAGEDDATA data_seg("PAGE")
- #define LOCKEDDATA data_seg()
- #define INITDATA data_seg("INIT")
- #define arraysize(p) (sizeof(p)/sizeof((p)[0]))
- typedef struct _DEVICE_EXTENSION {
- PDEVICE_OBJECT pDevObj;
- UNICODE_STRING ustrDeviceName; /* 设备名称 */
- UNICODE_STRING ustrSymLinkName; /* 链接名称 */
- }DEVICE_EXTENSION, *PDEVICE_EXTENSION;
- NTSTATUS CreateDevice(IN PDRIVER_OBJECT pDriverObject);
- VOID HelloDDKUnload(IN PDRIVER_OBJECT pDriverObject);
- NTSTATUS HelloDDKDispatchRoutine(IN PDEVICE_OBJECT pDevObj,
- IN PIRP pIrp)
- //hello_nt.c
- #include "hello_nt.h"
- #define HELLO_DDK_DEVICE_NAME L"\\Device\\DriverDeviceName"
- #define HELLO_DDK_DOS_NAME L"\\??\\DriverDosName"
- #define DEBUG_ENTER() KdPrint(("%s entry.\n", __FUNCTION__));
- /*
- VOID WINAPI RtlInitUnicodeString(
- _Inout_ PUNICODE_STRING DestinationString,
- _In_opt_ PCWSTR SourceString
- );
- NTSTATUS IoCreateDevice(
- _In_ PDRIVER_OBJECT DriverObject,
- _In_ ULONG DeviceExtensionSize,
- _In_opt_ PUNICODE_STRING DeviceName,
- _In_ DEVICE_TYPE DeviceType,
- _In_ ULONG DeviceCharacteristics,
- _In_ BOOLEAN Exclusive,
- _Out_ PDEVICE_OBJECT *DeviceObject
- );
- http://msdn.microsoft.com/en-us/library/windows/hardware/ff548397%28v=vs.85%29.aspx
- */
- #pragma INITCODE
- NTSTATUS CreateDevice(IN PDRIVER_OBJECT pDriverObject)
- {
- NTSTATUS status;
- PDEVICE_OBJECT pDevObj;
- PDEVICE_EXTENSION pDevExt;
- UNICODE_STRING devName;
- UNICODE_STRING SymLinkName;
- RtlInitUnicodeString(&devName, HELLO_DDK_DEVICE_NAME);
- RtlInitUnicodeString(&SymLinkName, HELLO_DDK_DOS_NAME);
- //创建设备,将驱动对象和设备对象绑定,指明设备的类型,名称等属性
- status = IoCreateDevice(pDriverObject,
- sizeof(DEVICE_EXTENSION),
- &devName,
- FILE_DEVICE_UNKNOWN,
- FILE_DEVICE_SECURE_OPEN,
- FALSE,
- &pDevObj);
- if ( !NT_SUCCESS(status) ) {
- KdPrint(("IoCreateDevice err"));
- return status;
- }
- pDevObj->Flags |= DO_BUFFERED_IO;
- pDevExt = pDevObj->DeviceExtension;
- pDevExt->pDevObj = pDevObj;
- pDevExt->ustrDeviceName = devName;
- pDevExt->ustrSymLinkName = SymLinkName;
- //创建设备名称的符号链接,
- status = IoCreateSymbolicLink(&SymLinkName, &devName);
- if ( !NT_SUCCESS(status) ) {
- KdPrint(("IoCreateSymbolicLink err"));
- return status;
- }
- return STATUS_SUCCESS;
- }
- /* 删除CreateDevice创造的东西 */
- #pragma PAGEDCODE
- VOID HelloDDKUnload(IN PDRIVER_OBJECT pDriverObject)
- {
- PDEVICE_OBJECT pDevObj;
- PDEVICE_EXTENSION pDevExt;
- DEBUG_ENTER();
- //DriverObject->DeviceObject->DeviceExtension
- pDevObj = pDriverObject->DeviceObject; //设备对象和驱动对象都有指向对方的指针
- pDevExt = pDevObj->DeviceExtension;
- //删除符号链接及设备对象
- IoDeleteSymbolicLink(&pDevExt->ustrSymLinkName);
- IoDeleteDevice(pDevExt->pDevObj);
- }
- /*
- VOID IoCompleteRequest(
- _In_ PIRP Irp,
- _In_ CCHAR PriorityBoost
- );
- http://msdn.microsoft.com/en-us/library/ff548343%28VS.85%29.aspx
- */
- #pragma PAGEDCODE
- NTSTATUS HelloDDKDispatchRoutine(IN PDEVICE_OBJECT pDevObj,
- IN PIRP pIrp)
- {
- NTSTATUS status = STATUS_SUCCESS;
- DEBUG_ENTER();
- pIrp->IoStatus.Status = status;
- pIrp->IoStatus.Information = 0;
- IoCompleteRequest(pIrp, IO_NO_INCREMENT);//马上完成了IO请求
- return status;
- }
- /*
- *驱动入口函数
- */
- #pragma INITCODE
- //extern "C" NTSTATUS DriverEntry(IN PDEVICE_OBJECT pDriverObject,//c++程序
- NTSTATUS DriverEntry(IN PDRIVER_OBJECT pDriverObject,
- IN PUNICODE_STRING pRegistryPath)
- {
- NTSTATUS status;
- DEBUG_ENTER();
- pDriverObject->DriverUnload = HelloDDKUnload;
- pDriverObject->MajorFunction[IRP_MJ_CREATE] = HelloDDKDispatchRoutine;
- pDriverObject->MajorFunction[IRP_MJ_CLOSE] = HelloDDKDispatchRoutine;
- pDriverObject->MajorFunction[IRP_MJ_WRITE] = HelloDDKDispatchRoutine;
- pDriverObject->MajorFunction[IRP_MJ_READ] = HelloDDKDispatchRoutine;
- status = CreateDevice(pDriverObject);
- return status;
- }
- //hello_nt.inf
- ;; The Win2K DDK documentation contains an excellent INF reference.
- ;目标安装文件: abc.sys, (ABCkeyboard.sys)
- ;类子键:使用自定义的设备类,Class=ZhangfanDevice
- ;硬件子键:
- ;服务子键:HelloWDM,最好跟abc.sys的名字一致,也就是改为abc
- ;--------- Version Section ---------------------------------------------------
- [Version]
- Signature="$CHICAGO$"
- Provider=Zhangfan_Device2 ;驱动属性-驱动程序-驱动程序提供商
- DriverVer=11/1/2007,3.0.0.3 ;驱动程序版本
- ;###类子键,设备从属的设备类:
- ;HK_LM\SYSTEM\CurrentControlSet\Control\Class\{GUID}\Class
- ;如果是标准的设备,则使用相同的名字和GUID,否则创建自己的设备类和GUID
- Class=ZhangfanDevice ;HK_LM\SYSTEM\CurrentControlSet\Control\Class\{GUID}\Class
- ClassGUID={EF2962F0-0D55-4bff-B8AA-2221EE8A79B0} ;上面的{GUID}
- ; 如果使用标准设备类,则不需要这些
- ;--------- ClassInstall/ClassInstall32 Section -------------------------------
- ; 9X Style Windows 98
- [ClassInstall]
- Addreg=Class_AddReg
- ; NT Style Windows 2000
- [ClassInstall32]
- Addreg=Class_AddReg
- [Class_AddReg]
- HKR,,,,%DeviceClassName%
- HKR,,Icon,,"-5"
- ;待安装文件的位置及描述
- ;--------- 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 = "HelloWDM",Disk1,,
- [SourceDisksFiles]
- abc.sys = 1,,
- ;目标安装位置
- ;--------- DestinationDirs Section -------------------------------------------
- [DestinationDirs]
- YouMark_Files_Driver = 10,System32\Drivers
- ;##硬件子键,硬件实例
- ;HKEY_LOCAL_MACHINE\SYSTEM\CONTROLSET001\ENUM (\ROOT\UNKNOWN\0000)
- ;--------- 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
- ;服务子键,兼容以前的NT驱动,也就是可以用INF安装NT驱动
- ;;HK_LM\SYSTEM\CurrentControlSet\services 生成"HelloWDM"项
- ;---------- 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,,abc.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\abc.sys
- [YouMark_NT_AddReg]
- HKLM, "System\CurrentControlSet\Services\HelloWDM\Parameters",\
- "BreakOnEntry", 0x00010001, 0
- ; --------- Files (common) -------------
- [YouMark_Files_Driver]
- abc.sys
- ;--------- Strings Section ---------------------------------------------------
- [Strings]
- ProviderName="Zhangfan.inc"
- MfgName="Zhangfan Soft" ;驱动属性-常规-制造商
- DeviceDesc="Hello World NT!" ;设备管理器显示的名字,例如"标准VGA图形适配器"
- DeviceClassName="Zhangfan_Device_class" ;;驱动属性-常规-设备类型
- SvcDesc="Zhangfan"
0
上一篇:pragma once
下一篇:error RC2104 : undefined keyword or key name: Select 1394
相关热门文章
- LNK1123: 转换到 COFF 期间失...
- WIN7访问共享:0x80070035 找不...
- Delphi 2010下载+完美破解...
- vs2010调试C++程序时提示 无...
- VISIO,不规则封闭图形填充方...
- linux dhcp peizhi roc
- 关于Unix文件的软链接
- 求教这个命令什么意思,我是新...
- sed -e "/grep/d" 是什么意思...
- 谁能够帮我解决LINUX 2.6 10...
给主人留下些什么吧!~~
评论热议
0 0
- Windows NT驱动
- Windows NT/2000下不用驱动的Ring0代码实现
- Windows NT/2000下不用驱动的Ring0代码实现
- windows 下驱动NT和WDM 基本例子 (一)
- Windows NT
- Windows NT
- Windows 驱动开发基础(六)NT驱动的基本结构
- NT式驱动模版
- NT驱动加载器
- NT驱动笔记
- NT式驱动
- NT驱动加载方式
- nt驱动1
- 转:Windows NT/2000/XP下不用驱动的Ring0代码实现
- Windows NT/2000/XP下不用驱动的Ring0代码实现(http://webcrazy.yeah.net)
- 最简单明了的驱动开发说明: Windows NT 设备驱动程序开发基础(转)
- Windows NT/2000/XP下不用驱动的Ring0代码实现
- Windows NT/2000/XP下不用驱动的Ring0代码实现
- libcmt.lib
- ubuntu下tftp的安装、配置、使用
- 工作中积累的优秀博客
- windows安装服务程序
- pragma once
- Windows NT驱动
- error RC2104 : undefined keyword or key name: Select 1394
- #51nod 1305 Pairwise Sum and Divide
- 修改Makefile.am,无法生效
- iOS中常见的第三方登录
- hadoop-2.7.1/tmp/dfs/namesecondary/in_use.lock (Permission denied) 错误解决
- SwipeRefreshLayout基本使用和冲突解决机制
- 一个循环队列在linux下的应用
- TortoiseSVN 修改服务器地址url
原创粉丝点击
热门IT博客
热门问题
老师的惩罚
人脸识别
我在镇武司摸鱼那些年
重生之率土为王
我在大康的咸鱼生活
盘龙之生命进化
天生仙种
凡人之先天五行
春回大明朝
姑娘不必设防,我是瞎子
玘怎么读
玙
玙怎么读
姚玙璠
玙为什么是凶字
玛
克斯玛
玛莎拉
玛莎拉帝
西格玛
玛萨拉蒂
萨拉玛公主
都贵玛
尼桑马驰
玛驰车怎么样
瑪
玛驰论坛
玛驰车
日产玛驰怎么样
尼桑玛驰图片
码驰
驰
日产玛驰图片
玛喜达
玛珈片
日产玛驰自动挡报价
玛沙拉
玛驰首付多少
尼桑 玛驰
日产汽车玛驰
日产玛驰优惠
雨燕 玛驰
玛驰两厢车
尼桑两厢车玛驰
锐玛遮光罩怎么样
尼桑玛驰油耗
生活玛丽
玛丽苏
血腥玛丽
玛丽生活
玛丽的生活