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

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

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

Студворк — интернет-сервис помощи студентам
Доброго времени суток!
Возникла нетривиальная(на мой взгляд) задачка: Открываем какой нибудь файл через какую нибудь программу(условно говоря 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
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
23.07.2015, 18:18
Ответы с готовыми решениями:

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

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

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

49
0 / 0 / 0
Регистрация: 21.03.2015
Сообщений: 29
10.09.2015, 12:09  [ТС]
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Dragokas Посмотреть сообщение
Не имею понятия, о какой ошибке (моей) идет речь
У вас Dll в хроме не выполнялась, как я понял. Я это имел ввиду.
Цитата Сообщение от Dragokas Посмотреть сообщение
Укажите разрядность Вашего MS Office и версию ОС
ОС Windows 7 максимальная x64
MS Word 2013 (15.0.4569.1504) MSO (15.0.4569.1506) 32-разрядная версия
0
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
10.09.2015, 14:37
Какие-то высосанные из пальца проблемы, чес-слово !..

Стартовый адрес удаленного потока известен - это LoadLibraryW, так в
чем проблема ? После запуска Office цепляйся к нему отладчиком, ставь
брейкпоинт на эту функцию, а затем запускай CreateRemoteThread.

Когда загрузится dll, можно поставить второй брейкпоинт на DllMain и
выполнить ее в пошаговом режиме.

Второй вариант: выполнить этот тест на виртуальной машине с подключенным
отладчиком ядра, вместо MessageBox используя OutputDebugString/DbgPrint.
Весь вывод пойдет в окно отладчика.

Такие "трудности" решаются минуты за 3.
0
 Аватар для Shvonder
46 / 35 / 24
Регистрация: 16.03.2015
Сообщений: 179
10.09.2015, 19:44
Цитата Сообщение от Убежденный Посмотреть сообщение
Такие "трудности" решаются минуты за 3.
Да, для супер-хакеров, типа "Убеждённого"...
Другой вопрос, никак ни вникну (пытаюсь понять, со-вчерашнего дня...), что Человеку нужно, что соорудить требуется? (если можно доступным языком)

Добавлено через 16 минут
Но в другом случае, понял разумеется, но все-таки, ведь перехватов великое множество (т.е. способов), а-вы, Убеждённый, вскользь говорите, можно было и конкретный пример показать.

Добавлено через 2 минуты
у меня нет подобного примера, точнее есть, но на мой взгляд - Ваш будет безупречней!

Добавлено через 2 часа 2 минуты
Ни в обиду, но истинный Спец - всегда даст знать Нубу, в другом случае псевдо-Гуру-обманщик...
Я постараюсь, осуществить сто/процентный пример, но - когда допью ( некоторую ёмкость ).

Добавлено через 12 минут
Спасибо - всем, что помните обо мне, спасибо, за-спонсорскую Атаку, много ни перечисляйте, а-то я умру от вина ( спасибо и знайте, всё что делается - это дпя ВАС, просто передаю опыт, в освоении которого, Вы проскочите лишнее Шаги )
0
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
10.09.2015, 19:45
Мой пример (если бы я его захотел написать) не сильно отличался бы от того,
как смастерил AdamWest, только я понаставлю проверку ошибок на
каждом шагу, а вместо fprintf использую обертку над OutputDebugString.
1
 Аватар для Shvonder
46 / 35 / 24
Регистрация: 16.03.2015
Сообщений: 179
10.09.2015, 19:56
Убежденный, мы не знакомы - поэтому я не могу сказать вам, -хм... одним словом прекрасно вас понимаю, наверное - я ни очень связан с жизненными обстоятельствами, да-и вообще, не считаю, что передача какой-то информации - может применить. Да, само-собой, применить можно, но и вы - Убеждённый, не забывайте, что здесь ни Технический форум и ни-очень круто, просто - подсказываем ( проводим Своё время - все-равно, лучше, чем у TV ), а-поэтому, нет упреков, но мне ( лично ) ни жаль, с Точки Зрения ( как-бы ) ни открывать "секретов". Думаю, Вы, меня понимаете. Поэтому - мне хочется, чтобы с нашей поддержки, т.е. Русских людей, которые имеют какой=либо Опыт - передать - молодым.
thx!
0
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
10.09.2015, 20:00
Shvonder, я стараюсь это и делать - делиться опытом.
Т.е. объяснять идеи, которые лежат в основе того или иного кода,
приводить ссылки на MSDN и другие источники, где человек может
(если захочет) узнать больше по этой теме.

А тупо писать за других код, который потом будут копи-пастить
бездумно куда ни попадя - это не "делиться опытом".
3
0 / 0 / 0
Регистрация: 21.03.2015
Сообщений: 29
11.09.2015, 17:41  [ТС]
Цитата Сообщение от Shvonder Посмотреть сообщение
что Человеку нужно, что соорудить требуется?
Пишу модуль, который должен - открывать файлы с сервера(скачиваются и открываются локально), при их изменении отсылать эти файлы на сервер, при закрытии файлов будет что то ещё(ну то есть пока не ясно что конкретно, но понятно что реакция на закрытие должна быть).
Первый способ отлова изменений был через ReadDirectoryChangesW (Провалилось из-за разнообразия особенностей генерирования уведомления продуктами MS Office).
Второй, это способ описанный здесь. К сожалению мне пока не хватает ума и опыта чтобы довести его до конца.
Третий через хэндлы файлов(Пока остановился на нём. Если прототип успешно пройдёт тестирование, то так и оставлю, если нет, буду дальше копать вариант с Dll).

P.S. Извиняюсь за оффтоп.
0
Эксперт WindowsАвтор FAQ
 Аватар для Dragokas
18035 / 7738 / 892
Регистрация: 25.12.2011
Сообщений: 11,502
Записей в блоге: 16
12.09.2015, 16:01
Цитата Сообщение от AdamWest Посмотреть сообщение
У вас Dll в хроме не выполнялась, как я понял. Я это имел ввиду.
Как бы Вам сказать. В рекомендациях уважаемого Убежденного невыполнение буквально любого пункта ведет к "блокировке" функционала библиотеки. И это наверное только начало списка проблем. Самому мне перечитать и реализовать все довольно долго. А мне уже не нужно, т.к. я свою проблему решил иначе. Тем не менее я чисто ради интереса исправил часть ошибок и проблем, задействовал несколько средств межпроцессной коммуникации, но ни хром, ни офис 2013 (Win7x32) пока не поддаются (внедрение кода происходит удачно и на этом все). Выложу в своей теме для других то, на чем остановился.

Цитата Сообщение от Убежденный Посмотреть сообщение
Второй вариант: выполнить этот тест на виртуальной машине с подключенным
отладчиком ядра, вместо MessageBox используя OutputDebugString/DbgPrint.
Весь вывод пойдет в окно отладчика.
Похоже на данном этапе это как раз и будет наиболее рациональный путь для способа с удаленным потоком.

Цитата Сообщение от AdamWest Посмотреть сообщение
Третий через хэндлы файлов
Есть и четвертый. Использовать нативные средства офиса - макросы, размещенные в персональной книге макросов, точнее в Word-е это зовется - Шаблон .dot, который задействуется при открытии любого документа и находится по адресу %userprofile%\AppData\Roaming\Microsoft\ Шаблоны\ (язык VBA).
Событийная схема. Код таков (читайте комментарии):

Visual Basic
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
Option Explicit
 
Private Type COPYDATASTRUCT
    dwData As Long
    cbData As Long
    lpData As Long
End Type
 
Private Declare Function SendMessageW Lib "user32" (ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
Private Declare Function FindWindow Lib "user32" Alias "FindWindowW" (ByVal lpClassName As Long, ByVal lpWindowName As Long) As Long
Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
 
Private Const WM_COPYDATA = &H4A
 
Private Sub Document_Close()
    Dim Answer          As VbMsgBoxResult
    Dim BookPath        As String
    Dim ReceiveWndTtile As String
    
    'Куда отправляем (Title окна) ?
    
    ReceiveWndTtile = "Get_WM_COPYDATA"
    
    BookPath = ActiveDocument.Path & "\" & ActiveDocument.Name
    
    With ActiveDocument
        ' Изменяем поведение программы, делая псевдо-перехват диалогового окна сохранения файла, эмулируя наше собственное.
        ' Иначе это окно возникнет в момент времени ПОСЛЕ возбуждения данного события,
        ' а нам ведь нужно отправить в другой процесс сообщение в момент времени - ПОСЛЕ сохранения документа, а не ДО.
        If Not .Saved Then
            Answer = MsgBox("Вы хотите сохранить изменения в " & .Name & "?", vbYesNoCancel Or vbExclamation)
            If vbYes = Answer Then
                .Save
                .Saved = True
            ElseIf vbNo = Answer Then
                .Saved = True   ' сообщаем документу, что несохраненных данных нет, таким образом стандартное окно не появится
            End If
        End If
        ' Если не была нажата кнопка "Отмена" -> документ в процессе закрытия, а исходный файл содержит актуальные данные.
        ' Документ все еще открыт Word-ом в режиме общего доступа, тем не менее его уже можно использовать другим процессом.
        If vbCancel <> Answer Then
            'MsgBox BookPath
            
            Dim hWnd As Long
            hWnd = FindWindow(0&, StrPtr(ReceiveWndTtile))
            
            If 0 <> hWnd Then
                Dim CDRec As COPYDATASTRUCT
                CDRec.dwData = 1                'ID
                CDRec.cbData = LenB(BookPath)   'Size of Data
                CDRec.lpData = StrPtr(BookPath) 'pointer to Data
                SendMessageW hWnd, WM_COPYDATA, hWnd, CDRec
                CloseHandle hWnd
            End If
        End If
    End With
End Sub
Вместо SendMessage можно вставить, что угодно - MessageBox (в VBA - MsgBox), запись в файл, любые WinAPI...
Доступ к шаблону можно получить из-под любого открытого документа по нажатию ALT+F11,
далее ->

Перед закрытием любого документа после актуализации файла будет отправлено сообщение WM_COPYDATA.

Пример принимающей стороны:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    switch (message)
    {
    case WM_COPYDATA:
    {
        COPYDATASTRUCT* cds = (COPYDATASTRUCT*)lParam;
        if (cds->dwData == 1) {
            LPCWSTR wStr = (LPCWSTR)(cds->lpData);
            MessageBoxW(0, wStr, L"My message", MB_OK);
        }
        break;
    }
    default:
        return DefWindowProc(hWnd, message, wParam, lParam);
    }
    return 0;
}
По крайней мере код внедрять уже не нужно. Он и так нативно выполняется из-под самого Word-а.
Подробнее - в форум по VBA.
Единственной проблемой здесь окажется стандартная политика безопасности (автоматическое отключение неподписанных макросов).
Здесь есть 2 решение:
1) отключить запрос на подтверждение запуска неподписанных макросов, что повлечет в целом понижение уровня безопасности системы в целом. Скриптом. Вручную.
2) подписать шаблон с макросом. Собственно, саму подпись можно изготовить самому средствами самого же офиса.
Это делается просто, хотя я сам никогда этим не пользовался. Уточните на спец. форуме, если будет необходимость.
1
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
12.09.2015, 16:21
Цитата Сообщение от Dragokas Посмотреть сообщение
но ни хром, ни офис 2013 (Win7x32) пока не поддаются
Цитата Сообщение от Убежденный Посмотреть сообщение
Процессы chrome, как и IE в защищенном режиме, выполняются на уровнях целостности low и untrusted.
Чтобы с этих уровней обращаться к файлам, реестру, процессам и другим объектам, на этих объектах
должна стоять соответствующая разрешающая метка.
Например, если ты хочешь из процесса chrome.exe (IL = untrusted) отправить данные через
пайп в другой процесс (который запущен в обычном режиме), то нужно выполнить два условия:

1. Пайп должен создаваться на стороне сервера, то есть, во втором процессе,
так как процесс с Untrusted Integrity не может создавать такие объекты.

2. Чтобы из хромовского процесса можно было достучаться до этого сервера, пайп
должен быть создан с дескриптором безопасности, у которого в SACL прописано
"Integrity Level = Untrusted". Тогда будет работать. Для теста можно использовать
такой Security Descriptor:
D:P(A;;GA;;;WD)S(ML;;NW;;;S-1-16-0)
1
Эксперт WindowsАвтор FAQ
 Аватар для Dragokas
18035 / 7738 / 892
Регистрация: 25.12.2011
Сообщений: 11,502
Записей в блоге: 16
12.09.2015, 17:35
Спасибо. Как-то забыл поток испробовать.
И да действительно, Process Explorer для большинства процессов хрома показывает Untrusted IL.
А при внедрении в те, у которых уровень IL выше, по крайней мере создается переменная окружения.
По сути да, сильно урезанные права.

А вот кстати, у обсуждаемого Word IL - средний.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
12.09.2015, 17:35

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
50
Ответ Создать тему
Новые блоги и статьи
Запустил конкурс "тем и промптов для текстовых квестов созданных почти чисто ИИ"
Adler 06.10.2026
Всем привет! За последние три-четыре дня я создал более 16 текстовых квестовых игр используя преимущественно по одному запросу к ИИ на игру. Мне так понравилось смотреть все ветки/ сцены во всех. . .
ИИ не может найти нужный язык в списке
Supersumestria 05.10.2026
Я ему даю вот такое изображение и прошу найти и подчеркнуть немецкий язык. Возвращает он вот это: https:/ / i. **********/ vqBWLe2. png Нужную строчку в 3й колонке просто выдумал. . Это. . .
Новая последняя моя музыка в SUNO
zorxor 05.10.2026
Здравствуйте, дорогие мои друзья! С большой радостью я хотел бы представить вам свою новую последнею музыку, которую сгенерировала мне по моей просьбе нейросеть SUNO. С уважением, zorxor. Это. . .
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js. В помощники взял Яндекс-Алису. Было создано три зала на разные интересы. исторические и ретро сериал Хичкок. . .
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru