void CrashHandlerWindows::writeCrashDump(PEXCEPTION_POINTERS pointers) {
	
	GetTempPath(boost::size(m_pCrashInfo->miniDumpTmpFile), m_pCrashInfo->miniDumpTmpFile);
	WCHAR tick[24];
	_ultow(GetTickCount(), tick, 10);
	wcscat(m_pCrashInfo->miniDumpTmpFile, tick);
	wcscat(m_pCrashInfo->miniDumpTmpFile, L"-arx-crash.dmp");
	
	HANDLE file = CreateFileW(m_pCrashInfo->miniDumpTmpFile, GENERIC_READ | GENERIC_WRITE,
	                          0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
	if(file == INVALID_HANDLE_VALUE) {
		return;
	}
	
	MINIDUMP_TYPE miniDumpType = (MINIDUMP_TYPE)(MiniDumpWithIndirectlyReferencedMemory
	                                             | MiniDumpScanMemory);
	
	MINIDUMP_EXCEPTION_INFORMATION exceptionInfo;
	exceptionInfo.ThreadId = m_pCrashInfo->threadId;
	exceptionInfo.ExceptionPointers = pointers;
	exceptionInfo.ClientPointers = TRUE;

	// Write the minidump
	MiniDumpWriteDump(GetCurrentProcess(), GetCurrentProcessId(), file, miniDumpType,
	                  &exceptionInfo, NULL, NULL);
	
	CloseHandle(file);
	
}
Example #2
0
NTSTATUS
BcdDeleteElement (
    _In_ HANDLE ObjectHandle,
    _In_ ULONG Type
    )
{
    NTSTATUS Status;
    HANDLE ElementsHandle, ElementHandle;
    WCHAR TypeString[22];

    /* Open the elements key */
    Status = BiOpenKey(ObjectHandle, L"Elements", &ElementsHandle);
    if (NT_SUCCESS(Status))
    {
        /* Convert the element ID into a string */
        if (!_ultow(Type, TypeString, 16))
        {
            /* Failed to do so */
            Status = STATUS_UNSUCCESSFUL;
        }
        else
        {
            /* Open the element specifically */
            Status = BiOpenKey(ElementHandle, TypeString, &ElementHandle);
            if (NT_SUCCESS(Status))
            {
                /* Delete it */
                Status = BiDeleteKey(ElementHandle);
                if (NT_SUCCESS(Status))
                {
                    /* No point in closing the handle anymore */
                    ElementHandle = NULL;
                }
            }
            else
            {
                /* The element doesn't exist */
                Status = STATUS_NOT_FOUND;
            }

            /* Check if we should close the key */
            if (ElementHandle)
            {
                /* Do it */
                BiCloseKey(ElementHandle);
            }
        }
    }

    /* Check if we should close the elements handle */
    if (ElementsHandle)
    {
        /* Do it */
        BiCloseKey(ElementsHandle);
    }

    /* Return whatever the result was */
    return Status;
}
Example #3
0
VOID ProcessItemCreateCallback(
    __in PVOID Object,
    __in PH_EM_OBJECT_TYPE ObjectType,
    __in PVOID Extension
    )
{
    PPH_PROCESS_ITEM processItem = Object;
    PPROCESS_EXTENSION extension = Extension;

    _ultow((ULONG)processItem->ProcessId, extension->PidHexText, 16);
}
Example #4
0
var& var::operator+=(const wstring& rhs)
{
	wstring s;
	if(vt == STR) {
		wstring s=rhs;
		if (UnquoteString(s,'#','#')) {
			if (!isbuf) {
				//String + buf Hex Buffer to String ok
				size_t len=s.length()/2;
				wchar_t* buf = (wchar_t*)malloc(len*2+1);
				Str2Rgch(s,buf,len+1);
				s.assign(buf,len);
				str  += s;
				size += len;
				free(buf);
			} else { 
				// Buffer + Buffer
				str = L"#"+str.substr(1,str.length()-2)+s+L"#";
				size += s.length()/2;
			}
		} else {
			if (!isbuf) {
				//str + str
				str += rhs;
				size += rhs.length();
			} else {
				//buf + str
				wstring Hex;
				Str2Hex(s,Hex,s.length());
				str = L"#"+str.substr(1,str.length()-2)+Hex+L"#";
				size += s.length();
			}
		}

	} else if(vt == DW) {
		var v=(wstring)rhs;

		wchar_t dwbuf[12];
		if (v.isbuf) {
			//ulong + BUFFER >> CONCATE HEX
			s = strbuffhex();
			wsprintf(dwbuf, L"%08X",dw);
			*this = L"#"+((wstring)dwbuf)+s+L"#";
		} else {
			//ulong + STRING >> CONCATE _ultow+str
			s = _wcsupr(_ultow(dw, dwbuf, 16));
			*this = s+v.str;
		}
	}

	return *this;
}
Example #5
0
int GetValueW(MCONTACT hContact, const char *module, const char *setting, WCHAR *value, int length)
{
	DBVARIANT dbv = { 0 };

	if (!module || !setting || !value)
		return 0;

	if (length >= 10 && !db_get_s(hContact, module, setting, &dbv, 0)) {
		switch (dbv.type) {

		case DBVT_ASCIIZ:
			mir_wstrncpy(value, ptrW(mir_a2u(dbv.pszVal)), length);
			break;

		case DBVT_DWORD:
		case DBVT_WORD:
		case DBVT_BYTE:
			_ultow(getNumericValue(&dbv), value, 10);
			break;

		case DBVT_WCHAR:
			mir_wstrncpy(value, dbv.pwszVal, length);
			break;

		case DBVT_UTF8:
			mir_wstrncpy(value, ptrW(mir_utf8decodeW(dbv.pszVal)), length);
			break;

		case DBVT_DELETED:
			value[0] = 0;
			return 0;
		}

		int type = dbv.type;
		db_free(&dbv);
		return type;
	}

	value[0] = 0;
	return 0;
}
Example #6
0
var& var::operator+=(const ulong& rhs)
{
	if(vt == DW)
		dw += rhs;
	else if(vt == FLT)
		flt += rhs;
	else if(vt == STR) {
		wstring s;
		wchar_t dwbuf[12];
		if (isbuf) {
			//Concate Num ulong to a buffer (4 octets)
			s = strbuffhex();
			wsprintf(dwbuf, L"%08X",rev(rhs));
			*this = L"#" + s + dwbuf + L"#";
		} else {
			//Add Number to a String
			s = _wcsupr(_ultow(rhs, dwbuf, 16));
			str += s;
			size += s.length();
		}
	}
	return *this;
}
Example #7
0
INT_PTR CDialogManage::CTabSettings::OnCommand(WPARAM wParam, LPARAM lParam)
{
	switch (LOWORD(wParam))
	{
	case IDC_MANAGESETTINGS_LANGUAGE_COMBOBOX:
		if (HIWORD(wParam) == CBN_SELCHANGE)
		{
			int sel = ComboBox_GetCurSel((HWND)lParam);
			LCID lcid = (LCID)ComboBox_GetItemData((HWND)lParam, sel);
			if (lcid != Rainmeter->m_ResourceLCID)
			{
				WCHAR buffer[16];
				_ultow(lcid, buffer, 10);
				WritePrivateProfileString(L"Rainmeter", L"Language", buffer, Rainmeter->GetIniFile().c_str());

				std::wstring resource = Rainmeter->GetPath() + L"Languages\\";
				resource += buffer;
				resource += L".dll";
				FreeLibrary(Rainmeter->m_ResourceInstance);
				Rainmeter->m_ResourceInstance = LoadLibraryEx(resource.c_str(), NULL, DONT_RESOLVE_DLL_REFERENCES | LOAD_LIBRARY_AS_DATAFILE);
				Rainmeter->m_ResourceLCID = lcid;

				if (CDialogAbout::c_Dialog)
				{
					int sel = TabCtrl_GetCurSel(GetDlgItem(CDialogAbout::c_Dialog->GetWindow(), IDC_ABOUT_TAB));
					SendMessage(CDialogAbout::c_Dialog->GetWindow(), WM_DELAYED_CLOSE, 0, 0);
					if (sel == 0)
					{
						Rainmeter->DelayedExecuteCommand(L"!About");
					}
					else if (sel == 1)
					{
						Rainmeter->DelayedExecuteCommand(L"!About Skins");
					}
					else if (sel == 2)
					{
						Rainmeter->DelayedExecuteCommand(L"!About Plugins");
					}
					else //if (sel == 3)
					{
						Rainmeter->DelayedExecuteCommand(L"!About Version");
					}
				}

				SendMessage(c_Dialog->GetWindow(), WM_DELAYED_CLOSE, 0, 0);
				Rainmeter->DelayedExecuteCommand(L"!Manage Settings");
			}
		}
		break;

	case IDC_MANAGESETTINGS_CHECKUPDATES_CHECKBOX:
		Rainmeter->SetDisableVersionCheck(!Rainmeter->GetDisableVersionCheck());
		break;

	case IDC_MANAGESETTINGS_LOCKSKINS_CHECKBOX:
		Rainmeter->SetDisableDragging(!Rainmeter->GetDisableDragging());
		break;

	case IDC_MANAGESETTINGS_RESETSTATISTICS_BUTTON:
		Rainmeter->ResetStats();
		break;

	case IDC_MANAGESETTINGS_SHOWLOGFILE_BUTTON:
		Rainmeter->ShowLogFile();
		break;

	case IDC_MANAGESETTINGS_DELETELOGFILE_BUTTON:
		Rainmeter->DeleteLogFile();
		if (_waccess(Rainmeter->GetLogFile().c_str(), 0) == -1)
		{
			Button_SetCheck(GetDlgItem(m_Window, IDC_MANAGESETTINGS_LOGTOFILE_CHECKBOX), BST_UNCHECKED);
			EnableWindow(GetDlgItem(m_Window, IDC_MANAGESETTINGS_SHOWLOGFILE_BUTTON), FALSE);
			EnableWindow(GetDlgItem(m_Window, IDC_MANAGESETTINGS_DELETELOGFILE_BUTTON), FALSE);
		}
		break;

	case IDC_MANAGESETTINGS_LOGTOFILE_CHECKBOX:
		if (Rainmeter->GetLogging())
		{
			Rainmeter->StopLogging();
		}
		else
		{
			Rainmeter->StartLogging();
			if (_waccess(Rainmeter->GetLogFile().c_str(), 0) != -1)
			{
				EnableWindow(GetDlgItem(m_Window, IDC_MANAGESETTINGS_SHOWLOGFILE_BUTTON), TRUE);
				EnableWindow(GetDlgItem(m_Window, IDC_MANAGESETTINGS_DELETELOGFILE_BUTTON), TRUE);
			}
		}
		break;

	case IDC_MANAGESETTINGS_VERBOSELOGGING_CHECKBOX:
		Rainmeter->SetDebug(!Rainmeter->GetDebug());
		break;

	default:
		return 1;
	}

	return 0;
}
Example #8
0
void String::FromUInt(unsigned long value)
{
	wchar_t buffer[64];
	_ultow(value,buffer,10);
	SetBuffer(buffer);
}
Example #9
0
DWORD WINAPI PerformancePageRefreshThread(void *lpParameter)
{
    ULONGLONG  CommitChargeTotal;
    ULONGLONG  CommitChargeLimit;
    ULONGLONG  CommitChargePeak;

    ULONG  CpuUsage;
    ULONG  CpuKernelUsage;

    ULONGLONG  KernelMemoryTotal;
    ULONGLONG  KernelMemoryPaged;
    ULONGLONG  KernelMemoryNonPaged;

    ULONGLONG  PhysicalMemoryTotal;
    ULONGLONG  PhysicalMemoryAvailable;
    ULONGLONG  PhysicalMemorySystemCache;

    ULONG  TotalHandles;
    ULONG  TotalThreads;
    ULONG  TotalProcesses;

    WCHAR  Text[260];
    WCHAR  szMemUsage[256];

    MSG    msg;

    LoadStringW(hInst, IDS_STATUS_MEMUSAGE, szMemUsage, 256);

    while (1)
    {
        int nBarsUsed1;
        int nBarsUsed2;

        WCHAR szChargeTotalFormat[256];
        WCHAR szChargeLimitFormat[256];

        /*  Wait for an the event or application close */
        if (GetMessage(&msg, NULL, 0, 0) <= 0)
            return 0;

        if (msg.message == WM_TIMER)
        {
            /*
             *  Update the commit charge info
             */
            CommitChargeTotal = PerfDataGetCommitChargeTotalK();
            CommitChargeLimit = PerfDataGetCommitChargeLimitK();
            CommitChargePeak  = PerfDataGetCommitChargePeakK();
            _ultow(CommitChargeTotal, Text, 10);
            SetWindowTextW(hPerformancePageCommitChargeTotalEdit, Text);
            _ultow(CommitChargeLimit, Text, 10);
            SetWindowTextW(hPerformancePageCommitChargeLimitEdit, Text);
            _ultow(CommitChargePeak, Text, 10);
            SetWindowTextW(hPerformancePageCommitChargePeakEdit, Text);

            StrFormatByteSizeW(CommitChargeTotal * 1024,
                               szChargeTotalFormat,
                               sizeof(szChargeTotalFormat));

            StrFormatByteSizeW(CommitChargeLimit * 1024,
                               szChargeLimitFormat,
                               sizeof(szChargeLimitFormat));

            wsprintfW(Text, szMemUsage, szChargeTotalFormat, szChargeLimitFormat,
                      (CommitChargeLimit ? ((CommitChargeTotal * 100) / CommitChargeLimit) : 0));

            SendMessageW(hStatusWnd, SB_SETTEXT, 2, (LPARAM)Text);

            /*
             *  Update the kernel memory info
             */
            KernelMemoryTotal = PerfDataGetKernelMemoryTotalK();
            KernelMemoryPaged = PerfDataGetKernelMemoryPagedK();
            KernelMemoryNonPaged = PerfDataGetKernelMemoryNonPagedK();
            _ultow(KernelMemoryTotal, Text, 10);
            SetWindowTextW(hPerformancePageKernelMemoryTotalEdit, Text);
            _ultow(KernelMemoryPaged, Text, 10);
            SetWindowTextW(hPerformancePageKernelMemoryPagedEdit, Text);
            _ultow(KernelMemoryNonPaged, Text, 10);
            SetWindowTextW(hPerformancePageKernelMemoryNonPagedEdit, Text);

            /*
             *  Update the physical memory info
             */
            PhysicalMemoryTotal = PerfDataGetPhysicalMemoryTotalK();
            PhysicalMemoryAvailable = PerfDataGetPhysicalMemoryAvailableK();
            PhysicalMemorySystemCache = PerfDataGetPhysicalMemorySystemCacheK();
            _ultow(PhysicalMemoryTotal, Text, 10);
            SetWindowTextW(hPerformancePagePhysicalMemoryTotalEdit, Text);
            _ultow(PhysicalMemoryAvailable, Text, 10);
            SetWindowTextW(hPerformancePagePhysicalMemoryAvailableEdit, Text);
            _ultow(PhysicalMemorySystemCache, Text, 10);
            SetWindowTextW(hPerformancePagePhysicalMemorySystemCacheEdit, Text);

            /*
             *  Update the totals info
             */
            TotalHandles = PerfDataGetSystemHandleCount();
            TotalThreads = PerfDataGetTotalThreadCount();
            TotalProcesses = PerfDataGetProcessCount();
            _ultow(TotalHandles, Text, 10);
            SetWindowTextW(hPerformancePageTotalsHandleCountEdit, Text);
            _ultow(TotalThreads, Text, 10);
            SetWindowTextW(hPerformancePageTotalsThreadCountEdit, Text);
            _ultow(TotalProcesses, Text, 10);
            SetWindowTextW(hPerformancePageTotalsProcessCountEdit, Text);

            /*
             *  Redraw the graphs
             */
            InvalidateRect(hPerformancePageCpuUsageGraph, NULL, FALSE);
            InvalidateRect(hPerformancePageMemUsageGraph, NULL, FALSE);

            /*
             *  Get the CPU usage
             */
            CpuUsage = PerfDataGetProcessorUsage();
            if (CpuUsage <= 0 )       CpuUsage = 0;
            if (CpuUsage > 100)       CpuUsage = 100;

            if (TaskManagerSettings.ShowKernelTimes)
            {
                CpuKernelUsage = PerfDataGetProcessorSystemUsage();
                if (CpuKernelUsage <= 0)   CpuKernelUsage = 0;
                if (CpuKernelUsage > 100) CpuKernelUsage = 100;
            }
            else
            {
                CpuKernelUsage = 0;
            }
            /*
             *  Get the memory usage
             */
            CommitChargeTotal = PerfDataGetCommitChargeTotalK();
            CommitChargeLimit = PerfDataGetCommitChargeLimitK();
            nBarsUsed1 = CommitChargeLimit ? ((CommitChargeTotal * 100) / CommitChargeLimit) : 0;

            PhysicalMemoryTotal = PerfDataGetPhysicalMemoryTotalK();
            PhysicalMemoryAvailable = PerfDataGetPhysicalMemoryAvailableK();
            nBarsUsed2 = PhysicalMemoryTotal ? ((PhysicalMemoryAvailable * 100) / PhysicalMemoryTotal) : 0;

            GraphCtrl_AppendPoint(&PerformancePageCpuUsageHistoryGraph, CpuUsage, CpuKernelUsage, 0.0, 0.0);
            GraphCtrl_AppendPoint(&PerformancePageMemUsageHistoryGraph, nBarsUsed1, nBarsUsed2, 0.0, 0.0);
            /* PerformancePageMemUsageHistoryGraph.SetRange(0.0, 100.0, 10) ; */
            InvalidateRect(hPerformancePageMemUsageHistoryGraph, NULL, FALSE);
            InvalidateRect(hPerformancePageCpuUsageHistoryGraph, NULL, FALSE);
        }
    }
    return 0;
}
Example #10
0
void CWndStyleEditor::OnCbnSelchangeBlockIndex()
{
	// TODO: Add your control notification handler code here
	CString str;
	int SelIndex = m_BlockPoolIndex.GetCurSel();
	if(SelIndex == -1)
		m_BlockPoolIndex.GetWindowText(str);
	else
		m_BlockPoolIndex.GetLBText(SelIndex,str);

	int Index = _wtoi(str.GetBuffer());
	if(Index<1 || Index>32)
		return;

	m_pBlock = (*m_pBlockPool)[Index];

	if(m_pBlock==NULL)
		return;

	m_Rect = (*m_pBlock)[m_BlockIndex];
	for( int i = 0; i<GBM_COUNT; ++i )
		( ( ::CButton* )GetDlgItem( BlockIDC[i] ) )->SetCheck(0);
	( ( ::CButton* )GetDlgItem( BlockIDC[GBM_CENTER] ) )->SetCheck(1);

	// 更新字体信息
	// 是否使用风格字体
	if (m_pStyleStruct)
	{
		StyleStruct::FontVector::iterator itr = m_pStyleStruct->m_vecFont.find(Index);
		if ( itr != m_pStyleStruct->m_vecFont.end())
		{
			wchar_t Buf[256];
			if (itr->second)
			{
				// 是否使用字体
				CheckDlgButton(IDC_CHECK_EDIT_FONT, TRUE);
				m_FontEffectMask = itr->second->m_uFontEffectMask;
				m_FontColor2.SetWindowText( _ultow( itr->second->m_uFontGradualColor, Buf, 16 ) );

				m_FontColor.SetWindowText( _ultow( itr->second->m_EventFont[m_Mask].m_FontColor, Buf, 16 ) );
				m_FontBKC.SetWindowText( _ultow( itr->second->m_EventFont[m_Mask].m_uFontBkColor, Buf, 16 ) );
				// 字体风格
				CheckDlgButton(IDC_CHECK_FONT_ITALIC, m_FontEffectMask & FontEffect::Italic);
				CheckDlgButton(IDC_CHECK_OUTLINE, m_FontEffectMask & FontEffect::Outline);
				CheckDlgButton(IDC_CHECK_SHADOW, m_FontEffectMask & FontEffect::Shadow);
				CheckDlgButton(IDC_CHECK_GRADUAL, m_FontEffectMask & FontEffect::Gradual);
				// 字体和大小
				m_FontName.SetCurSel(itr->second->m_nFontID);
				m_FontSize.SetWindowText( _ultow( itr->second->m_FontSize, Buf,10 ) );
			}
			else
				CheckDlgButton(IDC_CHECK_EDIT_FONT, FALSE);
		}
		else
			CheckDlgButton(IDC_CHECK_EDIT_FONT, FALSE);
	}
	
	
	RefreshView();

}
Example #11
0
//############################### CODE ######################################
//write an RDP file with settings stored in Registry
void writeRDP() {
    FILE  *pFile=NULL;
    TCHAR *filename = L"\\Windows\\default.rdp";

    byte buffer[2];
    buffer[0]=0xFF;
    buffer[1]=0xFE;

    TCHAR szTemp[MAX_PATH*2];
    size_t str_length = 0;

    TCHAR sDesktopWidth[10];
    TCHAR sDesktopHeight[10];
    _ultow(iDesktopWidth, sDesktopWidth, 10);
    _ultow(iDesktopHeight, sDesktopHeight, 10);

    pFile = _wfopen(filename, L"w+b");
    if(pFile != NULL)
    {
        fwrite(buffer, 2, 1, pFile);
        int c=1;
        do {
            //extra processing
#if _WIN32_WCE == 0x420
            //PPC2003 does not support UserName etc...
            if(wcsstr(rdpLines[c].line, L"ServerName")!=NULL)
                wsprintf(szTemp, rdpLines[c].line, myDlgItems[0].szValue);	//at idx 0 we have the servername in myDlgItems[]
#else
            if(wcsstr(rdpLines[c].line, L"UserName")!=NULL)
                wsprintf(szTemp, rdpLines[c].line, myDlgItems[1].szValue);
            else if(wcsstr(rdpLines[c].line, L"Domain")!=NULL)
                wsprintf(szTemp, rdpLines[c].line, myDlgItems[3].szValue);
            else if(wcsstr(rdpLines[c].line, L"ServerName")!=NULL)
                wsprintf(szTemp, rdpLines[c].line, myDlgItems[0].szValue);
            else if(wcsstr(rdpLines[c].line, L"SavePassword")!=NULL)
                wsprintf(szTemp, rdpLines[c].line, myDlgItems[4].szValue);
#endif
            else if(wcsstr(rdpLines[c].line, L"EnableClipboardRedirection")!=NULL)
                if(g_bEnableClipboardRedirection)
                    wsprintf(szTemp, rdpLines[c].line, L"1");
                else
                    wsprintf(szTemp, rdpLines[c].line, L"0");

            else if(wcsstr(rdpLines[c].line, L"DesktopHeight")!=NULL)

                if(g_bUseFitToScreen)   //3=FullScreen or 1=normal
                    wsprintf(szTemp, rdpLines[c].line, sScreenHeight /* L"320" */);
                else
                    wsprintf(szTemp, rdpLines[c].line, sDesktopHeight);// L"640");

            else if(wcsstr(rdpLines[c].line, L"DesktopWidth")!=NULL)

                if(g_bUseFitToScreen)   //3=FullScreen or 1=normal
                    wsprintf(szTemp, rdpLines[c].line, sScreenWidth /* L"240" */);
                else
                    wsprintf(szTemp, rdpLines[c].line, sDesktopWidth);// L"480");

            else if(wcsstr(rdpLines[c].line, L"ScreenStyle")!=NULL) {
                //0=no fullscreen + no fit, 1= fit to screen+no fullscreen, 2=fullscreen+no fit, 3=fit+fullscreen
                if(g_bUseFullscreen && g_bUseFitToScreen)
                    wsprintf(szTemp, rdpLines[c].line, L"3");
                else if (!g_bUseFullscreen && !g_bUseFitToScreen)
                    wsprintf(szTemp, rdpLines[c].line, L"0");
                else if (!g_bUseFullscreen && g_bUseFitToScreen)
                    wsprintf(szTemp, rdpLines[c].line, L"1");
                else if (g_bUseFullscreen && !g_bUseFitToScreen)
                    wsprintf(szTemp, rdpLines[c].line, L"2");
                else
                    wsprintf(szTemp, rdpLines[c].line, L"0");
            }

            else if(wcsstr(rdpLines[c].line, L"ColorDepthID")!=NULL) {
                wsprintf(szTemp, rdpLines[c].line, dwColorDepth);  //3=HighColor(16Bit) or 1=(8Bit) color
            }

            else if(wcsstr(rdpLines[c].line, L"EnableDriveRedirection")!=NULL) {
                wsprintf(szTemp, rdpLines[c].line, dwEnableDriveRedirection);  //0=no redirection to host (default), 1=EnableDriveRedirection
            }

            else if(wcsstr(rdpLines[c].line, L"AudioRedirectionMode")!=NULL) {
                wsprintf(szTemp, rdpLines[c].line, dwAudioRedirectionMode);  //0=Redirect sounds to the client,
                //1=Play sounds at the remote computer,
                //2=Disable sound redirection; do not play sounds at the server
            }
            else
                wsprintf(szTemp, rdpLines[c].line, L"");

            //write line by line
            str_length = wcslen(szTemp) * sizeof(TCHAR); //unicode!

            fwrite(szTemp , str_length, 1, pFile);
            DEBUGMSG(1, (L"write: '%s'\n", szTemp));

            c++;
        } while( rdpLines[c].line != NULL );
        fclose(pFile);
        DEBUGMSG(1, (L"\nFile write complete\n"));
    }
    //CryptProtectData
}
Example #12
0
static BOOL CALLBACK QQDetailsDlgProc(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam) {
	switch (msg)
	{

	case WM_INITDIALOG:
		TranslateDialogDefault(hwndDlg);
		SetWindowLong(hwndDlg,GWL_USERDATA,lParam);
		FillCBList(hwndDlg,IDC_INFO_SEX,sex_names);
		FillCBList(hwndDlg,IDC_INFO_AREA,country_names);
		FillCBList(hwndDlg,IDC_INFO_PROVINCE,province_names);
		//FillCBList(IDC_INFO_CITY,city_names);
		FillCBList(hwndDlg,IDC_INFO_ANIMAL,zodiac_names);
		FillCBList(hwndDlg,IDC_INFO_HOROSCOPE,horoscope_names);
		FillCBList(hwndDlg,IDC_INFO_BLOOD,blood_types);

		return TRUE;

	case WM_DESTROY:
		if (LocalDetails_t* ldt=networkmap[hwndDlg]) {
			delete ldt;
			networkmap.erase(hwndDlg);
		}
		break;
	case WM_NOTIFY:										 
		switch (((LPNMHDR)lParam)->idFrom) {
			case 0:
				switch (((LPNMHDR)lParam)->code) {
					case PSN_INFOCHANGED:
						if (LocalDetails_t* ldt=networkmap[(HANDLE)((LPPSHNOTIFY)lParam)->lParam]) {
							TCHAR szTemp[MAX_PATH];
							HANDLE hContact = (HANDLE)((LPPSHNOTIFY)lParam)->lParam;
							LPSTR m_szModuleName=ldt->network->m_szModuleName;
							DBVARIANT dbv;
							HBITMAP hBMP;
							HINSTANCE hInst;
							char szPluginPath[MAX_PATH]={0};

							// Contact
							int nTemp;

							// Overview
							// QQ ID
							_ultow(READC_D2(UNIQUEIDSETTING),szTemp,10);
							SetDlgItemText(hwndDlg,IDC_INFO_UID,szTemp);

#define DETAILS_READTS(key,ctl) if (!READC_TS2(key,&dbv)) { SetDlgItemText(hwndDlg,ctl,dbv.ptszVal); DBFreeVariant(&dbv); }
							// Nickname
							DETAILS_READTS("Nick",IDC_INFO_NICKNAME);

							// Age
							_ultow(READC_W2("Age"),szTemp,10);
							SetDlgItemText(hwndDlg,IDC_INFO_AGE,szTemp);

							// Sex
							*szTemp=READC_B2("Gender");
							SendDlgItemMessage(hwndDlg,IDC_INFO_SEX,CB_SETCURSEL,(WPARAM)(*szTemp=='M'?0:*szTemp=='F'?1:2),0);

							DETAILS_READTS("Country",IDC_INFO_AREA);
							DETAILS_READTS("Province",IDC_INFO_PROVINCE);
							DETAILS_READTS("City",IDC_INFO_CITY);

							// Contact 
							DETAILS_READTS("Email",IDC_INFO_EMAIL);
							DETAILS_READTS("Address",IDC_INFO_ADDRESS);
							DETAILS_READTS("ZIP",IDC_INFO_ZIPCODE);
							DETAILS_READTS("Telephone",IDC_INFO_PHONE);
							DETAILS_READTS("Mobile",IDC_INFO_MOBILE);
							DETAILS_READTS("PersonalSignature",IDC_INFO_SIGNATURE);

							// Details
							DETAILS_READTS("FirstName",IDC_INFO_REALNAME);
							DETAILS_READTS("College",IDC_INFO_COLLEGE);
							DETAILS_READTS("Homepage",IDC_INFO_HOMEPAGE);
							DETAILS_READTS("About",IDC_INFO_DESCRIPTION);

							// Face
							nTemp=DBGetContactSettingWord(hContact,m_szModuleName,"Face",0);
							if (!nTemp)
								nTemp=101;
							else
								nTemp=nTemp/3 + 1;

							hBMP=NULL;
							if (!DBGetContactSetting(hContact,m_szModuleName,"UserHeadMD5",&dbv)) {
								// CallService(MS_UTILS_PATHTOABSOLUTE,(WPARAM)"QQ\\",(LPARAM)szPluginPath);
								FoldersGetCustomPath(ldt->network->m_avatarFolder,szPluginPath,MAX_PATH,"QQ");
								strcat(szPluginPath,"\\");
								strcat(szPluginPath,dbv.pszVal);
								strcat(szPluginPath,".bmp");

								hBMP=(HBITMAP)CallService(MS_UTILS_LOADBITMAP,0,(LPARAM)szPluginPath);
								DBFreeVariant(&dbv);
							}

							CallService(MS_UTILS_PATHTOABSOLUTE,(WPARAM)"Plugins\\QQHeadImg.dll",(LPARAM)szPluginPath);

							if (!hBMP) {
								hInst=LoadLibraryA(szPluginPath);

								if (hInst) {
									hBMP=LoadBitmap(hInst,MAKEINTRESOURCE(100+nTemp));
									SendDlgItemMessage(hwndDlg,IDC_INFO_FACE,STM_SETIMAGE,IMAGE_BITMAP,(LPARAM)hBMP);
								}
								FreeLibrary(hInst);
							}

							if (hBMP)
								SendDlgItemMessage(hwndDlg,IDC_INFO_FACE,STM_SETIMAGE,IMAGE_BITMAP,(LPARAM)hBMP);

							*strrchr(szPluginPath,'\\')=0;

							DETAILS_READTS("MirVer",IDC_INFO_CLIENTVER);
							DETAILS_READTS("Location",IDC_INFO_IP);

#define DETAILS_READB(key,ctl) SendDlgItemMessage(hwndDlg,ctl,CB_SETCURSEL,(WPARAM)READC_B2(key),0); 

							DETAILS_READB("Zodiac",IDC_INFO_ANIMAL);
							DETAILS_READB("Blood",IDC_INFO_BLOOD);
							DETAILS_READB("Horoscope",IDC_INFO_HOROSCOPE);

							// Level
							int suns, moons, stars;

							EvaUtil::calcSuns(READC_W2("Level"),&suns,&moons,&stars);
							swprintf(szTemp,TranslateT("%d (%d-%d-%d)"),READC_W2("Level"), suns,moons,stars);
							SetDlgItemText(hwndDlg,IDC_LEVEL,szTemp);
							swprintf(szTemp,TranslateT("%d Hours (%d Hours to Next Level)"),READC_D2("OnlineMins")/3600,READC_W2("HoursToLevelUp"));
							SetDlgItemText(hwndDlg,IDC_ONLINE,szTemp);

							//SetWindowLong(hwndDlg,GWL_USERDATA,(LONG)hContact);
						}
						break;
				}
			break;
		}
		break;

#if 0
	case WM_COMMAND:
		/*switch(LOWORD(wParam))
		{

		case IDC_CHANGEDETAILS:
		{
		CallService(MS_UTILS_OPENURL, 1, (LPARAM)"http://www.icq.com/whitepages/user_details.php");
		}
		break;

		case IDCANCEL:
		SendMessage(GetParent(hwndDlg),msg,wParam,lParam);
		break;
		}*/
		break;
#endif
	}

	return FALSE;	
}
Example #13
0
static BOOL CALLBACK QunDetailsDlgProc(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam) {
	switch (msg)
	{

	case WM_INITDIALOG:
		{
			TranslateDialogDefault(hwndDlg);
			SetWindowLong(hwndDlg,GWL_USERDATA,lParam);

			return TRUE;
		}

	case WM_TIMER:
		if (LocalDetails_t* ldt=networkmap[(HANDLE)GetWindowLong(hwndDlg,GWL_USERDATA)]) {
			LPSTR m_szModuleName=ldt->network->m_szModuleName;
			HANDLE hContact=ldt->hContact;
			unsigned int qunid=READC_D2(UNIQUEIDSETTING);
			/*
			ldt->network->UpdateQunContacts(hwndDlg,qunid);
			*/
			KillTimer(hwndDlg,1);
			ldt->network->append(new QunGetOnlineMemberPacket(qunid));
		}
		return TRUE;

	case WM_NOTIFY:
		switch (((LPNMHDR)lParam)->idFrom) {
			case 0:
				switch (((LPNMHDR)lParam)->code) {
					case PSN_INFOCHANGED:
						if (LocalDetails_t* ldt=networkmap[(HANDLE)((LPPSHNOTIFY)lParam)->lParam]) {
							LPTSTR pszTemp;
							LPSTR m_szModuleName=ldt->network->m_szModuleName;
							char szTemp[MAX_PATH];
							TCHAR wszTemp[MAX_PATH];
							HANDLE hContact = (HANDLE)((LPPSHNOTIFY)lParam)->lParam;
							HANDLE hContact2=hContact;
							DBVARIANT dbv;
							unsigned int nTemp;

							unsigned int qunid=0;

							qunid=READC_D2(UNIQUEIDSETTING);

							nTemp=READC_D2("Creator");
							ultoa(nTemp,szTemp,10);

							if (!READC_S2(szTemp,&dbv)) {
								// Qun creator info available
								pszTemp=mir_a2u_cp(dbv.pszVal,936);
								swprintf(wszTemp,L"%s (%u)", pszTemp, nTemp);
								mir_free(pszTemp);
								DBFreeVariant(&dbv);
							} else
								_ultow(nTemp,wszTemp,10);

							SetDlgItemText(hwndDlg,IDC_QUNINFO_CREATOR,wszTemp);

							_ultow(READC_D2("ExternalID"),wszTemp,10);
							SetDlgItemText(hwndDlg,IDC_QUNINFO_QID,wszTemp);

							if (!READC_TS2("Nick",&dbv)) {
								// Qun name available
								SetDlgItemText(hwndDlg,IDC_QUNINFO_NAME,wcschr(dbv.ptszVal,L')')+2);
								DBFreeVariant(&dbv);
							}

							if (!DBGetContactSettingTString(hContact,"CList","StatusMsg",&dbv)) {
								// Notice available
								SetDlgItemText(hwndDlg,IDC_QUNINFO_NOTICE,dbv.ptszVal);
								DBFreeVariant(&dbv);
							}

							if (!READC_TS2("Description",&dbv)) {
								// Description available
								SetDlgItemText(hwndDlg,IDC_QUNINFO_DESC,dbv.ptszVal);
								DBFreeVariant(&dbv);
							}

							switch (READC_B2("GetInfoOnline")) {
								case 1: // Just retrieved info, send member online update call
									PostMessage(hwndDlg,WM_TIMER,1,0);
									{
										unsigned int myqq=ldt->network->GetMyQQ();
										Qun* qun=ldt->network->m_qunList.getQun(READC_D2(UNIQUEIDSETTING));
										if (qun==NULL || !(qun->isAdmin(myqq)||qun->getDetails().getCreator()==myqq)) {
											EnableWindow(GetDlgItem(hwndDlg,IDC_QUNINFO_DELMEMBER),FALSE);
										} else
											EnableWindow(GetDlgItem(hwndDlg,IDC_QUNINFO_DELMEMBER),TRUE);

										if (qun->getDetails().getCreator()==myqq) {
											EnableWindow(GetDlgItem(hwndDlg,IDC_QUNINFO_SETADMIN),TRUE);
											EnableWindow(GetDlgItem(hwndDlg,IDC_QUNINFO_UNSETADMIN),TRUE);
											EnableWindow(GetDlgItem(hwndDlg,IDC_QUNINFO_TRANSFER),TRUE);
										}
									}
									break;
								case 2: // Retrieved online info
									ldt->network->UpdateQunContacts(hwndDlg,qunid);
									WRITEC_B("GetInfoOnline",0);
									ldt->timer=SetTimer(hwndDlg,1,60000,NULL);
									break;
							}
						}
					break;
				}
				break;
		}
		break;

	case WM_DESTROY:
		if (LocalDetails_t* ldt=networkmap[hwndDlg]) {
			if (ldt->timer) KillTimer(hwndDlg,1);
			delete ldt;
			networkmap.erase(hwndDlg);
		}
		break;
	case WM_COMMAND:
		{
			if (LocalDetails_t* ldt=networkmap[(HANDLE)GetWindowLong(hwndDlg,GWL_USERDATA)]) {
				char szTemp[MAX_PATH]={0};
				if (SendDlgItemMessageA(hwndDlg,IDC_QUNINFO_MEMBERLIST,LB_GETTEXT,SendDlgItemMessage(hwndDlg,IDC_QUNINFO_MEMBERLIST,LB_GETCURSEL,0,0),(LPARAM)&szTemp)!=LB_ERR && *szTemp!=0) {
					LPSTR pszChk=strrchr(szTemp,'(');

					unsigned int qqid=strtoul(strrchr(szTemp,pszChk?'(':' ')+1,NULL,10);
					LPSTR m_szModuleName=ldt->network->m_szModuleName;
					HANDLE hContact=ldt->hContact;
					unsigned int qunid=READC_D2(UNIQUEIDSETTING);

					switch (LOWORD(wParam)) {
						case IDC_QUNINFO_ADDTOME:
							{
								if (HANDLE hContact=ldt->network->FindContact(qqid)) {
									MessageBox(hwndDlg,TranslateT("The member is already in your contact list."),NULL,MB_ICONERROR);
								} else {
									ldt->network->AddContactWithSend(qqid);
								}
							}
							break;
						case IDC_QUNINFO_DELMEMBER:
							{
								TCHAR szMsg[MAX_PATH];
								_stprintf(szMsg,TranslateT("Are you sure you want to kick user %u out of this Qun %d?"),qqid,READC_D2("ExternalID"));
								if (MessageBox(NULL,szMsg,APPNAME,MB_ICONWARNING|MB_YESNO)==IDYES) {
									std::list<unsigned int> list;
									QunModifyMemberPacket *out=new QunModifyMemberPacket(READC_D2(UNIQUEIDSETTING),false);
									list.insert(list.end(),qqid);
									out->setMembers(list);
									ldt->network->append(out);
								}
							}
							break;
						case IDC_QUNINFO_SETADMIN:
						case IDC_QUNINFO_UNSETADMIN:
							{
								QunAdminOpPacket* out=new QunAdminOpPacket(qunid,qqid,LOWORD(wParam)==IDC_QUNINFO_SETADMIN);
								ldt->network->append(out);
							}
							break;
						case IDC_QUNINFO_TRANSFER:
							{
								TCHAR szMsg[MAX_PATH];
								_stprintf(szMsg,TranslateT("Are you sure you want to transfer Qun %u to user %u?"),READC_D2("ExternalID"),qqid);
								if (MessageBox(NULL,szMsg,APPNAME,MB_ICONWARNING|MB_YESNO)==IDYES) {
									std::list<unsigned int> list;
									QunTransferPacket *out=new QunTransferPacket(qunid,qqid);
									ldt->network->append(out);
								}
							}
							break;
					}
				}
			}
		}
		break;
#if 0
	case WM_COMMAND:
		/*switch(LOWORD(wParam))
		{

		case IDC_CHANGEDETAILS:
		{
		CallService(MS_UTILS_OPENURL, 1, (LPARAM)"http://www.icq.com/whitepages/user_details.php");
		}
		break;

		case IDCANCEL:
		SendMessage(GetParent(hwndDlg),msg,wParam,lParam);
		break;
		}*/
		break;
#endif
	}

	return FALSE;	
}
////////////////////////////////////////////////////////////////////////
// DumpColumnsInfo
//
////////////////////////////////////////////////////////////////////////
void DumpColumnsInfo
(
    DBORDINAL		cColumns,
    DBCOLUMNINFO*	rgColInfo,
	CTable*			pCTable
)
{
	WCHAR*		pwszGuid = NULL;
	WCHAR		pwszNum[10];
	WCHAR*		pwszPropID = NULL;
	HRESULT		hr = S_OK;

	ASSERT(rgColInfo != NULL);
	 
	OutputFile("%s[COLUMN] ColName iOrdinal, TYPE, ulColumnSize, bPrecision, bScale, dwFlags, Prefix, Suffix, ColIDKind, ColIDGuid, ColIDName", START_OF_TYPE);
	DumpLineEnd();

	for(DBORDINAL i=0; i<cColumns; i++)
	{
		//Skip bookmark columns
		if(rgColInfo[i].iOrdinal == 0)
			continue;
		
		//Display ColumnInfo
		const static NAMEMAP rgColumnFlags[] = 
		{
			VALUE_CHAR(DBCOLUMNFLAGS_ISBOOKMARK),
			VALUE_CHAR(DBCOLUMNFLAGS_MAYDEFER),
			VALUE_CHAR(DBCOLUMNFLAGS_WRITE),
			VALUE_CHAR(DBCOLUMNFLAGS_WRITEUNKNOWN),
			VALUE_CHAR(DBCOLUMNFLAGS_ISFIXEDLENGTH),
			VALUE_CHAR(DBCOLUMNFLAGS_ISNULLABLE),
			VALUE_CHAR(DBCOLUMNFLAGS_MAYBENULL),
			VALUE_CHAR(DBCOLUMNFLAGS_ISLONG),
			VALUE_CHAR(DBCOLUMNFLAGS_ISROWID),
			VALUE_CHAR(DBCOLUMNFLAGS_ISROWVER),
			VALUE_CHAR(DBCOLUMNFLAGS_CACHEDEFERRED),
			
			VALUE_CHAR(DBCOLUMNFLAGS_SCALEISNEGATIVE),
			VALUE_CHAR(DBCOLUMNFLAGS_ISCHAPTER),
			VALUE_CHAR(DBCOLUMNFLAGS_ISROWURL),
			VALUE_CHAR(DBCOLUMNFLAGS_ISDEFAULTSTREAM),
			VALUE_CHAR(DBCOLUMNFLAGS_ISCOLLECTION),
		};

		//Format: {ColName(iOrdinal, TYPE, ulColumnSize, bPrecision, bScale, dwFlags}
		
		//ColumnName
		//fprintf replaces NULL with "(NULL)" which we don't want interpreted as the 
		//column name, so just output an empty string for this case...
		OutputFile("%s%S%,", START_OF_TYPE, rgColInfo[i].pwszName ? rgColInfo[i].pwszName : L"");
		
		//iOrdinal
		OutputFile("%d,", rgColInfo[i].iOrdinal);

		//TYPE
		OutputFile("%S ", GetDBTypeName(rgColInfo[i].wType & ~(DBTYPE_BYREF | DBTYPE_ARRAY | DBTYPE_VECTOR)) );
		if (rgColInfo[i].wType & DBTYPE_BYREF)
			OutputFile(" | DBTYPE_BYREF ");
		if (rgColInfo[i].wType & DBTYPE_ARRAY)
			OutputFile(" | DBTYPE_ARRAY ");
		if (rgColInfo[i].wType & DBTYPE_VECTOR)
			OutputFile(" | DBTYPE_VECTOR ");
		OutputFile(",");
		
		//ulColumnSize
		OutputFile("%ld,", rgColInfo[i].ulColumnSize );
		
		//bPrecision
		OutputFile("%d,",  rgColInfo[i].bPrecision );
		
		//bScale
		OutputFile("%d,",  rgColInfo[i].bScale );
		
		//dwFlags
		OutputFile("%s,",
			GetNoteStringBitvals(NUMELEM(rgColumnFlags), rgColumnFlags, rgColInfo[i].dwFlags));

		//ColIDKind
		OutputFile("%d,",  rgColInfo[i].columnid.eKind);

		if (rgColInfo[i].columnid.eKind != DBKIND_NAME &&
			rgColInfo[i].columnid.eKind != DBKIND_PROPID)
		{
			if(rgColInfo[i].columnid.eKind == DBKIND_GUID_NAME ||
				rgColInfo[i].columnid.eKind == DBKIND_GUID_PROPID ||
				rgColInfo[i].columnid.eKind == DBKIND_GUID)
				hr = StringFromCLSID(rgColInfo[i].columnid.uGuid.guid, &pwszGuid);
			else if(rgColInfo[i].columnid.uGuid.pguid)
				//It is a PGUID type.
				hr = StringFromCLSID(*(rgColInfo[i].columnid.uGuid.pguid), &pwszGuid);
		}

		switch (rgColInfo[i].columnid.eKind)
		{
		case DBKIND_GUID_NAME:
			OutputFile("%S,", pwszGuid);
			OutputFile("%S", rgColInfo[i].columnid.uName.pwszName);
			break;
		case DBKIND_GUID_PROPID:
			OutputFile("%S,",  pwszGuid);
			_ultow(rgColInfo[i].columnid.uName.ulPropid, pwszNum, 10);
			OutputFile("%S", pwszNum);
			break;
		case DBKIND_NAME:
			OutputFile("%s,", "");
			OutputFile("%S", rgColInfo[i].columnid.uName.pwszName);
			break;
		case DBKIND_PGUID_NAME:
			OutputFile("%S,", pwszGuid);
			OutputFile("%S", rgColInfo[i].columnid.uName.pwszName);
			break;
		case DBKIND_PGUID_PROPID:
			OutputFile("%S,", pwszGuid);
			_ultow(rgColInfo[i].columnid.uName.ulPropid, pwszNum, 10);
			OutputFile("%S", pwszNum);
			break;
		case DBKIND_PROPID:
			OutputFile("%s,", "");
			_ultow(rgColInfo[i].columnid.uName.ulPropid, pwszNum, 10);
			OutputFile("%S", pwszNum);
			break;
		case DBKIND_GUID:
			OutputFile("%S,", pwszGuid);
			OutputFile("%s", "");
			break;
		default:
			break;
		} //switch

		//Prefix Suffix.
		//Note: The prefix and suffix are not part of the ColumnInfo.  So we have to look them
		//up in the CTable object, hopefully we created the table so we have this info left
		//around from the Schema rowset.  
		WCHAR* pwszPrefix = NULL;
		WCHAR* pwszSuffix = NULL;
		CCol rCol;
		
		//We also use ColumnID matching, since DefaultQuery may be  a superset of the OpenRowset TableCreation.
		if(SUCCEEDED(pCTable->GetColInfo(&rgColInfo[i].columnid, rCol)))
		{
			pwszPrefix = rCol.GetPrefix();
			pwszSuffix = rCol.GetSuffix();
		}

		//Prefix
		OutputFile(",%ls,", pwszPrefix);
				
		//Suffix
		OutputFile("%ls", pwszSuffix);

		//ENDL
		DumpLineEnd();
	}

	SAFE_FREE(pwszGuid);

	DumpLineEnd();
	DumpLineEnd();
	OutputFile("%s[DATA] Type data", START_OF_TYPE);
	DumpLineEnd();
}
Example #15
0
int DoInjectRemote(LPWSTR asCmdArg, bool abDefTermOnly)
{
	gbInShutdown = TRUE; // чтобы не возникло вопросов при выходе
	gnRunMode = RM_SETHOOK64;
	LPWSTR pszNext = asCmdArg;
	LPWSTR pszEnd = NULL;
	DWORD nRemotePID = wcstoul(pszNext, &pszEnd, 10);
	wchar_t szStr[16];
	wchar_t szTitle[128];
	wchar_t szInfo[120];
	wchar_t szParentPID[32];


	#ifdef SHOW_INJECTREM_MSGBOX
	wchar_t szDbgMsg[512], szTitle[128];
	PROCESSENTRY32 pinf;
	GetProcessInfo(nRemotePID, &pinf);
	_wsprintf(szTitle, SKIPLEN(countof(szTitle)) L"ConEmuCD PID=%u", GetCurrentProcessId());
	_wsprintf(szDbgMsg, SKIPLEN(countof(szDbgMsg)) L"Hooking PID=%s {%s}\nConEmuCD PID=%u. Continue with injects?", asCmdArg ? asCmdArg : L"", pinf.szExeFile, GetCurrentProcessId());
	if (MessageBoxW(NULL, szDbgMsg, szTitle, MB_SYSTEMMODAL|MB_OKCANCEL) != IDOK)
	{
		return CERR_HOOKS_FAILED;
	}
	#endif


	if (nRemotePID)
	{
		#if defined(SHOW_ATTACH_MSGBOX)
		if (!IsDebuggerPresent())
		{
			wchar_t szTitle[100]; _wsprintf(szTitle, SKIPLEN(countof(szTitle)) L"%s PID=%u /INJECT", gsModuleName, gnSelfPID);
			const wchar_t* pszCmdLine = GetCommandLineW();
			MessageBox(NULL,pszCmdLine,szTitle,MB_SYSTEMMODAL);
		}
		#endif

		CEStr lsName, lsPath;
		{
		CProcessData processes;
		processes.GetProcessName(nRemotePID, lsName.GetBuffer(MAX_PATH), MAX_PATH, lsPath.GetBuffer(MAX_PATH*2), MAX_PATH*2, NULL);
		CEStr lsLog(L"Remote: PID=", _ultow(nRemotePID, szStr, 10), L" Name=`", lsName, L"` Path=`", lsPath, L"`");
		LogString(lsLog);
		}

		// Go to hook
		// InjectRemote waits for thread termination
		DWORD nErrCode = 0;
		CINFILTRATE_EXIT_CODES iHookRc = InjectRemote(nRemotePID, abDefTermOnly, &nErrCode);

		_wsprintf(szInfo, SKIPCOUNT(szInfo) L"InjectRemote result: %i (%s)", iHookRc,
			(iHookRc == CIR_OK) ? L"CIR_OK" :
			(iHookRc == CIR_AlreadyInjected) ? L"CIR_AlreadyInjected" :
			L"?");
		LogString(szInfo);

		if (iHookRc == CIR_OK/*0*/ || iHookRc == CIR_AlreadyInjected/*1*/)
		{
			return iHookRc ? CERR_HOOKS_WAS_ALREADY_SET : CERR_HOOKS_WAS_SET;
		}

		DWORD nSelfPID = GetCurrentProcessId();
		PROCESSENTRY32 self = {sizeof(self)}, parent = {sizeof(parent)};
		// Not optimal, needs refactoring
		if (GetProcessInfo(nSelfPID, &self))
			GetProcessInfo(self.th32ParentProcessID, &parent);

		// Ошибку (пока во всяком случае) лучше показать, для отлова возможных проблем
		//_ASSERTE(iHookRc == 0); -- ассерт не нужен, есть MsgBox

		_wsprintf(szTitle, SKIPLEN(countof(szTitle))
			L"%s %s, PID=%u", gsModuleName, gsVersion, nSelfPID);

		_wsprintf(szInfo, SKIPCOUNT(szInfo)
			L"Injecting remote FAILED, code=%i:0x%08X\n"
			L"%s %s, PID=%u\n"
			L"RemotePID=%u ",
			iHookRc, nErrCode, gsModuleName, gsVersion, nSelfPID, nRemotePID);

		_wsprintf(szParentPID, SKIPCOUNT(szParentPID)
			L"\n"
			L"ParentPID=%u ",
			self.th32ParentProcessID);

		CEStr lsError(lstrmerge(
			szInfo,
			lsPath.IsEmpty() ? lsName.IsEmpty() ? L"<Unknown>" : lsName.ms_Val : lsPath.ms_Val,
			szParentPID,
			parent.szExeFile));

		LogString(lsError);
		MessageBoxW(NULL, lsError, szTitle, MB_SYSTEMMODAL);
	}
	else
	{
		//_ASSERTE(pi.hProcess && pi.hThread && pi.dwProcessId && pi.dwThreadId);
		wchar_t szDbgMsg[512], szTitle[128];
		_wsprintf(szTitle, SKIPLEN(countof(szTitle)) L"ConEmuC, PID=%u", GetCurrentProcessId());
		_wsprintf(szDbgMsg, SKIPLEN(countof(szDbgMsg)) L"ConEmuC.X, PID=%u\nCmdLine parsing FAILED (%u)!\n%s",
			GetCurrentProcessId(), nRemotePID,
			asCmdArg);
		LogString(szDbgMsg);
		MessageBoxW(NULL, szDbgMsg, szTitle, MB_SYSTEMMODAL);
	}

	return CERR_HOOKS_FAILED;
}