NtQueryFullAttributesFile.

This commit is contained in:
Ben Vanik 2013-10-16 22:41:31 -07:00
parent fd1054d823
commit 1b12949dd2
12 changed files with 77 additions and 67 deletions

View File

@ -52,6 +52,18 @@ DiscImageEntry::~DiscImageEntry() {
xe_mmap_release(mmap_); xe_mmap_release(mmap_);
} }
X_STATUS DiscImageEntry::QueryInfo(XFileInfo* out_info) {
XEASSERTNOTNULL(out_info);
out_info->creation_time = 0;
out_info->last_access_time = 0;
out_info->last_write_time = 0;
out_info->change_time = 0;
out_info->allocation_size = 2048;
out_info->file_length = gdfx_entry_->size;
out_info->attributes = gdfx_entry_->attributes;
return X_STATUS_SUCCESS;
}
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

@ -33,6 +33,8 @@ public:
xe_mmap_ref mmap() const { return mmap_; } xe_mmap_ref mmap() const { return mmap_; }
GDFXEntry* gdfx_entry() const { return gdfx_entry_; } GDFXEntry* gdfx_entry() const { return gdfx_entry_; }
virtual X_STATUS QueryInfo(XFileInfo* out_info);
virtual MemoryMapping* CreateMemoryMapping( virtual MemoryMapping* 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);

View File

