如何检查内核模式下是否存在文件/目录?

问题描述

是否有某种方法可以验证内核模式下是否存在特定的文件/目录?谢谢。

解决方法

以下是使用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");