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

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

Автор: kvazigorynich
Дата сообщения: 05.03.2013 00:07
kotlomoy

В студии совсем беда с включаемыми файлами и не только. Решил не заниматься фигней и собирать там где собирается. Тем более что под MSYS мне удалось абсолютно статическую сборку сделать. В оригинальной сборке под винду одна dll'ка цеплялась. В моей сборке dll вообще не нужны и размер на пару мег меньше получился. Правда я так и не понял кто такой licucore. Просто убрал нафиг привязку этой либы. Вроде как это что-то связанное с поддержкой языков с написанием справа налево.
Автор: ne_viens
Дата сообщения: 05.03.2013 07:49
libicu пробовал подключать?
http://icu-project.org/download/4.0.html
Автор: kvazigorynich
Дата сообщения: 05.03.2013 08:51
ne_viens

Я тоже на нее вышел, но сначала просто удалил опцию -licucore при сборке. Собирал ведь статическую сборку. При сборке ошибок не обнаружилось. Значит она и не нужна? Или я ошибаюсь?
Автор: bomzzz
Дата сообщения: 05.03.2013 17:24
в чем дело может быть. создал в нативном режиме ключ реестра, задал несколько параметров. а теперь никак не могу их удалить\изменить - статус акцес виолатион
уже несколько часов бьюсь и даже мысли нет что может быть
http://forum.vingrad.ru/act-Print/client/printer/f-84/t-43987.html
нашел даже якобы работающий пример выгрузки драйвера на дельфятине, ну не вижу я тут каких то принципиальных фещей
Автор: bomzzz
Дата сообщения: 05.03.2013 20:47
ne_viens
разобрался немного во всем. можно три варианта сделать

1 вызывать нужные функции ядра через драйвер вертуального устройства. тормозно и нужно два файла
2 попробовать загрузить свою дллку в адресное пространство ntdll.dll и запустить, вроде оно может в ядро лазить. будет повеселее работать если получится, одним файлом не обойтись.
3 сделать консоль вообще целиком на драйвере и обойтись без ntdll.dll, в ней в принципе ничего такого особенного нету
Автор: ne_viens
Дата сообщения: 06.03.2013 08:04
1. Два файла можно обойти, если драйвер в .rsrc секцию запихнуть. Потом вытащить с FindResource(), LoadResource(), LockResource(), SizeofResource(); записать в %temp%, запустить с OpenSCManager(), OpenService(), QueryServiceStatus(), ControlService(), DeleteService(), CreateService(), CloseServiceHandle().

2. длл не имеет своего адресного пространства ее можно только в чужое (exe) загрузить. Также user mode отделено от kernel mode. Практически единственная связь только по DeviceIoControl(), WriteFile(), ReadFile(), и ещё какие-то механизмы синхронизации были.

3. В ntoskrnl.exe нужных ф-ий нет?

К ключам реестра обычно нет доступа, если они созданы с правами system, а открываются от имени user, или случайно последний ноль подхвачен в названии с NtCreateKey(), или хендл не закрыт, или много чего может быть.
Автор: AZJIO
Дата сообщения: 06.03.2013 09:50
Перезалил справку ссылка1, зеркало.
Исправлено ошибки sizof на sizeof, выровнены таблицы в разделе "Функции обработки двухбайтовых символов" и следующем за ним. На страницу "Операторы" добавил метки, чтобы делать прыжок к нужной главе, а не к началу страницы, всего дествуют 6-7 меток для операторов. Подсветил NULL и restrict и добавил им ссылку и индекс. Снизил ограничения, теперь вместо 800 блоков кода обрабатываются 1200 блоков, потому что в функциях первый пример всегда был не подсвечен.
Перезалил ещё раз, исправил ошибку и другие доработки.
Автор: bomzzz
Дата сообщения: 06.03.2013 18:19
люди!!!
голову сломал ключ создаю, создаются параметры, а удалить не могу

Цитата:
InitializeObjectAttributes offset RegistryAttrib, offset usdriverregistry, OBJ_CASE_INSENSITIVE, NULL, NULL
invoke NtCreateKey, addr hRegistry, KEY_ALL_ACCESS + DELETE, addr RegistryAttrib, NULL, NULL, NULL, addr RegDisposition    
invoke NtDeleteKey, hRegistry
invoke NtClose, hRegistry


NT Error 0xC0000008
STATUS_INVALID_HANDLE

вот пример на Си нашел якобы рабочий
http://stuff.mit.edu/afs/sipb/project/wine/src/wine-0.9.37/dlls/ntdll/tests/reg.c
Автор: Abs62
Дата сообщения: 06.03.2013 18:53
bomzzz