@ -29,17 +29,8 @@ DiscImageFile::DiscImageFile(
DiscImageFile::~DiscImageFile() { DiscImageFile::~DiscImageFile() {
} }
X_STATUS DiscImageFile::QueryInfo(FileInfo* out_info) { X_STATUS DiscImageFile::QueryInfo(XFileInfo* out_info) {
XEASSERTNOTNULL(out_info); return entry_->QueryInfo(out_info);
GDFXEntry* gdfx_entry = entry_->gdfx_entry();
out_info->creation_time = 0;
out_info->last_access_time = 0;
out_info->last_write_time = 0;
out_info->change_time = 0;
out_info->allocation_size = 2048;
out_info->file_length = gdfx_entry->size;
out_info->attributes = gdfx_entry->attributes;
return X_STATUS_SUCCESS;
} }
X_STATUS DiscImageFile::ReadSync( X_STATUS DiscImageFile::ReadSync(

View File

@ -30,7 +30,7 @@ public:
DiscImageEntry* entry); DiscImageEntry* entry);
virtual ~DiscImageFile(); virtual ~DiscImageFile();
virtual X_STATUS QueryInfo(FileInfo* out_info); virtual X_STATUS QueryInfo(XFileInfo* out_info);
protected: protected:
virtual X_STATUS ReadSync( virtual X_STATUS ReadSync(

View File

@ -48,6 +48,26 @@ HostPathEntry::~HostPathEntry() {
xe_free(local_path_); xe_free(local_path_);
} }
X_STATUS HostPathEntry::QueryInfo(XFileInfo* out_info) {
XEASSERTNOTNULL(out_info);
WIN32_FILE_ATTRIBUTE_DATA data;
if (!GetFileAttributesEx(
local_path_, GetFileExInfoStandard, &data)) {
return X_STATUS_ACCESS_DENIED;
}
#define COMBINE_TIME(t) (((uint64_t)t.dwHighDateTime << 32) | t.dwLowDateTime)
out_info->creation_time = COMBINE_TIME(data.ftCreationTime);
out_info->last_access_time = COMBINE_TIME(data.ftLastAccessTime);
out_info->last_write_time = COMBINE_TIME(data.ftLastWriteTime);
out_info->change_time = COMBINE_TIME(data.ftLastWriteTime);
out_info->allocation_size = 4096;
out_info->file_length = ((uint64_t)data.nFileSizeHigh << 32) | data.nFileSizeLow;
out_info->attributes = (X_FILE_ATTRIBUTES)data.dwFileAttributes;
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

@ -30,6 +30,8 @@ public:
const xechar_t* local_path() { return local_path_; } const xechar_t* local_path() { return local_path_; }
virtual X_STATUS QueryInfo(XFileInfo* out_info);
virtual MemoryMapping* CreateMemoryMapping( virtual MemoryMapping* 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);

View File

@ -29,24 +29,8 @@ HostPathFile::~HostPathFile() {
CloseHandle(file_handle_); CloseHandle(file_handle_);
} }
X_STATUS HostPathFile::QueryInfo(FileInfo* out_info) { X_STATUS HostPathFile::QueryInfo(XFileInfo* out_info) {
XEASSERTNOTNULL(out_info); return entry_->QueryInfo(out_info);
WIN32_FILE_ATTRIBUTE_DATA data;
if (!GetFileAttributesEx(
entry_->local_path(), GetFileExInfoStandard, &data)) {
return X_STATUS_ACCESS_DENIED;
}
#define COMBINE_TIME(t) (((uint64_t)t.dwHighDateTime << 32) | t.dwLowDateTime)
out_info->creation_time = COMBINE_TIME(data.ftCreationTime);
out_info->last_access_time = COMBINE_TIME(data.ftLastAccessTime);
out_info->last_write_time = COMBINE_TIME(data.ftLastWriteTime);
out_info->change_time = COMBINE_TIME(data.ftLastWriteTime);
out_info->allocation_size = 4096;
out_info->file_length = ((uint64_t)data.nFileSizeHigh << 32) | data.nFileSizeLow;
out_info->attributes = (X_FILE_ATTRIBUTES)data.dwFileAttributes;
return X_STATUS_SUCCESS;
} }
X_STATUS HostPathFile::ReadSync( X_STATUS HostPathFile::ReadSync(

View File

@ -30,7 +30,7 @@ public:
HostPathEntry* entry, HANDLE file_handle); HostPathEntry* entry, HANDLE file_handle);
virtual ~HostPathFile(); virtual ~HostPathFile();
virtual X_STATUS QueryInfo(FileInfo* out_info); virtual X_STATUS QueryInfo(XFileInfo* out_info);
protected: protected:
virtual X_STATUS ReadSync( virtual X_STATUS ReadSync(

View File

@ -21,6 +21,7 @@ namespace kernel {
namespace xboxkrnl { namespace xboxkrnl {
class KernelState; class KernelState;
class XFile; class XFile;
class XFileInfo;
namespace fs { namespace fs {
class Device; class Device;
@ -55,6 +56,8 @@ public:
const char* path() const { return path_; } const char* path() const { return path_; }
const char* name() const { return name_; } const char* name() const { return name_; }
virtual X_STATUS QueryInfo(XFileInfo* out_info) = 0;
virtual MemoryMapping* CreateMemoryMapping( virtual MemoryMapping* CreateMemoryMapping(
xe_file_mode file_mode, const size_t offset, const size_t length) = 0; xe_file_mode file_mode, const size_t offset, const size_t length) = 0;

View File

@ -38,12 +38,6 @@ X_STATUS XFile::Wait(uint32_t wait_reason, uint32_t processor_mode,
wait_reason, processor_mode, alertable, opt_timeout); wait_reason, processor_mode, alertable, opt_timeout);
} }
X_STATUS XFile::QueryInfo(FileInfo* out_info) {
XEASSERTNOTNULL(out_info);
xe_zero_struct(out_info, sizeof(FileInfo));
return X_STATUS_NOT_IMPLEMENTED;
}
X_STATUS XFile::Read(void* buffer, size_t buffer_length, size_t byte_offset, X_STATUS XFile::Read(void* buffer, size_t buffer_length, size_t byte_offset,
size_t* out_bytes_read) { size_t* out_bytes_read) {
if (byte_offset == -1) { if (byte_offset == -1) {

View File

@ -22,10 +22,32 @@ namespace xboxkrnl {
class XAsyncRequest; class XAsyncRequest;
class XEvent; class XEvent;
class XFileInfo {
public:
// FILE_NETWORK_OPEN_INFORMATION
uint64_t creation_time;
uint64_t last_access_time;
uint64_t last_write_time;
uint64_t change_time;
uint64_t allocation_size;
uint64_t file_length;
X_FILE_ATTRIBUTES attributes;
void Write(uint8_t* base, uint32_t p) {
XESETUINT64BE(base + p, creation_time);
XESETUINT64BE(base + p + 8, last_access_time);
XESETUINT64BE(base + p + 16, last_write_time);
XESETUINT64BE(base + p + 24, change_time);
XESETUINT64BE(base + p + 32, allocation_size);
XESETUINT64BE(base + p + 40, file_length);
XESETUINT32BE(base + p + 48, attributes);
XESETUINT32BE(base + p + 52, 0); // pad
}
};
class XFile : public XObject { class XFile : public XObject {
public: public:
XFile(KernelState* kernel_state, uint32_t desired_access);
virtual ~XFile(); virtual ~XFile();
size_t position() const { return position_; } size_t position() const { return position_; }
@ -34,16 +56,7 @@ public:
virtual X_STATUS Wait(uint32_t wait_reason, uint32_t processor_mode, virtual X_STATUS Wait(uint32_t wait_reason, uint32_t processor_mode,
uint32_t alertable, uint64_t* opt_timeout); uint32_t alertable, uint64_t* opt_timeout);
typedef struct { virtual X_STATUS QueryInfo(XFileInfo* out_info) = 0;
uint64_t creation_time;
uint64_t last_access_time;
uint64_t last_write_time;
uint64_t change_time;
uint64_t allocation_size;
uint64_t file_length;
X_FILE_ATTRIBUTES attributes;
} FileInfo;
virtual X_STATUS QueryInfo(FileInfo* out_info);
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);
@ -51,6 +64,7 @@ public:
XAsyncRequest* request); XAsyncRequest* request);
protected: protected:
XFile(KernelState* kernel_state, uint32_t desired_access);
virtual X_STATUS ReadSync( virtual X_STATUS 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) = 0; size_t* out_bytes_read) = 0;

View File

@ -322,25 +322,11 @@ SHIM_CALL NtQueryInformationFile_shim(
// ULONG Unknown; // ULONG Unknown;
// }; // };
XEASSERT(length == 56); XEASSERT(length == 56);
XFile::FileInfo file_info; XFileInfo file_info;
result = file->QueryInfo(&file_info); result = file->QueryInfo(&file_info);
if (XSUCCEEDED(result)) { if (XSUCCEEDED(result)) {
info = 56; info = 56;
SHIM_SET_MEM_64(file_info_ptr, file_info.Write(SHIM_MEM_BASE, file_info_ptr);
file_info.creation_time);
SHIM_SET_MEM_64(file_info_ptr + 8,
file_info.last_access_time);
SHIM_SET_MEM_64(file_info_ptr + 16,
file_info.last_write_time);
SHIM_SET_MEM_64(file_info_ptr + 24,
file_info.change_time);
SHIM_SET_MEM_64(file_info_ptr + 32,
file_info.allocation_size);
SHIM_SET_MEM_64(file_info_ptr + 40,
file_info.file_length);
SHIM_SET_MEM_32(file_info_ptr + 48,
file_info.attributes);
SHIM_SET_MEM_32(file_info_ptr + 52, 0); // Unknown!
} }
break; break;
default: default:
@ -386,9 +372,11 @@ SHIM_CALL NtQueryFullAttributesFile_shim(
Entry* entry = fs->ResolvePath(attrs.object_name.buffer); Entry* entry = fs->ResolvePath(attrs.object_name.buffer);
if (entry && entry->type() == Entry::kTypeFile) { if (entry && entry->type() == Entry::kTypeFile) {
// Found. // Found.
// TODO(benvanik): set file_info_ptr data XFileInfo file_info;
XEASSERTALWAYS(); result = entry->QueryInfo(&file_info);
result = X_STATUS_SUCCESS; if (XSUCCEEDED(result)) {
file_info.Write(SHIM_MEM_BASE, file_info_ptr);
}
} }
SHIM_SET_RETURN(result); SHIM_SET_RETURN(result);