Форум программистов, компьютерный форум, киберфорум
C/C++: WinAPI
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.69/29: Рейтинг темы: голосов - 29, средняя оценка - 4.69
0 / 0 / 0
Регистрация: 21.03.2015
Сообщений: 29
1

Отслеживание закрытия файла процессом, запущенным через CreateProcess

23.07.2015, 18:18. Показов 5959. Ответов 49
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Доброго времени суток!
Возникла нетривиальная(на мой взгляд) задачка: Открываем какой нибудь файл через какую нибудь программу(условно говоря file.docx с помощью MS Word) и нужно отследить закрытие этого файла.
Запуск осуществляю с помощью CreateProcess, а именно:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
STARTUPINFO si;
PROCESS_INFORMATION pi;
 
ZeroMemory(&si, sizeof(si));
si.cb = sizeof(si);
ZeroMemory(&pi, sizeof(pi));
 
CreateProcess
    (
        TEXT("C:\\Program Files (x86)\\Microsoft Office\\Office15\\WINWORD.EXE"),
        L"/t C:\\Temp\\file.docx", NULL, NULL, TRUE,
        CREATE_NEW_CONSOLE,
        NULL, NULL,
        &si,
        &pi
    );
Далее казалось бы всё просто, мониторь себе список запущенных процессов по pi.dwProcessId и всё.
Но есть одно но. Если при этом будет запущен ещё какой либо файл (например something.docx), то он запустится в том же процессе и в таком случае при закрытии отслеживаемого файла, процесс останется. И я не смогу своевременно отреагировать на его закрытие

Вопрос в том можно ли как то отследить закрытие конкретного файла в программе?? Или же можно запустить процесс выполнения программы так, что бы при выполнении других файлов такого типа, они выполнялись в другом процессе??
Помогите пожалуйста(
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
23.07.2015, 18:18
Ответы с готовыми решениями:

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

Получить список dll, используемых запущенным процессом
Делаю античит для сетевой игры(готовых решений нет) по способу белого\черного листов и сверкой md5...

Отслеживание создания файлов чужим процессом
Здравствуйте. Возникла проблемка с отслеживанием создания новых файлов в определенной папке чужим...

Отслеживание закрытия программы.
Как отследить что мою прогу пытаются закрыть. Неважно как, по CTRL Alt Del, или еще как? CloseQuery...

49
0 / 0 / 0
Регистрация: 21.03.2015
Сообщений: 29
09.09.2015, 12:23  [ТС] 21
Author24 — интернет-сервис помощи студентам
Цитата Сообщение от Убежденный Посмотреть сообщение
Путь к dll задан в char-символах, а удаленный поток зовет LoadLibraryW,
которому нужна строка в wchar_t-символах. Да, и MSDN крайне не советует
звать MessageBox из DllMain...
Путь к Dll поменял на
C++
1
const wchar_t* dll = L"c:\\users\\adam\\documents\\visual studio 2015\\Projects\\HookDll\\Debug\\HookDll.dll";
MessageBox из DllMain убрал. Лог файл Dll всё равно не создаётся.
Через монитор ресурсов смотрю связанные модули с процессом WINWORD.EXE, HookDll.dll там нет((
В чём ещё может быть проблема?
0
Ушел с форума
Эксперт С++
16473 / 7436 / 1187
Регистрация: 02.05.2013
Сообщений: 11,617
Записей в блоге: 1
09.09.2015, 12:26 22
Цитата Сообщение от AdamWest Посмотреть сообщение
В чём ещё может быть проблема?
Где код ?

Цитата Сообщение от AdamWest Посмотреть сообщение
Лог файл Dll всё равно не создаётся.
Писать в корень системного диска могут только администраторы и система.
Может, дело еще в этом ?
0
0 / 0 / 0
Регистрация: 21.03.2015
Сообщений: 29
09.09.2015, 12:41  [ТС] 23
Цитата Сообщение от Убежденный Посмотреть сообщение
Путь к dll задан в char-символах, а удаленный поток зовет LoadLibraryW,
которому нужна строка в wchar_t-символах.
1. Путь к dll заменил на:
C++
1
const wchar_t* dll = L"c:\\users\\adam\\documents\\visual studio 2015\\Projects\\HookDll\\Debug\\HookDll.dll\0";
2. strlen(dll) заменил на wcslen(dll) + 1

3. MessageBox из dll убрал

4. в Dll путь к логу поменял на: C:\\Temp\\temp.txt
Код из dll всё равно не отрабатывает(Файл temp.txt не создаётся).
Смотрю через монитор ресурсов связанные модули с процессом WINWORD.EXE, в списке нет моей dll((

В чём ещё может быть проблема?

Полный код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
#include "stdafx.h"
#include <iostream>
#include <string>
#include <windows.h>
#include <tlhelp32.h>
#include <Aclapi.h>
 
 
#include <Winternl.h> 
using namespace std;
 
 
void injectDLL(HANDLE hProcess)
{
 
    const wchar_t* dll = L"c:\\users\\adam\\documents\\visual studio 2015\\Projects\\HookDll\\Debug\\HookDll.dll\0";
    
    LPVOID lpSpace = (LPVOID)VirtualAllocEx(hProcess, NULL, wcslen(dll) + 1, MEM_COMMIT, PAGE_READWRITE);
    int n = WriteProcessMemory(hProcess, lpSpace, dll, wcslen(dll) + 1, NULL);
    size_t sDll = wcslen(dll);
    HMODULE hModule = GetModuleHandle(L"kernel32.dll");
    LPVOID lpBaseAddress = (LPVOID)GetProcAddress(hModule, "LoadLibraryW");
    
    HANDLE hThread = CreateRemoteThread(hProcess, NULL, 0, (LPTHREAD_START_ROUTINE)lpBaseAddress, lpSpace, NULL, NULL);
    DWORD threadId = GetThreadId(hThread);
    DWORD processId = GetProcessIdOfThread(hThread);
    printf("Injected thread id: %u for pid: %u", threadId, processId);
    
};
 
 
VOID EnumModuleList(HANDLE CONST hStdOut, DWORD CONST dwProcessId, HANDLE hLauncher)
{
    MODULEENTRY32 meModuleEntry;
    TCHAR szBuff[1024];
    DWORD dwTemp;
    HANDLE CONST hSnapshot = CreateToolhelp32Snapshot(
        TH32CS_SNAPMODULE, dwProcessId);
    if (INVALID_HANDLE_VALUE == hSnapshot) {
        return;
    }
    //while (true) {}
    meModuleEntry.dwSize = sizeof(MODULEENTRY32);
    Module32First(hSnapshot, &meModuleEntry);
    string str = "kernel32.dll";
    wstring w_str(str.begin(), str.end());
    do {
        if (meModuleEntry.szModule == w_str)
        {
            injectDLL(hLauncher);
            break;
        }
    } while (Module32Next(hSnapshot, &meModuleEntry));
 
    CloseHandle(hSnapshot);
}//*/
 
int main()
{
    STARTUPINFO si;
    PROCESS_INFORMATION pi;
 
    ZeroMemory(&si, sizeof(si));
    si.cb = sizeof(si);
    ZeroMemory(&pi, sizeof(pi));
 
    CreateProcessW
        (
            TEXT("C:\\Program Files (x86)\\Microsoft Office\\Office15\\WINWORD.EXE"),
            L"/t C:\\Temp\\sendMEplease.docx", NULL, NULL, TRUE,
            CREATE_NEW_CONSOLE,
            NULL, NULL,
            &si,
            &pi
            );
 
    PROCESSENTRY32 peProcessEntry;
    TCHAR szBuff[1024];
    DWORD dwTemp;
    HANDLE CONST hSnapshot = CreateToolhelp32Snapshot(
        TH32CS_SNAPPROCESS, pi.dwProcessId);
    if (INVALID_HANDLE_VALUE == hSnapshot) {
        return 0;
    }
    HANDLE CONST hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);
    peProcessEntry.dwSize = sizeof(PROCESSENTRY32);
    Process32First(hSnapshot, &peProcessEntry);
    do {
        if (peProcessEntry.th32ProcessID == pi.dwProcessId)
        {
            EnumModuleList(hStdOut, peProcessEntry.th32ProcessID, pi.hProcess);
            break;
        }
    } while (Process32Next(hSnapshot, &peProcessEntry));
    
    CloseHandle(hSnapshot);
    CloseHandle(pi.hThread);
    CloseHandle(pi.hProcess);//*/
    return 0;
}

DLL:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#include <stdio.h>
#include <winsock2.h>
#include <windows.h>
 
INT APIENTRY DllMain(HMODULE hDll, DWORD Reason, LPVOID Reserved)
{
    FILE *file;
    fopen_s(&file, "C:\\Temp\\temp.txt", "a+");
 
    switch (Reason)
    {
    case DLL_PROCESS_ATTACH:
        fprintf(file, "DLL attach function called.n");
        break;
    case DLL_PROCESS_DETACH:
        fprintf(file, "DLL detach function called.n");
        break;
    case DLL_THREAD_ATTACH:
        fprintf(file, "DLL thread attach function called.n");
        break;
    case DLL_THREAD_DETACH:
        fprintf(file, "DLL thread detach function called.n");
        break;
    }
 
    fclose(file);
    return TRUE;
}
0
Ушел с форума
Эксперт С++
16473 / 7436 / 1187
Регистрация: 02.05.2013
Сообщений: 11,617
Записей в блоге: 1
09.09.2015, 12:58 24
VirtualAlloc(Ex) и WriteProcessMemory работают с количеством байт.
wcslen возвращает количество символов.
Правильно так:
C
1
size_t const SizeOfPayload = (wcslen(path) + 1) * sizeof (wchar_t);
0
0 / 0 / 0
Регистрация: 21.03.2015
Сообщений: 29
09.09.2015, 14:27  [ТС] 25
Убежденный, Переделал на количество байт и всё равно dll не отработала((
Может я ещё где то допустил ошибку?
0
Ушел с форума
Эксперт С++
16473 / 7436 / 1187
Регистрация: 02.05.2013
Сообщений: 11,617
Записей в блоге: 1
09.09.2015, 15:59 26
И снова спрошу: где код (последняя версия) ?
0
0 / 0 / 0
Регистрация: 21.03.2015
Сообщений: 29
09.09.2015, 16:15  [ТС] 27
Убежденный,

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
#include "stdafx.h"
#include <iostream>
#include <string>
#include <windows.h>
//#include <fstream>
#include <tlhelp32.h>
#include <Aclapi.h>
//#include "MinHook.h"
 
 
#include <Winternl.h> 
using namespace std;
 
typedef int (WINAPI* HookChangeType)(int);
 
void injectDLL(HANDLE hProcess)
{
 
    const wchar_t* dll = L"c:\\users\\adam\\documents\\visual studio 2015\\Projects\\HookDll\\Debug\\HookDll.dll\0";
 
    size_t const DLLPathSize = (wcslen(dll) + 1) * sizeof(wchar_t);
 
    LPVOID lpSpace = (LPVOID)VirtualAllocEx(hProcess, NULL, DLLPathSize, MEM_COMMIT, PAGE_READWRITE);
    int n = WriteProcessMemory(hProcess, lpSpace, dll, DLLPathSize, NULL);
    HMODULE hModule = GetModuleHandle(L"kernel32.dll");
    LPVOID lpBaseAddress = (LPVOID)GetProcAddress(hModule, "LoadLibraryW");
    
    HANDLE hThread = CreateRemoteThread(hProcess, NULL, 0, (LPTHREAD_START_ROUTINE)lpBaseAddress, lpSpace, NULL, NULL);
    DWORD threadId = GetThreadId(hThread);
    DWORD processId = GetProcessIdOfThread(hThread);
    printf("Injected thread id: %u for pid: %u", threadId, processId);
};
 
 
VOID EnumModuleList(HANDLE CONST hStdOut, DWORD CONST dwProcessId, HANDLE hLauncher)
{
    MODULEENTRY32 meModuleEntry;
    TCHAR szBuff[1024];
    DWORD dwTemp;
    HANDLE CONST hSnapshot = CreateToolhelp32Snapshot(
        TH32CS_SNAPMODULE, dwProcessId);
    if (INVALID_HANDLE_VALUE == hSnapshot) {
        return;
    }
    
    meModuleEntry.dwSize = sizeof(MODULEENTRY32);
    Module32First(hSnapshot, &meModuleEntry);
    string str = "kernel32.dll";
    wstring w_str(str.begin(), str.end());
    do {
        if (meModuleEntry.szModule == w_str)
        {
            injectDLL(hLauncher);
            break;
        }
    } while (Module32Next(hSnapshot, &meModuleEntry));
 
    CloseHandle(hSnapshot);
}//*/
 
int main()
{
    STARTUPINFO si;
    PROCESS_INFORMATION pi;
 
    ZeroMemory(&si, sizeof(si));
    si.cb = sizeof(si);
    ZeroMemory(&pi, sizeof(pi));
 
    //MH_Initialize();
    CreateProcessW
        (
            TEXT("C:\\Program Files (x86)\\Microsoft Office\\Office15\\WINWORD.EXE"),
            L"/t C:\\Temp\\sendMEplease.docx", NULL, NULL, TRUE,
            CREATE_NEW_CONSOLE,
            NULL, NULL,
            &si,
            &pi
            );
 
    PROCESSENTRY32 peProcessEntry;
    TCHAR szBuff[1024];
    DWORD dwTemp;
    HANDLE CONST hSnapshot = CreateToolhelp32Snapshot(
        TH32CS_SNAPPROCESS, pi.dwProcessId);
    if (INVALID_HANDLE_VALUE == hSnapshot) {
        return 0;
    }
    HANDLE CONST hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);
    peProcessEntry.dwSize = sizeof(PROCESSENTRY32);
    Process32First(hSnapshot, &peProcessEntry);
    do {
        if (peProcessEntry.th32ProcessID == pi.dwProcessId)
        {
            EnumModuleList(hStdOut, peProcessEntry.th32ProcessID, pi.hProcess);
            break;
        }
    } while (Process32Next(hSnapshot, &peProcessEntry));
    
    CloseHandle(hSnapshot);
    CloseHandle(pi.hThread);
    CloseHandle(pi.hProcess);//*/
    return 0;
}

DLL:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#include <stdio.h>
#include <winsock2.h>
#include <windows.h>
 
INT APIENTRY DllMain(HMODULE hDll, DWORD Reason, LPVOID Reserved)
{
    FILE *file;
    fopen_s(&file, "C:\\Temp\\temp.txt", "a+");
 
    switch (Reason)
    {
    case DLL_PROCESS_ATTACH:
        fprintf(file, "DLL attach function called.n");
        break;
    case DLL_PROCESS_DETACH:
        fprintf(file, "DLL detach function called.n");
        break;
    case DLL_THREAD_ATTACH:
        fprintf(file, "DLL thread attach function called.n");
        break;
    case DLL_THREAD_DETACH:
        fprintf(file, "DLL thread detach function called.n");
        break;
    }
 
    fclose(file);
    return TRUE;
}
0
Ушел с форума
Эксперт С++
16473 / 7436 / 1187
Регистрация: 02.05.2013
Сообщений: 11,617
Записей в блоге: 1
09.09.2015, 16:31 28
А функция injectDLL вообще вызывается ?
И что-то мне кажется, все эти манипуляции с CreateToolhelp32Snapshot и
поиском kernel32 лишены смысла. Все равно поток с CreateRemoteThread
не запустится, пока не прогрузится kernel32 и все остальные статически
прилинкованные dll-ки.

Короче, в данном случае можно звать injectDLL сразу после успешного
вызова CreateProcessW.
0
0 / 0 / 0
Регистрация: 21.03.2015
Сообщений: 29
09.09.2015, 16:50  [ТС] 29
injectDLL - вызывается, заходил туда отладчиком.

Удалил все махинации с CreateToolhelp32Snapshot и прочим. На результат никак не повлияло.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
#include "stdafx.h"
#include <iostream>
#include <string>
#include <windows.h>
#include <thread>
#include <tlhelp32.h>
#include <Aclapi.h>
#include <Winternl.h> 
using namespace std;
 
void injectDLL(HANDLE hProcess)
{
    const wchar_t* dll = L"c:\\users\\adam\\documents\\visual studio 2015\\Projects\\HookDll\\Debug\\HookDll.dll\0";
 
    size_t const DLLPathSize = (wcslen(dll) + 1) * sizeof(wchar_t);
 
    LPVOID lpSpace = (LPVOID)VirtualAllocEx(hProcess, NULL, DLLPathSize, MEM_COMMIT, PAGE_READWRITE);
    int n = WriteProcessMemory(hProcess, lpSpace, dll, DLLPathSize, NULL);
    HMODULE hModule = GetModuleHandle(L"kernel32.dll");
    LPVOID lpBaseAddress = (LPVOID)GetProcAddress(hModule, "LoadLibraryW");
    
    HANDLE hThread = CreateRemoteThread(hProcess, NULL, 0, (LPTHREAD_START_ROUTINE)lpBaseAddress, lpSpace, NULL, NULL);
    DWORD threadId = GetThreadId(hThread);
    DWORD processId = GetProcessIdOfThread(hThread);
    printf("Injected thread id: %u for pid: %u", threadId, processId);
};
 
int main()
{
    STARTUPINFO si;
    PROCESS_INFORMATION pi;
 
    ZeroMemory(&si, sizeof(si));
    si.cb = sizeof(si);
    ZeroMemory(&pi, sizeof(pi));
 
    CreateProcessW
        (
            TEXT("C:\\Program Files (x86)\\Microsoft Office\\Office15\\WINWORD.EXE"),
            L"/t C:\\Temp\\sendMEplease.docx", NULL, NULL, TRUE,
            CREATE_NEW_CONSOLE,
            NULL, NULL,
            &si,
            &pi
            );
 
    injectDLL(pi.hProcess);
    
    return 0;
}
В DLL ничего не менял.
0
Ушел с форума
Эксперт С++
16473 / 7436 / 1187
Регистрация: 02.05.2013
Сообщений: 11,617
Записей в блоге: 1
09.09.2015, 17:23 30
Как на счет проверить, что возвращают функции VirtualAllocEx, WriteVirtualMemory,
GetProcAddress и CreateRemoteThread ?
0
0 / 0 / 0
Регистрация: 21.03.2015
Сообщений: 29
09.09.2015, 17:56  [ТС] 31
Убежденный, проставил проверки. Всё корректно отрабатывает до конца, в консоль выводится только 2 сообщения последних строк injectDll(Injected thread id: threadId for pid: processId " и FINISH INJECT соответственно)

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
#include "stdafx.h"
#include <iostream>
#include <fstream>
#include <string>
#include <windows.h>
#include <thread>
#include <tlhelp32.h>
#include <Aclapi.h>
#include <Winternl.h> 
using namespace std;
 
 
void injectDLL(HANDLE hProcess)
{
    const wchar_t* dll = L"c:\\users\\adam\\documents\\visual studio 2015\\Projects\\HookDll\\Debug\\HookDll.dll\0";
 
    size_t const DLLPathSize = (wcslen(dll) + 1) * sizeof(wchar_t);
 
    LPVOID lpSpace = (LPVOID)VirtualAllocEx(hProcess, NULL, DLLPathSize, MEM_COMMIT, PAGE_READWRITE);
    if (lpSpace == NULL)
    {
        cout << "Could not allocate memory in process" << endl;
        return;
    }
 
    int n = WriteProcessMemory(hProcess, lpSpace, dll, DLLPathSize, NULL);
    if (n == 0)
    {
        cout << "Could not write to process's address space" << endl;
        return;
    }
    HMODULE hModule = GetModuleHandle(L"kernel32.dll");
    LPVOID lpBaseAddress = (LPVOID)GetProcAddress(hModule, "LoadLibraryW");
    if (lpBaseAddress == NULL)
    {
        cout<<"Unable to locate LoadLibraryW"<<endl;
        return;
    }
    
    HANDLE hThread = CreateRemoteThread(hProcess, NULL, 0, (LPTHREAD_START_ROUTINE)lpBaseAddress, lpSpace, NULL, NULL);
    if (hThread == NULL)
    {
        cout << "hThread is NULL" << endl;
        return;
    }
    DWORD threadId = GetThreadId(hThread);
    DWORD processId = GetProcessIdOfThread(hThread);
    printf("Injected thread id: %u for pid: %u", threadId, processId);
    cout << "FINISH INJECT" << endl;
 
};
 
int main()
{
    STARTUPINFO si;
    PROCESS_INFORMATION pi;
 
    ZeroMemory(&si, sizeof(si));
    si.cb = sizeof(si);
    ZeroMemory(&pi, sizeof(pi));
 
    CreateProcessW
        (
            TEXT("C:\\Program Files (x86)\\Microsoft Office\\Office15\\WINWORD.EXE"),
            L"/t C:\\Temp\\sendMEplease.docx", NULL, NULL, TRUE,
            CREATE_NEW_CONSOLE,
            NULL, NULL,
            &si,
            &pi
            );
 
    injectDLL(pi.hProcess);
 
    return 0;
}
Миниатюры
Отслеживание закрытия файла процессом, запущенным через CreateProcess  
0
Ушел с форума
Эксперт С++
16473 / 7436 / 1187
Регистрация: 02.05.2013
Сообщений: 11,617
Записей в блоге: 1
09.09.2015, 17:59 32
Цитата Сообщение от AdamWest Посмотреть сообщение
Всё корректно отрабатывает до конца
Так в чем тогда проблема ?
0
0 / 0 / 0
Регистрация: 21.03.2015
Сообщений: 29
09.09.2015, 18:19  [ТС] 33
Цитата Сообщение от Убежденный Посмотреть сообщение
Так в чем тогда проблема ?
Код из DLL не выполняется. под фразой "всё корректно отрабатывает до конца" я имел ввиду что все функции возвращают не нулевые значения и программа отрабатывает до конца

DLL
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#include <stdio.h>
#include <winsock2.h>
#include <windows.h>
 
INT APIENTRY DllMain(HMODULE hDll, DWORD Reason, LPVOID Reserved)
{
    FILE *file;
    fopen_s(&file, "C:\\Temp\\temp.txt", "a+");
 
    switch (Reason)
    {
    case DLL_PROCESS_ATTACH:
        fprintf(file, "DLL attach function called.n");
        break;
    case DLL_PROCESS_DETACH:
        fprintf(file, "DLL detach function called.n");
        break;
    case DLL_THREAD_ATTACH:
        fprintf(file, "DLL thread attach function called.n");
        break;
    case DLL_THREAD_DETACH:
        fprintf(file, "DLL thread detach function called.n");
        break;
    }
 
    fclose(file);
    return TRUE;
}
0
267 / 170 / 40
Регистрация: 25.08.2014
Сообщений: 1,087
Записей в блоге: 1
09.09.2015, 18:30 34
Если всё работает, тогда твоя длл должна быть в процессе. Посмотри с помощью process explorer загрузилось ли. Вообще держи его открытым чтобы увидеть создание/провал создания удалённого потока.
0
Ушел с форума
Эксперт С++
16473 / 7436 / 1187
Регистрация: 02.05.2013
Сообщений: 11,617
Записей в блоге: 1
09.09.2015, 18:34 35
Цитата Сообщение от AdamWest Посмотреть сообщение
Код из DLL не выполняется.
А ты уверен, что MS Office, который запускается из CreateProcessW,
может писать в C:\Windows\Temp ? У меня в эту папку без прав
администратора даже заглянуть нельзя...
0
0 / 0 / 0
Регистрация: 21.03.2015
Сообщений: 29
09.09.2015, 18:39  [ТС] 36
Цитата Сообщение от Enno Посмотреть сообщение
Если всё работает, тогда твоя длл должна быть в процессе
Через монитор ресурсов нашёл свою Dll в списке связанных модулей с процессом WINWORD.EXE. Но почему не отрабатывает DllMain из моей DLL? (не создаётся файл "C:\\Temp\\temp.txt")

Добавлено через 39 секунд
Цитата Сообщение от Убежденный Посмотреть сообщение
C:\Windows\Temp
Там папка c:\Temp\
0
267 / 170 / 40
Регистрация: 25.08.2014
Сообщений: 1,087
Записей в блоге: 1
09.09.2015, 19:11 37
Цитата Сообщение от AdamWest Посмотреть сообщение
Но почему не отрабатывает DllMain
Используй CreateFile и WriteFile, выводи ошибки в MessageBox'ах.

Добавлено через 24 секунды
Цитата Сообщение от AdamWest Посмотреть сообщение
Там папка c:\Temp\
Она существует вообще?
0
Эксперт WindowsАвтор FAQ
17998 / 7699 / 892
Регистрация: 25.12.2011
Сообщений: 11,477
Записей в блоге: 16
09.09.2015, 21:27 38
Попробовал натравить свою поделку на Winword.exe (ver.2003). У меня лог нормально создается в c:\temp.

Может стоит последовать рекомендациям из моей темы и проверить каждую деталь.
0
0 / 0 / 0
Регистрация: 21.03.2015
Сообщений: 29
10.09.2015, 10:54  [ТС] 39
Цитата Сообщение от Enno Посмотреть сообщение
Используй CreateFile и WriteFile, выводи ошибки в MessageBox'ах.
Написал создание файла используя CreateFile и WriteFile, вот только MessageBox не показывает сообщения, даже из первой строки DllMain, printf тоже. Поэтому мне кажется что код DLL совсем не отрабатывает. Мб Dll нужно компилировать с каким нибудь до ключом?(Использую VS 2015)

Цитата Сообщение от Enno Посмотреть сообщение
Она существует вообще?
Да. существует.


Цитата Сообщение от Dragokas Посмотреть сообщение
Попробовал натравить свою поделку на Winword.exe (ver.2003). У меня лог нормально создается в c:\temp.
Может стоит последовать рекомендациям из моей темы и проверить каждую деталь.
Word у меня 2013 версии. А в итоге в чём была Ваша ошибка?

Dll:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
#include <stdio.h>
#include <winsock2.h>
#include <windows.h>
#include <iostream>
#include <thread>
using namespace std;
 
void logIt()
{
    HANDLE hFile;
    char DataBuffer[] = "This is some test data to write to the file.";
    DWORD dwBytesToWrite = (DWORD)strlen(DataBuffer);
    DWORD dwBytesWritten = 0;
    BOOL bErrorFlag = FALSE;
 
    hFile = CreateFile(L"C:\\Temp\\temp.txt", GENERIC_WRITE, 0, NULL,CREATE_NEW,FILE_ATTRIBUTE_NORMAL,NULL); 
 
    if (hFile == INVALID_HANDLE_VALUE)
    {
        printf("Cannot create file.\n");
                MessageBox(NULL, L"DllMain", L"Cannot create file", MB_OK);
        return;
    }
 
    bErrorFlag = WriteFile(hFile, DataBuffer, dwBytesToWrite, &dwBytesWritten, NULL);  
 
    if (FALSE == bErrorFlag)
    {
        printf("Terminal failure: Unable to write to file.\n");
                MessageBox(NULL, L"DllMain", L"Terminal failure: Unable to write to file", MB_OK);
    }
 
    CloseHandle(hFile);
};
 
INT APIENTRY DllMain(HMODULE hDll, DWORD Reason, LPVOID Reserved)
{
        MessageBox(NULL, L"DllMain", L"DllMain is LAUNCH", MB_OK);
    printf("DllMain.\n");
    logIt();
    switch (Reason)
    {
    case DLL_PROCESS_ATTACH:
        //fprintf(file, "DLL attach function called.n");
        break;
    case DLL_PROCESS_DETACH:
        //fprintf(file, "DLL detach function called.n");
        break;
    case DLL_THREAD_ATTACH:
        //fprintf(file, "DLL thread attach function called.n");
        break;
    case DLL_THREAD_DETACH:
        //fprintf(file, "DLL thread detach function called.n");
        break;
    }
 
    return TRUE;
}
0
Эксперт WindowsАвтор FAQ
17998 / 7699 / 892
Регистрация: 25.12.2011
Сообщений: 11,477
Записей в блоге: 16
10.09.2015, 11:41 40
Цитата Сообщение от AdamWest Посмотреть сообщение
Word у меня 2013 версии. А в итоге в чём была Ваша ошибка?
Не имею понятия, о какой ошибке (моей) идет речь. У меня все нормально.
Укажите разрядность Вашего MS Office и версию ОС. Если найду время, попробую на нем.
0
10.09.2015, 11:41
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
10.09.2015, 11:41
Помогаю со студенческими работами здесь

Отслеживание закрытия программы
Приветствую! Нужна ваша помощь! Каким образом можно запустить exe файл и ждать его завершения?...

Отслеживание закрытия диалога
Здравствуйте! Имеется вот такой класс: package com.contedevel.timetable; import...

Отслеживание закрытия стороннего приложения
Всем доброго времени суток. Нужно реализовать программу последовательного открытия .exe файлов. То...

Отслеживание закрытия формы javafx
Здравствуйте! Такой вопрос. Есть форма (сцена) приложения и вот из нее по кнопке создаю и запускаю...


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

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