带驱动器号的完整文件路径

时间:2013-03-17 09:58:51

标签: windows driver kernel-mode filter-driver

我是驱动程序开发的初学者。我正在开发一个过滤器驱动程序(内核模式)。 我想获得打开的每个文件的完整路径。 我有一个文件对象和一个IRP 。 我使用& pFileObject-> fileName 来显示路径。它显示完整的路径但不显示驱动器号。 请提供内核级别例程,告知驱动器号。 下面是代码

#include "StdAfx.h"
#include "drv_common.h"
#include "ntddk.h"
#include "FsFilter.h"


///////////////////////////////////////////////////////////////////////////////////////////    ////////
// PassThrough IRP Handler

NTSTATUS FsFilterDispatchPassThrough( __in PDEVICE_OBJECT DeviceObject, __in PIRP Irp )
{
    PFSFILTER_DEVICE_EXTENSION pDevExt = (PFSFILTER_DEVICE_EXTENSION)DeviceObject-    >DeviceExtension;

    IoSkipCurrentIrpStackLocation(Irp);
    return IoCallDriver(pDevExt->AttachedToDeviceObject, Irp);
}

///////////////////////////////////////////////////////////////////////////////////////////    ////////
// IRP_MJ_CREATE IRP Handler

NTSTATUS FsFilterDispatchCreate(
    __in PDEVICE_OBJECT DeviceObject,
    __in PIRP           Irp
    )
{
    PFILE_OBJECT pFileObject = IoGetCurrentIrpStackLocation(Irp)->FileObject;

    DbgPrint("%wZ\n", &pFileObject->FileName);

    return FsFilterDispatchPassThrough(DeviceObject, Irp);
}

1 个答案:

答案 0 :(得分:1)

正如@sergmat建议您可以使用IoVolumeDeviceToDosName例程来获取卷名。但请确保您只在PASSIVE_LEVEL拨打该路线,这可能就是您所遇到的。

此外,建议不要在调度例程中使用pFileObject->FileName。内存可能来自分页池,无法在DISPATCH_LEVEL或更高版本中访问。