从FILE_OBJECT里获取完整NT路径和DOS路径
来源:互联网 发布:电脑视频文件修复软件 编辑:程序博客网 时间:2024/05/20 09:06
原作者:Tesla.Angela
链接:http://www.m5home.com/bbs/thread-8896-1-1.html
众所周知在FILE_OBJECT.FileName的路径是不带盘符的,于是网上各种QUICK AND DIRTY的代码就干脆直接从FileName里取得“无头路径”。
这种恶心的做法自然是要不得的,现在分享一下从这个结构体里取完整路径的方法。区区40行代码(还包括空行和注释),即可支持XP到WIN10。
不知道啥时候这段代码会出现在某些“大牛”的工程里然后标为“原创”。哈哈。
最后补充一下:这个pFileObject 的获取
可以看我的另一篇文章
NT5/NT6上的获取进程全路径
http://blog.csdn.net/zhuhuibeishadiao/article/details/51136650
也可以参考以下链接 第八个男人 很难访问 赶紧备份下
链接:http://www.debugman.com/archiver/tid/4223 (我的第八个男人啊~~~)
EPROCESS获取FileObject
1,通过PsGetCurrentProcess获取EPROCESS,EPROCESS->SectionObject->Segment->ControlArea->FileObject,不过貌似wdk的EPROCESS被定义成了KPROCESS,这个EPROCESS的结构就不一样了;2,通过获取process的Handle,然后调用ObReferenceObjectByHandle, ObjectType 填写IoFileObjectType,然后获取其FileObject;
目前只想到上面两种方法,不知道还有没有其他更简单点的办法。
PS:用的框架是文件过滤驱动。
先谢谢了 写了验证一下,第二个方法好像行不通,不知道是不是process的handle不能用IoFileObjectType来获取FileObject。
第一个方法因为没有wdk定义的结构体,暂时不想使用哪个方法。 ZwQueryInformationProcess, ZwCreateFile , ObReferenceObjectByHandle 谢谢MJ。
网上找的一段代码,贴出来留给后面的同学看看。
// 注: 当函数返回TRUE时,参数pImageName所指向的 PANSI_STRING 对象需要用RtlFreeAnsiString()释放。
// 否则,标记为 "Strg" 的内存池会产生泄露。
typedef NTSTATUS (*QUERY_INFO_PROCESS) (
__in HANDLE ProcessHandle,
__in PROCESSINFOCLASS ProcessInformationClass,
__out_bcount(ProcessInformationLength) PVOID ProcessInformation,
__in ULONG ProcessInformationLength,
__out_opt PULONG ReturnLength
);
QUERY_INFO_PROCESS ZwQueryInformationProcess;
#define ProcessImageFileName 27
BOOLEAN GetProcessImageName(PANSI_STRING pImageName)
{
KIRQL CurIRQL ;
NTSTATUS status;
ULONG returnedLength;
ULONG bufferLength;
PVOID buffer;
PUNICODE_STRING imageName;
BOOLEAN bRet = FALSE ;
PAGED_CODE(); // this eliminates the possibility of the IDLE Thread/Process
CurIRQL = KeGetCurrentIrql() ;
DbgPrint ("Current IRQL is %d\\r\\n", CurIRQL) ;
if (PASSIVE_LEVEL != CurIRQL)
{
return FALSE ;
}
try
{
if ( ! MmIsAddressValid (pImageName))
{
return FALSE ;
}
pImageName->Length = 0 ;
pImageName->MaximumLength = 0 ;
pImageName->Buffer = NULL ;
}
except (EXCEPTION_EXECUTE_HANDLER)
{
return FALSE ;
}
if (NULL == ZwQueryInformationProcess) {
UNICODE_STRING routineName;
RtlInitUnicodeString(&routineName, L"ZwQueryInformationProcess");
ZwQueryInformationProcess =
(QUERY_INFO_PROCESS) MmGetSystemRoutineAddress(&routineName);
if (NULL == ZwQueryInformationProcess) {
DbgPrint("Cannot resolve ZwQueryInformationProcess\\n");
return FALSE ;
}
}
//
// Step one - get the size we need
//
status = ZwQueryInformationProcess( NtCurrentProcess(),
ProcessImageFileName,
NULL, // buffer
0, // buffer size
&returnedLength);
if (STATUS_INFO_LENGTH_MISMATCH != status) {
return FALSE;
}
//
// Is the passed-in buffer going to be big enough for us?
// This function returns a single contguous buffer model...
//
bufferLength = returnedLength - sizeof(UNICODE_STRING);
//
// If we get here, the buffer IS going to be big enough for us, so
// let's allocate some storage.
//
buffer = ExAllocatePoolWithTag(PagedPool, returnedLength, 'ipgD');
if (NULL == buffer) {
return FALSE ;
}
try
{
//
// Now lets go get the data
//
status = ZwQueryInformationProcess( NtCurrentProcess(),
ProcessImageFileName,
buffer,
returnedLength,
&returnedLength);
if (NT_SUCCESS(status)) {
//
// Ah, we got what we needed
//
imageName = (PUNICODE_STRING) buffer;
// RtlCopyUnicodeString(ProcessImageName, imageName);
//RtlZeroMemory (pBuffer, cbBuffer) ;
//if (((size_t)-1) != wcstombs (pBuffer, imageName->Buffer, cbBuffer))
//{
// bRet = TRUE ;
//}
//KdPrint (("Current ProcessImageFileName: \\"%s\\"\\r\\n", pBuffer)) ;
if (STATUS_SUCCESS != RtlUnicodeStringToAnsiString (pImageName, imageName, TRUE))
{
bRet = FALSE ;
KdPrint (("Current ProcessImageFileName: Unknow\\r\\n")) ;
}
else
{
bRet = TRUE ;
KdPrint (("Current ProcessImageFileName: \\"%s\\"\\r\\n", pImageName->Buffer)) ;
}
}
}
except (EXCEPTION_EXECUTE_HANDLER)
{
bRet = FALSE ;
}
//
// free our buffer
//
ExFreePool(buffer);
//
// And tell the caller what happened.
//
return bRet ;
}
0 0
- 从FILE_OBJECT里获取完整NT路径和DOS路径
- NT路径和DOS路径转换
- NT路径和DOS路径相互转换
- NT 路径转换成dos路径
- 从完整路径中获取文件名
- dos环境下获取完整路径中的文件名
- R3下 DOS路径转化为NT路径
- Delphi获取完整路径
- java获取完整路径
- Dos 怎么获取当前路径
- 获取NT中系统进程的路径
- [Win32] 获取进程完整路径
- 从注册表获取路径
- 获取drawable里的路径
- 如何从完整的文件路径中分离文件名和路径名?
- 如何从DOS进入指定路径
- 批处理dos下获取当前路径命令
- 批处理dos下获取当前路径命令
- 这几刚干完一个简单的项目,总结一下。本人是新手 第一次做项目,老手就不用看了
- 战略转移了,以后只在博客园上写博客了,欢迎来访。
- 学习笔记---赋值运算符与逗号运算符
- NS2 教學手冊 ( NS2 Learning Guide)
- 求二元查找树的镜像
- 从FILE_OBJECT里获取完整NT路径和DOS路径
- 超实用压力测试工具-ab工具
- 破解 jar 包之直接修改 .class 文件方式
- struts2框架如何使用websocket实现web程序消息推送
- LeetCode 219. Contains Duplicate II
- 个人记录-LeetCode 37. Sudoku Solver
- 使用编译好的OPENNI2的动态库与静态库进行Kinect2.0的ONI格式视频流录制
- Bebop2 FlightPlan 文件传输脚本结构
- HTTP协议简述