@ -4,6 +4,7 @@
# include <cinttypes>
# include <cinttypes>
# include <cstring>
# include <cstring>
# include <iterator>
# include <string>
# include <string>
# include <utility>
# include <utility>
# include <vector>
# include <vector>
@ -229,23 +230,20 @@ private:
LOG_DEBUG ( Service_FS , " called, unk=0x{:X} " , unk ) ;
LOG_DEBUG ( Service_FS , " called, unk=0x{:X} " , unk ) ;
// Calculate how many entries we can fit in the output buffer
// Calculate how many entries we can fit in the output buffer
u64 count_entries = ctx . GetWriteBufferSize ( ) / sizeof ( FileSys : : Entry ) ;
const u64 count_entries = ctx . GetWriteBufferSize ( ) / sizeof ( FileSys : : Entry ) ;
// Cap at total number of entries.
// Cap at total number of entries.
u64 actual_entries = std : : min ( count_entries , entries . size ( ) - next_entry_index ) ;
const u64 actual_entries = std : : min ( count_entries , entries . size ( ) - next_entry_index ) ;
// Read the data from the Directory backend
// Determine data start and end
std : : vector < FileSys : : Entry > entry_data ( entries . begin ( ) + next_entry_index ,
const auto * begin = reinterpret_cast < u8 * > ( entries . data ( ) + next_entry_index ) ;
entries . begin ( ) + next_entry_index + actual_entries ) ;
const auto * end = reinterpret_cast < u8 * > ( entries . data ( ) + next_entry_index + actual_entries ) ;
const auto range_size = static_cast < std : : size_t > ( std : : distance ( begin , end ) ) ;
next_entry_index + = actual_entries ;
next_entry_index + = actual_entries ;
// Convert the data into a byte array
std : : vector < u8 > output ( entry_data . size ( ) * sizeof ( FileSys : : Entry ) ) ;
std : : memcpy ( output . data ( ) , entry_data . data ( ) , output . size ( ) ) ;
// Write the data to memory
// Write the data to memory
ctx . WriteBuffer ( output ) ;
ctx . WriteBuffer ( begin , range_size ) ;
IPC : : ResponseBuilder rb { ctx , 4 } ;
IPC : : ResponseBuilder rb { ctx , 4 } ;
rb . Push ( RESULT_SUCCESS ) ;
rb . Push ( RESULT_SUCCESS ) ;