FILE_OBJECT结构体

本文介绍如何通过FILE_OBJECT结构体获取文件的完整路径,包括盘符、相对路径及文件名,并提供具体步骤与代码实现。

FILE_OBJECT的定义:

 typedef struct _FILE_OBJECT {
    CSHORT Type;
    CSHORT Size;
    PDEVICE_OBJECT DeviceObject;//设备对象
    PVPB Vpb;
    PVOID FsContext;
    PVOID FsContext2;
    PSECTION_OBJECT_POINTERS SectionObjectPointer;
    PVOID PrivateCacheMap;
    NTSTATUS FinalStatus;
    struct _FILE_OBJECT *RelatedFileObject;
    BOOLEAN LockOperation;
    BOOLEAN DeletePending;
    BOOLEAN ReadAccess;
    BOOLEAN WriteAccess;
    BOOLEAN DeleteAccess;
    BOOLEAN SharedRead;
    BOOLEAN SharedWrite;
    BOOLEAN SharedDelete;
    ULONG Flags;
    UNICODE_STRING FileName;
    LARGE_INTEGER CurrentByteOffset;
    ULONG Waiters;
    ULONG Busy;
    PVOID LastLock;
    KEVENT Lock;
    KEVENT Event;
    PIO_COMPLETION_CONTEXT CompletionContext;
} FILE_OBJECT;
 从FILE_OBJECT结构体中的Filename属性可以得到该文件的文件名,例如:abc.exe

 另外从FILE_OBJECT结构体中的步得到该文件的相对路径,例如:  /AAAA/BBBB/CCCC


这样综合起来,我只能得到该文件没有盘符的路径:/AAAA/BBBB/CCCC/abc.exe

得到完整路径的方法

//相关变量 HANDLE filehandle=0; PFILE_OBJECT file=0; PFILE_OBJECT relatedfile=0;

POBJECT_HANDLE_INFORMATION info=0;  char filefullname_c[1024]; ANSI_STRING filefullname_a; 

UNICODE_STRING filefullname_u; int relatedfilelength; POBJECT_NAME_INFORMATION     

 fileNameInformation;

ULONG retSize; //先得到盘符

RtlVolumeDeviceToDosName(file->DeviceObject,&filefullname_u);

RtlUnicodeStringToAnsiString(&filefullname_a,&filefullname_u,1);

strncpy(filefullname_c,filefullname_a.Buffer,filefullname_a.Length); 

filefullname_c[filefullname_a.Length]='/0';

relatedfilelength=filefullname_a.Length; //相对路径

relatedfile=file->RelatedFileObject;

RtlUnicodeStringToAnsiString(&filefullname_a,&relatedfile->FileName,1);

strncat(filefullname_c,filefullname_a.Buffer,filefullname_a.Length); 

filefullname_c[relatedfilelength+filefullname_a.Length]='/0';

relatedfilelength+=filefullname_a.Length; //文件名

RtlUnicodeStringToAnsiString(&filefullname_a,&file->FileName,1);

strcat(filefullname_c,"//");

strncat(filefullname_c,filefullname_a.Buffer,filefullname_a.Length);

filefullname_c[relatedfilelength+filefullname_a.Length+1]='/0';

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值