- //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"
相关热门文章
给主人留下些什么吧!~~
评论热议