BOOL CALLBACK close_alert_window_enum( HWND hwnd, LPARAM lParam ) { char buf[ 7 ] = { 0 }; PROCESS_INFORMATION const * const pi = (PROCESS_INFORMATION *)lParam; DWORD pid; DWORD tid; /* We want to find and close any window that: * 1. is visible and * 2. is a dialog and * 3. is displayed by any of our child processes */ if ( /* We assume hidden windows do not require user interaction. */ !IsWindowVisible( hwnd ) /* Failed to read class name; presume it is not a dialog. */ || !GetClassNameA( hwnd, buf, sizeof( buf ) ) /* All Windows system dialogs use the same Window class name. */ || strcmp( buf, "#32770" ) ) return TRUE; /* GetWindowThreadProcessId() returns 0 on error, otherwise thread id of * the window's message pump thread. */ tid = GetWindowThreadProcessId( hwnd, &pid ); if ( !tid || !is_parent_child( pi->dwProcessId, pid ) ) return TRUE; /* Ask real nice. */ PostMessageA( hwnd, WM_CLOSE, 0, 0 ); /* Wait and see if it worked. If not, insist. */ if ( WaitForSingleObject( pi->hProcess, 200 ) == WAIT_TIMEOUT ) { PostThreadMessageA( tid, WM_QUIT, 0, 0 ); WaitForSingleObject( pi->hProcess, 300 ); } /* Done, we do not want to check any other windows now. */ return FALSE; }
static int CALLBACK enumWindowsProc(HWND hwnd, LPARAM lParam) { HWND *wnd = (HWND *)lParam; char name[128]; name[0] = '\0'; GetClassNameA( hwnd, name, 128 ); if( !strcasecmp( name, "WorkerW" ) ) { hwnd = FindWindowEx( hwnd, NULL, _T("SHELLDLL_DefView"), NULL ); if( hwnd ) hwnd = FindWindowEx( hwnd, NULL, _T("SysListView32"), NULL ); if( hwnd ) { *wnd = hwnd; return false; } } return true; }
static BOOL CALLBACK TopLevelWindows (HWND hwnd, LPARAM argsLP) { Args *args = reinterpret_cast <Args *> (argsLP); char s[4096]; GetClassNameA (hwnd, s, sizeof s); if (strcmp (s, "CabinetWClass") == 0) { GetWindowTextA (hwnd, s, sizeof s); if (strstr (s, args->DriveRootPath.c_str()) != NULL) { PostMessage (hwnd, WM_CLOSE, 0, 0); return TRUE; } args->ExplorerWindow = hwnd; EnumChildWindows (hwnd, ChildWindows, argsLP); } return TRUE; }
HWND Executor::findTables(const QString & tClass, HWND BeginHandle) { //найти окно HWND CurrWnd = NULL; CurrWnd = GetWindow(BeginHandle, GW_HWNDFIRST); while (CurrWnd) { char clName[MAX_WND_TEXT]; GetClassNameA(CurrWnd, clName, MAX_WND_TEXT); QString sClass(clName); if (sClass == tClass) { //вернуть первое //оно первое в z порядке return CurrWnd; } CurrWnd = GetWindow(CurrWnd, GW_HWNDNEXT); } return NULL; }
static void toolbarcheck( HWND hDlg) { /* test toolbar properties */ /* bug #10532 */ int maxtextrows; HWND ctrl; DWORD ret; char classname[20]; for( ctrl = GetWindow( hDlg, GW_CHILD); ctrl ; ctrl = GetWindow( ctrl, GW_HWNDNEXT)) { GetClassNameA( ctrl, classname, 10); classname[7] = '\0'; if( !strcmp( classname, "Toolbar")) break; } ok( ctrl != NULL, "could not get the toolbar control\n"); ret = SendMessageA( ctrl, TB_ADDSTRINGA, 0, (LPARAM)"winetestwinetest\0\0"); ok( ret == 0, "addstring returned %d (expected 0)\n", ret); maxtextrows = SendMessageA( ctrl, TB_GETTEXTROWS, 0, 0); ok( maxtextrows == 0 || broken(maxtextrows == 1), /* Win2k and below */ "Get(Max)TextRows returned %d (expected 0)\n", maxtextrows); }
/* MAKE_EXPORT GetClassNameW_new=GetClassNameW */ BOOL WINAPI GetClassNameW_new(HWND hWnd, LPWSTR lpClassName, int nMaxCount) { LPSTR lpBuffer = (LPSTR)malloc(nMaxCount); BOOL result; if(lpBuffer == NULL) return FALSE; result = GetClassNameA(hWnd, lpBuffer, nMaxCount); if(!result) { free(lpBuffer); return FALSE; } STACK_AtoW(lpBuffer, lpClassName); free(lpBuffer); return TRUE; }
// если она ещё не перехвачена. Если показывается диалог, то считаем его // модальным, все координаты кликов будут обрабатываться для него. static BOOL WINAPI Hook_ShowWindow(HWND hWnd, int Cmd) { // Получаем название класса окна OutputDebugString("1234"); char cClasN[MAX_PATH]; GetClassNameA(hWnd, cClasN, MAX_PATH); bool isFrame = (NULL != m_strstr(cClasN, "SunAwtFrame")); bool isDialog = (NULL != m_strstr(cClasN, "SunAwtDialog")); if (SW_HIDE != Cmd) { OutputDebugString("Hook_ShowWindow"); if (isFrame) { // Перебиваем оконную функцию на свою DbgMsg(cClasN, (int)Cmd, "Java Frame Wnd"); ChangeWndProc(hWnd, &g_frame_wnd, &g_old_frame_wnd_proc); g_is_dialog = false; } else if (isDialog) { // Перебиваем оконную функцию на свою DbgMsg(cClasN, (int)Cmd, "Java Dialog Wnd"); ChangeWndProc(hWnd, &g_dialog_wnd, &g_old_dialog_wnd_proc); g_is_dialog = true; } } else { g_is_dialog = false; } Cmd /= Cmd & 0xf0000000; // Вызываем дефолтную ShowWindow return Real_ShowWindow(hWnd, Cmd); }
void ContainerNode::AddTooltip(HWND hChild, HINSTANCE hInstance, std::string szTip) { if (!m_hTooltipWnd) return; TOOLINFOA ti; ZeroMemory(&ti,sizeof(TOOLINFOA)); ti.cbSize=sizeof(TOOLINFOA); ti.uFlags=TTF_SUBCLASS; ti.hinst=hInstance; ti.uId=GetNextFreeCommand(); ti.lpszText=(LPSTR)szTip.c_str(); char szClassName[64]; if (!GetClassNameA(hChild,szClassName,64)) strcpy(szClassName,""); if (strcmpi(szClassName,"STATIC")==0 && GetPropA(hChild,"OriginalStaticProc")==0) { SetPropA(hChild,"OriginalStaticProc",(HANDLE)SetWindowLong(hChild,GWL_WNDPROC,(LONG)StaticHookProc)); } ti.hwnd=hChild; RECT rcClient; GetClientRect(hChild,&rcClient); CopyRect(&ti.rect,&rcClient); SendMessage(m_hTooltipWnd,TTM_ADDTOOLA,0,(WPARAM)&ti); }
void Executor::timerEvent(QTimerEvent *) { TimerKiller killer(this, timer_id_, interval_); //ищем топовое окно заданного класса static const QString psClass = "TfrmTable"; static const int minFoldHue = 15; static const int maxFoldHue = 30; static const int minCallHue = 60; static const int maxCallHue = 70; static const int minCheckHue = 42; static const int maxCheckHue = 58; //смотрим топовое окно WId FgWnd = GetForegroundWindow(); char clName[MAX_WND_TEXT]; GetClassNameA(FgWnd, clName, MAX_WND_TEXT); QString sClass(clName); if (!sClass.contains(psClass)) { return; } //область кнопок QRect checkRect; QRect foldRect; bool hasCheck = false; bool hasFold = false; bool hasCall = false; int btnHeight = 110; int btnWidth = 0; WId BtnWnd = FindWindowEx(FgWnd, NULL, L"TAniLayer", NULL); if (BtnWnd) { RECT btnRect; //GetClientRect(BtnWnd, &btnRect); GetWindowRect(BtnWnd, &btnRect); btnHeight = btnRect.bottom - btnRect.top; btnWidth = btnRect.right - btnRect.left; btnWidth = btnWidth >> 1; HwndToTop(FgWnd); //делаем скрин области кнопок QPixmap pixBtn = QPixmap::grabWindow(BtnWnd, btnWidth, 0, btnWidth, btnHeight); QImage imgBtn = pixBtn.toImage(); //imgBtn.save("btn.bmp"); QPoint ptFold, ptCall, ptCheck; //здесь нужна обработка нашего хода static const int rectMin = 10; //Начинаем поиск с кнопки Чек //если она есть то однозначно наш ход hasCheck = Proc770::checkHueButton(imgBtn, minCheckHue, maxCheckHue, rectMin, checkRect); if (!hasCheck) { //ищем кнопку Fold и Call hasFold = Proc770::checkHueButton(imgBtn, minFoldHue, maxFoldHue, rectMin, foldRect); hasCall = Proc770::checkHueButton(imgBtn, minCallHue, maxCallHue, rectMin); if (hasFold && hasCall) { //qDebug() << "FOLD is avail"; } else { return; } } else { //qDebug() << "CHECK is avail"; } } //здесь наш ход QPixmap pixRoom = QPixmap::grabWindow(FgWnd); QRect rectRoom = pixRoom.rect(); rectRoom.setHeight(rectRoom.height() - btnHeight); QImage imgRoom = pixRoom.copy(rectRoom).toImage(); // устанавливаем изображение для обработки cardProc_->setImage(imgRoom); // если стадия префлопа if (cardProc_->isPreflop()) { //qDebug() << "Preflop!"; // получить карманные карты bool ok = false; QPair<QRect, QRect> holeCards = cardProc_->getHoleCards(&ok); if (!ok) return; /// Debugging { //uint num = 0; //num = QDateTime::currentDateTime().toTime_t(); //imgRoom.save(QString("test/table_%1.bmp").arg(num)); //imgBtn.save(QString("test/btns_%1.bmp").arg(num)); //imgRoom.copy(holeCards.first).save(QString("test/first_%1.bmp").arg(num)); //imgRoom.copy(holeCards.second).save(QString("test/second_%1.bmp").arg(num)); /// } Debugging if (holeCards.first.isEmpty() || holeCards.second.isEmpty() || holeCards.first.isNull() || holeCards.second.isNull()) return; QImage firstImg = imgRoom.copy(holeCards.first); QImage secondImg = imgRoom.copy(holeCards.second); QString card1 = cardFromImage(firstImg); QString card2 = cardFromImage(secondImg); if (card1.length() != 2 || card2.length() != 2) return; //qDebug() << card1 << card2; //сохранить карты в кэш QString joined = card1 + card2; if (joined == cache_ && !lastIsFold_) { //хорошие карты - человек думает, не мешать return; } else { cache_ = joined; } QString range = cardRangeFromHoles(card1, card2); //qDebug() << range; if (playingCard_.contains(range)) { //panic! lastIsFold_ = false; if (data_.visualAlert) { alarm_->highlight(joined, FgWnd); } if (data_.turnBeep) { QString appExe = qApp->applicationDirPath(); QSound::play(appExe + "/sounds/turn.wav"); } } else { if (data_.advisorMode) { QString advice = tr("Fold/Check this hand: %1") .arg(card1 + " " + card2); cbFun(advice.toStdString().c_str()); return; } //foldOrCheck(FgWnd); //qDebug() << "Check Rect" << checkRect; int w = checkRect.width(); int h = checkRect.height(); checkRect.setX(btnWidth + checkRect.x()); checkRect.setY(imgRoom.height() + checkRect.y()); checkRect.setWidth(w); checkRect.setHeight(h); //qDebug() << "New Check Rect" << checkRect; //qDebug() << "Fold Rect" << foldRect; w = foldRect.width(); h = foldRect.height(); foldRect.setX(btnWidth + foldRect.x()); foldRect.setY(imgRoom.height() + foldRect.y()); foldRect.setWidth(w); foldRect.setHeight(h); //qDebug() << "New Fold Rect" << foldRect; if (hasCheck) { if (data_.checkBeep) { QString appExe = qApp->applicationDirPath(); QSound::play(appExe + "/sounds/check.wav"); } clickTo(FgWnd, checkRect); if (data_.showFolded) { QString sAction = tr("This hand has been checked: "); cbFun(QString(sAction + card1 + " " + card2).toStdString().c_str()); } //обнулить кэш cache_.clear(); lastIsFold_ = false; } else if (hasFold) { lastIsFold_ = true; if (data_.foldBeep) { QString appExe = qApp->applicationDirPath(); QSound::play(appExe + "/sounds/fold.wav"); } clickTo(FgWnd, foldRect); if (data_.showFolded) { QString sAction = tr("This hand has been folded: "); cbFun(QString(sAction + card1 + " " + card2).toStdString().c_str()); } } } } //код для набивки базы карт /* qDebug() << "Check Rect" << checkRect; int w = checkRect.width(); int h = checkRect.height(); checkRect.setX(btnWidth + checkRect.x()); checkRect.setY(imgRoom.height() + checkRect.y()); checkRect.setWidth(w); checkRect.setHeight(h); qDebug() << "New Check Rect" << checkRect; qDebug() << "Fold Rect" << foldRect; w = foldRect.width(); h = foldRect.height(); foldRect.setX(btnWidth + foldRect.x()); foldRect.setY(imgRoom.height() + foldRect.y()); foldRect.setWidth(w); foldRect.setHeight(h); qDebug() << "New Fold Rect" << foldRect; if (cardProc_->isPreflop()) { if (hasCheck) { clickTo(FgWnd, checkRect); } else if (hasFold && hasCall) { clickTo(FgWnd, foldRect); } } else { clickTo(FgWnd, foldRect); clickTo(FgWnd, checkRect); qDebug() << "Flop at least!"; return; } */ }
bool IsWindowClassA(HWND hwnd, const char *cn) { char cna[256]; if (!GetClassNameA(hwnd, cna, sizeof(cna))) return false; return (!strcmp(cna, cn)); }
static INT_PTR CALLBACK DlgProcIcqOpts(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam) { CIcqProto *ppro = (CIcqProto*)GetWindowLongPtr( hwndDlg, GWLP_USERDATA ); switch (msg) { case WM_INITDIALOG: TranslateDialogDefault(hwndDlg); ppro = (CIcqProto*)lParam; SetWindowLongPtr(hwndDlg, GWLP_USERDATA, lParam); { DWORD dwUin = ppro->getContactUin(NULL); if (dwUin) SetDlgItemInt(hwndDlg, IDC_ICQNUM, dwUin, FALSE); else // keep it empty when no UIN entered SetDlgItemTextA(hwndDlg, IDC_ICQNUM, ""); SendDlgItemMessage(hwndDlg, IDC_PASSWORD, EM_LIMITTEXT, PASSWORDMAXLEN - 1, 0); // bit of a security hole here, since it's easy to extract a password from an edit box char pszPwd[PASSWORDMAXLEN]; if (ppro->GetUserStoredPassword(pszPwd, sizeof(pszPwd))) SetDlgItemTextA(hwndDlg, IDC_PASSWORD, pszPwd); LoadDBCheckState(ppro, hwndDlg, IDC_SSL, "SecureConnection", DEFAULT_SECURE_CONNECTION); LoadDBCheckState(ppro, hwndDlg, IDC_MD5LOGIN, "SecureLogin", DEFAULT_SECURE_LOGIN); LoadDBCheckState(ppro, hwndDlg, IDC_LEGACY, "LegacyFix", DEFAULT_LEGACY_FIX); char szServer[MAX_PATH]; if (!ppro->getSettingStringStatic(NULL, "OscarServer", szServer, MAX_PATH)) SetDlgItemTextA(hwndDlg, IDC_ICQSERVER, szServer); else SetDlgItemTextA(hwndDlg, IDC_ICQSERVER, IsDlgButtonChecked(hwndDlg, IDC_SSL) ? DEFAULT_SERVER_HOST_SSL : DEFAULT_SERVER_HOST); SetDlgItemInt(hwndDlg, IDC_ICQPORT, ppro->getWord("OscarPort", IsDlgButtonChecked(hwndDlg, IDC_SSL) ? DEFAULT_SERVER_PORT_SSL : DEFAULT_SERVER_PORT), FALSE); LoadDBCheckState(ppro, hwndDlg, IDC_KEEPALIVE, "KeepAlive", DEFAULT_KEEPALIVE_ENABLED); SendDlgItemMessage(hwndDlg, IDC_LOGLEVEL, TBM_SETRANGE, FALSE, MAKELONG(0, 4)); SendDlgItemMessage(hwndDlg, IDC_LOGLEVEL, TBM_SETPOS, TRUE, 4 - ppro->getByte("ShowLogLevel", LOG_WARNING)); SetDlgItemText(hwndDlg, IDC_LEVELDESCR, TranslateTS(szLogLevelDescr[4 - SendDlgItemMessage(hwndDlg, IDC_LOGLEVEL, TBM_GETPOS, 0, 0)])); ShowDlgItem(hwndDlg, IDC_RECONNECTREQD, SW_HIDE); LoadDBCheckState(ppro, hwndDlg, IDC_NOERRMULTI, "IgnoreMultiErrorBox", 0); } return TRUE; case WM_HSCROLL: SetDlgItemText(hwndDlg, IDC_LEVELDESCR, TranslateTS(szLogLevelDescr[4 - SendDlgItemMessage(hwndDlg, IDC_LOGLEVEL, TBM_GETPOS, 0, 0)])); OptDlgChanged(hwndDlg); break; case WM_COMMAND: switch (LOWORD(wParam)) { case IDC_LOOKUPLINK: Utils_OpenUrl(URL_FORGOT_PASSWORD); return TRUE; case IDC_NEWUINLINK: Utils_OpenUrl(URL_REGISTER); return TRUE; case IDC_RESETSERVER: SetDlgItemInt(hwndDlg, IDC_ICQPORT, IsDlgButtonChecked(hwndDlg, IDC_SSL) ? DEFAULT_SERVER_PORT_SSL : DEFAULT_SERVER_PORT, FALSE); case IDC_SSL: SetDlgItemTextA(hwndDlg, IDC_ICQSERVER, IsDlgButtonChecked(hwndDlg, IDC_SSL) ? DEFAULT_SERVER_HOST_SSL : DEFAULT_SERVER_HOST); SetDlgItemInt(hwndDlg, IDC_ICQPORT, IsDlgButtonChecked(hwndDlg, IDC_SSL) ? DEFAULT_SERVER_PORT_SSL : DEFAULT_SERVER_PORT, FALSE); OptDlgChanged(hwndDlg); return TRUE; } if (ppro->icqOnline() && LOWORD(wParam) != IDC_NOERRMULTI) { char szClass[80]; GetClassNameA((HWND)lParam, szClass, sizeof(szClass)); if (mir_strcmpi(szClass, "EDIT") || HIWORD(wParam) == EN_CHANGE) ShowDlgItem(hwndDlg, IDC_RECONNECTREQD, SW_SHOW); } if ((LOWORD(wParam) == IDC_ICQNUM || LOWORD(wParam) == IDC_PASSWORD || LOWORD(wParam) == IDC_ICQSERVER || LOWORD(wParam) == IDC_ICQPORT) && (HIWORD(wParam) != EN_CHANGE || (HWND)lParam != GetFocus())) { return 0; } OptDlgChanged(hwndDlg); break; case WM_NOTIFY: switch (((LPNMHDR)lParam)->code) { case PSN_APPLY: char str[128]; ppro->setDword(UNIQUEIDSETTING, GetDlgItemInt(hwndDlg, IDC_ICQNUM, NULL, FALSE)); GetDlgItemTextA(hwndDlg, IDC_PASSWORD, str, _countof(ppro->m_szPassword)); if (mir_strlen(str)) { mir_strcpy(ppro->m_szPassword, str); ppro->m_bRememberPwd = true; } else ppro->m_bRememberPwd = ppro->getByte("RememberPass", 0); ppro->setString("Password", str); GetDlgItemTextA(hwndDlg, IDC_ICQSERVER, str, _countof(str)); ppro->setString("OscarServer", str); ppro->setWord("OscarPort", (WORD)GetDlgItemInt(hwndDlg, IDC_ICQPORT, NULL, FALSE)); StoreDBCheckState(ppro, hwndDlg, IDC_KEEPALIVE, "KeepAlive"); StoreDBCheckState(ppro, hwndDlg, IDC_SSL, "SecureConnection"); StoreDBCheckState(ppro, hwndDlg, IDC_MD5LOGIN, "SecureLogin"); StoreDBCheckState(ppro, hwndDlg, IDC_LEGACY, "LegacyFix"); StoreDBCheckState(ppro, hwndDlg, IDC_NOERRMULTI, "IgnoreMultiErrorBox"); ppro->setByte("ShowLogLevel", (BYTE)(4 - SendDlgItemMessage(hwndDlg, IDC_LOGLEVEL, TBM_GETPOS, 0, 0))); return true; } break; } return FALSE; }
/****************************************************************** * WDML_ServerNameProc * * */ static LRESULT CALLBACK WDML_ServerNameProc(HWND hwndServer, UINT iMsg, WPARAM wParam, LPARAM lParam) { HWND hwndClient; HSZ hszApp, hszTop; HDDEDATA hDdeData = 0; WDML_INSTANCE* pInstance; UINT uiLo, uiHi; switch (iMsg) { case WM_DDE_INITIATE: /* wParam -- sending window handle LOWORD(lParam) -- application atom HIWORD(lParam) -- topic atom */ TRACE("WM_DDE_INITIATE message received!\n"); hwndClient = (HWND)wParam; pInstance = WDML_GetInstanceFromWnd(hwndServer); TRACE("idInst=%ld, threadID=0x%lx\n", pInstance->instanceID, GetCurrentThreadId()); if (!pInstance) return 0; /* don't free DDEParams, since this is a broadcast */ UnpackDDElParam(WM_DDE_INITIATE, lParam, &uiLo, &uiHi); hszApp = WDML_MakeHszFromAtom(pInstance, uiLo); hszTop = WDML_MakeHszFromAtom(pInstance, uiHi); if (!(pInstance->CBFflags & CBF_FAIL_CONNECTIONS)) { BOOL self = FALSE; CONVCONTEXT cc; CONVCONTEXT* pcc = NULL; WDML_CONV* pConv; char buf[256]; if (GetWindowThreadProcessId(hwndClient, NULL) == GetWindowThreadProcessId(hwndServer, NULL) && WDML_GetInstanceFromWnd(hwndClient) == WDML_GetInstanceFromWnd(hwndServer)) { self = TRUE; } /* FIXME: so far, we don't grab distant convcontext, so only check if remote is * handled under DDEML, and if so build a default context */ if ((GetClassNameA(hwndClient, buf, sizeof(buf)) && strcmp(buf, WDML_szClientConvClassA) == 0) || (GetClassNameW(hwndClient, (LPWSTR)buf, sizeof(buf)/sizeof(WCHAR)) && lstrcmpW((LPWSTR)buf, WDML_szClientConvClassW) == 0)) { pcc = &cc; memset(pcc, 0, sizeof(*pcc)); pcc->cb = sizeof(*pcc); pcc->iCodePage = IsWindowUnicode(hwndClient) ? CP_WINUNICODE : CP_WINANSI; } if ((pInstance->CBFflags & CBF_FAIL_SELFCONNECTIONS) && self) { TRACE("Don't do self connection as requested\n"); } else if (hszApp && hszTop) { WDML_SERVER* pServer = (WDML_SERVER*)GetWindowLongA(hwndServer, GWL_WDML_SERVER); /* check filters for name service */ if (!pServer->filterOn || DdeCmpStringHandles(pServer->hszService, hszApp) == 0) { /* pass on to the callback */ hDdeData = WDML_InvokeCallback(pInstance, XTYP_CONNECT, 0, 0, hszTop, hszApp, 0, (DWORD)pcc, self); if ((UINT)hDdeData) { pConv = WDML_CreateServerConv(pInstance, hwndClient, hwndServer, hszApp, hszTop); if (pConv && pcc) pConv->wStatus |= ST_ISLOCAL; } } } else if (pInstance->servers) { /* pass on to the callback */ hDdeData = WDML_InvokeCallback(pInstance, XTYP_WILDCONNECT, 0, 0, hszTop, hszApp, 0, (DWORD)pcc, self); if (hDdeData == (HDDEDATA)CBR_BLOCK) { /* MS doc is not consistent here */ FIXME("CBR_BLOCK returned for WILDCONNECT\n"); } else if ((UINT)hDdeData != 0) { HSZPAIR* hszp; hszp = (HSZPAIR*)DdeAccessData(hDdeData, NULL); if (hszp) { int i; for (i = 0; hszp[i].hszSvc && hszp[i].hszTopic; i++) { pConv = WDML_CreateServerConv(pInstance, hwndClient, hwndServer, hszp[i].hszSvc, hszp[i].hszTopic); if (pConv && pcc) pConv->wStatus |= ST_ISLOCAL; } DdeUnaccessData(hDdeData); } if (!WDML_IsAppOwned(hDdeData)) DdeFreeDataHandle(hDdeData); } } } return 0; case WM_DDE_REQUEST: FIXME("WM_DDE_REQUEST message received!\n"); return 0; case WM_DDE_ADVISE: FIXME("WM_DDE_ADVISE message received!\n"); return 0; case WM_DDE_UNADVISE: FIXME("WM_DDE_UNADVISE message received!\n"); return 0; case WM_DDE_EXECUTE: FIXME("WM_DDE_EXECUTE message received!\n"); return 0; case WM_DDE_POKE: FIXME("WM_DDE_POKE message received!\n"); return 0; case WM_DDE_TERMINATE: FIXME("WM_DDE_TERMINATE message received!\n"); return 0; } return DefWindowProcA(hwndServer, iMsg, wParam, lParam); }
HWND ProcessList::getWindowsByProcessName(string processName, string windowName, string className) { windowList = {}; // NuLogger::getInstance()->log("-----------------------------------------------------"); // NuLogger::getInstance()->log("getWindowsByProcessName"); // NuLogger::getInstance()->log("-----------------------------------------------------"); vector<DWORD> pidList = getPIDsofProcess(processName); for (vector<DWORD>::iterator it = pidList.begin(); it != pidList.end(); ++it) { addMainWindowByProcessIdToWindowList(*it); } vector<HWND> mainWindows = windowList; windowList = {}; for (vector<HWND>::iterator itHWND = mainWindows.begin(); itHWND != mainWindows.end(); ++itHWND) { addChildWindowsByMainWindowToWindowList(*itHWND); } vector<HWND> childWindows = windowList; windowList = {}; vector<HWND> allWindows = mainWindows; allWindows.insert(allWindows.end(), childWindows.begin(), childWindows.end()); vector<HWND> filteredWindows = {}; for (vector<HWND>::iterator cHWND = allWindows.begin(); cHWND != allWindows.end(); ++cHWND) { if (IsWindow(*cHWND) && IsWindowVisible(*cHWND)) { // NuLogger::getInstance()->log(" - Handle %i", *cHWND); CHAR windowNameBuf[255]; GetWindowTextA(*cHWND, windowNameBuf, 255); // NuLogger::getInstance()->log(" |- Window: \"%s\"", windowNameBuf); CHAR classNameBuf[255]; GetClassNameA(*cHWND, classNameBuf, 255); // NuLogger::getInstance()->log(" |- ClassName: \"%s\"", classNameBuf); if ((windowNameBuf == windowName || windowName == "") && (classNameBuf == className || className == "")) { filteredWindows.push_back(*cHWND); // return *cHWND; } } else { // NuLogger::getInstance()->log("\\ no window"); } } // NuLogger::getInstance()->log("-----------------------------------------------------"); if (filteredWindows.size() > 0) { return filteredWindows[0]; } else { return NULL; } }
/****************************************************************** * WDML_ClientProc * * Window Proc created on client side for each conversation */ static LRESULT CALLBACK WDML_ClientProc(HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM lParam) { UINT uiLo, uiHi; WDML_CONV* pConv = NULL; HSZ hszSrv, hszTpc; TRACE("%p %04x %08lx %08lx\n", hwnd, iMsg, wParam , lParam); if (iMsg == WM_DDE_ACK && /* in the initial WM_INITIATE sendmessage */ ((pConv = WDML_GetConvFromWnd(hwnd)) == NULL || pConv->wStatus == XST_INIT1)) { /* In response to WM_DDE_INITIATE, save server window */ char buf[256]; WDML_INSTANCE* pInstance; /* note: sent messages do not need packing */ uiLo = LOWORD(lParam); uiHi = HIWORD(lParam); /* FIXME: convlist should be handled here */ if (pConv) { /* we already have started the conv with a server, drop other replies */ GlobalDeleteAtom(uiLo); GlobalDeleteAtom(uiHi); PostMessageW((HWND)wParam, WM_DDE_TERMINATE, (WPARAM)hwnd, 0); return 0; } pInstance = WDML_GetInstanceFromWnd(hwnd); hszSrv = WDML_MakeHszFromAtom(pInstance, uiLo); hszTpc = WDML_MakeHszFromAtom(pInstance, uiHi); pConv = WDML_AddConv(pInstance, WDML_CLIENT_SIDE, hszSrv, hszTpc, hwnd, (HWND)wParam); SetWindowLongPtrW(hwnd, GWL_WDML_CONVERSATION, (ULONG_PTR)pConv); pConv->wStatus |= ST_CONNECTED; pConv->wConvst = XST_INIT1; /* check if server is handled by DDEML */ if ((GetClassNameA((HWND)wParam, buf, sizeof(buf)) && lstrcmpiA(buf, WDML_szServerConvClassA) == 0) || (GetClassNameW((HWND)wParam, (LPWSTR)buf, sizeof(buf)/sizeof(WCHAR)) && lstrcmpiW((LPWSTR)buf, WDML_szServerConvClassW) == 0)) { pConv->wStatus |= ST_ISLOCAL; } GlobalDeleteAtom(uiLo); GlobalDeleteAtom(uiHi); /* accept conversation */ return 1; } if (iMsg >= WM_DDE_FIRST && iMsg <= WM_DDE_LAST) { pConv = WDML_GetConvFromWnd(hwnd); if (pConv) { MSG msg; HDDEDATA hdd; msg.hwnd = hwnd; msg.message = iMsg; msg.wParam = wParam; msg.lParam = lParam; WDML_HandleReply(pConv, &msg, &hdd, NULL); } return 0; } return IsWindowUnicode(hwnd) ? DefWindowProcW(hwnd, iMsg, wParam, lParam) : DefWindowProcA(hwnd, iMsg, wParam, lParam); }
BOOL CALLBACK EWP_DirectInject(HWND hwnd, LPARAM lParam) { CHAR name[500] = {0}; struct INJ_DATA injdata = *(struct INJ_DATA*)lParam; // injection via windowtitle if(injdata.mode == 1) { GetWindowTextA(hwnd, name, 500 * sizeof(CHAR)); if(strncmp((LPCSTR)injdata.name, name, strlen(name) + 1) == 0) { DWORD dwPid = 0; GetWindowThreadProcessId(hwnd, &dwPid); if(dwPid == 0) { PRINT_ERROR_MSGA("Could not get ProcessId from window handle (hwnd: 0x%p).", hwnd); } if(!CHECK_TARGET_PROC(dwPid)) { PRINT_TARGET_PROC_ERROR(dwPid); return TRUE; } if(injdata.inject) { if(injdata.mm) { if(!MapRemoteModuleA(dwPid, injdata.libpath)) { PRINT_ERROR_MSGA("Failed to map the PE file into the remote address space of a process (PID: %x)\n", dwPid); } } else { InjectLibraryA(dwPid, injdata.libpath); } } else { if(injdata.module_address) { EjectLibrary(dwPid, injdata.module_address); } else { EjectLibraryA(dwPid, injdata.libpath); } } } } // injection via windowclass if(injdata.mode == 2) { GetClassNameA(hwnd, name, 500 * sizeof(CHAR)); if(strncmp((LPCSTR)injdata.name, name, strlen(name) + 1) == 0) { DWORD dwPid = 0; GetWindowThreadProcessId(hwnd, &dwPid); if(dwPid == 0) { PRINT_ERROR_MSGA("Could not get ProcessId from window handle (hwnd: 0x%p).", hwnd); } if(!CHECK_TARGET_PROC(dwPid)) { PRINT_TARGET_PROC_ERROR(dwPid); return TRUE; } if(injdata.inject) { if(injdata.mm) { if(!MapRemoteModuleA(dwPid, injdata.libpath)) { PRINT_ERROR_MSGA("Failed to map the PE file into the remote address space of a process (PID: %x)\n", dwPid); } } else { InjectLibraryA(dwPid, injdata.libpath); } } else { if(injdata.module_address) { EjectLibrary(dwPid, injdata.module_address); } else { EjectLibraryA(dwPid, injdata.libpath); } } } } return TRUE; }