• Как решить проблему с Find?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    При ситуации, когда был найден вариант файла подобного вида, скрипт впадал в кому
    Экспроприатор (16 сер.) - web-dl1080p.mkv*

    Взять аргументы в кавычки:
    Serials_file_destination=$(basename $Serials_destination)
    заменить на
    Serials_file_destination=$(basename "$Serials_destination")
    и по аналогии в других местах: dirname, mv.
    Ответ написан
  • Копирование на fasm с указанием пути?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Предполагаю как-то через ExpandEnvironmentString.
    Но не могу разобраться.

    В чём разобраться, в ExpandEnvironmentStrings? Дай ей на вход свою строку с переменными, буфер куда она запишет строку с подставленными значениями и его размер. Потом этот буфер дай на вход CopyFile.
    Ответ написан
    1 комментарий
  • Как общаться с процессом в Linux?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Нужно написать программу, которая будет посылать в stdin программы данные и забирать из stdout.

    Что я делаю не так?


    Ты пользуешься не тем методом. pidfd_open делает совсем не то, что ты ожидаешь, см. раздел "Use cases for PID file descriptors" по приведённой ссылке.

    Взаимодействие с дочерним процессом через stdin/stdout обычно реализуется через пайп. Вот пример.

    Вот ещё пример который делает exec

    #include <unistd.h>
    
    int main()
    {
            int fd[2][2];
            pipe(fd[0]);
            pipe(fd[1]);
            pid_t pid_fork = fork();
            if (!pid_fork) {
                    // Дочерний процесс
                    close(fd[0][1]);
                    close(fd[1][0]);
                    dup2(fd[0][0], STDIN_FILENO);
                    dup2(fd[1][1], STDOUT_FILENO);
                    execl("/usr/bin/tr", "/usr/bin/tr", "l", "r", NULL);
            } else {
                    // Родительский процесс
                    close(fd[0][0]);
                    close(fd[1][1]);
                    char buf[1000];
                    ssize_t sz;
    
                    write(fd[0][1], "hello, world\n", sizeof("hello, world\n") - 1);
                    close(fd[0][1]);
                    sz = read(fd[1][0], buf, sizeof(buf));
                    if (sz > 0) {
                            write(STDOUT_FILENO, buf, sz);
                    }
            }
            return 0;
    }
    Ответ написан
    Комментировать
  • Ошибка с подключением к самописному ftp серверу, в чем проблема?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    в чем проблема?

    У тебя гонка между этим:
    if(pthread_create(&tid, NULL, new_connection, serv)) qDebug() << "ошибка создания потока подключения";
            server->num_of_users++;

    и этим:
    descriptor = *(server->sa[server->num_of_users-1]);


    С точки зрения работы с потоками код написан никак.
    Ответ написан
  • Как сказать процессору "выполни это"?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Как сказать процессору «выполни это»?

    Превратить это в бинарник для начала и посмотреть, что там. Это можно (было бы) сделать командой xxd -r dump, но в твоём дампе странный порядок байтов в словах. Можно сначала перевернуть байты, а потом прогнать через xxd:
    sed 's/\([^ ]*\)/\1/;s/ \(..\)\(..\)/ \2\1/g' < dump | xxd -r > bin
    . Прогнав полученный код через дизассемблер можно понять (по переходу к адресу 0x7c05), что это код для бут-сектора:
    $ objdump -b binary -m i8086 -D bin        
    
    bin1:     file format binary
    
    Disassembly of section .data:
    
    00000000 <.data>:
       0:   ea 05 7c 00 00          ljmp   $0x0,$0x7c05
       5:   31 c0                   xor    %ax,%ax
    ...

    Дальше можно записать этот код в образ диска и попытаться загрузиться с него:
    $ head -c 254 /dev/zero >> bin
    $ printf "\x55\xaa" >> bin
    $ qemu-system-i386 -hda bin -d in_asm,exec -D log

    Поискав в созданном логе адрес 7c00 можно увидеть, что код делает при выполнении:
    ----------------
    IN:
    0x00007c00:  ea 05 7c 00 00           ljmpw    $0x0:$0x7c05
    
    Trace 0: 0x7f7a98164f00 [00000000/00007c00/0x40]
    ----------------
    IN:
    0x00007c05:  31 c0                    xorw     %ax, %ax
    0x00007c07:  8e d8                    movw     %ax, %ds
    0x00007c09:  8e d0                    movw     %ax, %ss
    
    Trace 0: 0x7f7a98165040 [00000000/00007c05/0x40]
    ----------------
    IN:
    0x00007c0b:  bc 00 7c                 movw     $0x7c00, %sp
    
    Trace 0: 0x7f7a98165180 [00000000/00007c0b/0x48]
    ----------------
    IN:
    0x00007c0e:  88 16 db 7c              movb     %dl, 0x7cdb
    0x00007c12:  31 c0                    xorw     %ax, %ax
    0x00007c14:  8e c0                    movw     %ax, %es
    0x00007c16:  bb 00 80                 movw     $0x8000, %bx
    0x00007c19:  8a 16 db 7c              movb     0x7cdb, %dl
    0x00007c1d:  b6 00                    movb     $0, %dh
    0x00007c1f:  b1 02                    movb     $2, %cl
    0x00007c21:  b5 00                    movb     $0, %ch
    0x00007c23:  b0 30                    movb     $0x30, %al
    0x00007c25:  e8 53 00                 callw    0x7c7b
    
    Trace 0: 0x7f7a98165280 [00000000/00007c0e/0x40]
    ----------------
    IN:
    0x00007c7b:  b4 02                    movb     $2, %ah
    0x00007c7d:  cd 13                    int      $0x13

    -- он хочет загрузить 48 секторов начиная со второго с текущего диска в память по адресу 0x8000, потом делает какую-то скучную фигню, а потом…
    ----------------
    IN:
    0x00007c2f:  fa                       cli
    0x00007c30:  0f 01 16 f4 7c           lgdtw    0x7cf4
    0x00007c35:  0f 20 c0                 movl     %cr0, %eax
    0x00007c38:  66 83 c8 01              orl      $1, %eax
    0x00007c3c:  0f 22 c0                 movl     %eax, %cr0
    
    Linking TBs 0x7f7a98167580 [00007c2b] index 0 -> 0x7f7a981676c0 [00007c2f]
    Trace 0: 0x7f7a981676c0 [00000000/00007c2f/0x40]
    ----------------
    IN:
    0x00007c3f:  ea 44 7c 08 00           ljmpw    $0x8:$0x7c44
    
    Trace 0: 0x7f7a981678c0 [00000000/00007c3f/0xc0]
    ----------------
    IN:
    0x00007c44:  66 b8 10 00              movw     $0x10, %ax
    0x00007c48:  8e d8                    movl     %eax, %ds
    
    Trace 0: 0x7f7a98167a00 [00000000/00007c44/0x90]
    ----------------
    IN:
    0x00007c4a:  8e c0                    movl     %eax, %es
    
    Trace 0: 0x7f7a98167b40 [00000000/00007c4a/0x90]
    ----------------
    IN:
    0x00007c4c:  8e e0                    movl     %eax, %fs
    0x00007c4e:  8e e8                    movl     %eax, %gs
    0x00007c50:  8e d0                    movl     %eax, %ss
    
    Trace 0: 0x7f7a98167c80 [00000000/00007c4c/0x90]
    ----------------
    IN:
    0x00007c52:  bc 00 c0 07 00           movl     $0x7c000, %esp
    
    Trace 0: 0x7f7a98167dc0 [00000000/00007c52/0xb8]
    ----------------
    IN:
    0x00007c57:  e8 a4 03 00 00           calll    0x8000

    …переключается в защищённый режим и вызывает только что загруженный код.

    как например запихнуть это в exe файл?

    в exe-файл это запихнуть можно, но в таком виде как есть -- это бесполезно, потому что этот код привязан к абсолютным адресам.
    Ответ написан
    Комментировать
  • Как прокручивать консоль Arch linux?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Как прокручивать консоль Arch linux?

    "Консоль" в смысле "голый виртуальный терминал"? Никак. Можно запускать какой-нибудь screen или tmux в виртуальном терминале и "прокручивать" вывод его средствами (не самыми, впрочем, очевидными: ctrl-a-esc).
    Ответ написан
  • Как проверить, является ли файл PE? (то есть, .exe он или нет)?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    не понимаю, чем в данном случае является szFile

    Судя по тому, как он используется, szFile -- указатель на буфер с содержимым файла. Почему такой странный выбор типа -- действительно непонятно, логично было бы использовать const void *.
    Ответ написан
    Комментировать
  • Изменить объем раздела /home linux?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Могу ли я на время удалить swap, либо создать его из свободного места, чтобы добавить свободное место в /home?

    легко. ты это можешь сделать даже из запущенного линукса, отключи его (swapoff /dev/nvme1n1p8), а дальше -- делай с разделом что хочешь.
    Ответ написан
    1 комментарий
  • Как обходить возврат функции epoll_wait?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    когда из слушающих сокетов ловиться соединение(accept), оно добовляется в набор для отслеживания еполл_вайтом и тут же возвращается с событием 4. Как? По логике если ты ко мне подключился, я жду от тебя "новостей" с цифрой 1.

    4 -- это EPOLLRDHUP? По логике, если ты принял входящее соединение, а другая сторона на нём сделала shutdown(…, SHUT_WR), чтобы данные могли идти только от тебя к клиенту, то такое поведение ты и получишь.
    Ответ написан
    6 комментариев
  • Как увеличить памяти для переменных и функций ядра на C?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    При достижении или больше определённого количества переменных или функций, перестают работать все string literals в ядре C

    Определённого -- это какого?

    Вот тут
    mov bx, KERNEL_OFFSET ; Read from disk and store in 0x1000
        mov dh, 54 ;31 or 54

    ты 54 сектора ядра загружаешь в память. Есть какая-нибудь корреляция?

    как можно увеличить память для них?

    код ядра ты не привёл, что там ломается можно только догадываться, ну ты понял.
    Ответ написан
  • Почему после вызова Message Box, GetKeyState() не считывает состояние клавиши?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Почему … GetKeyState() не считывает состояние клавиши?

    Потому что чтобы GetKeyState работал, поток должен обрабатывать свою очередь сообщений (например, циклом, наподобие этого).
    Из man GetKeyState:
    The key status returned from this function changes as a thread reads key messages from its message queue. The status does not reflect the interrupt-level state associated with the hardware. Use the GetAsyncKeyState function to retrieve that information.
    Ответ написан
    Комментировать
  • Как распаковать все файлы из qcow2?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    qcow2 -- это формат представления блочного устройства, на нём нет файлов, на нём может быть файловая система или разделы с файловыми системами. Можно превратить qcow2 в обычный raw образ командой qemu-img: qemu-img dd -O raw if=file.qcow2 of=file.raw.
    Получившийся сырой образ можно анализировать стандартными средствами. Если там одна файловая система, можно её просто примонтировать через loop: mkdir fs ; sudo mount file.raw fs. Если там таблица разделов, можно каким-нибудь kpartx создать устройства для каждого из разделов и примонтировать нужные:
    $ mkdir fs ; sudo kpartx -av file.raw 
    add map loop0p1 (254:4): 0 65536 linear 7:0 2048
    add map loop0p2 (254:5): 0 2029568 linear 7:0 67584
    $ sudo mount /dev/mapper/loop0p2 fs

    Естественно, если на разделах какой-нибудь LVM или LUKS прийдётся делать дополнительные телодвижения чтобы добраться до файлов.
    Ответ написан
    Комментировать
  • Какое приложение/процесс отправляет arp запросы?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    если роутер отправил мне-компьютеру запрос, то какой процесс будет отвечать на него?

    Cтандартным образом -- будет отвечать вот это место в сетевом стеке.

    В качестве альтернативы, кто угодно с привилегией CAP_NET_RAW может создать сырой сокет и через него получать и посылать всё что угодно, включая ARP-запросы и ответы.

    за получение ip по DHCP отвечает клиент

    можно попросить ядро сконфигурировать сеть через DHCP опцией командной строки ядра ip=dhcp, тогда будет работать код вот из этого файлика.
    Ответ написан
    1 комментарий
  • Почему для драйвера мыши используется тот же порт, что и в драйвере клавиатуры?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Такие же порты используются при нахождении нажатой клавиши на клавиатуре, так как они могут быть и там и тут?

    Это называется мультиплексирование. В конце концов PS/2 -- довольно сложный интерфейс, работающий с командами, а не то чтобы клавиатура была напрямую подсоединена к одному из портов PC. См. https://wiki.osdev.org/Mouse_Input#Keyboard.2FAux_...
    Ответ написан
    Комментировать
  • Почему scanf некорректно работает в FASM?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Функция scanf крушит программу

    Скорее всего ты ошибаешься, и "программу крушит" вот это:
    push numderA
    call [printf]

    printf ожидает первым параметром форматную строку.
    Ответ написан
    6 комментариев
  • У меня программа не выводит числа в консоль, как исправить?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Моя программа … выводит адрес на месте первого числа и букву на месте второго числа.
    как исправить?

    1) посмотреть, какие параметры ожидает функция printf которую ты используешь. Форматная строка для двух целых чисел -- "%d %d".
    2) узнать, как параметры передаются в функцию и что делать после возвращения из неё. Ты используешь push razmer чтобы передать адрес переменной razmer в scanf, но в printf нужно передать не адрес переменной, а её значение. Например так:
    mov eax, [razmer]
    push eax


    Помимо этого в коде есть и другие ошибки: razmer и razmer2 определены как rb 1, а должны бы быть определены как rd 1, поскольку формат %d для scanf приведёт к записи 4 байт. %t -- нет такого формата в scanf, имелся в виду, наверно, %d.
    Ответ написан
    Комментировать
  • Корректно ли сравнивать цифры объявленные как строки, т.е объектом string?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Как в ситуации ниже, поступает компилятор?

    Компилятор вставляет вызов string::operator <. Если это std::string, то оператор выполняет лексикографическое сравнение, т.е. сравнивает символы обеих строк по очереди до первой различающейся пары, меньшей будет та строка, которой принадлежит символ с меньшим кодом.
    В примере "100.05" < "100.03" результат будет false потому что 5 > 3.

    Могут ли быть какие-то проблемы

    Для такого сравнения строковые представления чисел должны начинаться разрядами одного веса. Т.е. можно сравнивать "100.05" и "099.1" (первая цифра и слева и справа -- сотни), но нельзя сравнивать "100.05" и "99.1" (слева первая цифра -- сотни, справа -- десятки).
    Ответ написан
    Комментировать
  • Почему не получается деление div на ассемблере в С++?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Почему не получается деление div на ассемблере в С++?
    char b1 = 3, b2, b3 = 1 , res2; //1 байт el, bl, ah    ]]  cbw -> short
      short w1= 1000, w2 = 500, w3 = 2;
    //(w1 - w2) * w3 / b1

    div bl

    Потому что (1000 - 500) * 2 / 3 = 333, а это не влезает в один байт результата, а значит ты получаешь исключение. См.
    Ответ написан
    Комментировать
  • Как исправить ошибку "Кадр не находится в модуле" при создании потока?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    "Кадр не находится в модуле". Подскажите с чем это может быть связано
    HANDLE h = CreateThread(
        NULL,
        0,
        factorial(gn),
        NULL,
        NULL,
        NULL
    );

    Третий параметр CreateThread -- указатель на функцию, которая будет запущена в создаваемом потоке. А у тебя записано скорее всего что-то другое. Если ты хотел запустить функцию factorial в потоке, она должна 1) иметь определённый прототип (вот такой), и 2) в функцию CreateThread надо передать её адрес, а не результат её вызова (например, так: CreateThread(NULL, 0, factorial, NULL, NULL, NULL)). 3) если ты сделаешь эти два изменения, тебе прийдётся также переделать передачу параметра в функцию factorial и получение результата её работы.
    Ответ написан
  • Как реализовать _open() для добавления своих потоков ввода-вывода?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Почитать про libgloss, понять что надо самому разбирать пути переданные в параметре name и где-то хранить данные о том, что за файл и как был открыт. Понять, как именно ты хочешь "реализовать работу со своими устройствами" и… реализовать её.
    Ответ написан