-1

私はドライバー開発の初心者です。フィルター ドライバー (カーネル モード) を開発しています。開いているすべてのファイルのフルパスを取得したい。ファイル オブジェクトと 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);
}
4

1 に答える 1

1

@sergmat が示唆IoVolumeDeviceToDosNameしたように、ルーチンを使用してボリューム名を取得できます。ただし、そのルートを でのみ呼び出すようにしてくださいPASSIVE_LEVEL。これは、発生している可能性があります。

また、pFileObject->FileNameディスパッチ ルーチンでの使用は推奨されません。DISPATCH_LEVELメモリは、以上でアクセスできないページ プールから取得される可能性があります。

于 2013-03-20T04:38:00.043 に答える