[原创]内核中判断文件有没有存在
在内核中如何判断应层程路径的文件是否存在?
在网络上的google一遍,没有找到现成的资料,现在整理出来分享给大家
应用层传路径给内核驱动时所传的路径为"C:\123\111.exe",在内核中是不能直接使用该路径,需要转成内核的文件路径
再进行文件判断(ZwQueryFullAttributesFile)
以下是实现代码

/************************************************************************
@method:CheckFileExists
判断应用层文件有没有存在
@param: PUNICODE_STRING FileName
@return:存在TRUE
不存在FALSE
@date: [2012-07-11 zhansq]
************************************************************************/
BOOLEAN CheckFileExists(IN PWCHAR FileName)
{
BOOLEAN bret = FALSE;
NTSTATUS status = STATUS_SUCCESS;
OBJECT_ATTRIBUTES attributes;
UNICODE_STRING usSymfile;
UNICODE_STRING ustmpfile;
FILE_NETWORK_OPEN_INFORMATION FileInformation;
WCHAR pathhead[10] = L"\\??\\C:";
//传入的路径如:C:\111\123.txt
if (FileName == NULL || wcslen(FileName) < 4) return FALSE;
pathhead[4] = FileName[0];
RtlInitUnicodeString(&usSymfile,pathhead);
try
{
ustmpfile.Length = 0;
ustmpfile.MaximumLength = 600;
ustmpfile.Buffer = ExAllocatePoolWithTag( NonPagedPool,600,'tSpR');;
if (ustmpfile.Buffer == NULL)
{
leave;
}
RtlZeroMemory(ustmpfile.Buffer,ustmpfile.MaximumLength);
if (QuerySymbolicLink(&usSymfile,&ustmpfile) == FALSE)
{
leave;
}
status = RtlAppendUnicodeToString(&ustmpfile,&FileName[2]);
if (!NT_SUCCESS(status))
{
leave;
}
InitializeObjectAttributes( &attributes,&ustmpfile,OBJ_CASE_INSENSITIVE | OBJ_KERNEL_HANDLE,NULL,NULL );
status = ZwQueryFullAttributesFile(&attributes,&FileInformation);
if (NT_SUCCESS(status))
{
//文件存在
bret = TRUE;
}
}
finally
{
if (ustmpfile.Buffer != NULL) ExFreePoolWithTag(ustmpfile.Buffer,'tSpR');;
return bret;
}
}