Цитата:
KEY_ALL_ACCESS + DELETE

А вот не надо битовые флаги формировать операцией сложения.
В KEY_ALL_ACCESS входит STANDARD_RIGHTS_REQUIRED, куда входит и DELETE. А вот в KEY_ALL_ACCESS + DELETE сам флаг DELETE отсутствует.
Собственно, STANDARD_RIGHTS_REQUIRED + DELETE = SYNCHRONIZE
Сюрприз?
Автор: bomzzz
Дата сообщения: 06.03.2013 19:08
нет не сурпрыс, это промежуточный вариант, пробовал и алакцесс и только делете и только райт че только не пробовал. второй день мучаюсь


mov eax, KEY_ALL_ACCESS; + DELETE
точно меняется флаг. убрать надо сейчас скажу какая ошибка

0xC0000121
STATUS_CANNOT_DELETE
    

An attempt has been made to remove a file or directory that cannot be deleted.

Добавлено:
ура удалил. 121 - значит есть подключи.

Добавлено:
но это еще пол беды теперь надо чтоб получилось занчение параметра изменить
Автор: AZJIO
Дата сообщения: 06.03.2013 21:07
bomzzz
Флаги равные 2^n являются чистыми, остальные - комбинации. Вот как это работает
Автор: bomzzz
Дата сообщения: 06.03.2013 21:16
да это не спасает с недокументированными функциями. в одном месте так написано в другом так, ошибка на ошибку накладываются и фиг вычислишь в чем дело. с огромным трудом пробиваюсь маленькими шажками. не говоря уж про то, что я две недели лепил совместимые инклуды
Автор: juvaforza
Дата сообщения: 06.03.2013 22:39
bomzzz
А почему с одним лишь флагом DELETE не получалось?
Автор: bomzzz
Дата сообщения: 07.03.2013 04:23
патамуша реестр открывается, если ключа не было он создается и создается два параметра, потом по этому ключу запускается драйвер, потом драйвер отрабатывает свою комманду, драйвер выгружается и в конце удаляется ключик. я хотел доделать удаление ключика, смену параметров попробовать и начать делать комманду REG.
но закрывать хендл и открывать снова я тоже пробовал. теперь я просто создаю этот ключик с параметром REG_OPTION_VOLATILE - то есть ему жить до перезагрузки. но удаление ключа мне все равно понадобится. значит сначала надо делать Reg Query, удалять все подключи а потом сам ключик.

Добавлено:

вот такой командный интерпретатор. тут еще до хрена делать, постраничный вывод, перенаправление потоков, параметры команд и сами команды. пока самый минимум сделан.
Автор: bomzzz
Дата сообщения: 07.03.2013 08:54

Цитата:
push eax
invoke RtlAdjustPrivilege,12,1h,0h,esp
pop eax
.if eax == 0
invoke RtlAdjustPrivilege,12,FALSE,0h,esp
.endif

не подскажете так надо делать?
Автор: bomzzz
Дата сообщения: 07.03.2013 20:25
как правильно выводить значение параметров:

REG_BINARY - по байтно 16 ричными цифрами?

REG_RESOURCE_LIST
REG_FULL_RESOURCE_DESCRIPTOR
REG_RESOURCE_REQUIREMENTS_LIST - как бинари дату?

REG_QWORD=11, REG_QWORD_LITTLE_ENDIAN=11 - они оба литл ендиан?

хоть не припомню когда я последний раз видел 386 машину, да и 486 тоже, как по вашему мнению лучше перевернуть байты REG_DWORD_LITTLE_ENDIAN:
fastcall @RtlUlongByteSwap, ecx == 386
bswap eax     == 486
??????
Автор: ne_viens
Дата сообщения: 07.03.2013 21:42
RtlUlongByteSwap proc
mov eax, ecx
bswap eax
retn
RtlUlongByteSwap endp
Автор: bomzzz
Дата сообщения: 07.03.2013 22:03
это откуда такое? нафига она тогда нужна? а RtlUlongLongByteSwap как устроена? в каком порядке ей пихать длинные слова из реестра?
Автор: ne_viens
Дата сообщения: 07.03.2013 22:25
От ntdll.dll

RtlUlonglongByteSwap proc

arg_0 = dword ptr 4
arg_4 = dword ptr 8

mov edx, [esp+arg_4]
mov eax, [esp+arg_0]
bswap edx
bswap eax
mov ecx, eax
mov eax, edx
mov edx, ecx
retn
RtlUlonglongByteSwap endp

