Ru-Board.club
← Вернуться в раздел «Прикладное программирование»

» Вопросы по программированию на C/С++

Автор: bomzzz
Дата сообщения: 02.03.2013 11:02
PRTL_USER_PROCESS_PARAMETERS ни у кого нету описание вот этой структуры? скачал студию 2008 и DDK расковырял вроде все файлы проверил не нашел. на мсдн есть только для windows desktop c ней код не компилится пишет ошибка, с w2kundoc.inc код компилится но не работает, не могу ошибку найти. нашел на одном форуме упоминание о запусках процессов в нативных режимах что есть отличие между w2k и wxp, без уточнения в какой структуре конкретно
Автор: Abs62
Дата сообщения: 02.03.2013 11:08
kvazigorynich

Цитата:
И все-таки под виндой кому можно скормить makefile.in для сборки проекта?

Скрипту Configure, который входит в проект. Он запускается под MSYS и генерит makefile. Стандартная операция для линуксовых проектов.
Автор: bomzzz
Дата сообщения: 02.03.2013 11:27
объясните пожалуйста вот в этом куске кода при вызове функции RtlCreateProcessParameters ей передается указатель на структуру Env или сама структура запихивается в стек?


Цитата:
NTSTATUS CreateNativeProcess(IN PCWSTR file_name, IN PCWSTR cmd_line, OUT PHANDLE hProcess)
{
UNICODE_STRING fname, nt_file;
PCWSTR file_part;
UNICODE_STRING EnvString, NullString, UnicodeSystemDriveString;
NTSTATUS status; // Status
UNICODE_STRING imgname; // ImageName
UNICODE_STRING imgpath; // Nt ImagePath
UNICODE_STRING dllpath; // Nt DllPath (DOS Name)
UNICODE_STRING cmdline; // Nt CommandLine
PRTL_USER_PROCESS_PARAMETERS processparameters; // ProcessParameters
RTL_USER_PROCESS_INFORMATION processinformation={0}; // ProcessInformation
WCHAR Env[2] = { 0,0 }; // Process Envirnoment
PKUSER_SHARED_DATA SharedData = (PKUSER_SHARED_DATA)USER_SHARED_DATA; // Kernel Shared Data

*hProcess = NULL;

RtlDosPathNameToNtPathName_U(file_name, &nt_file, &file_part, NULL);

RtlInitUnicodeString(&imgpath, nt_file.Buffer); // Image path
RtlInitUnicodeString(&imgname, file_part); // Image name
RtlInitUnicodeString(&dllpath, SharedData->NtSystemRoot); // DLL Path is %SystemRoot%
RtlInitUnicodeString(&cmdline, cmd_line); // Command Line parameters

status = RtlCreateProcessParameters(&processparameters, &imgname, &dllpath, &dllpath, &cmdline, Env, 0, 0, 0, 0);

if (!NT_SUCCESS(status))
{
RtlCliDisplayString("RtlCreateProcessParameters failed\n");
return STATUS_UNSUCCESSFUL;


Добавлено:

Цитата:
PKUSER_SHARED_DATA SharedData = (PKUSER_SHARED_DATA)USER_SHARED_DATA

и еще такой вопрос вот тут надо как до дополнительно инициализировать память?

у меня вот так написано в инклуде. и мне нужен параметр +30h. но при обращении к этой памяти процесс вылетает

Цитата:
KI_USER_SHARED_DATA    equ 0ffdf0000h;0xFFDF0000
SharedUserData        equ KI_USER_SHARED_DATA
Автор: kvazigorynich
Дата сообщения: 02.03.2013 14:16
Abs62

Наконец-то понял в чем там суть. Кто-нибудь в курсе где взять ликукор?

В смысле


Код: cannot find -licucore
Автор: vlary
Дата сообщения: 02.03.2013 15:59
bomzzz

Цитата:
при вызове функции RtlCreateProcessParameters ей передается указатель на структуру Env или сама структура запихивается в стек?
С чего ты решил, что Env - структура?
Это обычный массив WCHAR. Ну и как в любом массиве, имя массива одновременно является и указателем на этот массив.
Автор: bomzzz
Дата сообщения: 02.03.2013 16:06
ну потому что это переменная окружения, а по коду у меня сложилось впечатление, что если перед именем стоит & то это указатель, если конечно имя сразу как поинтер не задекларировано. но вот в этом случае я не могу разобраться, потому что вроде по описанию должен указатель передаваться, а по коду чета понять не могу тут указатель или она сама засовываетсся и как назло у нее размерность четыре байта. в итоге я программу дезассемблировал и увидел что там поинтер

недокументированные все функции в разных местах могут быть по разному описаны, приходится методом тыка пробираться

Добавлено:
[more]static
NTSTATUS
__fastcall
_ExecuteImage(
IN PUNICODE_STRING ImageFileName,
IN PUNICODE_STRING CommandLine OPTIONAL,
IN PUNICODE_STRING Curdir OPTIONAL,
IN PUNICODE_STRING Environment OPTIONAL,
OUT NTSTATUS* ExitCode OPTIONAL
)
{
    NTSTATUS Status;
    PRTL_USER_PROCESS_PARAMETERS pp;
    RTL_PROCESS_INFO pi;


    //
    // Create process.
    //

    Status = RtlCreateProcessParameters(&pp,
                                        ImageFileName,
                                        NULL,
                                        Curdir,
                                        CommandLine,
                                        Environment,
                                        NULL,
                                        NULL,
                                        NULL,
                                        NULL
                                     );

    if(STATUS_SUCCESS != Status)
    {
        return Status;
    }

    //
    // Call Rtl to create the process.
    //

    Status = RtlCreateUserProcess(
                                 ImageFileName,
                                 OBJ_CASE_INSENSITIVE,
                                 pp,
                                 NULL,
                                 NULL,
                                 NULL,
                                 TRUE,
                                 NULL,
                                 NULL,
                                 &pi
                                 );



    RtlDestroyProcessParameters(pp);[/more]

а вот тут скажите пожалуйста что значит - в одной функции стоит &pp в другой просто pp, это что ли указатель на указатель получается?
Автор: kvazigorynich
Дата сообщения: 02.03.2013 16:49
Собрал чтоб её!

Правда есть несколько странностей. Может у кого мысли будут по этому поводу?

1. Сборка требует dll'ки. С теми либами которые я собирал у себя сборка не проходила, я взял на авось отсюда https://raw.github.com/dwimperl/perl-5.12.3.0/master/c/lib/libxml2.a. Все собралось, но либы видать не статические?

2. Почему-то требует dll'ки с подчеркиванием на конце и без. Dll'ку подсунул одну и туже. Работает, но нафига ей две одинаковые с разными именами? Я это конечно пофиксил. Просто в exe убрал подчеркивание из имени dll и в конце нолик добавил. Но все-таки хотелось бы понять причину.

Прога при использовании показала идентичный результат с оригиналом. Значит как я понимаю сборка прошла удачно, но с непонятными косяками по вышеозначенным двум пунктам.

Если кто-то что-то может подсказать, буду рад выслушать.
Автор: bomzzz
Дата сообщения: 02.03.2013 16:55
возможно они должны быть разными. но для твоей программы оказалось не критично вот для масма 10-го надо две такие

Автор: kotlomoy
Дата сообщения: 02.03.2013 17:04
bomzzz

Цитата:
а вот тут скажите пожалуйста что значит - в одной функции стоит &pp в другой просто pp, это что ли указатель на указатель получается?

Похоже на то. Где-то внутри функции создается структура, а возвращается только указатель на нее. &pp указывает, куда положить этот указатель
Автор: ne_viens
Дата сообщения: 02.03.2013 17:05
>bomzzz

В функцию RtlCreateProcessParameters(&pp,...) передаётся адрес указателя pp.
RtlCreateProcessParameters() делает malloc(), заполняет структуру и записывает адрес начала структуры в адрес pp. (*pp = RtlUserProcessParameters;)
Дальше в коде исползуется указатель, который указывает на структуру RTL_USER_PROCESS_PARAMETERS
и в самом конце RtlDestroyProcessParameters() освобождает (free()) память занимаемую структурой.

Автор: kvazigorynich
Дата сообщения: 02.03.2013 17:15
Думаю что в моем случае дела обстоят иначе.

Слева оригинал, требующий dll и с подчеркиванием и без. Справа тот что я поправил. Ему хватает просто dll без подчеркиваний.



И кстати у левого, судя по показаниям плагина, нет зависимостей от dll без подчеркивания.

UPD: Вопрос с подчеркиваниями решился. Просто заменил либы на свои откомпилированные.

Вопрос со статической сборкой никак решить не получается. Как только я подсовываю статическую библиотеку, линкер сразу начинает ругаться на то что функции в libxslt не определены. Самое интересное что эти функции должны быть в libxml2, но в статической libxml2 такое ощущение что их нет.
Автор: bomzzz
Дата сообщения: 02.03.2013 19:15
ne_viens
пасиба, просветление началось.

Добавлено:
ne_viens
ура бсода нет. еще какая то кривость но заработало.

http://undocumented.ntinternals.net/UserMode/Structures/RTL_USER_PROCESS_PARAMETERS.html
Should be set before call RtlCreateProcessParameters.
никогда бы не подумал что тут это имелось ввиду


Добавлено:
я с этим сутки ковырялся. в принципе мог дорыться. я уже пробовал создаваемую структуру разбирать и не мог понять куда оно подевалось.
и с этим проковырялся часов шесть. у меня число от 2000-ка оказывается было
invoke MessageBoxW,0,[7FFE0000h+48],ADDR mestitle,MB_ICONASTERISK
Автор: bomzzz
Дата сообщения: 03.03.2013 07:14
никто такой фигней не пользовался LdrEnumerateLoadedModules
все что нашел http://www.wasm.ru/forum/viewtopic.php?pid=221396

Цитата:
invoke LdrEnumerateLoadedModules, 0, addr MyProc, addr stop

MyProc proc DataTableEntry:DWORD,Parameter:DWORD,StopEnumerate:DWORD
    assume ebx:ptr LDR_DATA_TABLE_ENTRY
    mov ebx, DataTableEntry
    invoke MessageBoxW,0,[ebx].BaseDllName.Buffer,ADDR mestitle,MB_ICONASTERISK
    assume ebx:NOTHING
    mov byte ptr[StopEnumerate], 1
    mov Parameter, 1
    xor eax, eax
    ret
MyProc endp

я уж по всякому перепробовал один раз вызывает функция обратного вызова с именем самой программы, а потом выдает ошибку c00000ef - STATUS_INVALID_PARAMETER_1

почему ни LdrGetDllHandle ни GetModuleHandle не возвращают handle ntoskrnl.exe?
пытаюсь из нее получить адрес функции
invoke LdrGetProcedureAddress, hntoskrnl, $CTA0("InbvResetDisplay"), 302, addr addrInbvResetDisplay;
и по имени и по ординалу фигу. а из user32.dll выдает.

A user-mode application cannot call the entry points in Ntoskrnl.exe, and a kernel-mode driver cannot call the entry points in Ntdll.dll.

Добавлено:
ne_viens
получится так - к командному интерпретатору сделать драйвер, который будет загружаться с помощью NtLoadDriver и вызывать функции ядра недоступные пользовательскому режиму?
Автор: kvazigorynich
Дата сообщения: 03.03.2013 08:59
Я еще попробую поспрашивать про статическую сборку.

Я вроде понимаю в чем проблема, но никак не могу понять почему происходит так.

В статической и динамической версии библиотек функции имеют разные имена. Почему-то в объектных файлах используются функции с именами из динамической библиотеки. А нужно чтобы использовались те что в статической находятся.

Например линкер пишет


Код:
/MinGW/lib\libexslt.a(common.o): In function `exsltNodeSetFunction':
\MinGW\msys\1.0\home\3K\libxslt\libexslt/common.c:71: undefined reference to `_imp__xmlFree'
Автор: bomzzz
Дата сообщения: 03.03.2013 09:45

Цитата:
ne_viens
получится так - к командному интерпретатору сделать драйвер, который будет загружаться с помощью NtLoadDriver и вызывать функции ядра недоступные пользовательскому режиму?

получится. проверил
Автор: AZJIO
Дата сообщения: 03.03.2013 10:16
ne_viens
Можешь прокомментировать пример на русском языке? Желательно по строкам. Сначала я почитал основные разделы в справке, чтобы разобраться, но сам алгоритм понять всё равно сложно.
Автор: Abs62
Дата сообщения: 03.03.2013 10:52
kvazigorynich
Ключ скрипта конфигурации "--disable-shared" пробовали?
Автор: kvazigorynich
Дата сообщения: 03.03.2013 11:28
Abs62

делал так

./configure --enable-static --disable-shared

Этот ключ везде надо использовать? Я имею ввиду при сборке всех библиотек и приложения?
Автор: Abs62
Дата сообщения: 03.03.2013 11:39
kvazigorynich

Цитата:
Этот ключ везде надо использовать? Я имею ввиду при сборке всех библиотек и приложения?

Если стоит задача по максимуму обойтись без динамических библиотек - по идее, да.
Автор: kvazigorynich
Дата сообщения: 03.03.2013 12:38
Abs62

Пересобрал все с ключом --disable-shared. Вроде нормально теперь.

Осталось только freetype победить. В исходниках configure сделан через одно место. Он утверждает что у меня unix и пытается соответствующую сборку сделать.

Вобщем все собрал как хотел. Траблы были из-за того что путаница в директориях присутствовала и надо было использовать --disable-shared. Хотя это и не должно было влиять. Потому что по умолчанию генерятся обе библиотеки. Правда есть подозрение что дело скорее в директории include. Видимо она отличается при сборке с shared и без.
Автор: ne_viens
Дата сообщения: 03.03.2013 12:41
>AZJIO
Прокомментировал.
Автор: bomzzz
Дата сообщения: 03.03.2013 14:04
ne_viens
сделал драйвер, его загружает нативная консоль и через него доступны все функции ядра - очистка экрана, управление курсором, цвет экрана и куча всего остального.
а нельзя интересно как то придумать, чтоб выделить память в контексте процесса которому доступны все функции ядра и обойтись без драйвера?
Автор: ne_viens
Дата сообщения: 03.03.2013 15:05
В native программировании от меня плохой советник будет, так как забросил я это дело с приходом win64. Если нельзя запустить неподписанный драйвер, то нафик его и писать.
Последним был драйвер, который включает аналоговые входы на DV камере как dvin.exe (http://www.sps.volyne.cz/set1394/anin/analog.html) но из WinXP. Понадобилось старые VHSы перегнать на цифру.
Кстати, из-за win64 я из MASMа на C перешёл тоже.

А в native очень мало что доступно из того, что имеется в user modе. Даже GetModuleHandle() надо писать самому. И количество доступных API уменьшается с увеличением IRQL. И большинство native API вообще не документировано- надо самому искать информацию по белу свету, или выкапывать из Debug Symbols, или дизасемблировать Идой.

Автор: bomzzz
Дата сообщения: 03.03.2013 16:19

Цитата:
надо самому искать информацию по белу свету,

ну так интерестнее.

Цитата:
Даже GetModuleHandle() надо писать самому.

LdrGetDllHandle не надо
ярад конечно за микрософт что они так далеко продвинулись, но я еще так далеко не продвинулся
Автор: kvazigorynich
Дата сообщения: 04.03.2013 12:57
Вот такой вопрос возник.

Имеется ли возможность конвертануть проект, который я наконец-то заставил работать под MSYS например в проект для Visual Studio. Насколько я знаю CMAKE умеет такое, но там ведь нужен конфигурационный файл. Этот файл автоматически можно сгенерировать? Или проще добавить все файлы проекта в Visual Studio, все включаемые файлы перенести в директории include или в сам проект, собрать библиотеки под Visual Studio и подключить к проекту? Мне просто удобнее в Visual Studio работать. В блокноте не очень удобно исходники править . Боюсь только что этот процесс опять начнет трепать мне нервы и займет день или два. Кто-нибудь пробовал вручную переносить?
Автор: bomzzz
Дата сообщения: 04.03.2013 16:06
а я наоборот только в блокноте могу писать. никакой гуй мне не по глазам
Автор: suslovp
Дата сообщения: 04.03.2013 18:30
Ребята, я погляжу вы тут шарите в dll-ках и прочей ереси Может подскажите мне чего полезного. Вобщем есть прога, к которой подключаются модули в виде dll файлов. И прога и dll-ки написаны на builder 6. Давненько мне нужно было подшаманить dll, изменить существующие функции, добавить нового функционала. А стояла у меня тогда ВинХП и CodeGear C++ Builder 2009 или 2010. И ставить шестой билдер нехотелось. Попробовал загнать исходники dll в Builder 2009 - с небольшими доработками всё скомпилилось. Но подсунув эту dll-ку проге - та благополучно валилась. Видимо что-то в dll отличалось, описания функций, типы передаваемых/возвращаемых параметров, или ещё чего. Копнув немного в инете - ничего дельного не нашел. Незнал как точно сформулировать запрос. Вобщем пришлось тогда тупо ставить builder 6 и компилить всё в нем.
Щас у меня компик обновился, стоит Win7 и RadStudio C++ Builder XE2. И снова понадобилась доработка тех dll-ок. Ставить динозавра Builder 6 я чего-то нехочу. Может в XE2 в свойствах проекта где-нибудь чего-нибудь потыкать можно, чтоб "интерфейс" dll-ки скомпиленой в XE2 стал похож на Builder 6. Вобщем получилось вроде так: нужно чтоб dll-ка написаная на XE2 работала с приложением написаным на Builder 6.
Автор: bomzzz
Дата сообщения: 04.03.2013 20:13
перекомпилировать или сразу программы писать совместимо, каждую функцию проверяя по мсдну. чтоб была совместима до Windows NT. даже драйвера можно совместимо написать.

что можно сделать = нативная консоль как я понял - это пользовательский режим, хотя работают и Zw и Nt функции одинаково прекрасно. чтоб использовать функции NtOsKrnl пришлось сделать драйвер. как можно одним файлом обойтись?
Автор: kotlomoy
Дата сообщения: 04.03.2013 20:13
kvazigorynich
А что ж мешало сразу в студии собирать?
По существу, к сожалению, не знаю ответа. Но если сишный код, то скорее всего без правки текста не обойтись - студия не поддерживает стандарт C99
Автор: dimon0476
Дата сообщения: 04.03.2013 21:20
suslovp,
Цитата:
нужно чтоб dll-ка написаная на XE2 работала с приложением написаным на Builder 6.
Это - возможно, но:
1. Обращение к функциям должно быть одинаковым
2. Должно быть строгое согласование переменных и их типов.

Страницы: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193

Предыдущая тема: не знаю как назвать тему :-)


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.