问题描述
是否有某种方法可以验证内核模式下是否存在特定的文件/目录?谢谢。
解决方法
以下是使用ZwQueryFullAttributesFile
函数引用@RbMm建议的解决方案。
BOOLEAN FileExists(const WCHAR* filename)
{
FILE_NETWORK_OPEN_INFORMATION info = { 0 };
NTSTATUS ntStatus = STATUS_UNSUCCESSFUL;
OBJECT_ATTRIBUTES objAttr = { 0 };
UNICODE_STRING uName = { 0 };
ULONG dwAttr = 0;
if (NULL == filename)
{
return FALSE;
}
RtlInitUnicodeString(&uName,filename);
RtlZeroMemory(&info,sizeof(FILE_NETWORK_OPEN_INFORMATION));
InitializeObjectAttributes(&objAttr,&uName,OBJ_KERNEL_HANDLE | OBJ_CASE_INSENSITIVE,NULL,NULL);
ntStatus = ZwQueryFullAttributesFile(&objAttr,&info);
if (!NT_SUCCESS(ntStatus))
{
DbgPrint("ZwQueryFullAttributesFile() error - 0x%X \n",ntStatus);
return FALSE;
}
dwAttr = info.FileAttributes;
if (dwAttr & FILE_ATTRIBUTE_ARCHIVE)
{
DbgPrint("%S is an archive \n",filename);
return TRUE;
}
else if (dwAttr & FILE_ATTRIBUTE_DIRECTORY)
{
DbgPrint("%S is a directory \n",filename);
return TRUE;
}
return FALSE;
}
//-----------------------------------------------
WCHAR *szFileName = L"\\??\\C:\\test.txt";
//WCHAR *szFileName = L"\\??\\C:\\test";
if(FileExists(szFileName)
DbgPrint("File exists! :D \n");