如何让IO管理器调用AddDevice函数?

whiteclouds 2015-01-08 08:05:41
第一次接触windows驱动,我写了一个文件磁盘驱动,驱动入口函数如下:
NTSTATUS DriverEntry(PDRIVER_OBJECT drvObject, PUNICODE_STRING usRegPath)
{
PKEY_VALUE_PARTIAL_INFORMATION startKeyValue;
ULONG version;
int i;

Dump("DriverEntry " DRIVER_NAME " " DRIVER_VERSION "\n");

memset(&OsVersion, 0, sizeof(RTL_OSVERSIONINFOW));
OsVersion.dwOSVersionInfoSize = sizeof(RTL_OSVERSIONINFOW);
RtlGetVersion(&OsVersion);
//Dump("RtlGetVersion:%d,%d\r\n", OsVersion.dwMajorVersion, OsVersion.dwMinorVersion);
// Load dump filter if the main driver is already loaded
if (NT_SUCCESS (FDDeviceIoControl (NT_ROOT_PREFIX, FD_IOCTL_GET_DRIVER_VERSION, NULL, 0, &version, sizeof (version))))
return DumpFilterEntry ((PFILTER_EXTENSION) drvObject, (PFILTER_INITIALIZATION_DATA) usRegPath);

FDDriverObject = drvObject;
memset(VirtualVolumeDeviceObjects, 0, sizeof(VirtualVolumeDeviceObjects));

if(NT_SUCCESS(FDReadRegistryKey(usRegPath, L"Start", &startKeyValue)))
{
if(startKeyValue->Type == REG_DWORD && *((uint32 *)startKeyValue->Data) == SERVICE_BOOT_START)
{
LoadBootArguments();
}
FDfree(startKeyValue);
}
else
{
Dump("Read registry key value failure!\n");
}

VolumeClassFilterRegistered = IsVolumeClassFilterRegistered();
ReportBOOL("VolumeClassFilterRegistered", VolumeClassFilterRegistered);

for (i = 0; i <= IRP_MJ_MAXIMUM_FUNCTION; ++i)
{
FDDriverObject->MajorFunction[i] = FDDispatchQueueIRP;
}
FDDriverObject->DriverExtension->AddDevice = FileDiskAddDevice;

drvObject->DriverUnload = UnloadDriver;

return FDCreateRootDeviceObject(FDDriverObject);
}

我写了一个加载程序,通过打印调试信息,在WinDBG里看到驱动已经被加载了,现在我想让IO管理器调用我的AddDevice函数,就是上面代码里的FileDiskAddDevice函数。但是我的驱动只是管理文件磁盘的,没有对应的硬件,查了好几天资料,也不知道如何让系统的IO管理器调用FileDiskAddDevice函数,有哪位高手知道?敬请赐教!谢谢!
...全文
545 13 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
whiteclouds 2016-05-05
  • 打赏
  • 举报
回复
可以参考FileDisk文件磁盘驱动的代码,这个几乎是驱动程序开发的入门模板
frostlihyan 2016-04-18
  • 打赏
  • 举报
回复
楼主问题解决了吗?我写了一个虚拟串口驱动,测试的时候,可以看到驱动driverentry之后,直接unload了,并没有adddevice,为什么呢?
曹大夯 2015-01-13
  • 打赏
  • 举报
回复
真的没有用过TrueCrypt。 建议继续研究这个项目的源码。看看这个项目是怎么工作的,然后再来调试你的东西比较合理。
whiteclouds 2015-01-12
  • 打赏
  • 举报
回复
我修改以后的inf文件内容如下:
;/*++
;
;Copyright (c) 1990-1999 Microsoft Corporation All rights Reserved
;
;Module Name:
;
;    BUSF.INF
;
;Abstract:
;
;    INF file for installing toaster bus enumerator driver with upper 
;    lower filter.
;
;    
;
;--*/
[Version]
Signature="$WINDOWS NT$"
Class=System
ClassGuid={4D36E97D-E325-11CE-BFC1-08002BE10318}
Provider=%ZXT%
DriverVer=09/21/2006,6.0.5736.1
CatalogFile=filedisk.cat

[DestinationDirs]
DefaultDestDir = 12

[SourceDisksNames]
1 = %DiskId1%,,,""

[SourceDisksFiles]
filedisk.sys  = 1,,
BFdoLwr.sys  = 1,,
BFdoUpr.sys  = 1,,

;*****************************************
; FileDisk  Install Section
;*****************************************

[Manufacturer]
%StdMfg%=Standard

[Standard]
%FileDisk.DeviceDesc%=FileDisk_Device, root\filedisk

[FileDisk_Device.NT]
CopyFiles=Drivers_Dir

[FileDisk_Device.NT.HW]
AddReg=FileDisk_Device.NT.HW.AddReg

