dahuatttt
驱动牛犊
驱动牛犊
  • 注册日期2009-05-25
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分6分
  • 威望41点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1289回复:1

读DDK中的过滤驱动产生的疑惑

楼主#
更多 发布于:2009-05-25 15:42
问题可见链接:http://topic.csdn.net/u/20090524/13/875f1c72-3d15-4b3e-95f8-d6d221dfb888.html
作为驱网新会员,下面将重述自己遇到的问题来表示诚意。
问题来源代码是winddk下2600\src\storage\filters\diskperf\diskperf.c这个文件。问题部分代码如下:
NTSTATUS 
DriverEntry( 
IN PDRIVER_OBJECT DriverObject, 
IN PUNICODE_STRING RegistryPath 
){ 
ULONG ulIndex; 
PDRIVER_DISPATCH * dispatch; 

DiskPerfRegistryPath.MaximumLength = RegistryPath->Length 
+ sizeof(UNICODE_NULL); 
DiskPerfRegistryPath.Buffer = ExAllocatePool( 
PagedPool, 
DiskPerfRegistryPath.MaximumLength); 
if (DiskPerfRegistryPath.Buffer != NULL) 
{ 
RtlCopyUnicodeString(&DiskPerfRegistryPath, RegistryPath); 
} else { 
DiskPerfRegistryPath.Length = 0; 
DiskPerfRegistryPath.MaximumLength = 0; 
} 

for (ulIndex = 0, dispatch = DriverObject->MajorFunction; 
ulIndex <= IRP_MJ_MAXIMUM_FUNCTION; 
ulIndex++, dispatch++) { 

*dispatch = DiskPerfSendToNextDriver; 
} 
DriverObject->MajorFunction[IRP_MJ_CREATE] = DiskPerfCreate; 
DriverObject->MajorFunction[IRP_MJ_READ] = DiskPerfReadWrite; 
DriverObject->MajorFunction[IRP_MJ_WRITE] = DiskPerfReadWrite; 
DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = DiskPerfDeviceControl; 
DriverObject->MajorFunction[IRP_MJ_SYSTEM_CONTROL] = DiskPerfWmi; 

DriverObject->MajorFunction[IRP_MJ_SHUTDOWN] = DiskPerfShutdownFlush; 
DriverObject->MajorFunction[IRP_MJ_FLUSH_BUFFERS] = DiskPerfShutdownFlush; 
DriverObject->MajorFunction[IRP_MJ_PNP] = DiskPerfDispatchPnp; 
DriverObject->MajorFunction[IRP_MJ_POWER] = DiskPerfDispatchPower; 

DriverObject->DriverExtension->AddDevice = DiskPerfAddDevice; 
DriverObject->DriverUnload = DiskPerfUnload; 

return(STATUS_SUCCESS); 

} // end DriverEntry() 

