Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  

Показать сообщение отдельно

Ветеран


Сообщения: 3320
Благодарности: 916

Профиль | Отправить PM | Цитировать


Delirium, когда в МультиБут понадобилось определить кто запускал консоль/GUI процесс, нашёл эту тему Как узнать имя процесса-родителя, а там ссылку в посте под номер 4
Тем не менее, код, переписанный с Делфи на С, не добавил, так как представил, что помимо explorer.exe и cmd.exe, программу может запускать totalcmd.exe, far.exe и т.д., что делает данный подход не надёжным.


Код: Выделить весь код
#define PSAPI_VERSION 1

#include <windows.h>
#include <stdio.h>
#include <Winternl.h>
#include <Psapi.h>

#pragma comment(lib, "Psapi.lib")

int WINAPI wWinMain (HINSTANCE hThisInst, HINSTANCE hPrevInst, LPWSTR lpszArgs, int nWinMode)
{
	HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, GetCurrentProcessId());
	if(hProcess == INVALID_HANDLE_VALUE)
		return -1;

	HMODULE hNtDll = LoadLibrary(L"ntdll.dll");
	if(hNtDll == NULL)
		return -1;

	typedef NTSTATUS (NTAPI *pfnNtQueryInformationProcess)(
		IN  HANDLE ProcessHandle,
		IN  PROCESSINFOCLASS ProcessInformationClass,
		OUT PVOID ProcessInformation,
		IN  ULONG ProcessInformationLength,
		OUT PULONG ReturnLength    OPTIONAL
		);

	pfnNtQueryInformationProcess gNtQueryInformationProcess = (pfnNtQueryInformationProcess)GetProcAddress(hNtDll, "NtQueryInformationProcess");
    if(gNtQueryInformationProcess == NULL)
	{
        FreeLibrary(hNtDll);
        return -1;
    }
	
	typedef struct _PROCESS_BASIC_INFORMATION {
		NTSTATUS ExitStatus;
		PPEB PebBaseAddress;
		ULONG_PTR AffinityMask;
		LONG BasePriority;
		ULONG_PTR UniqueProcessId;
		ULONG_PTR InheritedFromUniqueProcessId;
	};
	_PROCESS_BASIC_INFORMATION Info ={0};

	gNtQueryInformationProcess(hProcess, ProcessBasicInformation, &Info, sizeof(Info), NULL);// == NO_ERROR)
	CloseHandle(hProcess);
	
	hProcess = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, (DWORD)Info.InheritedFromUniqueProcessId);
	wchar_t szFileName[MAX_PATH] = L"";
	GetModuleFileNameEx(hProcess, NULL, szFileName, MAX_PATH);
	CloseHandle(hProcess);

	MessageBox(NULL, szFileName, L"Hi", MB_ICONINFORMATION);
	
	if(hNtDll != NULL)
		FreeLibrary(hNtDll);

	return 0;
}
На C# наверное можно перенести, а там и в Excel.
Не писал под .NET в Excel, так что не знаю нюансов, но разве при запуске второго экземпляра Excel не создаёт новой вкладке в своём окне? Или с рапортами выделяется отдельный поток и всё?
Это сообщение посчитали полезным следующие участники:

Отправлено: 20:01, 05-12-2009 | #2