2013-03-17 5 views
-1

저는 드라이버 개발의 초보자입니다. 나는 필터 드라이버 (커널 모드)를 개발 중이다. 열려있는 모든 파일의 전체 경로를 가져오고 싶습니다. 파일 개체와 IRP이 있습니다. & pFileObject-> fileName을 사용하여 경로를 표시하고 있습니다. 전체 경로를 표시하지만 드라이브 문자를 표시하지 않습니다. 드라이브 문자을 알려주는 커널 레벨 루틴을 제공하십시오. @sergmat가 볼륨 이름을 가져 IoVolumeDeviceToDosName 루틴을 사용할 수 있습니다 제안으로 아래 코드드라이브 문자가 포함 된 전체 파일 경로

#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); 
} 
+0

스택 오버플로는 "plz give me teh codez"웹 사이트가 아닙니다. 당신은 당신이 시도한 것을 설명하고, 실제 코드를 보여주고, 어디서 잘못되었는지 설명 할 필요가 있습니다. 문제를 직접 해결하기 위해 노력했다는 것을 증명하면 사람들은 훨씬 더 기꺼이 도울 것입니다. –

+0

코디 지금 내 질문을 편집했습니다. –

+0

코디, 루틴 지정만으로 충분할 것입니다 ... –

답변

1

입니다. 그러나 해당 경로를 PASSIVE_LEVEL (으)로만 부르면됩니다.

또한 디스패치 루틴에서는 pFileObject->FileName을 사용하지 않는 것이 좋습니다. 메모리가 DISPATCH_LEVEL 또는 그 이상에서 액세스 할 수없는 페이지 된 풀에서 온 것일 수 있습니다.