[Drivers_Dir]
filedisk.sys
BFdoLwr.sys
BFdoUpr.sys

[FileDisk_Device.NT.HW.AddReg]
HKR,,DeviceCharacteristics,0x10001,0x0100         ; Use same security checks on relative opens
HKR,,Security,,"D:P(A;;GA;;;BA)(A;;GA;;;SY)"      ; Allow generic-all access to Built-in administrators and Local system 
HKR,,"UpperFilters",0x00010000,"BFdoUpr"
HKR,,"LowerFilters",0x00010000,"BFdoLwr"


;-------------- Service installation
; Function and filter driver for the bus
[FileDisk_Device.NT.Services]
AddService = filedisk, %SPSVCINST_ASSOCSERVICE%, filedisk_Service_Inst
AddService = BFdoUpr,, busupper_Service_Inst
AddService = BFdoLwr,, buslower_Service_Inst

; -------------- busenum Toaster Bus Driver install sections
[filedisk_Service_Inst]
DisplayName    = %filedisk.SVCDESC%
ServiceType    = 1               ; SERVICE_KERNEL_DRIVER
StartType      = 3               ; SERVICE_DEMAND_START 
ErrorControl   = 1               ; SERVICE_ERROR_NORMAL

ServiceBinary  = %12%\filedisk.sys
LoadOrderGroup = Extended Base

; -------------- busupper Driver install section
[busupper_Service_Inst]
DisplayName    = %busupper.SVCDESC%
ServiceType    = 1               ; SERVICE_KERNEL_DRIVER
StartType      = 3               ; SERVICE_DEMAND_START 
ErrorControl   = 1               ; SERVICE_ERROR_NORMAL
ServiceBinary  = %12%\BFdoUpr.sys
LoadOrderGroup = PNP Filter

; -------------- buslower Driver install section
[buslower_Service_Inst]
DisplayName    = %buslower.SVCDESC%
ServiceType    = 1               ; SERVICE_KERNEL_DRIVER
StartType      = 3               ; SERVICE_DEMAND_START 
ErrorControl   = 1               ; SERVICE_ERROR_NORMAL
ServiceBinary  = %12%\BFdoLwr.sys
LoadOrderGroup = PNP Filter

[Strings]
SPSVCINST_ASSOCSERVICE= 0x00000002
ZXT = "China ZXT"
StdMfg = "(Standard system devices)"
DiskId1 = "FileDisk Installation Disk #1"
FileDisk.DeviceDesc = "FileDisk Driver for disk driver"
filedisk.SVCDESC = "FileDisk Driver"
busupper.SVCDESC = "FileDisk FDO Upper Filter"
buslower.SVCDESC = "FileDisk FDO Lower Filter"

请版主老大不吝赐教,谢谢啊。
whiteclouds 2015-01-12
  • 打赏
  • 举报
回复
我实在是服了TrueCrypt的代码了,查了一天也没搞明白它是怎么让驱动工作的。我先前找到的inf文件生成函数根本也没被执行过,好像它是直接操作注册表来注册驱动的,而我在注册表里搜TrueCrypt这个词,也没找到有价值的信息。 还请版主指教我一下,Device ID是怎么得来的?我试着在inf文件里把它写成是我的驱动文件名,但还是不成。这个东东咋这么奇怪捏?它究竟是何方神圣啊?
曹大夯 2015-01-12
  • 打赏
  • 举报
回复
TrueCrypt用的INF文件你能设法找到或者提取出来么? INF会支持的设备的Device ID。你提供的INF里面缺少对应的Device ID申明。
whiteclouds 2015-01-11
  • 打赏
  • 举报
回复
引用 5 楼 Huntercao 的回复:
不了解TrueCrypt。 除非你要做类似的产品。一般情况下参考Microsoft WDK/DDK的例子来开发驱动程序比较好。
你好,我现在正在开发的产品就是类似TrueCrypt的,所以我才在它基础上进行修改。我的问题只是,inf文件的哪些信息跟驱动程序的哪些信息要对应起来,才能让驱动被正确安装?谢谢!
曹大夯 2015-01-09
  • 打赏
  • 举报
回复
AddDevice 应该是在加载驱动的过程中被调用的。 你的加载程序在加载驱动的过程中,FileDiskAddDevice有被调用么?
曹大夯 2015-01-09
  • 打赏
  • 举报
回复
不了解TrueCrypt。 除非你要做类似的产品。一般情况下参考Microsoft WDK/DDK的例子来开发驱动程序比较好。
whiteclouds 2015-01-09
  • 打赏
  • 举报
