Ejemplo n.º 1
0
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;
}
Ejemplo n.º 2
0
Archivo: io.c Proyecto: sherpya/nloader
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);
    }