Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Программирование и базы данных (http://forum.oszone.net/forumdisplay.php?f=21)
-   -   C/C++|Example|Программа для восстановления загрузчиков Windows Vista и Windows 7 (http://forum.oszone.net/showthread.php?t=157561)

Admiral 19-11-2009 02:45 1274122

C/C++|Example|Программа для восстановления загрузчиков Windows Vista и Windows 7
 
Данная программа представляет собой GUI оболочку над системными утилитами BootSect и BcdEdit.

Прямая ссылка на исходник -> http://www.topsoftzone.ru/files_soft...tiboot_src.zip

FAQ

Q. Как скомпилировать?
A. Я использовал Microsoft 32-bit C/C++ Optimizing Compiler версии 15.00.30729.01 входящий в Microsoft Visual С++ 2008 Express Edition.
cl MultiBoot.cpp Kernel32.lib User32.lib Shell32.lib Gdi32.lib Comdlg32.lib ComCtl32.lib Version.lib AdvApi32.lib /D "_UNICODE" /D "UNICODE" /link /subsystem:windows
Требуется так же наличие Microsoft SDK. Например последний - Microsoft Windows SDK for Windows 7 and .NET Framework 3.5 SP1 на конкретную платформу (x86, x64, IA64).
Опционально можно добавить ещё ключи /MERGE:.rdata=.text /SECTION:.text,EWR
Компилировал именно с консоли (Пуск->Программы->Visual C++ 9.0 Express Edition->Visual Studio Tools->Visual Studio 2008 Command Prompt)

Так как не хотелось навязывать "Распространяемый пакет Microsoft Visual C++" (Microsoft Visual C++ Redistributable Package).
Если известно где в среде отключается данная зависимость, то прошу об этом сообщить в теме Visual C++ 9.0 и C++Builder 2007 - программы на голой винде (без .NET и тд)

Для компиляции так же годится
Visual C++ Toolkit 2003 и Visual C++ 2005 Express Edition

Q. Так может где-то есть бинарник?
A. Да есть http://soft.oszone.net/program/9336/MultiBoot/

Q. Как добавить ресурсы в выходной файл, как это сделано в бинарнике выше?
A. Нужно указать подготовленный ресурс при компиляции.
cl MultiBoot.cpp Kernel32.lib User32.lib Shell32.lib Gdi32.lib Comdlg32.lib ComCtl32.lib Version.lib AdvApi32.lib /D "_UNICODE" /D "UNICODE" /link /subsystem:windows MultiBoot.res

Q. А как подготовить ресурс файл?
A. Для этого в блокноте пишем следующие строки
Код:

BootSect.exe RCDATA bootsect.exe
BcdEdit.exe RCDATA bcdedit.exe

сохраняем файл, например под именем MultiBoot.rc. Дальше понадобится компилятор ресурсов. Например Microsoft Windows Resource Compiler. Можно найти в составе SDK.
В консоли заходим в папку с RC и пишем такую команду
rc -r -DWIN32 MultiBoot.rc
Если требуется, указываем полный путь к MultiBoot.rc. В результате получаем MultiBoot.res файл.

Q. Ну а как быть с манифестом, его ведь тоже можно разместить в ресурсах?
A. Да можно, для этого есть специализированная утилита mt (Manifest Tool), входящая в SDK.
mt.exe" -manifest MultiBoot_with_res.exe.manifest -outputresource:MultiBoot_with_res.exe;1
В результате манифест разместится в ресурсах.
Так же есть возможность разместить и через компилятор ресурсов, для этого пишем или дописываем выше начатый RC файл
1 24 DISCARDABLE MultiBoot.exe.manifest
и проделываем действия из ответа выше.

Q. Как собрать х64 версию бинарника?
A. Алгоритм сбора непосредственно в средстве разработке мне неизвестный. Попробуйте узнать например через тему Компиляция кода в VS 2005 для Win x64
При установленной SDK это можно сделать следующим образом
  • идём в Start Menu->Programs->Microsoft Windows SDK v6.1->CMD Shell (путь может отличатся, в зависимости от установленной версии SDK)
  • задаём переменные среды setenv /Release /x64 /xp (setenv имя батника, может быть другим в конкретной версии SDK)
  • компилируем по командам выше. При компиляции версии с ресурсами есть нюанс – нужно явно задать платформу - /MACHINE:X64
cl MultiBoot.cpp Kernel32.lib User32.lib Shell32.lib Gdi32.lib Comdlg32.lib ComCtl32.lib Version.lib AdvApi32.lib /D "_UNICODE" /D "UNICODE" /link /subsystem:windows /MACHINE:x64 ..\MultiBoot_x64.res /MERGE:.rdata=.text /SECTION:.text,EWR /OUT:MultiBoot_with_res_x64.exe

Q. Где бы ещё что-то почитать по данному коду? Может есть какие-нибудь источники?
A. Да, конечно. Вот список руководств по WIN32 (на английском)
Forger's Win32 API Tutorials
The Winapi (C Win32 API, No MFC) tutorial
Damb - Tutorials

Пример работы с GetVersion в программу вошёл практически без изменений.
Связанная тема Прозрачный STATIC текст

Q. Могу ли я использовать код в своих программах?
A. Да, конечно. Cпециально для участников и гостей конференции OSZone.net
Найдёте баг - дайте знать. Есть предложение, не стесняйтесь.

Темы подкатегории Example, предложены участником hasherfrog.
Тема построена по аналогии с этой.


Время: 04:32.

Время: 04:32.
© OSzone.net 2001-