ZwQueryDirectoryFile 缓冲区溢出

ZwQueryDirectoryFile Buffer Overflow

我正在尝试编写 Windows 驱动程序代码来扫描目录中的文件名:

HANDLE directory_handle;
FILE_BOTH_DIR_INFORMATION directory_information;
IO_STATUS_BLOCK io_status_block;
NTSTATUS status;
OBJECT_ATTRIBUTES directory_attributes;
InitializeObjectAttributes(&directory_attributes                   ,
                           &directory_name                         ,
                           OBJ_CASE_INSENSITIVE | OBJ_KERNEL_HANDLE,
                           0                                       ,
                           0                                       );
status = ZwCreateFile(&directory_handle                                 ,
                      FILE_LIST_DIRECTORY | SYNCHRONIZE                 ,
                      &directory_attributes                             ,
                      &io_status_block                                  ,
                      0                                                 ,
                      0                                                 ,
                      FILE_SHARE_VALID_FLAGS                            ,
                      FILE_OPEN                                         ,
                      FILE_SYNCHRONOUS_IO_NONALERT | FILE_DIRECTORY_FILE,
                      0                                                 ,
                      0                                                 );
status = ZwQueryDirectoryFile(directory_handle             ,
                              NULL                         ,
                              0                            ,
                              0                            ,
                              &io_status_block             ,
                              &directory_information       ,
                              sizeof(directory_information),
                              FileBothDirectoryInformation ,
                              TRUE                         ,
                              NULL                         ,
                              FALSE                        );
status = ZwQueryDirectoryFile(directory_handle             ,
                              NULL                         ,
                              0                            ,
                              0                            ,
                              &io_status_block             ,
                              &directory_information       ,
                              sizeof(directory_information),
                              FileBothDirectoryInformation ,
                              TRUE                         ,
                              NULL                         ,
                              FALSE                        );

第一次调用ZwQueryDirectoryFile()returns一个STATUS_SUCCESS0x00000000)的结果,但是第二次调用returns一个状态STATUS_BUFFER_OVERFLOW0x80000005)。您知道什么可能导致此缓冲区溢出错误吗?

谢谢。

FILE_ID_BOTH_DIR_INFORMATION是变长结构。 您将需要分配足够的 space 来接收结构末尾的路径字符串。

您需要将分配的缓冲区的大小传递给 ZwQueryDirectoryFile 而不是 sizeof(FILE_ID_BOTH_DIR_INFORMATION)

不知道为什么第一个有效。

STATUS_BUFFER_OVERFLOW 表示缓冲区不够大 return 完整文件名(但是我们知道缓冲区至少对于基本结构足够大,否则 STATUS_BUFFER_TOO_SMALL ).

这里发生的是第一个调用成功 return编辑了“.”条目(因为在基本结构中有用于单个字符文件名的空间),但第二次调用失败并显示 STATUS_BUFFER_OVERFLOW 因为缓冲区不够大,无法容纳“..”条目。