阅读:1289回复:1
读DDK中的过滤驱动产生的疑惑
问题可见链接: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 |
|
沙发#
发布于:2009-05-25 18:07
想明白啦!这论坛没结贴一说吧?
|
|