NTSTATUS 
DiskPerfAddDevice( 
IN PDRIVER_OBJECT DriverObject, 
IN PDEVICE_OBJECT PhysicalDeviceObject 
){ 
NTSTATUS status; 
IO_STATUS_BLOCK ioStatus; 
PDEVICE_OBJECT filterDeviceObject; 
PDEVICE_EXTENSION deviceExtension; 
CCHAR ntNameBuffer[DISKPERF_MAXSTR]; 
STRING ntNameString; 
UNICODE_STRING ntUnicodeString; 
PIRP irp; 
STORAGE_DEVICE_NUMBER number; 
ULONG registrationFlag = 0; 
PWMILIB_CONTEXT wmilibContext; 
PCHAR buffer; 
ULONG buffersize; 

PAGED_CODE(); 
DebugPrint((2, "DiskPerfAddDevice: Driver %X Device %X\n", 
DriverObject, PhysicalDeviceObject)); 

status = IoCreateDevice(DriverObject, 
DEVICE_EXTENSION_SIZE, 
NULL, 
FILE_DEVICE_DISK, 
FILE_DEVICE_SECURE_OPEN, 
FALSE, 
&filterDeviceObject); 

if (!NT_SUCCESS(status)) { 
DebugPrint((1, "DiskPerfAddDevice: Cannot create filterDeviceObject\n")); 
return status; 
} 

filterDeviceObject->Flags |= DO_DIRECT_IO; 

deviceExtension = (PDEVICE_EXTENSION) filterDeviceObject->DeviceExtension; 

RtlZeroMemory(deviceExtension, DEVICE_EXTENSION_SIZE); 
DiskPerfGetClock(deviceExtension->LastIdleClock, NULL); 
DebugPrint((10, "DiskPerfAddDevice: LIC=%I64u\n", 
deviceExtension->LastIdleClock)); 

deviceExtension->Processors = KeNumberProcessors; 
buffersize= PROCESSOR_COUNTERS_SIZE * deviceExtension->Processors; 
buffer = (PCHAR) ExAllocatePool(NonPagedPool, buffersize); 
if (buffer != NULL) { 
RtlZeroMemory(buffer, buffersize); 
deviceExtension->DiskCounters = (PDISK_PERFORMANCE) buffer; 
} 
else { 
DiskPerfLogError( 
filterDeviceObject, 
513, 
STATUS_SUCCESS, 
IO_ERR_INSUFFICIENT_RESOURCES); 
} 

deviceExtension->PhysicalDeviceObject = PhysicalDeviceObject; 

deviceExtension->TargetDeviceObject = 
IoAttachDeviceToDeviceStack(filterDeviceObject, PhysicalDeviceObject); 

if (deviceExtension->TargetDeviceObject == NULL) { 
IoDeleteDevice(filterDeviceObject); 
DebugPrint((1, "DiskPerfAddDevice: Unable to attach %X to target %X\n", 
filterDeviceObject, PhysicalDeviceObject)); 
return STATUS_NO_SUCH_DEVICE; 
} 
deviceExtension->DeviceObject = filterDeviceObject; 

deviceExtension->PhysicalDeviceName.Buffer 
= deviceExtension->PhysicalDeviceNameBuffer; 

KeInitializeEvent(&deviceExtension->PagingPathCountEvent, 
NotificationEvent, TRUE); 

wmilibContext = &deviceExtension->WmilibContext; 
RtlZeroMemory(wmilibContext, sizeof(WMILIB_CONTEXT)); 
wmilibContext->GuidCount = DiskperfGuidCount; 
wmilibContext->GuidList = DiskperfGuidList; 
wmilibContext->QueryWmiRegInfo = DiskperfQueryWmiRegInfo; 
wmilibContext->QueryWmiDataBlock = DiskperfQueryWmiDataBlock; 
wmilibContext->WmiFunctionControl = DiskperfWmiFunctionControl; 

filterDeviceObject->Flags |= DO_POWER_PAGABLE; 

filterDeviceObject->Flags &= ~DO_DEVICE_INITIALIZING; 

return STATUS_SUCCESS; 

} // end DiskPerfAddDevice()

此代码应该是存储设备的过滤驱动(个人认为也是个文件系统的过滤驱动),代码中可以看到的是,DriverEntry内没有创建任何Device Object(包括CDO,PDO,FDO,普通DO),只是做了基本的初始化,传递了AddDevice例程入口。
他的设备对象的创建和Attach都是在AddDevice中完成的,Attach的目标设备是AddDevice的第二个参数。我实在不能理解,系统是怎么知道这个驱动是个什么类型的驱动,为啥就能在正确的时候调用AddDevice并把正确的PDO传给该例程。如果我插入一个USB鼠标,难道也会发生该驱动的AddDevice的调用?(该驱动文档里说不需要通过inf文件来加载)

具体文件附上 diskperf.zip
dahuatttt
驱动牛犊
驱动牛犊
  • 注册日期2009-05-25
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分6分
  • 威望41点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2009-05-25 18:07
想明白啦!这论坛没结贴一说吧?
游客

返回顶部