mirror of
https://github.com/daeken/Zookeeper.git
synced 2024-05-15 11:29:33 -04:00
Completely pass initialization of binaries.
This commit is contained in:
parent
a32a786890
commit
2aeb66c4ab
|
@ -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;
|
||||
|
|
12
Ioctls.hpp
12
Ioctls.hpp
|
@ -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;
|
||||
|
|
|
@ -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--)
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -5,8 +5,6 @@ void NTAPI kernel_KeInitializeDpc(
|
|||
PKDEFERRED_ROUTINE DeferredRoutine,
|
||||
PVOID DeferredContext
|
||||
) {
|
||||
log("KeInitializeDPC");
|
||||
|
||||
Dpc->Number = 0;
|
||||
Dpc->DeferredRoutine = DeferredRoutine;
|
||||
Dpc->Type = DpcObject;
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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
|
||||
);
|
||||
|
|
|
@ -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(
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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
|
||||
}
|
||||
|
|
|
@ -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.");
|
||||
|
|
|
@ -280,7 +280,6 @@ void *malloc(size_t size)
|
|||
|
||||
if ( l_initialized == 0 )
|
||||
{
|
||||
log("initializing malloc");
|
||||
#ifdef DEBUG
|
||||
printf("%s\n","liballoc initializing.");
|
||||
#endif
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in a new issue