• C/C++ Crear un escritorio oculto

 #491004  por ExaBytes
 03 Mar 2017, 07:41
Buenas Amigos .. Estos últimos días he estado envuelta en un proyecto que requiere creación de nuevos escritorios y pensé en compartir un trozo de código espero les ea de utilidad

#include "Windows.h"
#pragma comment(lib, "Rpcrt4")


#define  RAND_DESK_NAME  0x000040

template <class TCHAR>
class MakeNewDesktop
{
public:

	MakeNewDesktop();
	bool generateUUID(LPVOID buffer, DWORD sz);
	bool setDeskName(TCHAR *name);
	void SwitchToNew();
	void SwitchToDefault() const;
private:
	bool Create();

public:

private:
	TCHAR DeskName[40];
	int randName;
	bool b_ok;
	UUID bUuid;
	RPC_WSTR rstrUUID;
	HDESK hDeskNew;
	HDESK hDeskOld;

protected:
};


template <class TCHAR>
MakeNewDesktop<TCHAR>::MakeNewDesktop() : randName(0), rstrUUID(nullptr), hDeskNew(nullptr),
hDeskOld(nullptr), b_ok(false)
{
}


template <class TCHAR>
bool MakeNewDesktop<TCHAR>::generateUUID(LPVOID buffer, DWORD sz)
{
	// vamos a Generar El Indentificador  Universal unico
	if (UuidCreate(&bUuid) == RPC_S_OK) b_ok = true;
	else return false;

	if (b_ok != false && UuidToStringW(&bUuid, &rstrUUID) == RPC_S_OK)
	{
		// copiamos el numero de caracteres que requiere el buffer
		lstrcpynW(LPWSTR(buffer), LPCWSTR(rstrUUID), sz);
		return true;
	}

	return false;
}

template <class TCHAR>
bool MakeNewDesktop<TCHAR>::setDeskName(TCHAR* name)
{
	if (name == NULL || ua_lstrlenW(name) > 40) return false;
	else  lstrcpynW(DeskName, name, lstrlenW(name) + 1);
	return true;
}

template <class TCHAR>
bool MakeNewDesktop<TCHAR>::Create()
{

	b_ok = false;
	if (randName != false || DeskName == FALSE)
		generateUUID(DeskName, 40);

	if (DeskName != NULL && hDeskNew == NULL)
	{
		hDeskOld = GetThreadDesktop(GetCurrentThreadId()); // obtenemos el manejdor de el escritorio actual
		hDeskNew = CreateDesktopW(DeskName, NULL, NULL, 0, GENERIC_ALL, NULL); // creamos el nuevo
		if (hDeskOld != NULL && hDeskNew != NULL)
		{
			WCHAR  explore[MAX_PATH];
			ExpandEnvironmentStringsW(L"%windir%\\explorer.exe", explore, MAX_PATH - 1);
			STARTUPINFOW startup_info = { 0 };
			PROCESS_INFORMATION process_info = { 0 };

			if (SetThreadDesktop(hDeskNew))
			{
				startup_info.cb = sizeof(startup_info);
				startup_info.lpDesktop = DeskName;
				CreateProcessW(explore, NULL, NULL, NULL, FALSE, 0, NULL, NULL, &startup_info, &process_info);
				SetThreadDesktop(hDeskOld);
			}
		}

		b_ok = true;
	}

	return  b_ok;
}

template <class TCHAR>
void MakeNewDesktop<TCHAR>::SwitchToNew()
{

	if ((Create() != NULL))
	{
		SetThreadDesktop(hDeskNew);
		SwitchDesktop(hDeskNew);

	}

}

template <class TCHAR>
void MakeNewDesktop<TCHAR>::SwitchToDefault() const
{
	SwitchDesktop(hDeskOld);
	CloseHandle(hDeskNew);
}

typedef  MakeNewDesktop<wchar_t> MakeDeskW;
#endif // CREATEDESKTOP_H
	MakeDeskW newDesk;
	newDesk.setDeskName(L"Selene-PC");
	newDesk.SwitchToNew();
	Sleep(9000);
	newDesk.SwitchToDefault();
 #491025  por Blau
 04 Mar 2017, 00:26
El código es genial si se utiliza para algún proposito maligno :ja: Veo que te has dejado un #endif (que supongo que seria parte de un include guard), creo que es mejor usar #pragma once.
 #491027  por TITAN
 04 Mar 2017, 00:35
Estaría bueno que algunos de los proximos rat que esten por salir lo pongan en practica