回复
引用 3 楼 Huntercao 的回复:
[quote=引用 楼主 whiteclouds 的回复:] 我写了一个加载程序,通过打印调试信息,在WinDBG里看到驱动已经被加载了
你你说的加载程序是什么功能?你怎么知道驱动已经被加载了。 INF文件里需要有对应设备的ID提供设备信息,系统才会进行安装。 你是参考哪个例子写的驱动程序?一般的例子都会提供例子INF来安装。最好参考例子来写INF。[/quote] 我在DriverEntry函数里输出调试信息,能正确看到,而且我发出的自定义IO控制字也都正确执行了。 我参照的是TrueCrypt写的驱动,这个项目的inf是安装过程中生成一个临时的文件,大概安装结束以后就删除了吧。反正我全盘搜索也找不到它生成的inf文件,只是在代码里能看到这个文件的内容。
曹大夯 2015-01-09
  • 打赏
  • 举报
回复
引用 楼主 whiteclouds 的回复:
我写了一个加载程序,通过打印调试信息,在WinDBG里看到驱动已经被加载了
你你说的加载程序是什么功能?你怎么知道驱动已经被加载了。 INF文件里需要有对应设备的ID提供设备信息,系统才会进行安装。 你是参考哪个例子写的驱动程序?一般的例子都会提供例子INF来安装。最好参考例子来写INF。
whiteclouds 2015-01-09
  • 打赏
  • 举报
回复
引用 1 楼 Huntercao 的回复:
AddDevice 应该是在加载驱动的过程中被调用的。 你的加载程序在加载驱动的过程中,FileDiskAddDevice有被调用么?
没有。我想这个函数应该是系统调用的,不该手动调用。 PS:查了MSDN,好像我必须提供一个inf文件,安装这个inf文件之后FileDiskAddDevice就会被调用,我写了一个inf文件,安装之后跟系统内其他设备相比,在注册表里缺少一个LEGACY_FILEDISK项,这个是不是就是问题的根本原因?如果是,该如何解决? 我的inf文件内容:
;;;
;;; FileDisk
;;;
;;;

[Version]
Signature   = "$Windows NT$"
Class       = "DiskDrive"             ;This is determined by the work this filter driver does
ClassGuid   = {4d36e967-e325-11ce-bfc1-08002be10318}    ;This value is determined by the Class
Provider    = %zxt%
DriverVer   = 01/09/2015,1.0.0.0
;;CatalogFile = FileDisk.cat


[DestinationDirs]
DefaultDestDir          = 12
FileDisk.DriverFiles  = 12            ;%windir%\system32\drivers

;;
;; Default install sections
;;

[DefaultInstall]
OptionDesc  = %ServiceDescription%
CopyFiles   = FileDisk.DriverFiles

[DefaultInstall.Services]
AddService  = %ServiceName%,,FileDisk.Service

;;
;; Default uninstall sections
;;

[DefaultUninstall]
DelFiles   = FileDisk.DriverFiles

[DefaultUninstall.Services]
DelService = %ServiceName%,0x200      ;Ensure service is stopped before deleting

;
; Services Section
;

[FileDisk.Service]
DisplayName      = %ServiceName%
Description      = %ServiceDescription%
ServiceBinary    = %12%\%DriverName%.sys    ;%windir%\system32\drivers\
;Dependencies     = "FltMgr"
;ServiceType      = 2                        ;SERVICE_FILE_SYSTEM_DRIVER
ServiceType      = 1                        ;SERVICE_KERNEL_DRIVER
StartType        = 3                        ;SERVICE_DEMAND_START
ErrorControl     = 1                        ;SERVICE_ERROR_NORMAL
;LoadOrderGroup   = "FSFilter Activity Monitor"
;AddReg           = FileDisk.AddRegistry

;
; Registry Modifications
;

[FileDisk.AddRegistry]
HKR,"Instances","DefaultInstance",0x00000000,%DefaultInstance%
HKR,"Instances\"%Instance1.Name%,"Altitude",0x00000000,%Instance1.Altitude%
HKR,"Instances\"%Instance1.Name%,"Flags",0x00010001,%Instance1.Flags%

;
; Copy Files
;

[FileDisk.DriverFiles]
%DriverName%.sys

[SourceDisksFiles]
FileDisk.sys = 1,,

[SourceDisksNames]
1 = %DiskId1%,,,

;;
;; String Section
;;

[Strings]
zxt                     = "China ZhongXingTong Corporation"
ServiceDescription      = "FileDisk mini-filter driver"
ServiceName             = "FileDisk"
DriverName              = "FileDisk"
DiskId1                 = "FileDisk Device Installation Disk"

;Instances specific information.
DefaultInstance         = "FileDisk Instance"
Instance1.Name          = "FileDisk Instance"
Instance1.Altitude      = "370020"
Instance1.Flags         = 0x1          ; Suppress automatic attachments

21,616

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 驱动开发/核心开发
社区管理员
  • 驱动开发/核心开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