Completely pass initialization of binaries.

This commit is contained in:
Cody Brocious 2016-05-19 13:03:57 -06:00
parent a32a786890
commit 2aeb66c4ab
16 changed files with 126 additions and 51 deletions

View file

@ -167,26 +167,31 @@ DirHandle::DirHandle(string path, string mapped_path, FSFlags flags) : IOHandle(
mkdir(mapped_path.c_str(), 0700);
}
void DirHandle::read(void *buf, uint32_t count, int64_t offset) {
cout << "Attempting to read " << count << " bytes from directory " << path << endl;
cout << "Offset " << hex << offset << endl;
//cout << "Attempting to read " << count << " bytes from directory " << path << endl;
//cout << "Offset " << hex << offset << endl;
}
void DirHandle::write(void *buf, uint32_t count, int64_t offset) {
cout << "Attempting to write " << count << " bytes to directory " << path << endl;
cout << "Offset " << hex << offset << endl;
if(count == 0) {
cout << "Attempting to write " << count << " bytes to directory " << path << endl;
cout << "Offset " << hex << offset << endl;
cout << "Null write" << endl;
box->cpu->break_in = true;
}
}
void DirHandle::ioctl(uint32_t code, void *ibuf, uint32_t isize, void *obuf, uint32_t osize) {
switch(code) {
case IOCTL_DISK_GET_DRIVE_GEOMETRY: {
auto geom = (DISK_GEOMETRY *) obuf;
geom->BytesPerSector = 1024*1024;
break;
}
case IOCTL_DISK_GET_PARTITION_INFO: {
auto part = (PARTITION_INFORMATION *) obuf;
part->StartingOffset = 0;
part->PartitionLength = 1 * 1024 * 1024 * 1024; // 1GB
part->HiddenSectors = 0;
part->PartitionNumber = 5; // Who cares?
part->PartitionType = 0;
part->PartitionType = 8;
part->BootIndicator = 1;
part->RecognizedPartition = 1;
part->RewritePartition = 0;

View file

@ -1,9 +1,15 @@
#pragma once
#define IOCTL_DISK_GET_DRIVE_GEOMETRY 0x70000
#define IOCTL_DISK_GET_PARTITION_INFO 0x74004
typedef struct __attribute__((packed)) DISK_GEOMETRY {
uint64_t Cylinders; // 0x00
uint32_t MediaType, TracksPerCylinder, SectorsPerTrack, BytesPerSector; // 0x08 0x0C 0x10 0x14
} DISK_GEOMETRY;
typedef struct __attribute__((packed)) PARTITION_INFORMATION {
uint64_t StartingOffset, PartitionLength;
uint32_t HiddenSectors, PartitionNumber;
uint8_t PartitionType, BootIndicator, RecognizedPartition, RewritePartition;
uint64_t StartingOffset, PartitionLength; // 0x00 0x08
uint32_t HiddenSectors, PartitionNumber; // 0x10 0x14
uint8_t PartitionType, BootIndicator, RecognizedPartition, RewritePartition; // 0x18 0x19 0x20 0x21
} PARTITION_INFORMATION;

View file

@ -7,6 +7,10 @@ void *memcpy(void *dest, const void *src, size_t n) {
return dest;
}
char *strcpy(char *dest, const char *src) {
return (char *) memcpy(dest, src, strlen(src) + 1);
}
void *memset(void *ptr, int value, size_t num) {
auto chrs = (uint8_t *) ptr;
while(num--)

View file

@ -3,6 +3,7 @@
typedef unsigned long size_t;
void *memcpy(void *dest, const void *src, size_t n);
char *strcpy(char *dest, const char *src);
void *memset(void * ptr, int value, size_t num);
size_t strlen(const char *str);
int strcmp(const char *str1, const char *str2);

View file

@ -5,8 +5,6 @@ void NTAPI kernel_KeInitializeDpc(
PKDEFERRED_ROUTINE DeferredRoutine,
PVOID DeferredContext
) {
log("KeInitializeDPC");
Dpc->Number = 0;
Dpc->DeferredRoutine = DeferredRoutine;
Dpc->Type = DpcObject;

View file

@ -8,7 +8,6 @@ NTSTATUS NTAPI kernel_NtOpenFile(
uint32_t ShareAccess,
uint32_t OpenOptions
) {
log("NtOpenFile('%s', 0x%08x, 0x%08x)", ObjectAttributes->ObjectName->Buffer, DesiredAccess, OpenOptions);
auto flags = FSFlags::READ;
if(FLAG(DesiredAccess, FILE_WRITE_DATA))
flags |= FSFlags::WRITE;
@ -32,12 +31,6 @@ NTSTATUS NTAPI kernel_NtCreateFile(
IN ULONG CreateDisposition,
IN ULONG CreateOptions
) {
log("NtCreateFile('%s', 0x%08x, 0x%08x, 0x%08x)",
ObjectAttributes->ObjectName->Buffer,
DesiredAccess,
CreateDisposition,
CreateOptions
);
auto flags = FSFlags::READ;
if(CreateDisposition == FILE_CREATE || CreateDisposition == FILE_OPEN_IF)
flags |= FSFlags::CREATE;
@ -106,6 +99,25 @@ NTSTATUS NTAPI kernel_NtDeviceIoControlFile(
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;
@ -118,12 +130,8 @@ NTSTATUS NTAPI kernel_NtQueryVolumeInformationFile(
IN ULONG Length,
IN FS_INFORMATION_CLASS FileInformationClass
) {
if(IoStatusBlock)
debug("Ignoring status block");
switch(FileInformationClass) {
case FileFsSizeInformation: {
log("FsSizeInformation");
auto info = (FILE_FS_SIZE_INFORMATION *) FileInformation;
// Test XBE *requires* bytes per allocation unit == 16kb!
info->BytesPerSector = 4096; // 4KB sectors
@ -139,10 +147,30 @@ NTSTATUS NTAPI kernel_NtQueryVolumeInformationFile(
}
NTSTATUS NTAPI kernel_IoCreateSymbolicLink(
IN PSTRING SymbolicLinkName,
IN PSTRING DeviceName
PSTRING SymbolicLinkName,
PSTRING DeviceName
) {
log("IoCreateSymbolicLink('%s', '%s')", SymbolicLinkName->Buffer, DeviceName->Buffer);
// 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;
}

View file

@ -50,6 +50,18 @@ NTSTATUS NTAPI kernel_NtOpenFile(
uint32_t OpenOptions
);
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
);
NTSTATUS NTAPI kernel_NtReadFile(
HANDLE FileHandle,
HANDLE Event,
@ -85,6 +97,19 @@ NTSTATUS NTAPI kernel_NtDeviceIoControlFile(
ULONG OutputLength
);
NTSTATUS NTAPI kernel_NtFsControlFile(
HANDLE FileHandle,
HANDLE Event,
PVOID ApcRoutine,
PVOID ApcContext,
PVOID IoStatusBlock,
ULONG IoControlCode,
PVOID InputBuffer,
ULONG InputLength,
PVOID OutputBuffer,
ULONG OutputLength
);
NTSTATUS NTAPI kernel_NtClose(HANDLE handle);
NTSTATUS NTAPI kernel_NtQueryVolumeInformationFile(
@ -100,16 +125,15 @@ NTSTATUS NTAPI kernel_IoCreateSymbolicLink(
IN PSTRING DeviceName
);
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
NTSTATUS NTAPI kernel_NtOpenSymbolicLinkObject(
HANDLE *LinkHandle,
OBJECT_ATTRIBUTES *ObjectAttributes
);
NTSTATUS NTAPI kernel_NtQuerySymbolicLinkObject(
HANDLE LinkHandle,
STRING *LinkTarget,
uint32_t *ReturnedLength
);
extern uint32_t kernel_HalDiskCachePartitionCount;

View file

@ -19,10 +19,6 @@ NTSTATUS NTAPI kernel_NtAllocateVirtualMemory(
uint32_t AllocationType,
uint32_t Protect
) {
log(
"NtAllocateVirtualMemory(0x%08x, %i, 0x%08x, 0x%08x, 0x%08x)",
*BaseAddress, (ZeroBits != NULL) ? *ZeroBits : -1, *RegionSize, AllocationType, Protect
);
*BaseAddress = (void *) (((uint32_t) *BaseAddress) & ~0xFFF);
*RegionSize = pagepad(*RegionSize);
if((AllocationType & MEM_COMMIT) == MEM_COMMIT) {
@ -36,7 +32,18 @@ NTSTATUS NTAPI kernel_NtAllocateVirtualMemory(
bailout("Unsupported allocation type %x", AllocationType);
}
log("Allocated memory at 0x%08x", *BaseAddress);
return STATUS_SUCCESS;
}
NTSTATUS NTAPI kernel_NtFreeVirtualMemory(
void **BaseAddress,
uint32_t *FreeSize,
uint32_t FreeType
) {
*BaseAddress = (void *) (((uint32_t) *BaseAddress) & ~0xFFF);
*FreeSize = pagepad(*FreeSize);
unmap(*BaseAddress, *FreeSize / 4096);
return STATUS_SUCCESS;
}

View file

@ -15,3 +15,9 @@ NTSTATUS NTAPI kernel_NtAllocateVirtualMemory(
uint32_t AllocationType,
uint32_t Protect
);
NTSTATUS NTAPI kernel_NtFreeVirtualMemory(
void **BaseAddress,
uint32_t *FreeSize,
uint32_t FreeType
);

View file

@ -7,6 +7,7 @@ XBOX_HARDWARE_INFO kernel_XboxHardwareInfo = {
0,0,0,0
};
uint32_t kernel_XboxKrnlVersion = 0;
char *kernel_XeImageFileName = 0;
void kernel_DbgPrint(char *format, ...) {
va_list arglist;
@ -39,7 +40,7 @@ void NTAPI kernel_HalRegisterShutdownNotification(
PHAL_SHUTDOWN_REGISTRATION ShutdownRegistration,
CHAR Register
) {
log("HalRegisterShutdownNotification");
// XXX: Implement
}
NTSTATUS NTAPI kernel_ExQueryNonVolatileSetting(

View file

@ -5,6 +5,7 @@ extern uint32_t kernel_LaunchDataPage;
extern uint32_t kernel_IdexChannelObject;
extern XBOX_HARDWARE_INFO kernel_XboxHardwareInfo;
extern uint32_t kernel_XboxKrnlVersion;
extern char *kernel_XeImageFileName;
void kernel_DbgPrint(char *format, ...);
void NTAPI kernel_RtlAssert(char *message, char *filename, uint32_t line, uint32_t unk);

View file

@ -13,8 +13,6 @@ void threadex_proxy(uint32_t tid, uint32_t up) {
init_tib(tid);
log("Starting xbthread at %08x", s.StartRoutine);
log("StartContext1 %08x", s.StartContext1);
log("StartContext2 %08x", s.StartContext2);
asm(
"mov %0, %%esi\n"
@ -73,12 +71,12 @@ NTSTATUS NTAPI kernel_RtlInitializeCriticalSection(RTL_CRITICAL_SECTION *crit) {
}
NTSTATUS NTAPI kernel_RtlEnterCriticalSection(RTL_CRITICAL_SECTION *crit) {
log("RtlEnterCriticalSection");
// XXX: Implement
kernel_RtlInitializeCriticalSection(crit); // XBEs don't seem to do this.
return 0;
}
void NTAPI kernel_RtlLeaveCriticalSection(RTL_CRITICAL_SECTION *crit) {
log("RtlLeaveCriticalSection");
// XXX: Implement
}

View file

@ -3,8 +3,6 @@
typedef void(*xbe_ep_t)();
void entrypoint() {
log("NightBeliever initializing...");
auto xbe = get_xbebase();
auto thunk = (uint32_t *) xbe->thunk;
while(*thunk) {
@ -21,7 +19,6 @@ void entrypoint() {
auto hack2 = new uint8_t[0x20];
hack[0x3c / 4] = (uint32_t) hack2 + 0x7FFF0000;
log("Calling entrypoint.");
auto ep = (xbe_ep_t) xbe->oep;
ep();
log("Returned from entrypoint.");

View file

@ -280,7 +280,6 @@ void *malloc(size_t size)
if ( l_initialized == 0 )
{
log("initializing malloc");
#ifdef DEBUG
printf("%s\n","liballoc initializing.");
#endif

View file

@ -372,7 +372,7 @@ for fn in glob.glob('XboxKernel/*.hpp'):
if fn != 'XboxKernel/KernelThunk.hpp':
rh += file(('' if len(sys.argv) == 1 else sys.argv[1] + '/') + fn, 'r').read() + '\n'
def defined(sym):
if re.search(r'[\s^]kernel_' + sym + r'[;\s(]', rh, re.M | re.S):
if re.search(r'kernel_' + sym + r'[;\s(]', rh, re.M | re.S):
return True
return False

View file

@ -64,7 +64,7 @@ for i, (name, args) in enumerate(calls.items()):
print >>zhc, '\t\tcase %i: { // %s' % (i, name)
if len(args) > 1:
print >>zhh, 'typedef struct hypercall_%s {' % name
print >>zhh, 'typedef struct __attribute__((packed)) hypercall_%s {' % name
for arg, type, mapped in args:
print >>zhh, '\t%s %s;' % (mapped, arg)
print >>zhh, '} hypercall_%s_t;' % name