微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

NtCreateFile返回STATUS_OBJECT_NAME_NOT_FOUND,即使该文件存在于目录中

如何解决NtCreateFile返回STATUS_OBJECT_NAME_NOT_FOUND,即使该文件存在于目录中

我一直在尝试使用NtCreateFile打开现有文件,尽管即使我要在其中打开文件的目录中也没有找到我要查找的文件

The file I am trying to open.

NtCreateFile返回错误代码0x34,即STATUS_OBJECT_NAME_NOT_FOUND。

我对路径的格式是否正确进行了三重检查,我还确保UNICODE_STRING的Length和MaximumLength均为偶数且不为奇数,因为这会导致NtCreateFile抛出错误代码0x33(此处提供更多信息:{{3} }。

我注意到,尽管在同一文件夹中使用另一个.png文件也可以正常工作,但我可以使用另一个标志FILE_DIRECTORY_FILE而不是FILE_NON_DIRECTORY_FILE来成功获取文件的句柄。

NtOpenFile returns STATUS_OBJECT_NAME_INVALID

这是代码

#define DLL_FILE_OPEN                       1
#define DLL_NON_DIRECTORY_FILE              0x40
#define DLL_OPEN_BY_FILE_ID                 0x2000
#define DLL_DIRECTORY_FILE                  1
#define DLL_FILE_OPENED                     1
#define DLL_SYNCRONIZE                      0x00100000L
#define DLL_FILE_READ_ATTRIBUTES            0x0080
#define DLL_FILE_OPEN_FOR_BACKUP_INTENT     0x00004000


#define OBJ_CASE_INSENSITIVE                0x00000040L


void main()
{

    OBJECT_ATTRIBUTES oa;
    IO_STATUS_BLOCK isb;
    UNICODE_STRING NtPath;
    HANDLE FileHandle;
    NTSTATUS status;
    ULONG FileAttributes,Flags = 0;
    PVOID EaBuffer = 0;
    ULONG EaLength = 0;

    Flags |= DLL_NON_DIRECTORY_FILE;
    Flags |= DLL_FILE_OPEN_FOR_BACKUP_INTENT;

    NtPath.Buffer = (PWSTR)L"\\??\\C:\\Users\\MyUsername\\Downloads\\verifica.txt";
    NtPath.Length = (USHORT)(wcslen(NtPath.Buffer) + 1);  // +1 to avoid it being an odd value.
    NtPath.MaximumLength = (USHORT)(sizeof(PWSTR) + 1);

    InitializeObjectAttributes(&oa,&NtPath,OBJ_CASE_INSENSITIVE,0);

    status = NewNtCreateFile(&FileHandle,FILE_GENERIC_READ,&oa,&isb,NULL,FILE_SHARE_READ,DLL_FILE_OPEN,Flags,EaBuffer,EaLength);

    if (status != 0)
        printf("status: 0x%08X\n",status);
    else
        if (!FileHandle || FileHandle == INVALID_HANDLE_VALUE)
            printf("Invalid handle.\n");
        else
            printf("file opened successfully\n");

    return;

}```

解决方法

Fatal error: Uncaught PHPMailer\PHPMailer\Exception: SMTP Error: Could not authenticate. in /storage/ssd1/218/15386218/public_html/vendor/phpmailer/phpmailer/src/PHPMailer.php:2063 Stack trace: #0 /storage/ssd1/218/15386218/public_html/vendor/phpmailer/phpmailer/src/PHPMailer.php(1878): PHPMailer\PHPMailer\PHPMailer->smtpConnect(Array) #1 /storage/ssd1/218/15386218/public_html/vendor/phpmailer/phpmailer/src/PHPMailer.php(1601): PHPMailer\PHPMailer\PHPMailer->smtpSend('Date: Thu,12 N...','This is a multi...') #2 /storage/ssd1/218/15386218/public_html/vendor/phpmailer/phpmailer/src/PHPMailer.php(1437): PHPMailer\PHPMailer\PHPMailer->postSend() #3 /storage/ssd1/218/15386218/public_html/index.php(72): PHPMailer\PHPMailer\PHPMailer->send() #4 {main} thrown in /storage/ssd1/218/15386218/public_html/vendor/phpmailer/phpmailer/src/PHPMailer.php on line 2063

不。该字段是以字节为单位的长度。

 NtPath.Length = (USHORT)(wcslen(NtPath.Buffer));

此外,由于您没有将字符串传递给要写入的内容,因此我建议将 NtPath.Length = (USHORT)(wcslen(NtPath.Buffer)) << 1; NtPath.MaximumLength相同。

如果继续使用这些API,会发出一点警告,默认情况下将异步打开文件句柄,并且Length结构需要16字节对齐。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。