QueryVolume, QueryFileSystemAttributes stubs with accompanying XVolumeInfo and XFileSystemAttributeInfo. Needs further improvement.

This commit is contained in:
gibbed 2014-01-22 17:54:10 -08:00
parent 61093245a5
commit 6671908375
14 changed files with 139 additions and 0 deletions

View File

@ -110,6 +110,16 @@ X_STATUS DiscImageEntry::QueryDirectory(
return X_STATUS_SUCCESS; return X_STATUS_SUCCESS;
} }
X_STATUS DiscImageEntry::QueryVolume(XVolumeInfo* out_info, size_t length) {
XEASSERTALWAYS();
return X_STATUS_NOT_IMPLEMENTED;
}
X_STATUS DiscImageEntry::QueryFileSystemAttributes(XFileSystemAttributeInfo* out_info, size_t length) {
XEASSERTALWAYS();
return X_STATUS_NOT_IMPLEMENTED;
}
MemoryMapping* DiscImageEntry::CreateMemoryMapping( MemoryMapping* DiscImageEntry::CreateMemoryMapping(
xe_file_mode file_mode, const size_t offset, const size_t length) { xe_file_mode file_mode, const size_t offset, const size_t length) {
if (file_mode & kXEFileModeWrite) { if (file_mode & kXEFileModeWrite) {

View File

@ -35,6 +35,8 @@ public:
virtual X_STATUS QueryInfo(XFileInfo* out_info); virtual X_STATUS QueryInfo(XFileInfo* out_info);
virtual X_STATUS QueryDirectory(XDirectoryInfo* out_info, virtual X_STATUS QueryDirectory(XDirectoryInfo* out_info,
size_t length, const char* file_name, bool restart); size_t length, const char* file_name, bool restart);
virtual X_STATUS QueryVolume(XVolumeInfo* out_info, size_t length);
virtual X_STATUS QueryFileSystemAttributes(XFileSystemAttributeInfo* out_info, size_t length);
virtual bool can_map() { return true; } virtual bool can_map() { return true; }
virtual MemoryMapping* CreateMemoryMapping( virtual MemoryMapping* CreateMemoryMapping(

View File

@ -49,6 +49,14 @@ X_STATUS DiscImageFile::QueryDirectory(XDirectoryInfo* out_info,
return entry_->QueryDirectory(out_info, length, file_name, restart); return entry_->QueryDirectory(out_info, length, file_name, restart);
} }
X_STATUS DiscImageFile::QueryVolume(XVolumeInfo* out_info, size_t length) {
return entry_->QueryVolume(out_info, length);
}
X_STATUS DiscImageFile::QueryFileSystemAttributes(XFileSystemAttributeInfo* out_info, size_t length) {
return entry_->QueryFileSystemAttributes(out_info, length);
}
X_STATUS DiscImageFile::ReadSync( X_STATUS DiscImageFile::ReadSync(
void* buffer, size_t buffer_length, size_t byte_offset, void* buffer, size_t buffer_length, size_t byte_offset,
size_t* out_bytes_read) { size_t* out_bytes_read) {

View File

@ -36,6 +36,8 @@ public:
virtual X_STATUS QueryInfo(XFileInfo* out_info); virtual X_STATUS QueryInfo(XFileInfo* out_info);
virtual X_STATUS QueryDirectory(XDirectoryInfo* out_info, virtual X_STATUS QueryDirectory(XDirectoryInfo* out_info,
size_t length, const char* file_name, bool restart); size_t length, const char* file_name, bool restart);
virtual X_STATUS QueryVolume(XVolumeInfo* out_info, size_t length);
virtual X_STATUS QueryFileSystemAttributes(XFileSystemAttributeInfo* out_info, size_t length);
protected: protected:
virtual X_STATUS ReadSync( virtual X_STATUS ReadSync(

View File

@ -140,6 +140,43 @@ X_STATUS HostPathEntry::QueryDirectory(
return X_STATUS_SUCCESS; return X_STATUS_SUCCESS;
} }
// TODO(gibbed): call into HostPathDevice?
X_STATUS HostPathEntry::QueryVolume(XVolumeInfo* out_info, size_t length) {
XEASSERTNOTNULL(out_info);
const char* name = "test"; // TODO(gibbed): actual value
auto end = (uint8_t*)out_info + length;
size_t name_length = strlen(name);
if (((uint8_t*)&out_info->label[0]) + name_length > end) {
return X_STATUS_BUFFER_OVERFLOW;
}
out_info->creation_time = 0;
out_info->serial_number = 12345678;
out_info->supports_objects = 0;
out_info->label_length = (uint32_t)name_length;
memcpy(out_info->label, name, name_length);
return X_STATUS_SUCCESS;
}
// TODO(gibbed): call into HostPathDevice?
X_STATUS HostPathEntry::QueryFileSystemAttributes(XFileSystemAttributeInfo* out_info, size_t length) {
XEASSERTNOTNULL(out_info);
const char* name = "test"; // TODO(gibbed): actual value
auto end = (uint8_t*)out_info + length;
size_t name_length = strlen(name);
if (((uint8_t*)&out_info->fs_name[0]) + name_length > end) {
return X_STATUS_BUFFER_OVERFLOW;
}
out_info->attributes = 0;
out_info->maximum_component_name_length = 255; // TODO(gibbed): actual value
out_info->fs_name_length = (uint32_t)name_length;
memcpy(out_info->fs_name, name, name_length);
return X_STATUS_SUCCESS;
}
MemoryMapping* HostPathEntry::CreateMemoryMapping( MemoryMapping* HostPathEntry::CreateMemoryMapping(
xe_file_mode file_mode, const size_t offset, const size_t length) { xe_file_mode file_mode, const size_t offset, const size_t length) {
xe_mmap_ref mmap = xe_mmap_open(file_mode, local_path_, offset, length); xe_mmap_ref mmap = xe_mmap_open(file_mode, local_path_, offset, length);

View File

@ -32,6 +32,8 @@ public:
virtual X_STATUS QueryInfo(XFileInfo* out_info); virtual X_STATUS QueryInfo(XFileInfo* out_info);
virtual X_STATUS QueryDirectory(XDirectoryInfo* out_info, virtual X_STATUS QueryDirectory(XDirectoryInfo* out_info,
size_t length, const char* file_name, bool restart); size_t length, const char* file_name, bool restart);
virtual X_STATUS QueryVolume(XVolumeInfo* out_info, size_t length);
virtual X_STATUS QueryFileSystemAttributes(XFileSystemAttributeInfo* out_info, size_t length);
virtual bool can_map() { return true; } virtual bool can_map() { return true; }
virtual MemoryMapping* CreateMemoryMapping( virtual MemoryMapping* CreateMemoryMapping(

View File

@ -49,6 +49,14 @@ X_STATUS HostPathFile::QueryDirectory(XDirectoryInfo* out_info,
return entry_->QueryDirectory(out_info, length, file_name, restart); return entry_->QueryDirectory(out_info, length, file_name, restart);
} }
X_STATUS HostPathFile::QueryVolume(XVolumeInfo* out_info, size_t length) {
return entry_->QueryVolume(out_info, length);
}
X_STATUS HostPathFile::QueryFileSystemAttributes(XFileSystemAttributeInfo* out_info, size_t length) {
return entry_->QueryFileSystemAttributes(out_info, length);
}
X_STATUS HostPathFile::ReadSync( X_STATUS HostPathFile::ReadSync(
void* buffer, size_t buffer_length, size_t byte_offset, void* buffer, size_t buffer_length, size_t byte_offset,
size_t* out_bytes_read) { size_t* out_bytes_read) {

View File

@ -36,6 +36,8 @@ public:
virtual X_STATUS QueryInfo(XFileInfo* out_info); virtual X_STATUS QueryInfo(XFileInfo* out_info);
virtual X_STATUS QueryDirectory(XDirectoryInfo* out_info, virtual X_STATUS QueryDirectory(XDirectoryInfo* out_info,
size_t length, const char* file_name, bool restart); size_t length, const char* file_name, bool restart);
virtual X_STATUS QueryVolume(XVolumeInfo* out_info, size_t length);
virtual X_STATUS QueryFileSystemAttributes(XFileSystemAttributeInfo* out_info, size_t length);
protected: protected:
virtual X_STATUS ReadSync( virtual X_STATUS ReadSync(

View File

@ -88,6 +88,16 @@ X_STATUS STFSContainerEntry::QueryDirectory(
return X_STATUS_SUCCESS; return X_STATUS_SUCCESS;
} }
X_STATUS STFSContainerEntry::QueryVolume(XVolumeInfo* out_info, size_t length) {
XEASSERTALWAYS();
return X_STATUS_NOT_IMPLEMENTED;
}
X_STATUS STFSContainerEntry::QueryFileSystemAttributes(XFileSystemAttributeInfo* out_info, size_t length) {
XEASSERTALWAYS();
return X_STATUS_NOT_IMPLEMENTED;
}
X_STATUS STFSContainerEntry::Open( X_STATUS STFSContainerEntry::Open(
KernelState* kernel_state, KernelState* kernel_state,
uint32_t desired_access, bool async, uint32_t desired_access, bool async,

View File

@ -35,6 +35,8 @@ public:
virtual X_STATUS QueryInfo(XFileInfo* out_info); virtual X_STATUS QueryInfo(XFileInfo* out_info);
virtual X_STATUS QueryDirectory(XDirectoryInfo* out_info, virtual X_STATUS QueryDirectory(XDirectoryInfo* out_info,
size_t length, const char* file_name, bool restart); size_t length, const char* file_name, bool restart);
virtual X_STATUS QueryVolume(XVolumeInfo* out_info, size_t length);
virtual X_STATUS QueryFileSystemAttributes(XFileSystemAttributeInfo* out_info, size_t length);
virtual X_STATUS Open( virtual X_STATUS Open(
KernelState* kernel_state, KernelState* kernel_state,

View File

@ -44,11 +44,19 @@ X_STATUS STFSContainerFile::QueryInfo(XFileInfo* out_info) {
return entry_->QueryInfo(out_info); return entry_->QueryInfo(out_info);
} }
X_STATUS STFSContainerFile::QueryVolume(XVolumeInfo* out_info, size_t length) {
return entry_->QueryVolume(out_info, length);
}
X_STATUS STFSContainerFile::QueryDirectory(XDirectoryInfo* out_info, X_STATUS STFSContainerFile::QueryDirectory(XDirectoryInfo* out_info,
size_t length, const char* file_name, bool restart) { size_t length, const char* file_name, bool restart) {
return entry_->QueryDirectory(out_info, length, file_name, restart); return entry_->QueryDirectory(out_info, length, file_name, restart);
} }
X_STATUS STFSContainerFile::QueryFileSystemAttributes(XFileSystemAttributeInfo* out_info, size_t length) {
return entry_->QueryFileSystemAttributes(out_info, length);
}
X_STATUS STFSContainerFile::ReadSync( X_STATUS STFSContainerFile::ReadSync(
void* buffer, size_t buffer_length, size_t byte_offset, void* buffer, size_t buffer_length, size_t byte_offset,
size_t* out_bytes_read) { size_t* out_bytes_read) {

View File

@ -36,6 +36,8 @@ public:
virtual X_STATUS QueryInfo(XFileInfo* out_info); virtual X_STATUS QueryInfo(XFileInfo* out_info);
virtual X_STATUS QueryDirectory(XDirectoryInfo* out_info, virtual X_STATUS QueryDirectory(XDirectoryInfo* out_info,
size_t length, const char* file_name, bool restart); size_t length, const char* file_name, bool restart);
virtual X_STATUS QueryVolume(XVolumeInfo* out_info, size_t length);
virtual X_STATUS QueryFileSystemAttributes(XFileSystemAttributeInfo* out_info, size_t length);
protected: protected:
virtual X_STATUS ReadSync( virtual X_STATUS ReadSync(

View File

@ -20,6 +20,8 @@ XEDECLARECLASS2(xe, kernel, KernelState);
XEDECLARECLASS2(xe, kernel, XFile); XEDECLARECLASS2(xe, kernel, XFile);
XEDECLARECLASS2(xe, kernel, XFileInfo); XEDECLARECLASS2(xe, kernel, XFileInfo);
XEDECLARECLASS2(xe, kernel, XDirectoryInfo); XEDECLARECLASS2(xe, kernel, XDirectoryInfo);
XEDECLARECLASS2(xe, kernel, XVolumeInfo);
XEDECLARECLASS2(xe, kernel, XFileSystemAttributeInfo);
namespace xe { namespace xe {
@ -62,6 +64,8 @@ public:
virtual X_STATUS QueryInfo(XFileInfo* out_info) = 0; virtual X_STATUS QueryInfo(XFileInfo* out_info) = 0;
virtual X_STATUS QueryDirectory(XDirectoryInfo* out_info, virtual X_STATUS QueryDirectory(XDirectoryInfo* out_info,
size_t length, const char* file_name, bool restart) = 0; size_t length, const char* file_name, bool restart) = 0;
virtual X_STATUS QueryVolume(XVolumeInfo* out_info, size_t length) = 0;
virtual X_STATUS QueryFileSystemAttributes(XFileSystemAttributeInfo* out_info, size_t length) = 0;
virtual bool can_map() { return false; } virtual bool can_map() { return false; }
virtual MemoryMapping* CreateMemoryMapping( virtual MemoryMapping* CreateMemoryMapping(

View File

@ -83,6 +83,46 @@ public:
}; };
XEASSERTSTRUCTSIZE(XDirectoryInfo, 72); XEASSERTSTRUCTSIZE(XDirectoryInfo, 72);
// http://msdn.microsoft.com/en-us/library/windows/hardware/ff540287(v=vs.85).aspx
class XVolumeInfo {
public:
// FILE_FS_VOLUME_INFORMATION
uint64_t creation_time;
uint32_t serial_number;
uint32_t label_length;
uint32_t supports_objects;
char label[1];
void Write(uint8_t* base, uint32_t p) {
uint8_t* dst = base + p;
XESETUINT64BE(dst + 0, this->creation_time);
XESETUINT32BE(dst + 8, this->serial_number);
XESETUINT32BE(dst + 12, this->label_length);
XESETUINT32BE(dst + 16, this->supports_objects);
xe_copy_memory(dst + 20, this->label_length, this->label, this->label_length);
}
};
XEASSERTSTRUCTSIZE(XVolumeInfo, 24);
// http://msdn.microsoft.com/en-us/library/windows/hardware/ff540251(v=vs.85).aspx
class XFileSystemAttributeInfo {
public:
// FILE_FS_ATTRIBUTE_INFORMATION
uint32_t attributes;
int32_t maximum_component_name_length;
uint32_t fs_name_length;
char fs_name[1];
void Write(uint8_t* base, uint32_t p) {
uint8_t* dst = base + p;
XESETUINT32BE(dst + 0, this->attributes);
XESETUINT32BE(dst + 4, this->maximum_component_name_length);
XESETUINT32BE(dst + 8, this->fs_name_length);
xe_copy_memory(dst + 12, this->fs_name_length, this->fs_name, this->fs_name_length);
}
};
XEASSERTSTRUCTSIZE(XFileSystemAttributeInfo, 16);
class XFile : public XObject { class XFile : public XObject {
public: public:
virtual ~XFile(); virtual ~XFile();
@ -97,6 +137,8 @@ public:
virtual X_STATUS QueryInfo(XFileInfo* out_info) = 0; virtual X_STATUS QueryInfo(XFileInfo* out_info) = 0;
virtual X_STATUS QueryDirectory(XDirectoryInfo* out_info, virtual X_STATUS QueryDirectory(XDirectoryInfo* out_info,
size_t length, const char* file_name, bool restart) = 0; size_t length, const char* file_name, bool restart) = 0;
virtual X_STATUS QueryVolume(XVolumeInfo* out_info, size_t length) = 0;
virtual X_STATUS QueryFileSystemAttributes(XFileSystemAttributeInfo* out_info, size_t length) = 0;
X_STATUS Read(void* buffer, size_t buffer_length, size_t byte_offset, X_STATUS Read(void* buffer, size_t buffer_length, size_t byte_offset,
size_t* out_bytes_read); size_t* out_bytes_read);