Модераторы: feodorv, GremlinProg, xvr, Fixin
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Внедрение dll с помошью потоков, Почему неработает нифигу =\ 
:(
    Опции темы
drZmeu
  Дата 25.2.2007, 22:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 183
Регистрация: 22.11.2006

Репутация: нет
Всего: 1



Всем добрый вечер есть трабл = smile 
Вот код:

Код

#include "stdafx.h"
#include <windows.h>
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
    BOOL fOk = FALSE;
    DWORD hProcess=0x00000F50; //idProc
    HANDLE hThRead = NULL,hIdPro=NULL;
    TCHAR szLibFile[MAX_PATH];
    PWSTR pszLibFileRemote = NULL;
    int pause;

    hIdPro=OpenProcess(
         PROCESS_QUERY_INFORMATION |   // Required by Alpha
         PROCESS_CREATE_THREAD     |   // For CreateRemoteThread
         PROCESS_VM_OPERATION      |   // For VirtualAllocEx/VirtualFreeEx
         PROCESS_VM_WRITE,             // For WriteProcessMemory
         FALSE,hProcess);
    if(hIdPro==NULL){MessageBox(0,"No Acces !!!","",0);} //Если нет доступа то выводим предупреждение
    //---------------------------------------------------
      int cch = 1 + lstrlenW((PCWSTR)szLibFile);
      int cb  = cch * sizeof(WCHAR);
    GetModuleFileName(NULL,szLibFile,sizeof(szLibFile));
    _tcscpy(_tcsrchr(szLibFile, TEXT('\\')) + 1, TEXT("ImgWalk.DLL"));
    pszLibFileRemote = (PWSTR)VirtualAllocEx(hIdPro,NULL,cb,MEM_COMMIT,PAGE_READWRITE);
    if(pszLibFileRemote==NULL){MessageBox(0,"Error VirtAlocEx","",0);}
    //---------------------------------------------------
    if(!WriteProcessMemory(hIdPro,pszLibFileRemote,(PVOID)szLibFile,cb,NULL))MessageBox(0,"Error Write","",0);
    //---------------------------------------------------
    PTHREAD_START_ROUTINE ThreadRnt = (PTHREAD_START_ROUTINE)
        GetProcAddress(GetModuleHandle(TEXT("Kernel32")),"LoadLibraryW");
    if(ThreadRnt == NULL)MessageBox(0,"Not found adress LoadLibraryW","",0);
    //---------------------------------------------------
    hThRead=CreateRemoteThread(hIdPro,NULL,0,ThreadRnt,pszLibFileRemote,0,NULL);
    if(hThRead==NULL)MessageBox(0,"Can't create ThRead4Proc","",0);
    WaitForSingleObject(hThRead,INFINITE);
    fOk = TRUE;
    //----------------------------------------------------


    cout<<"Ypa =)"<<endl;
    cout<<hIdPro<<endl;

    cin>>pause;
    return fOk;
}


А dll из книжки Рихтера 'заногу его б =(('
Вобшем с его примера dll "это DLL, которая, будучи внедрена в адресное пространство процесса, выдает список всех DLL, используемых этим процессом. "
Если я узаю его утилиту InjLib то всё ОК а если свою вроде всё норм только ничего непроисходит и невыводится почуму ? Как исправить?
--------------------
[code=html]<table bgcolor='#0' width='69'><tr align='center' bgcolor='#0'><td><font size='6' face='cursive' color='#ffffff'><b>A</b></font></td></tr><tr align="center" bgcolor="#0">[/code]
PM MAIL   Вверх
azesmcar
Дата 26.2.2007, 11:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 5
Всего: 211



поставь где нибудь std::cout на szLibFile и pszLibFileRemote. У меня сомнения что path неправильный..

PM   Вверх
criz
Дата 13.2.2008, 18:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 63
Регистрация: 13.2.2008

Репутация: нет
Всего: нет



Товарищи, помогите понять где ошибка:
test.dll:
Код

#include <windows.h>

BOOL APIENTRY DllMain( HANDLE hModule, 
                       DWORD  ul_reason_for_call, 
                       LPVOID lpReserved
                     )
{
    switch (ul_reason_for_call)
    {
        case DLL_PROCESS_ATTACH:
            MessageBox(NULL, "DLL_PROCESS_ATTACH", "MessageBox", 0);
            break;
        case DLL_THREAD_ATTACH:
        case DLL_THREAD_DETACH:
        case DLL_PROCESS_DETACH:
            break;
    }
    return TRUE;
}

test.c
Код

#include <windows.h>
#include <tlhelp32.h>

BOOL inj(DWORD dwPrcId);
DWORD proc(void);


main()
{
    inj(proc());
}

BOOL inj(DWORD dwProcId)
{
    BOOL res = FALSE;
    HANDLE hProcess, hThread;
    PWSTR psRemFile;
    PTHREAD_START_ROUTINE pThRtn;
    int len;
    char *lbFileName     = "test.dll";

    hProcess = OpenProcess(
                            PROCESS_CREATE_THREAD |
                            PROCESS_VM_OPERATION |
                            PROCESS_VM_WRITE,
                            FALSE, dwProcId);
    if(!hProcess)
    {
        MessageBox(NULL, "Sorry, I can't open process", "Error", 0);
        return 0;
    }
    
    len = (strlen(lbFileName) + 1) * sizeof(WCHAR);

    psRemFile = (PWSTR) VirtualAllocEx(hProcess, NULL, len, MEM_RESERVE | MEM_COMMIT , PAGE_EXECUTE_READWRITE);
    if(psRemFile == NULL)
    {
        MessageBox(NULL, "Sorry, I can't allocating memory", "Error", 0);
        return 0;
    }
    if(!WriteProcessMemory(hProcess, psRemFile, (PVOID) lbFileName, len, NULL))
    {
        MessageBox(NULL, "Sorry, I can't write in memory", "Error", 0);
        return 0;
    }
    
    pThRtn = (PTHREAD_START_ROUTINE) GetProcAddress(GetModuleHandle(TEXT("kernel32")), "LoadLibraryW");
    if(!pThRtn)
    {
        MessageBox(NULL, "Sorry, I can't find process", "Error", 0);
        return 0;
    }

    hThread = CreateRemoteThread(hProcess, NULL, 0, pThRtn, psRemFile, 0, NULL);
    if(!hThread)
    {
        MessageBox(NULL, "Sorry, I can't create thread", "Error", 0);
        return 0;
    }
    
    WaitForSingleObject(hThread, INFINITE);
    res = TRUE;
    /*--------------------------------*/
    printf("%d\n", GetLastError());
    return res;
}

DWORD proc(void)
{
    PROCESSENTRY32 pe;
    HANDLE snap;
    DWORD id;

    snap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);

    pe.dwSize = sizeof(PROCESSENTRY32); 
    
    Process32First(snap, &pe); 
    do
    { 
        if (!strcmp("notepad.exe", pe.szExeFile)) 
        { 
            id = pe.th32ProcessID; 
            break; 
        } 
    } 
    while (Process32Next(snap, &pe)); 
    CloseHandle(snap);
    return id; 
}

ГетЛастЕррор выдает 1114ую ошибку. Совет от МискроСофта не помог, сделал все как они писали.
Если я делаю просто LoadLibrary, то все гут...
З.Ы. может я теорию неправильно понял:
 -- открываем процесс
 -- выделяем память в открытом процессе
 -- пишем данные в выделенную память
 -- узнаем адрес LoadLibrary в Kernel32
 -- Создаем поток....
верно? smile
PM MAIL WWW   Вверх
PPS05
Дата 14.2.2008, 00:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 262
Регистрация: 6.11.2005
Где: Беларусь, Минск

Репутация: 1
Всего: 7



Цитата(criz @  13.2.2008,  17:42 Найти цитируемый пост)
ГетЛастЕррор выдает 1114ую ошибку


а где именно?


--------------------
Ушел с форума и не вернулся.
PM MAIL ICQ   Вверх
criz
Дата 14.2.2008, 09:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 63
Регистрация: 13.2.2008

Репутация: нет
Всего: нет



Цитата(PPS05 @ 14.2.2008,  00:00)
Цитата(criz @  13.2.2008,  17:42 Найти цитируемый пост)
ГетЛастЕррор выдает 1114ую ошибку


а где именно?

Перед выходом из функции inj(). Трасер нигде не "застревает".
Оля(OllyDBG) тоже показывает -- "error_dll_init_failed"
Код

{
.....................
    WaitForSingleObject(hThread, INFINITE);
    res = TRUE;
    /*--------------------------------*/
    printf("%d\n", GetLastError());
    return res;
}

PM MAIL WWW   Вверх
PPS05
Дата 14.2.2008, 12:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 262
Регистрация: 6.11.2005
Где: Беларусь, Минск

Репутация: 1
Всего: 7



А ошибка вот где: строка 54 - ваши действия: вы нашли адрес LoadLibraryW и и создаете поток, который начинает выполнение как раз в начале этой функции. По-русски: вы вызываете LoadLibraryW без параметров, тогда логично, что ошибка "error_dll_init_failed" и еще чудо, что удаленный процесс не падает: два dword'а то снимаются со стека...

Если ты хочешь подрузить dll от имени другого процесса, то в psRemFile должен фактически загнать машинный код, который произведет данные действия. Где-то на rsdn.ru была статья "Перехват API вызовов на Windows NT" (или что-то такое). Там есть этот способ внедрения. 

Сам когда-то писал такое, вот исходник, но, думаю, разобраться в нем не так-то просто. На всякий случай выложу:

Код

struct CODETOINJECT
{
    struct
    {
        BYTE    push_lpModuleName;
        DWORD    lpModuleName;
        WORD    call;
        DWORD    routine_addr;
    } LoadLibraryA_call;

    struct
    {
        BYTE    push_funcName;
        DWORD    funcName;
        BYTE    push_eax;
        WORD    call;
        DWORD    routine_addr;
    } GetProcAddress_call;

    struct
    {
        BYTE    push_PID;
        DWORD    PID;
        BYTE    push_VSN;
        DWORD    VSN;
        WORD    call_eax;
    } here_call;

    struct
    {
        BYTE    push_exitCode;
        DWORD    exitCode;
        WORD    call;
        DWORD    routine_addr;
    } ExitThread_call;

    DWORD    ExitThread;
    DWORD    LoadLibraryA;
    DWORD    GetProcAddress;
    char    moduleName[256];
    char    here_name[10];
};

struct LONGJUMP
{
    BYTE    push;
    DWORD    addr;
    BYTE    ret;
};

extern "C" __declspec(dllexport)
int __stdcall inject(int dwVolumeSerialNumber, int dwPID, i_func_pcstr_plus * debug)
{
    debug("DLL: inject called\n");
    CODETOINJECT cti;

    HANDLE hProcess = OpenProcess(PROCESS_CREATE_THREAD | PROCESS_VM_WRITE |
        PROCESS_VM_OPERATION, FALSE, dwPID);
    if (!hProcess)
    {
        debug("DLL: Cound not open process with PID %d\n", dwPID);
        return 2;
    }
    void * rCode = VirtualAllocEx(hProcess, 0, sizeof(cti), MEM_COMMIT,
        PAGE_EXECUTE_READWRITE);
    if (!rCode)
    {
        debug("DLL: Could not allocate memory\n");
        return 3;
    }

    cti.LoadLibraryA_call.push_lpModuleName = 0x68;
    cti.LoadLibraryA_call.lpModuleName =
        (DWORD)rCode + (DWORD)&(((CODETOINJECT*)0)->moduleName);
    cti.LoadLibraryA_call.call = 0x15FF;
    cti.LoadLibraryA_call.routine_addr =
        (DWORD)rCode + (DWORD)&(((CODETOINJECT*)0)->LoadLibraryA);
    GetModuleFileName(hDll, cti.moduleName, 256);

    cti.GetProcAddress_call.push_funcName = 0x68;
    strcpy(cti.here_name, "here");
    cti.GetProcAddress_call.funcName = 
        (DWORD)rCode + (DWORD)&(((CODETOINJECT*)0)->here_name);
    cti.GetProcAddress_call.push_eax = 0x50;
    cti.GetProcAddress_call.call = 0x15FF;
    cti.GetProcAddress_call.routine_addr =
        (DWORD)rCode + (DWORD)&(((CODETOINJECT*)0)->GetProcAddress);

    cti.here_call.push_PID = 0x68;
    cti.here_call.PID = dwPID;
    cti.here_call.push_VSN = 0x68;
    cti.here_call.VSN = dwVolumeSerialNumber;
    cti.here_call.call_eax = 0xD0FF;

    cti.ExitThread_call.push_exitCode = 0x68;
    cti.ExitThread_call.exitCode = 0;
    cti.ExitThread_call.call = 0x15FF;
    cti.ExitThread_call.routine_addr = 
        (DWORD)rCode + (DWORD)&(((CODETOINJECT*)0)->ExitThread);

    cti.ExitThread = 
        (DWORD)GetProcAddress(GetModuleHandle("kernel32.dll"), "ExitThread");
    cti.LoadLibraryA = 
        (DWORD)GetProcAddress(GetModuleHandle("kernel32.dll"), "LoadLibraryA");
    cti.GetProcAddress = 
        (DWORD)GetProcAddress(GetModuleHandle("kernel32.dll"), "GetProcAddress");

    DWORD dwBytesWritten;
    WriteProcessMemory(hProcess, rCode, &cti, sizeof(cti), &dwBytesWritten);
    debug("DLL: %d bytes written to %.8X\n", dwBytesWritten, rCode);
    DWORD id;
    // Sleep(10000);
    HANDLE z = CreateRemoteThread(hProcess, NULL, 0, 
        (LPTHREAD_START_ROUTINE)rCode, NULL, 0, &id);
    debug("DLL: It seems to the remote thread was created\n");
    WaitForSingleObject(z, INFINITE);
    VirtualFreeEx(hProcess, rCode, 0, MEM_RELEASE);

    return 1;
}


