注册 登录  
 加关注
查看详情
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

从C开始

 
 
 

日志

 
 

文件过滤驱动在PreCreate中获得文件路径  

2011-05-14 17:26:35|  分类: 驱动编程 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
BOOLEAN 
GetFillFullPathPreCreate(
PFILE_OBJECT pFile,
PUNICODE_STRING path
)
{
NTSTATUS status;
POBJECT_NAME_INFORMATION pObjName = NULL;
WCHAR buf[256] = {0};
void *obj_ptr = NULL;
ULONG ulRet = 0;
BOOLEAN bSplit = FALSE;

if (pFile == NULL)
{
return FALSE;
}
if (pFile->FileName.Buffer == NULL)
{
return FALSE;
}

pObjName = (POBJECT_NAME_INFORMATION)buf;

if (pFile->RelatedFileObject != NULL)
{
obj_ptr = (void *)pFile->RelatedFileObject;
}
else
{
obj_ptr = (void *)pFile->DeviceObject;
}

status = ObQueryNameString(obj_ptr, pObjName, 256*sizeof(WCHAR), &ulRet);
if (status == STATUS_INFO_LENGTH_MISMATCH)
{
pObjName = (POBJECT_NAME_INFORMATION)ExAllocatePool(NonPagedPool, ulRet);
if (pObjName == NULL)
{
return FALSE;
}

RtlZeroMemory(pObjName, ulRet);

status = ObQueryNameString(obj_ptr, pObjName, ulRet, &ulRet);
if (!NT_SUCCESS(status))
{
return FALSE;
}
}
//拼接的时候, 判断是否需要加'\\'
if (pFile->FileName.Length > 2 && 
pFile->FileName.Buffer[0] != L'\\' &&
pObjName->Name.Buffer[pObjName->Name.Length/sizeof(WCHAR) -1] != L'\\')
{
bSplit = TRUE;
}
ulRet = pObjName->Name.Length + pFile->FileName.Length;

if (path->MaximumLength < ulRet)
{
return FALSE;
}

RtlCopyUnicodeString(path, &pObjName->Name);
if (bSplit)
{
RtlAppendUnicodeToString(path, L"\\");
}
RtlAppendUnicodeStringToString(path, &pFile->FileName);

if ((void*)pObjName != (void*)buf)
{
ExFreePool(pObjName);
}

return TRUE;
}
  评论这张
 
阅读(616)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018