0 / 0 / 0
Регистрация: 21.03.2016
Сообщений: 9
1

Как добавить программу в автозагрузку через реестр на С/С++?

21.04.2016, 23:23. Показов 7262. Ответов 20

Author24 — интернет-сервис помощи студентам
Это почему-то не работает...

C++
1
2
3
4
5
HKEY hg; 
LPCTSTR lpdata = L"C:\\Users\\User\\Desktop\\prog.exe";
RegOpenKeyEx(HKEY_LOCAL_MACHINE, L"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run",0, KEY_ALL_ACCESS, &hg); 
RegSetValueEx(hg, L"prog", 0, REG_SZ, (LPBYTE)lpdata, sizeof(lpdata) + 1); 
RegCloseKey(hg);
Есть ли ещё варианты, как это сделать? Или в коде ошибка?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
21.04.2016, 23:23
Ответы с готовыми решениями:

Как добавить программу в автозагрузку через реестр?
Всем привет! Как добавить программу в автозагрузку через реестр? То есть вот сюда :...

Добавить программу в автозагрузку через реестр
как добавить программу (.exe) в автозагрузку через регистр?

Как создать програмно автозагрузку конкретному пользователю через реестр?
У меня на компьютере созданы пользователи для детей. Я хочу добавить свою программу (контроль...

Добавление в автозагрузку через реестр
Подскажите как сделать чтобы при запуске компьютера программа запускалась. Тоесть я хочу чтобы...

20
Заблокирован
22.04.2016, 00:07 2
А проверять возвращаемые значения и использовать GetLastError что не позволяет?
0
26 / 12 / 6
Регистрация: 06.11.2015
Сообщений: 37
22.04.2016, 00:36 3
Цитата Сообщение от Виджит Посмотреть сообщение
Это почему-то не работает...
Так укажите, в чем это выражается. Например, в реестре ничего не появляется (возможно вы запускаете приложение без прав администратора или происходит перенаправление в ветку WOW6432Node). Или, например, появляется только имя диска "C:" (потому, что использовали sizeof(lpdata)).
Цитата Сообщение от Виджит Посмотреть сообщение
Или в коде ошибка?
Вот ошибка: sizeof(lpdata) вычислит размер указателя, а не длину строки.
Далее, нужно согласовано использовать что-то одно. Либо TCHAR, либо WCHAR
C++
1
2
3
4
// Для TCHAR
LPCTSTR lpdata = _T("C:\\Users\\User\\Desktop\\prog.exe");
// или для WCHAR
LPCWSTR lpdata = L"C:\\Users\\User\\Desktop\\prog.exe";
В соответствии с предыдущими замечаниями
C++
1
2
3
4
// Для TCHAR
RegSetValueEx(hg, _T("prog"), 0, REG_SZ, (LPBYTE)lpdata, _tcslen(lpdata) + 1);
// или для WCHAR
RegSetValueExW(hg, L"prog", 0, REG_SZ, (LPBYTE)lpdata, wcslen(lpdata) + 1);
Добавлено через 2 минуты
RegOpenKeyEx аналогично для TCHAR или RegOpenKeyExW для WCHAR
1
0 / 0 / 0
Регистрация: 21.03.2016
Сообщений: 9
22.04.2016, 01:15  [ТС] 4
Исправил(использовал WCHAR),но все равно в реестре ничего не появляется. Запускаю от имени администратора
0
1550 / 875 / 179
Регистрация: 05.12.2015
Сообщений: 2,555
22.04.2016, 01:27 5
Цитата Сообщение от Виджит Посмотреть сообщение
но все равно в реестре ничего не появляется
Посмотрите в HKLM->SOFTWARE->Wow6432Node->Microsoft->Windows->CurrentVersion->Run.
0
26 / 12 / 6
Регистрация: 06.11.2015
Сообщений: 37
22.04.2016, 08:50 6
Виджит
Как вы могли знать, современные операционные системы Windows бывают 32-разрядные и 64-разрядные (суть в поддержке соответствующих инструкций процессора). Так вот 64-разрядная Windows в целях обратной совместимости поддерживает 32-разрядные приложения, но для этих целей использует специальную подсистему, которая именуется WOW64 (Windows On Windows 64) и которая преобразует 32-разрядный код в 64-разрядный.
Поэтому, если у вас 64-разрядная Windows, то в реестре присутствует ветка HKLM\SOFTWARE\Wow6432Node для 32-разрядной подсистемы Windows. По умолчанию Visual Studio создает C++ проекты для 32-разрядной платформы и, скорее всего, ваше приложение пишет в эту ветку HKLM/SOFTWARE/Wow6432Node/Microsoft/Windows/CurrentVersion/Run.
0
5231 / 3204 / 362
Регистрация: 12.12.2009
Сообщений: 8,113
Записей в блоге: 2
22.04.2016, 09:06 7
Цитата Сообщение от Alterex Посмотреть сообщение
Windows бывают 32-разрядные и 64-разрядные (суть в поддержке соответствующих инструкций процессора)
Набор инструкций процессора зависит от версии ОС?
Цитата Сообщение от Alterex Посмотреть сообщение
для этих целей использует специальную подсистему, которая именуется WOW64 (Windows On Windows 64) и которая преобразует 32-разрядный код в 64-разрядный.
Шта?
0
7785 / 6553 / 2983
Регистрация: 14.04.2014
Сообщений: 28,617
22.04.2016, 09:44 8
Виджит, сказали же ошибки проверить, что функции возвращают?
0
26 / 12 / 6
Регистрация: 06.11.2015
Сообщений: 37
22.04.2016, 10:18 9
Цитата Сообщение от Kastaneda Посмотреть сообщение
Набор инструкций процессора зависит от версии ОС?
Я сказал эти слова? Или вы домыслили?
Цитата Сообщение от Kastaneda Посмотреть сообщение
которая преобразует 32-разрядный код в 64-разрядный.
Здесь я скорее всего ошибся.

Добавлено через 7 минут
Kastaneda, будьте культурнее. Неужели вы никогда не ошибались? Ваше "шта", такое надменное, {censored} не катит.
0
Kastaneda
22.04.2016, 10:25
  #10

Не по теме:

Цитата Сообщение от Alterex Посмотреть сообщение
Неужели вы никогда не ошибались?
конечно ошибался, но при этом мое эго позволяет мне адекватно реагировать на, пусть и надменные, замечания. А вот судя по тому, что вы добавили сообщение аж через 7 минут, ваше взвинченное эго не дало вам пройти мимо этого и заставило опуститься до матов.

0
26 / 12 / 6
Регистрация: 06.11.2015
Сообщений: 37
22.04.2016, 10:45 11
Цитата Сообщение от Kastaneda Посмотреть сообщение
при этом мое эго позволяет мне адекватно реагировать
Твое его не позволяет тебе адекватно реагировать. И это не зависит от моих "7 минут славы" (я мог бы объяснить эти 7 минут - но тебе это не нужно, у тебя и так все..).
Цитата Сообщение от Kastaneda Посмотреть сообщение
Набор инструкций процессора зависит от версии ОС?
Ну а по сути, где я это сказал?

Ты
Цитата Сообщение от Alterex Посмотреть сообщение
которая преобразует 32-разрядный код в 64-разрядный.
Насчет вот этого я признал, что точно не знаю, как это реализуется. А ты, видимо, знаешь? Напиши.
0
5231 / 3204 / 362
Регистрация: 12.12.2009
Сообщений: 8,113
Записей в блоге: 2
22.04.2016, 10:47 12
Цитата Сообщение от Alterex Посмотреть сообщение
Ну а по сути, где я это сказал?
Это интерпретированная мною фраза
Цитата Сообщение от Alterex
Windows бывают 32-разрядные и 64-разрядные (суть в поддержке соответствующих инструкций процессора)
и мое "шта" относилось не к этому.

Добавлено через 1 минуту
Цитата Сообщение от Alterex Посмотреть сообщение
А ты, видимо, знаешь? Напиши.
ОС переключает процессор в legacy mode, где и выполняется 32 битный код, считая, что он находится в 32 битном окружении. Это если вкраце.
0
26 / 12 / 6
Регистрация: 06.11.2015
Сообщений: 37
22.04.2016, 10:58 13
Хорошо. Давай изучать русский язык (а не твою интерпретацию).
Цитата Сообщение от Kastaneda Посмотреть сообщение
Windows бывают 32-разрядные и 64-разрядные (суть в поддержке соответствующих инструкций процессора)
Что не так в моем предложении: "Как вы могли знать, современные операционные системы Windows бывают 32-разрядные и 64-разрядные (суть в поддержке соответствующих инструкций процессора)".
0
5231 / 3204 / 362
Регистрация: 12.12.2009
Сообщений: 8,113
Записей в блоге: 2
22.04.2016, 11:01 14
Цитата Сообщение от Alterex Посмотреть сообщение
современные операционные системы Windows бывают 32-разрядные и 64-разрядные (суть в поддержке соответствующих инструкций процессора)
где связь между поддержкой инструкций процессора и разрядностью ОС?
0
26 / 12 / 6
Регистрация: 06.11.2015
Сообщений: 37
22.04.2016, 11:06 15
Цитата Сообщение от Kastaneda Посмотреть сообщение
ОС переключает процессор в legacy mode, где и выполняется 32 битный код, считая, что он находится в 32 битном окружении. Это если вкраце.
Вот я, действительно не знал этого. и Что? Ты герой!

Добавлено через 55 секунд

Не по теме:

Если это так

0
Kastaneda
22.04.2016, 11:10
  #16

Не по теме:

Цитата Сообщение от Alterex Посмотреть сообщение
Вот я, действительно не знал этого. и Что?
а то, что тут форум программистов, а не "ответы mail.ru", не надо писать свои домыслы, если чего-то не знаешь!

0
26 / 12 / 6
Регистрация: 06.11.2015
Сообщений: 37
23.04.2016, 06:39 17
Цитата Сообщение от Kastaneda Посмотреть сообщение
ОС переключает процессор в legacy mode, где и выполняется 32 битный код, считая, что он находится в 32 битном окружении. Это если вкраце.
И как же по вашему в этом унаследованном режиме процессора будет выполняться другой 64 битный код?
Да, я не знал этого точно, но предположил, что было бы логично конвертировать 32-разрядные адреса данных в 64-разрядные. Чем по моему и занимается подсистема WOW64, имитирующая 32-разрядное окружение, а не переключающая процессор в унаследованный режим. Есть подозрение, что домыслы, достойные "ответы mail.ru", написали вы, сударь. Или приведите заслуживающий доверия источник.
Цитата Сообщение от Kastaneda Посмотреть сообщение
где связь между поддержкой инструкций процессора и разрядностью ОС?
Это о предложении "современные операционные системы Windows бывают 32-разрядные и 64-разрядные (суть в поддержке соответствующих инструкций процессора)".
Вроде бы понятна связь. ОС бывают 32-разрядные и 64-разрядные (суть в поддержке соответствующих [32-разрядных и 64-разрядных] инструкций процессора). Я думаю, что вы носитель русского языка и значение слова "соответствующих" вам должно быть понятно. Возможно следовало бы вместо слова "инструкций" использовать слово "режимов". Короче по этому пункту - это просто ваши необоснованные придирки.

Добавлено через 14 минут
Кстати вот почитайте WOW64 Implementation Details.
0
5231 / 3204 / 362
Регистрация: 12.12.2009
Сообщений: 8,113
Записей в блоге: 2
23.04.2016, 07:02 18
Цитата Сообщение от Alterex Посмотреть сообщение
Чем по моему и занимается подсистема WOW64, имитирующая 32-разрядное окружение, а не переключающая процессор в унаследованный режим
Нет, делать имитацию не выгодно, когда для этого есть режим процессора
Цитата Сообщение от Alterex Посмотреть сообщение
Кстати вот почитайте WOW64 Implementation Details.
Там ни слова о низкоуровневой реализации, лучше почитайте Intel manual.

Добавлено через 1 минуту
Цитата Сообщение от Alterex Посмотреть сообщение
Вроде бы понятна связь. ОС бывают 32-разрядные и 64-разрядные (суть в поддержке соответствующих [32-разрядных и 64-разрядных] инструкций процессора).
У меня был рабочий проект, где приходилось 64 битный код исполнять под 16 битным DOS'ом, что вы на это скажите?
0
26 / 12 / 6
Регистрация: 06.11.2015
Сообщений: 37
23.04.2016, 08:30 19
Цитата Сообщение от Kastaneda Посмотреть сообщение
У меня был рабочий проект, где приходилось 64 битный код исполнять под 16 битным DOS'ом, что вы на это скажите?
К чему это? Или вы всерьез считаете, что для Windows x64 унаследованный режим является родным? Если нет, то что мне об этом нужно сказать? Это уже из области "в огороде бузина, а в Киеве дядька", ведь то, что вы там сделали ДОС 64-разрядной к моему предложению никакого отношения не имеет. Речь же шла о родной поддержке инструкций процессора ОС с соответствующей разрядностью.
Цитата Сообщение от Kastaneda Посмотреть сообщение
Там ни слова о низкоуровневой реализации, лучше почитайте Intel manual.
Вообще-то там описано, как преобразуются 32-разрядные вызовы. Почитать руководства Intel - здравая мысль - почитайте обязательно! И подумайте, как 64-разрядный код будет выполняться в унаследованном режиме процессора, если 64-разрядные инструкции в этом режиме не доступны.
Цитата Сообщение от Kastaneda Посмотреть сообщение
Нет, делать имитацию не выгодно, когда для этого есть режим процессора
Согласен, что будут накладные расходы, об этом Майкрософт пишет здесь и здесь. Кстати, сама Майкрософт указывает, что WOW64 является имитатором (эмулятором) x86.

Короче, "отмазки" одни. И нежелание признать, что вы на форуме программистов написали неверные домыслы, указывая на это другому.

Эта статья не официальный источник, но все же поможет вам разобраться.
0
Ушел с форума
Эксперт С++
16473 / 7436 / 1187
Регистрация: 02.05.2013
Сообщений: 11,617
Записей в блоге: 1
23.04.2016, 15:07 20
Цитата Сообщение от Alterex Посмотреть сообщение
И как же по вашему в этом унаследованном режиме процессора будет выполняться другой 64 битный код?
На 64-битных Windows 32-битные приложения выполняются процессором в compatibility mode.
В случае, например, когда нужно сделать системный вызов в ядро, процессор временно
переключается в 64-битный режим. "Просто так" никаких переключений между compatibility
mode и legacy mode не делается, да и нет у приложений такой возможности.

Цитата Сообщение от Alterex Посмотреть сообщение
Да, я не знал этого точно, но предположил, что было бы логично конвертировать 32-разрядные адреса данных в 64-разрядные. Чем по моему и занимается подсистема WOW64, имитирующая 32-разрядное окружение, а не переключающая процессор в унаследованный режим.
На самом деле это совсем не логично. 64-битный код заметно отличается от 32-битного:
другой набор регистров и инструкций, другая модель использования стека, другие
требования к выравниванию и т.п. Просто преобразованием адреса здесь не обошлось бы.

Цитата Сообщение от Alterex Посмотреть сообщение
Или приведите заслуживающий доверия источник.
В мануалах Intel (Intel® 64 and IA-32 Architectures Software Developer’s Manual,
Combined Volumes 1, 2A, 2B, 2C, 3A, 3B and 3C - June 2013) сказано дословно следующее:

VOL-1, 3.1.1 Intel® 64 Architecture
Intel 64 architecture adds IA-32e mode. IA-32e mode has two sub-modes.

These are:

...

• Compatibility mode (sub-mode of IA-32e mode) — Compatibility mode permits
most legacy 16-bit and 32-bit applications to run without re-compilation under a
64-bit operating system. For brevity, the compatibility sub-mode is referred to
as compatibility mode in IA-32 architecture. The execution environment of
compatibility mode is the same as described in Section 3.2. Compatibility mode
also supports all of the privilege levels that are supported in 64-bit and
protected modes. Legacy applications that run in Virtual 8086 mode or use
hardware task management will not work in this mode. Compatibility mode is
enabled by the operating system (OS) on a code segment basis. This means that a
single 64-bit OS can support 64-bit applications running in 64-bit mode and
support legacy 32-bit applications (not recompiled for 64-bits) running in
compatibility mode. Compatibility mode is similar to 32-bit protected mode.
Applications access only the first 4 GByte of linear address space.
Compatibility mode uses 16-bit and 32-bit address and operand sizes.
Like protected mode, this mode allows applications to access physical memory
greater than 4 GByte using PAE (Physical Address Extensions).
VOL-3A, 9.8.5.3 64-bit Mode and Compatibility Mode Operation
IA-32e mode uses two code segment-descriptor bits (CS.L and CS.D, see Figure 3-8)
to control the operating modes after IA-32e mode is initialized. If CS.L = 1 and CS.D = 0,
the processor is running in 64-bit mode. With this encoding, the default operand size
is 32 bits and default address size is 64 bits. Using instruction prefixes, operand size
can be changed to 64 bits or 16 bits; address size can be changed to 32 bits.

When IA-32e mode is active and CS.L = 0, the processor operates in compatibility mode.
In this mode, CS.D controls default operand and address sizes exactly as it does in
the IA-32 architecture. Setting CS.D = 1 specifies default operand and address size
as 32 bits. Clearing CS.D to 0 specifies default operand and address size as 16 bits
(the CS.L = 1, CS.D = 1 bit combination is reserved).

Compatibility mode execution is selected on a code-segment basis. This mode allows
legacy applications to coexist with 64-bit applications running in 64-bit mode.
An operating system running in IA-32e mode can execute existing 16-bit and 32-bit
applications by clearing their code-segment descriptor’s CS.L bit to 0.
Обращаю внимание на последний абзац, где сказано, что смена режима достигается
переключением дескриптора сегмента: когда флаг CS.L установлен, процессор работает в
64-битном режиме, когда сброшен - в compatibility mode. При этом 32-битное приложение
"думает", что выполняется в "настоящей" 32-битной среде, где ему доступно не более 4 Гигов
памяти, 32-битный набор регистров и т.п., а прямолинейные попытки вырваться из такой
"песочницы" пресекаются аппаратно. Программная эмуляция compatibility mode не требуется.

Что касается реализации WOW64 в современных Windows, то здесь все более-менее просто,
вот брейк на NtDelayExecution (то же самое, что Sleep в kernel32) в 32-битном
процессе, система Windows 8.1 x64:

Код
ntdll_76f10000!NtDelayExecution:
00000000`76f4d4b0 b833000600      mov     eax,60033h
00000000`76f4d4b5 64ff15c0000000  call    dword ptr fs:[0C0h]
00000000`76f4d4bc c20800          ret     8
Как видно, вполне себе такой 32-битный код. Вывод команды 'dg cs' (информация о
дескрипторе сегмента) подтверждает, что мы находимся в compatibility mode:

Код
                                                    P Si Gr Pr Lo
Sel        Base              Limit          Type    l ze an es ng Flags
---- ----------------- ----------------- ---------- - -- -- -- -- --------
0023 00000000`00000000 00000000`ffffffff Code RE Ac 3 Bg Pg P  Nl 00000cfb
Краткая расшифровка:

Sel 0x23 ... стандартное значение CS для 32-битного режима;
Type Code ... тип сегмента = код
RE ... права доступа = Read + Execute
Pl 3 ... Privilege Level 3 (user mode)
Long Nl ... NotLong (не long mode)

Из NtDelayExecution мы сразу попадаем в известную функцию внутри wow64cpu.dll:

Код
wow64cpu!KiFastSystemCall:
00000000`76f011d8 eaa421f0763300  jmp     0033:76F021A4
Этот far jump переключает сегмент и мы оказываемся в 64-битном режиме,
дескриптор сегмента и его параметры уже другие и соответствуют long mode:
Код
wow64cpu!CpupReturnFromSimulatedCode:
00000000`76f021a4 4987e6          xchg    rsp,r14
00000000`76f021a7 458b06          mov     r8d,dword ptr [r14]
00000000`76f021aa 4983c604        add     r14,4
00000000`76f021ae 4589453c        mov     dword ptr [r13+3Ch],r8d
00000000`76f021b2 45897548        mov     dword ptr [r13+48h],r14d
00000000`76f021b6 4d8d5e04        lea     r11,[r14+4]
00000000`76f021ba 41897d20        mov     dword ptr [r13+20h],edi
00000000`76f021be 41897524        mov     dword ptr [r13+24h],esi
...

                                                    P Si Gr Pr Lo
Sel        Base              Limit          Type    l ze an es ng Flags
---- ----------------- ----------------- ---------- - -- -- -- -- --------
0033 00000000`00000000 00000000`00000000 Code RE Ac 3 Nb By P  Lo 000002fb
Здесь CS = 0x33, Long = Lo, что как бы намекает.

При возврате из NtDelayExecution будет выполнена обратная процедура и
процессор снова вернется в 32-битный режим.

Это все низкоуровневые детали реализации поддержки выполнения WOW64-кода.
Сама WOW64 содержит еще много чего интересного - редирект реестра и файловой
системы, двойной стек для каждого потока, двойные структуры PEB/TEB, наследование
хэндлов, двойная регистрация COM-классов в реестре, двойные копии системных dll и
некоторых системных приложений и т.д. Большую часть этой информации Microsoft
не разглашает, в документации есть лишь крохи того, что происходит на самом
деле "за кадром".
5
23.04.2016, 15:07
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
23.04.2016, 15:07
Помогаю со студенческими работами здесь

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

Прописать программу в автозагрузку в реестр
Доброго времени суток! Вопрос: как добавить программу в реестр, для автозапуска при включении...

Как добавить программу в автозагрузку?
Здравствуйте. Мне необходимо добавить свою программу в автозагрузку. Чтобы не было тупых вопросов,...

Как добавить программу в автозагрузку?
как добавит программу в авто загрузку :CRY:


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru