«Невозможно открыть файл» из-за проблем с temp-файлами

Приветствую.
Использую консольную VMP 3.8.7.2001 (проблема была и с 3.8.5/3.8.6, другие не проверял) на Windows Server 2022.
Запускаю сразу несколько (4-7) процессов одновременно для обработки нескольких файлов.
Иногда возникали ошибки в вмп о невозможности открытия какого-то моего файла: [[VMProtect_Con.exe]] “[Ошибка] Невозможно открыть файл "path\to\file.dll"”
Проблема появлялась случайно и не уходила сама по себе. Иногда помогал перезапуск родительской программы-менеджера, чаще - только перезапуск всего сервера.

Как оказалось, проблема появляется, если удалить папку «%LocalAppData%\Temp<номер_используемый_в_вмп>», где появляются файлы vmpXXX.tmp при работе процессов. Вмп почему-то пересоздает эту папку только после перезагрузки сервера.
На сервере мало пространства на диске, оно часто забито на 90+%, поэтому включена авто-очистка диска, и файлы в temp регулярно чистятся. С этим и связываю случайное проявление проблемы ни с того, ни с сего.
Вопрос: можно ли как-то улучшить ситуацию с использованием временных файлов? Проверять наличие нужной папки, и если ее нет - создавать при каждом запуске процесса вмп? Да и улучшить репорт ошибок тоже не помешало бы, а то сейчас просто пишет, что не может открыть какой-то мой файл, хотя это неправда.

Прикрепляю лог ProcessMonitor одного из процессов, обратите внимание на ошибку NAME_NOT_FOUND при доступе к “C:\Users\USERNAME\AppData\Local\Temp\1”:

<event>
<ProcessIndex>144</ProcessIndex>
<Time_of_Day>8:34:11,5278705</Time_of_Day>
<Process_Name>VMProtect_Con.exe</Process_Name>
<PID>336</PID>
<Operation>CreateFile</Operation>
<Path>C:\Users\USERNAME\AppData\Local\Temp\1</Path>
<Result>NAME NOT FOUND</Result>
<Detail>Desired Access: Read Attributes, Disposition: Open, Options: Open Reparse Point, Attributes: n/a, ShareMode: Read, Write, Delete, AllocationSize: n/a</Detail>
</event>

procmon-vmpfail-log.zip (1.51 KB)

Для создания темпового файла используется следующий код:

		wchar_t lpTempPathBuffer[MAX_PATH], szTempFileName[MAX_PATH];
		DWORD dwRetVal = GetTempPathW(MAX_PATH, lpTempPathBuffer);
		if (dwRetVal <= MAX_PATH && (dwRetVal != 0)) {
			UINT uRetVal = GetTempFileNameW(lpTempPathBuffer, L"vmp", 0, szTempFileName);
			if (uRetVal > 0)
				ret  = os::ToUTF8(std::wstring(szTempFileName));
		}

Результат выглядит следующим образом:
“C:\Users\USERNAME\AppData\Local\Temp\vmp6AE6.tmp”

Никаких дополнительных подкаталогов внутри Temp не создается.

Разобрался. У почти всех процессов в переменных окружения неправильные %TMP%/%TEMP%, ведут на "\Temp\XYZ" вместо "\Temp". А GetTempPath как раз получает значение отсюда. Так что к вмп действительно не относится, можно закрывать =)

P.S. Если кому интересно, то вот статья про данный феномен: %TEMP% environment variable has a \2 or other number after it – rakhesh.com