阅读:2083回复:5
关于逻辑盘符的取得问题
看tooflat版主的程序,他的逻辑盘符的取得是在这个方法里,
NTSTATUS SfFsControlMountVolume( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp ) { ... if (NT_SUCCESS(RtlVolumeDeviceToDosName(StorageStackDeviceObject, &DosName))) { NewDevExt->DriveLetter = DosName.Buffer[0]; ExFreePool(DosName.Buffer); } ... } SfFsControlMountVolume方法 又是在SfFsControl方法中被调用。 我的sfilter是使用OSR Driver Loader这个工具注册的,从Register Service到Start Service,到操作一些文件的读写,用Debug Viewer查看,发觉SfFsControl方法,一直没有调用,不知为何??? 导致我在Write方法中DevExt->DriveLetter 取盘符取到的都是空的,没值。 哪位高人能指点一下,这是为何? |
|
|
沙发#
发布于:2007-05-11 08:28
估计是你的卷加载在先,驱动加载在后!
这样你是收不到IRP_MN_MOUNT_VOLUME通知的。 |
|
|
板凳#
发布于:2007-05-11 09:00
我看ifsddk下面的sfilter例子源程序,也没进到这个方法。我的DriverEntry方法如下,请版主帮我看一下,这两个加载顺序是不是反了,那些语句是加载卷的,那些语句是加载驱动的,在下愚笨,请版主明示,谢谢
NTSTATUS DriverEntry ( IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING RegistryPath ) /*++ Routine Description: This is the initialization routine for the SFILTER file system filter driver. This routine creates the device object that represents this driver in the system and registers it for watching all file systems that register or unregister themselves as active file systems. Arguments: DriverObject - Pointer to driver object created by the system. Return Value: The function value is the final status from the initialization operation. --*/ { PFAST_IO_DISPATCH fastIoDispatch; UNICODE_STRING nameString; NTSTATUS status; ULONG i; #if WINVER >= 0x0501 // // Try to load the dynamic functions that may be available for our use. // SfLoadDynamicFunctions(); // // Now get the current OS version that we will use to determine what logic // paths to take when this driver is built to run on various OS version. // SfGetCurrentVersion(); #endif // // Get Registry values // SfReadDriverParameters( RegistryPath ); // // Save our Driver Object, set our UNLOAD routine // gSFilterDriverObject = DriverObject; #if DBG && WINVER >= 0x0501 // // MULTIVERSION NOTE: // // We can only support unload for testing environments if we can enumerate // the outstanding device objects that our driver has. // // // Unload is useful for development purposes. It is not recommended for // production versions // if (NULL != gSfDynamicFunctions.EnumerateDeviceObjectList) { gSFilterDriverObject->DriverUnload = DriverUnload; } #endif // // Setup other global variables // ExInitializeFastMutex( &gSfilterAttachLock ); ExInitializeNPagedLookasideList( &gReadWriteCompletionCtxLookAsideList, NULL, NULL, 0, sizeof(READ_WRITE_COMPLETION_CONTEXT), SFLT_POOL_TAG, 0 ); // // Create the Control Device Object (CDO). This object represents this // driver. Note that it does not have a device extension. // RtlInitUnicodeString( &nameString, L"\\FileSystem\\Filters\\SFilter" ); status = IoCreateDevice( DriverObject, 0, //has no device extension &nameString, FILE_DEVICE_DISK_FILE_SYSTEM, FILE_DEVICE_SECURE_OPEN, FALSE, &gSFilterControlDeviceObject ); if (status == STATUS_OBJECT_PATH_NOT_FOUND) { // // This must be a version of the OS that doesn't have the Filters // path in its namespace. This was added in Windows XP. // // We will try just putting our control device object in the \FileSystem // portion of the object name space. // RtlInitUnicodeString( &nameString, L"\\FileSystem\\SFilterCDO" ); status = IoCreateDevice( DriverObject, 0, //has no device extension &nameString, FILE_DEVICE_DISK_FILE_SYSTEM, FILE_DEVICE_SECURE_OPEN, FALSE, &gSFilterControlDeviceObject ); if (!NT_SUCCESS( status )) { KdPrint(( "SFilter!DriverEntry: Error creating control device object \"%wZ\", status=%08x\n", &nameString, status )); return status; } } else if (!NT_SUCCESS( status )) { KdPrint(( "SFilter!DriverEntry: Error creating control device object \"%wZ\", status=%08x\n", &nameString, status )); return status; } // // Initialize the driver object with this device driver's entry points. // for (i = 0; i <= IRP_MJ_MAXIMUM_FUNCTION; i++) { DriverObject->MajorFunction = SfPassThrough; } // // We will use SfCreate for all the create operations // DriverObject->MajorFunction[IRP_MJ_CREATE] = SfCreate; DriverObject->MajorFunction[IRP_MJ_CREATE_NAMED_PIPE] = SfCreate; DriverObject->MajorFunction[IRP_MJ_CREATE_MAILSLOT] = SfCreate; DriverObject->MajorFunction[IRP_MJ_FILE_SYSTEM_CONTROL] = SfFsControl; DriverObject->MajorFunction[IRP_MJ_CLEANUP] = SfCleanupClose; DriverObject->MajorFunction[IRP_MJ_CLOSE] = SfCleanupClose; DriverObject->MajorFunction[IRP_MJ_READ] = EdRead; DriverObject->MajorFunction[IRP_MJ_WRITE] = EdWrite; //DriverObject->MajorFunction[IRP_MJ_WRITE] = EdWrite; // // Allocate fast I/O data structure and fill it in. // // NOTE: The following FastIo Routines are not supported: // AcquireFileForNtCreateSection // ReleaseFileForNtCreateSection // AcquireForModWrite // ReleaseForModWrite // AcquireForCcFlush // ReleaseForCcFlush // // For historical reasons these FastIO's have never been sent to filters // by the NT I/O system. Instead, they are sent directly to the base // file system. On Windows XP and later OS releases, you can use the new // system routine "FsRtlRegisterFileSystemFilterCallbacks" if you need to // intercept these callbacks (see below). // fastIoDispatch = ExAllocatePoolWithTag( NonPagedPool, sizeof( FAST_IO_DISPATCH ), SFLT_POOL_TAG ); if (!fastIoDispatch) { IoDeleteDevice( gSFilterControlDeviceObject ); return STATUS_INSUFFICIENT_RESOURCES; } RtlZeroMemory( fastIoDispatch, sizeof( FAST_IO_DISPATCH ) ); fastIoDispatch->SizeOfFastIoDispatch = sizeof( FAST_IO_DISPATCH ); fastIoDispatch->FastIoCheckIfPossible = SfFastIoCheckIfPossible; fastIoDispatch->FastIoRead = SfFastIoRead; fastIoDispatch->FastIoWrite = SfFastIoWrite; fastIoDispatch->FastIoQueryBasicInfo = SfFastIoQueryBasicInfo; fastIoDispatch->FastIoQueryStandardInfo = SfFastIoQueryStandardInfo; fastIoDispatch->FastIoLock = SfFastIoLock; fastIoDispatch->FastIoUnlockSingle = SfFastIoUnlockSingle; fastIoDispatch->FastIoUnlockAll = SfFastIoUnlockAll; fastIoDispatch->FastIoUnlockAllByKey = SfFastIoUnlockAllByKey; fastIoDispatch->FastIoDeviceControl = SfFastIoDeviceControl; fastIoDispatch->FastIoDetachDevice = SfFastIoDetachDevice; fastIoDispatch->FastIoQueryNetworkOpenInfo = SfFastIoQueryNetworkOpenInfo; fastIoDispatch->MdlRead = SfFastIoMdlRead; fastIoDispatch->MdlReadComplete = SfFastIoMdlReadComplete; fastIoDispatch->PrepareMdlWrite = SfFastIoPrepareMdlWrite; fastIoDispatch->MdlWriteComplete = SfFastIoMdlWriteComplete; fastIoDispatch->FastIoReadCompressed = SfFastIoReadCompressed; fastIoDispatch->FastIoWriteCompressed = SfFastIoWriteCompressed; fastIoDispatch->MdlReadCompleteCompressed = SfFastIoMdlReadCompleteCompressed; fastIoDispatch->MdlWriteCompleteCompressed = SfFastIoMdlWriteCompleteCompressed; fastIoDispatch->FastIoQueryOpen = SfFastIoQueryOpen; DriverObject->FastIoDispatch = fastIoDispatch; // // VERSION NOTE: // // There are 6 FastIO routines for which file system filters are bypassed as // the requests are passed directly to the base file system. These 6 routines // are AcquireFileForNtCreateSection, ReleaseFileForNtCreateSection, // AcquireForModWrite, ReleaseForModWrite, AcquireForCcFlush, and // ReleaseForCcFlush. // // In Windows XP and later, the FsFilter callbacks were introduced to allow // filters to safely hook these operations. See the IFS Kit documentation for // more details on how these new interfaces work. // // MULTIVERSION NOTE: // // If built for Windows XP or later, this driver is built to run on // multiple versions. When this is the case, we will test // for the presence of FsFilter callbacks registration API. If we have it, // then we will register for those callbacks, otherwise, we will not. // #if WINVER >= 0x0501 { FS_FILTER_CALLBACKS fsFilterCallbacks; if (NULL != gSfDynamicFunctions.RegisterFileSystemFilterCallbacks) { // // Setup the callbacks for the operations we receive through // the FsFilter interface. // // NOTE: You only need to register for those routines you really need // to handle. SFilter is registering for all routines simply to // give an example of how it is done. // fsFilterCallbacks.SizeOfFsFilterCallbacks = sizeof( FS_FILTER_CALLBACKS ); fsFilterCallbacks.PreAcquireForSectionSynchronization = SfPreFsFilterPassThrough; fsFilterCallbacks.PostAcquireForSectionSynchronization = SfPostFsFilterPassThrough; fsFilterCallbacks.PreReleaseForSectionSynchronization = SfPreFsFilterPassThrough; fsFilterCallbacks.PostReleaseForSectionSynchronization = SfPostFsFilterPassThrough; fsFilterCallbacks.PreAcquireForCcFlush = SfPreFsFilterPassThrough; fsFilterCallbacks.PostAcquireForCcFlush = SfPostFsFilterPassThrough; fsFilterCallbacks.PreReleaseForCcFlush = SfPreFsFilterPassThrough; fsFilterCallbacks.PostReleaseForCcFlush = SfPostFsFilterPassThrough; fsFilterCallbacks.PreAcquireForModifiedPageWriter = SfPreFsFilterPassThrough; fsFilterCallbacks.PostAcquireForModifiedPageWriter = SfPostFsFilterPassThrough; fsFilterCallbacks.PreReleaseForModifiedPageWriter = SfPreFsFilterPassThrough; fsFilterCallbacks.PostReleaseForModifiedPageWriter = SfPostFsFilterPassThrough; status = (gSfDynamicFunctions.RegisterFileSystemFilterCallbacks)( DriverObject, &fsFilterCallbacks ); if (!NT_SUCCESS( status )) { DriverObject->FastIoDispatch = NULL; ExFreePool( fastIoDispatch ); IoDeleteDevice( gSFilterControlDeviceObject ); return status; } } } #endif // // The registered callback routine "SfFsNotification" will be called // whenever a new file systems is loaded or when any file system is // unloaded. // // VERSION NOTE: // // On Windows XP and later this will also enumerate all existing file // systems (except the RAW file systems). On Windows 2000 this does not // enumerate the file systems that were loaded before this filter was // loaded. // status = IoRegisterFsRegistrationChange( DriverObject, SfFsNotification ); if (!NT_SUCCESS( status )) { KdPrint(( "SFilter!DriverEntry: Error registering FS change notification, status=%08x\n", status )); DriverObject->FastIoDispatch = NULL; ExFreePool( fastIoDispatch ); IoDeleteDevice( gSFilterControlDeviceObject ); return status; } // // Attempt to attach to the appropriate RAW file system device objects // since they are not enumerated by IoRegisterFsRegistrationChange. // { PDEVICE_OBJECT rawDeviceObject; PFILE_OBJECT fileObject; // // Attach to RawDisk device // RtlInitUnicodeString( &nameString, L"\\Device\\RawDisk" ); status = IoGetDeviceObjectPointer( &nameString, FILE_READ_ATTRIBUTES, &fileObject, &rawDeviceObject ); if (NT_SUCCESS( status )) { SfFsNotification( rawDeviceObject, TRUE ); ObDereferenceObject( fileObject ); } // // Attach to the RawCdRom device // RtlInitUnicodeString( &nameString, L"\\Device\\RawCdRom" ); status = IoGetDeviceObjectPointer( &nameString, FILE_READ_ATTRIBUTES, &fileObject, &rawDeviceObject ); if (NT_SUCCESS( status )) { SfFsNotification( rawDeviceObject, TRUE ); ObDereferenceObject( fileObject ); } } // // Clear the initializing flag on the control device object since we // have now successfully initialized everything. // ClearFlag( gSFilterControlDeviceObject->Flags, DO_DEVICE_INITIALIZING ); KdPrint(("Load encryption_dirctory successfully!")); ExInitializeFastMutex(&edReadMutex); return STATUS_SUCCESS; } |
|
|
地板#
发布于:2007-05-11 09:09
这是你的object,不是volume object。如果volume object在你后加载,他会调用你的object的mount接口;如果volume object在你的object前加载,需要自己处理mount的volume object
|
|
|
地下室#
发布于:2007-05-11 09:15
cyliu斑竹能不能直接告诉我,mount volume object用什么语句,加载驱动用什么语句,晕了,不好意思
|
|
|
5楼#
发布于:2007-05-11 10:41
如何先加载驱动,再加载卷??
版主能否告诉我啊? |
|
|