Zookeeper/NightBeliever/XboxKernel/FS.cpp
2016-05-19 13:03:57 -06:00

177 lines
5.1 KiB
C++

#include "Kernel.hpp"
NTSTATUS NTAPI kernel_NtOpenFile(
HANDLE *FileHandle,
ACCESS_MASK DesiredAccess,
OBJECT_ATTRIBUTES *ObjectAttributes,
IO_STATUS_BLOCK *IoStatusBlock,
uint32_t ShareAccess,
uint32_t OpenOptions
) {
auto flags = FSFlags::READ;
if(FLAG(DesiredAccess, FILE_WRITE_DATA))
flags |= FSFlags::WRITE;
if(FLAG(OpenOptions, FILE_DIRECTORY_FILE))
flags |= FSFlags::DIRECTORY;
*FileHandle = io_open(ObjectAttributes->RootDirectory, (char *) ObjectAttributes->ObjectName->Buffer, flags);
if(*FileHandle == 0)
return STATUS_OBJECT_NAME_NOT_FOUND;
return STATUS_SUCCESS;
}
NTSTATUS NTAPI kernel_NtCreateFile(
OUT PHANDLE FileHandle,
IN ACCESS_MASK DesiredAccess,
IN POBJECT_ATTRIBUTES ObjectAttributes,
OUT PIO_STATUS_BLOCK IoStatusBlock,
IN PLARGE_INTEGER AllocationSize,
IN ULONG FileAttributes,
IN ULONG ShareAccess,
IN ULONG CreateDisposition,
IN ULONG CreateOptions
) {
auto flags = FSFlags::READ;
if(CreateDisposition == FILE_CREATE || CreateDisposition == FILE_OPEN_IF)
flags |= FSFlags::CREATE;
else if(CreateDisposition == FILE_OVERWRITE || CreateDisposition == FILE_OVERWRITE_IF)
flags |= FSFlags::OVERWRITE;
if(FLAG(DesiredAccess, FILE_WRITE_DATA))
flags |= FSFlags::WRITE;
if(FLAG(CreateOptions, FILE_DIRECTORY_FILE))
flags |= FSFlags::DIRECTORY;
*FileHandle = io_open(ObjectAttributes->RootDirectory, (char *) ObjectAttributes->ObjectName->Buffer, flags);
if(*FileHandle == 0) {
return STATUS_OBJECT_NAME_NOT_FOUND;
}
return STATUS_SUCCESS;
}
NTSTATUS NTAPI kernel_NtReadFile(
HANDLE FileHandle,
HANDLE Event,
PVOID ApcRoutine,
PVOID ApcContext,
PVOID IoStatusBlock,
PVOID Buffer,
ULONG Length,
PLARGE_INTEGER ByteOffset
) {
auto offset = (ByteOffset == NULL || ByteOffset->u.HighPart == -1) ? -1 : ByteOffset->QuadPart;
if(io_read(FileHandle, Buffer, Length, offset))
return STATUS_SUCCESS;
bailout("Unknown failure");
return -1;
}
NTSTATUS NTAPI kernel_NtWriteFile(
HANDLE FileHandle,
HANDLE Event,
PVOID ApcRoutine,
PVOID ApcContext,
PVOID IoStatusBlock,
PVOID Buffer,
ULONG Length,
PLARGE_INTEGER ByteOffset
) {
auto offset = (ByteOffset == NULL || ByteOffset->u.HighPart == -1) ? -1 : ByteOffset->QuadPart;
if(io_write(FileHandle, Buffer, Length, offset))
return STATUS_SUCCESS;
bailout("Unknown failure");
return -1;
}
NTSTATUS NTAPI kernel_NtDeviceIoControlFile(
HANDLE FileHandle,
HANDLE Event,
PVOID ApcRoutine,
PVOID ApcContext,
PVOID IoStatusBlock,
ULONG IoControlCode,
PVOID InputBuffer,
ULONG InputLength,
PVOID OutputBuffer,
ULONG OutputLength
) {
if(io_ioctl(FileHandle, IoControlCode, InputBuffer, InputLength, OutputBuffer, OutputLength))
return STATUS_SUCCESS;
bailout("Unknown failure");
return -1;
}
NTSTATUS NTAPI kernel_NtFsControlFile(
HANDLE FileHandle,
HANDLE Event,
PVOID ApcRoutine,
PVOID ApcContext,
PVOID IoStatusBlock,
ULONG IoControlCode,
PVOID InputBuffer,
ULONG InputLength,
PVOID OutputBuffer,
ULONG OutputLength
) {
return kernel_NtDeviceIoControlFile(
FileHandle, Event, ApcRoutine, ApcContext, IoStatusBlock,
IoControlCode, InputBuffer, InputLength,
OutputBuffer, OutputLength
);
}
NTSTATUS NTAPI kernel_NtClose(HANDLE handle) {
close(handle);
return STATUS_SUCCESS;
}
NTSTATUS NTAPI kernel_NtQueryVolumeInformationFile(
IN HANDLE FileHandle,
OUT PIO_STATUS_BLOCK IoStatusBlock,
OUT PVOID FileInformation,
IN ULONG Length,
IN FS_INFORMATION_CLASS FileInformationClass
) {
switch(FileInformationClass) {
case FileFsSizeInformation: {
auto info = (FILE_FS_SIZE_INFORMATION *) FileInformation;
// Test XBE *requires* bytes per allocation unit == 16kb!
info->BytesPerSector = 4096; // 4KB sectors
info->SectorsPerAllocationUnit = 4; // 16KB allocation units
info->TotalAllocationUnits.QuadPart = 524288; // 8GB drive
info->AvailableAllocationUnits.QuadPart = 458752; // 7GB free
break;
}
default:
bailout("Unknown FS_INFORMATION_CLASS %i", FileInformationClass);
}
return STATUS_SUCCESS;
}
NTSTATUS NTAPI kernel_IoCreateSymbolicLink(
PSTRING SymbolicLinkName,
PSTRING DeviceName
) {
// XXX: Implement
return STATUS_SUCCESS;
}
NTSTATUS NTAPI kernel_NtOpenSymbolicLinkObject(
HANDLE *LinkHandle,
OBJECT_ATTRIBUTES *ObjectAttributes
) {
// XXX: Implement
*LinkHandle = 0xDEADBEEF;
return STATUS_SUCCESS;
}
NTSTATUS NTAPI kernel_NtQuerySymbolicLinkObject(
HANDLE LinkHandle,
STRING *LinkTarget,
uint32_t *ReturnedLength
) {
strcpy((char *) LinkTarget->Buffer, "\\Device\\CdRom0");
LinkTarget->Length = strlen((char *) LinkTarget->Buffer);
if(ReturnedLength != NULL) *ReturnedLength = LinkTarget->Length;
return STATUS_SUCCESS;
}
uint32_t kernel_HalDiskCachePartitionCount = 1;