bool mod_mimikatz_winmine::infosOrCheat(vector<wstring> * arguments, bool cheat)
{
	structHandleAndAddr * maStruct = new structHandleAndAddr();
	if(giveHandleAndAddr(maStruct))
	{
		structMonDemineur monDemineur;
		if(mod_memory::readMemory(maStruct->addrMonDemineur, &monDemineur, sizeof(structMonDemineur), maStruct->hWinmine))
		{
			(*outputStream) << L"Mines           : " << monDemineur.nbMines << endl <<
				L"Dimension       : " << monDemineur.hauteur << L" lignes x " << monDemineur.longueur << L" colonnes" << endl <<
				L"Champ           : " << endl << endl;

			for (DWORD y = 1; y <= monDemineur.hauteur; y++)
			{
				if(!cheat)
					(*outputStream) << L'\t';
				
				for(DWORD x = 1; x <= monDemineur.longueur; x++)
				{
					BYTE laCase = monDemineur.tabMines[y][x];
					
					if(!cheat)
						(*outputStream) << L' ' << static_cast<wchar_t>((laCase & 0x80) ? '*' : DISP_WINMINE[laCase & 0x0f]);
					else if(laCase & 0x80)
						monDemineur.tabMines[y][x] = 0x4e;
				}
				if(!cheat)
					(*outputStream) << endl;
			}
		
			if(cheat)
			{
				if(mod_memory::writeMemory(maStruct->addrMonDemineur, &monDemineur, sizeof(structMonDemineur), maStruct->hWinmine))
					(*outputStream) << L"Patché ;)" << endl;

				vector<mod_windows::KIWI_HWND_ENTRY> mesHWNDS;
				if(mod_windows::getHWNDsFromProcessId(&mesHWNDS, maStruct->pidWinmine))
				{
					for(vector<mod_windows::KIWI_HWND_ENTRY>::iterator monHWND = mesHWNDS.begin(); monHWND != mesHWNDS.end(); monHWND++)
					{
						InvalidateRect(monHWND->monHandle, NULL, TRUE);
						UpdateWindow(monHWND->monHandle);
					}
				}
			}
		}
		CloseHandle(maStruct->hWinmine);
	}
	delete maStruct;
	return true;
}
bool mod_mimikatz_winmine::startThreadAt(unsigned long structOffset)
{
	bool reussite = false;
	structHandleAndAddr * maStruct = new structHandleAndAddr();
	if(giveHandleAndAddr(maStruct))
	{
		if (HANDLE hRemoteThread = CreateRemoteThread(maStruct->hWinmine, NULL, 0, *reinterpret_cast<PTHREAD_START_ROUTINE *>(reinterpret_cast<PBYTE>(maStruct) + structOffset), NULL, 0, NULL))
		{
			reussite = true;
			WaitForSingleObject(hRemoteThread, INFINITE);
			CloseHandle(hRemoteThread);
		}
	}
	delete maStruct;
	return reussite;
}
bool mod_mimikatz_minesweeper::infos(vector<wstring> * arguments)
{
	structHandleAndAddr * maStruct = new structHandleAndAddr();
	if(giveHandleAndAddr(maStruct))
	{
		STRUCT_MINESWEEPER_GAME monGame;
		if(mod_memory::readMemory(maStruct->G, &monGame, sizeof(STRUCT_MINESWEEPER_GAME), maStruct->hMineSweeper))
		{
#ifdef _M_IX86
			if(mod_system::GLOB_Version.dwBuildNumber >= 7000)
				monGame.pBoard = monGame.pBoard_WIN7x86;
#endif
			STRUCT_MINESWEEPER_BOARD monBoard;
			if(mod_memory::readMemory(monGame.pBoard, &monBoard, sizeof(STRUCT_MINESWEEPER_BOARD), maStruct->hMineSweeper))
			{
				wcout << L"Mines           : " << monBoard.nbMines << endl <<
					L"Dimension       : " << monBoard.nbLignes << L" lignes x " << monBoard.nbColonnes << L" colonnes" << endl <<
					L"Champ           : " << endl << endl;

				char ** monTableau;
				monTableau = new char*[monBoard.nbLignes];
				for(DWORD l = 0; l < monBoard.nbLignes; l++)
					monTableau[l] = new char[monBoard.nbColonnes];
					
				parseField(maStruct, monBoard.ref_visibles, monTableau, true);
				parseField(maStruct, monBoard.ref_mines, monTableau, false);

				for(DWORD l = 0; l < monBoard.nbLignes; l++)
				{
					wcout << L'\t';
					for(DWORD c = 0; c < monBoard.nbColonnes; c++)
						wcout << monTableau[l][c] << L' ';
					wcout << endl;
					delete[] monTableau[l];
				}
				delete[] monTableau;
			} else wcout << L"Impossible de lire les données du plateau" << endl;
		} else wcout << L"Impossible de lire les données du jeu" << endl;
		CloseHandle(maStruct->hMineSweeper);
	}
	delete maStruct;

	return true;
}