Автор: bomzzz
Дата сообщения: 07.03.2013 22:32
да чета я ступил, надо было из интересу расковырять нтдлл. вроде хп вообще с 386 процессором не совместима.
а в каком порядке пихать это дело из реестра? чета я не могу найти ни одного значения в реестре чтоб проверить

Добавлено:
REG_NONE - а че с этим делать?

Добавлено:

Цитата:
REG_QWORD. Значения длиной в четыре слова (64 бита). Этот тип похож на REG_DWORD, но содержит 64 бита вместо 32. Единственная версия Windows ХР, которая поддерживает этот тип - это Windows ХР 64-Bit Edition (64-разрядная версия). Вы можете просматривать и редактировать эти значения в десятичной или шестнадца-теричной форме. Примером REG_QWORD является значение 0xFE02000110010001.

http://www.compremont.org/reestr-microsoft-windows-khr-spravochnik-professionala/reestr-microsoft-windows-khr-spravochnik-professionala-str19.html
может вранье но радует

Добавлено:
разобрался. тип none и qword отображают как бинари дату. а reg_link это юникодная строка ссылка. а хп неподдерживает только биг ендиан qword
Автор: AZJIO
Дата сообщения: 08.03.2013 18:05
bomzzz
Да, когда я искал инфу по типам данных реестра, эта страница была единственной, которая более подробна раскрывала типы. Я даже на основе сделал страницу, с краткой информацией о типе возвращаемого значения.
Автор: bomzzz
Дата сообщения: 08.03.2013 20:20
да палесная страничка. жалко не нагуглилась сразу. у меня новый головняк - гадаю как разбор команды сделать - надо решить как в reg add выковыривать /ve. в cmd можно набивать все в довольно произвольном порядке засоряя все лишними пробелами, а аглоритм в последствии должен поддерживать все команды cmd, а их немало. между делом color сделал

в ntdll оказывается много полезных функций сидит которые msvcrt заменяют
Автор: ne_viens
Дата сообщения: 08.03.2013 21:20
Парсер аргументов, чтоли?
Возьми stdargv.c из "C:\Program Files\Microsoft Visual Studio 9.0\VC\crt\src"
Чуть поправить надо будет, чтоб зажил самостoятельно.

Жалко, что sprintf() в ntdll.dll такой-же корявый как и wsprintf() - без "%f".
Автор: bomzzz
Дата сообщения: 09.03.2013 03:06
ne_viens
не обязательно готовый использовать. еще плохо себе все дерево команд представляю. вот попробовал что то поделать на эту тему. это вырезает параметр /V. еще надо перевод сделать регистра букв. и с кавычками разобраться. для командного параметра я давно себе быструый кусочек кода сделал, который все случаи учитывает, включая запуск из реестра - там лишний пробел добавляется

Цитата:
.386

.model flat, stdcall
option casemap :none

include \MASM32\INCLUDE\windows.inc
include \MASM32\INCLUDE\user32.inc
include \MASM32\INCLUDE\kernel32.inc
include \MASM32\INCLUDE\ntdll.inc
include \masm32\macros\Strings.mac

.data
mestitle    dw "B","o","m","z",0
form        dw "%","u", 0

TW0 " reg add \=\\Registry\\Machine\\Disk\= /V Path /VE", commandstr
.data?
buffer        db 512 dup(?)
string        db 512 dup(?)

.code
start:
invoke MessageBoxW,0,addr commandstr,ADDR mestitle,MB_ICONASTERISK
;invoke towlower, addr commandstr
lea ebx, commandstr
invoke wcsstr, addr commandstr, $CTW0(" /V ")
add eax, 8
mov ebx, eax
invoke wcsrchr, ebx, " "
sub eax, ebx
shr eax, 1
invoke wcsncpy, addr buffer, ebx, eax
invoke MessageBoxW,0,addr buffer,ADDR mestitle,MB_ICONASTERISK
invoke ExitProcess,0
end start

тут в начале до фига всего такого