Т.е. cti будет содержать такой код:
Код

push dword [lpModuleName] ; "my.dll"
call LoadLibraryA
push dword [lpFuncName] ; "myFunc"
push eax ; hInstance
call GetProcAddress
push param2
push param1
call eax
push 0
call ExitThread


Добавлено через 40 секунд
P.S. Здесь много непонятно, поэтому спрашивайте.  smile 


--------------------
Ушел с форума и не вернулся.
PM MAIL ICQ   Вверх
586
Дата 14.2.2008, 17:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2243
Регистрация: 8.5.2006

Репутация: 39
Всего: 146



Ошибок море: проблемы с юникодом, незакрытые дескрипторы и пр. Перечислять долго, надеюсь сам разберёшся.
Код
BOOL inj(DWORD dwPrcId);
DWORD proc(void);

BOOL inj(DWORD dwProcId)
{
    BOOL res = FALSE;
    HANDLE hProcess, hThread;
    LPVOID psRemFile;
    PTHREAD_START_ROUTINE pThRtn;
    int len;
    wchar_t lpwszLibName[260];   // Юникод

    GetModuleFileNameW(NULL, lpwszLibName, 260);
    wcscpy(wcsrchr(lpwszLibName, L'\\')+1, L"project2.dll");   // получение ПОЛНОГО пути

    hProcess = OpenProcess(
                            PROCESS_CREATE_THREAD |
                            PROCESS_VM_OPERATION |
                            PROCESS_VM_WRITE,
                            FALSE, dwProcId);
    if(!hProcess)
    {
        MessageBox(NULL, "Sorry, I can't open process", "Error", 0);
    } else {
        psRemFile = (PWSTR) VirtualAllocEx(hProcess, NULL, sizeof(lpwszLibName), MEM_RESERVE | MEM_COMMIT , PAGE_EXECUTE_READWRITE);
        if(psRemFile == NULL)
        {
            MessageBox(NULL, "Sorry, I can't allocating memory", "Error", 0);
        } else {
            if(!WriteProcessMemory(hProcess, psRemFile, lpwszLibName, sizeof(lpwszLibName), NULL))
            {
                MessageBox(NULL, "Sorry, I can't write in memory", "Error", 0);
            } else {
    
                pThRtn = (PTHREAD_START_ROUTINE) GetProcAddress(GetModuleHandle(TEXT("kernel32")), "LoadLibraryW");
                if(!pThRtn)
                {
                    MessageBox(NULL, "Sorry, I can't find process", "Error", 0);
                } else {

                    hThread = CreateRemoteThread(hProcess, NULL, 0, pThRtn, psRemFile, 0, NULL);
                    if(!hThread)
                    {
                        MessageBox(NULL, "Sorry, I can't create thread", "Error", 0);
                    } else {
                        WaitForSingleObject(hThread, INFINITE);
                        DWORD dwExitCode;   // базовый адрес модуля (можно использовать для FreeLibrary)
                        GetExitCodeThread(hThread, &dwExitCode);
                        if(!dwExitCode) MessageBoxA(NULL, "Функция LoadLibrary завершена с ошибкой", 0, 16);
                        else res = TRUE;   // success
                    }  //(!hThread)
                    CloseHandle(hThread);
                } //GetProcAddress
            }  // WriteProcessMemory
            VirtualFreeEx(hProcess, psRemFile, sizeof(lpwszLibName), MEM_FREE);   // освобождение памяти
        } // VirtualAlloc
        CloseHandle(hProcess);
    } //(!hProcess)

    return res;
}

DWORD proc(void)
{
    PROCESSENTRY32 pe;
    HANDLE snap;
    DWORD id;

    snap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);

    pe.dwSize = sizeof(PROCESSENTRY32); 

    Process32First(snap, &pe);
    do
    {
        if (!strcmp("notepad.exe", pe.szExeFile))
        {
            id = pe.th32ProcessID;
            break; 
        }
    }
    while (Process32Next(snap, &pe));
    CloseHandle(snap);
    return id;
}


Это сообщение отредактировал(а) 586 - 14.2.2008, 18:11
PM   Вверх
criz
Дата 14.2.2008, 19:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 63
Регистрация: 13.2.2008

Репутация: нет
Всего: нет



smile  smile  smile Ура! Работает smile
Вспомнил слова Рихтера: "Если Вы плаваете в одной из этих тем, то....", там как раз про юникод было))))
Кроме работы с юникодом, я забыл про освобождение  smile 
586, спасибо.


Цитата(PPS05 @  14.2.2008,  12:20 Найти цитируемый пост)
Сам когда-то писал такое, вот исходник, но, думаю, разобраться в нем не так-то просто. На всякий случай выложу:

тут вроде надо знать основы асм-а(push, call, etc...)? smile До этого мне пока далеко)))

Добавлено через 3 минуты и 7 секунд
Цитата(PPS05 @  14.2.2008,  12:20 Найти цитируемый пост)
вызываете LoadLibraryW без параметров

Я ж вроде указываю в качестве параметра имя длл-ки....или я не так понял?
PM MAIL WWW   Вверх
PPS05
Дата 14.2.2008, 19:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 262
Регистрация: 6.11.2005
Где: Беларусь, Минск

Репутация: 1
Всего: 7



Цитата(criz @  14.2.2008,  18:06 Найти цитируемый пост)
Я ж вроде указываю в качестве параметра имя длл-ки....или я не так понял?


Строка 47:
pThRtn принимает значение адреса LoadLibraryW
Строка 54:
pThRtn указывается как стартовый адрес потока. Таким образом, функция внезапно получает управление, при этом в стеке нет ни адреса возврата, ни параметров... (поток только-только запущен).


--------------------
Ушел с форума и не вернулся.
PM MAIL ICQ   Вверх
criz
Дата 14.2.2008, 21:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 63
Регистрация: 13.2.2008

Репутация: нет
Всего: нет



Цитата(PPS05 @  14.2.2008,  19:20 Найти цитируемый пост)
Таким образом, функция внезапно получает управление, при этом в стеке нет ни адреса возврата, ни параметров...

...это решается путем инициализации cti, так?
Повторюсь, без знаний ассемблера трудно разобраться smile
PM MAIL WWW   Вверх
586
Дата 14.2.2008, 21:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2243
Регистрация: 8.5.2006

Репутация: 39
Всего: 146



Цитата(PPS05 @  14.2.2008,  19:20 Найти цитируемый пост)
pThRtn указывается как стартовый адрес потока. Таким образом, функция внезапно получает управление, при этом в стеке нет ни адреса возврата, ни параметров... (поток только-только запущен). 

На низком уровне функция LoadLibrary соответствует функции типа THREAD_START_ROUTINE. По соглашению вызова они тоже совпадают (__stdcall).
PM   Вверх
PPS05
Дата 14.2.2008, 22:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 262
Регистрация: 6.11.2005
Где: Беларусь, Минск

Репутация: 1
Всего: 7



Цитата(586 @  14.2.2008,  20:32 Найти цитируемый пост)
На низком уровне функция LoadLibrary соответствует функции типа THREAD_START_ROUTINE. По соглашению вызова они тоже совпадают (__stdcall).


Но "error_dll_init_failed" мы-таки получим!!!  smile 


--------------------
Ушел с форума и не вернулся.
PM MAIL ICQ   Вверх
586
Дата 14.2.2008, 23:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2243
Регистрация: 8.5.2006

Репутация: 39
Всего: 146



Цитата(PPS05 @  14.2.2008,  22:37 Найти цитируемый пост)
Но "error_dll_init_failed" мы-таки получим!!!  

Интересно, откуда?  smile 
PM   Вверх
PPS05
Дата 14.2.2008, 23:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 262
Регистрация: 6.11.2005
Где: Беларусь, Минск

Репутация: 1
Всего: 7



 smile ...Меня перекосило... я не заметил psRemFile...


--------------------
Ушел с форума и не вернулся.
PM MAIL ICQ   Вверх
criz
Дата 15.2.2008, 20:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 63
Регистрация: 13.2.2008

Репутация: нет
Всего: нет



удалено мной.... smile 

Это сообщение отредактировал(а) criz - 20.2.2008, 17:51
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




[ Время генерации скрипта: 0.0982 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.