NTSTATUS NTAPI NtTerminateThread(HANDLE ThreadHandle, NTSTATUS ExitStatus) { ThreadHandle = GetThreadHandle(ThreadHandle); if (ExitStatus != STATUS_SUCCESS) { fprintf(stderr, "ntdll.NtTerminateThread(\"%s\", 0x%08x)\n", strhandle(ThreadHandle), ExitStatus); abort(); } Log("ntdll.NtTerminateThread(\"%s\", 0x%08x)\n", strhandle(ThreadHandle), ExitStatus); ThreadHandle->thread.ExitStatus = ExitStatus; #ifdef THREADED pthread_exit(&ThreadHandle->thread.ExitStatus); #else longjmp(env, 1); #endif return STATUS_SUCCESS; }
NTSTATUS NTAPI NtReadFile(HANDLE FileHandle, HANDLE Event, PIO_APC_ROUTINE ApcRoutine, PVOID ApcContext, PIO_STATUS_BLOCK IoStatusBlock, PVOID Buffer, ULONG Length, PLARGE_INTEGER ByteOffset, PULONG Key) { int count; CHECK_HANDLE(FileHandle, HANDLE_FILE); CHECK_POINTER(IoStatusBlock); #ifdef REDIR_IO { NTSTATUS res = ftbl.nt.NtReadFile(FileHandle->file.fh, Event, ApcRoutine, ApcContext, IoStatusBlock, Buffer, Length, ByteOffset, Key); Log("ntdll.NtReadFile(\"%s\", %p, %d, %lld) = 0x%08x\n", strhandle(FileHandle), Buffer, Length, ByteOffset ? ByteOffset->QuadPart : 0, res); return res; } #endif Log("ntdll.NtReadFile(\"%s\", %p, %d, %lld)\n", strhandle(FileHandle), Buffer, Length, ByteOffset ? ByteOffset->QuadPart : 0); if (FileHandle->file.fh == fileno(stdin)) { int c; KEYBOARD_INPUT_DATA *KeyboardData; if (Length != sizeof(KEYBOARD_INPUT_DATA)) return (IoStatusBlock->u.Status = STATUS_INVALID_PARAMETER); if ((c = GetChar()) != EOF) { char *name = strhandle(FileHandle); KeyboardData = (KEYBOARD_INPUT_DATA *) Buffer; KeyboardData->UnitId = (strlen(name) >= 24) ? name[23] - '0' : 0; KeyboardData->MakeCode = AsciiToScan[c]; KeyboardData->Flags = KEY_MAKE; IoStatusBlock->Information = Length; } else IoStatusBlock->Information = 0; return (IoStatusBlock->u.Status = STATUS_SUCCESS); } if (!IsValidHandle(FileHandle->file.fh)) return (IoStatusBlock->u.Status = STATUS_INVALID_HANDLE); if (ByteOffset && (ByteOffset->QuadPart != FILE_USE_FILE_POINTER_POSITION)) { if (FileHandle->file.st.st_size < ByteOffset->QuadPart) { fprintf(stderr, "ntdll.NtReadFile() - Invalid seek -> %llu - max %llu\n", ByteOffset->QuadPart, FileHandle->file.st.st_size); return (IoStatusBlock->u.Status = STATUS_INVALID_PARAMETER); } #ifdef _WIN32 SetFilePointerEx(FileHandle->file.fh, *ByteOffset, NULL, 0); } if (!ReadFile(FileHandle->file.fh, Buffer, Length, &IoStatusBlock->Information, NULL)) return (IoStatusBlock->u.Status = STATUS_UNSUCCESSFUL); #else lseek(FileHandle->file.fh, ByteOffset->QuadPart, SEEK_SET); }