Цитата:
wcstoul PROTO C :VARARG
wcstombs PROTO C :VARARG
wcstol PROTO C :VARARG
wcsstr PROTO C :VARARG
wcsspn PROTO C :VARARG
wcsrchr PROTO C :VARARG
wcspbrk PROTO C :VARARG
wcsncpy PROTO C :VARARG
wcsncmp PROTO C :VARARG
wcsncat PROTO C :VARARG
wcslen PROTO C :VARARG
wcscspn PROTO C :VARARG
wcscpy PROTO C :VARARG
wcscmp PROTO C :VARARG
wcschr PROTO C :VARARG
wcscat PROTO C :VARARG
vsprintf PROTO C :VARARG
vDbgPrintExWithPrefix PROTO STDCALL WORD,:DWORD,:DWORD,:DWORD,:DWORD
vDbgPrintEx PROTO STDCALL WORD,:DWORD,:DWORD,:DWORD
towupper PROTO C :VARARG
towlower PROTO C :VARARG
toupper PROTO C :VARARG
tolower PROTO C :VARARG
tan PROTO C :VARARG
swprintf PROTO C :VARARG
strtoul PROTO C :VARARG
strtol PROTO C :VARARG
strstr PROTO C :VARARG
strspn PROTO C :VARARG
strrchr PROTO C :VARARG
strpbrk PROTO C :VARARG
strncpy PROTO C :VARARG
strncmp PROTO C :VARARG
strncat PROTO C :VARARG
strlen PROTO C :VARARG
strcspn PROTO C :VARARG
strcpy PROTO C :VARARG
strcmp PROTO C :VARARG
strchr PROTO C :VARARG
strcat PROTO C :VARARG
sscanf PROTO C :VARARG
sqrt PROTO C :VARARG
sprintf PROTO C :VARARG
sin PROTO C :VARARG
qsort PROTO C :VARARG
pow PROTO C :VARARG
memset PROTO C :VARARG
memmove PROTO C :VARARG
memcpy PROTO C :VARARG
memcmp PROTO C :VARARG
memchr PROTO C :VARARG
mbstowcs PROTO C :VARARG
log PROTO C :VARARG
labs PROTO C :VARARG
isxdigit PROTO C :VARARG
iswxdigit PROTO C :VARARG
iswspace PROTO C :VARARG
iswlower PROTO C :VARARG
iswdigit PROTO C :VARARG
iswctype PROTO C :VARARG
iswalpha PROTO C :VARARG
isupper PROTO C :VARARG
isspace PROTO C :VARARG
ispunct PROTO C :VARARG
isprint PROTO C :VARARG
islower PROTO C :VARARG
isgraph PROTO C :VARARG
isdigit PROTO C :VARARG
iscntrl PROTO C :VARARG
isalpha PROTO C :VARARG
isalnum PROTO C :VARARG
floor PROTO C :VARARG
_fabs PROTO C :VARARG
cos PROTO C :VARARG
ceil PROTO C :VARARG
bsearch PROTO C :VARARG
atol PROTO C :VARARG
atoi PROTO C :VARARG
atan PROTO C :VARARG
abs PROTO C :VARARG


Добавлено:
а не знаешь где экранный буфер, можно выводить на экран минуя и ntdll, и ntoskrnl? или надо видео драйверу какие то стандартные команды передавать? чтоб курсор сделать, а может вывод на экран оптимизировать.
Автор: dimon0476
Дата сообщения: 09.03.2013 15:53
Кто знает:
В МГТУ имени Н.Э.Баумана читают отличные лекции по программированию и на Си в том числе. В инете они есть. Кто знает, где скачать? Дайте линк.
Автор: AZJIO
Дата сообщения: 09.03.2013 17:34
dimon0476
Лекции тоже чудес не делают. Попробуй AutoIt3, в 10 раз легче. Особенно если рядом нет специалистов, которые могут подсказать.

Обновил справку, начал делать описание функций в стиле AutoIt3. Строковые для примера уже поменял, частично математических и функции с приставкой "is".
Автор: dimon0476
Дата сообщения: 09.03.2013 18:41
AZJIO, а он существует русский? И где?
Автор: AZJIO
Дата сообщения: 09.03.2013 20:04
dimon0476
Да, на русском справка, вот тема, смотри в шапке. А вообще скачай комплект отсюда, но справку обнови до последней версии.
Автор: AZJIO
Дата сообщения: 10.03.2013 14:36
int fgetpos(FILE *stream, fpos_t *position);
Как правильно термин определяющий параметр "FILE *stream"? Файловый дескриптор? Или кратко просто дескриптор. Хотя в справке нашёл термин "указатель файла".
И ещё, на сколько я понимаю обращение к файловой системе происходит на уровне системы, к примеру через WinAPI, как в данном случае работают функции, не зная о текущей системе?
Автор: kotlomoy
Дата сообщения: 10.03.2013 15:36
AZJIO

Цитата:
Как правильно термин определяющий параметр "FILE *stream"? Файловый дескриптор? Или кратко просто дескриптор. Хотя в справке нашёл термин "указатель файла".

Ну правильно, это же указатель, прежде всего. В данном случае указатель на файловый дескриптор.

Цитата:
И ещё, на сколько я понимаю обращение к файловой системе происходит на уровне системы, к примеру через WinAPI, как в данном случае работают функции, не зная о текущей системе?

Подозреваю, что функции знают о текущей системе.

Страницы: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193

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


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