卸载列出残留进程
Exec(ExpandConstant('{app}\KmdUtil.exe'), 'scandll', '', SW_SHOWNORMAL, ewWaitUntilTerminated, ExecRet);
_FX ULONG Kmd_DoWindow(WCHAR *text, PGM *pgms, BOOLEAN silent) { static ATOM atom = 0; RECT rc; int w, h, x, y, xOk, xCancel; HWND hWnd, hStatic, hList, hBtnOk, hBtnCancel; MSG msg; NONCLIENTMETRICS_XP ncm; HFONT hFontVar, hFontFixed; ULONG i; BOOL b, OkClicked; BOOLEAN rtl; // // get fonts // memzero(&ncm, sizeof(ncm)); ncm.cbSize = sizeof(ncm); if (SystemParametersInfo(SPI_GETNONCLIENTMETRICS, ncm.cbSize, &ncm, 0)) hFontVar = CreateFontIndirect(&ncm.lfMessageFont); else hFontVar = NULL; if (! hFontVar) hFontVar = GetStockObject(SYSTEM_FONT); hFontFixed = GetStockObject(ANSI_FIXED_FONT); // // create window // if (! atom) { WNDCLASS wc; memzero(&wc, sizeof(WNDCLASS)); wc.lpfnWndProc = Kmd_WindowProc; wc.hInstance = GetModuleHandle(NULL); wc.hIcon = LoadIcon(NULL, IDI_INFORMATION); wc.hCursor = LoadCursor(NULL, IDC_ARROW); wc.hbrBackground = (HBRUSH)(COLOR_BTNFACE + 1); wc.lpszClassName = SANDBOXIE L"SandboxieKmdUtilWindow"; atom = RegisterClass(&wc); } GetWindowRect(GetDesktopWindow(), &rc); w = rc.right - rc.left; if (w >= 800) { w /= 2; x = w / 2; } else { w -= 32; x = 0; } h = rc.bottom - rc.top; if (h >= 600) { h /= 2; y = h / 2; } else { h -= 32; y = 0; } OkClicked = FALSE; hWnd = CreateWindowEx( WS_EX_APPWINDOW, (LPCWSTR)atom, SANDBOXIE, WS_POPUPWINDOW | WS_CAPTION, x, y, w, h, NULL, NULL, NULL, &OkClicked); // // create static text // SbieDll_GetLanguage(&rtl); i = rtl ? WS_EX_LAYOUTRTL : 0; hStatic = CreateWindowEx( i, L"STATIC", SbieDll_FormatMessage0(8106), SS_LEFT | WS_CHILD | WS_VISIBLE, 5, 5, w - 15, 40, hWnd, NULL, NULL, NULL); SendMessage(hStatic, WM_SETFONT, (WPARAM)hFontVar, FALSE); // // create buttons // wcscpy(text, SbieDll_FormatMessage0(3001)); for (i = 0; i < wcslen(text); ++i) if (text[i] == L'&') wmemmove(text + i, text + i + 1, wcslen(text + i)); xOk = w / 2 - 150; xCancel = w / 2 + 50; y = h - 65; if (rtl) { x = xOk; xOk = xCancel; xCancel = x; } hBtnOk = CreateWindowEx( 0, L"BUTTON", text, BS_PUSHBUTTON | WS_CHILD | WS_TABSTOP | WS_VISIBLE, xOk, y, 100, 25, hWnd, (HMENU)IDOK, NULL, NULL); SendMessage(hBtnOk, WM_SETFONT, (WPARAM)hFontVar, FALSE); wcscpy(text, SbieDll_FormatMessage0(3002)); for (i = 0; i < wcslen(text); ++i) if (text[i] == L'&') wmemmove(text + i, text + i + 1, wcslen(text + i)); hBtnCancel = CreateWindowEx( 0, L"BUTTON", text, BS_PUSHBUTTON | WS_CHILD | WS_TABSTOP | WS_VISIBLE, xCancel, y, 100, 25, hWnd, (HMENU)IDCANCEL, NULL, NULL); SendMessage(hBtnCancel, WM_SETFONT, (WPARAM)hFontVar, FALSE); // // create list box and populate it // hList = CreateWindowEx( 0, L"LISTBOX", NULL, LBS_NOINTEGRALHEIGHT | LBS_NOSEL | WS_HSCROLL | WS_VSCROLL | WS_BORDER | WS_CHILD | WS_TABSTOP | WS_VISIBLE, 5, 45, w - 15, h - 115, hWnd, NULL, NULL, NULL); SendMessage(hList, WM_SETFONT, (WPARAM)hFontFixed, FALSE); SendMessage(hList, LB_SETHORIZONTALEXTENT, 800, 0); b = FALSE; for (i = 0; pgms[i].process_id; ++i) { pgms[i].skip = TRUE; if (_wcsicmp(pgms[i].image, SBIESVC_EXE) == 0) continue; if (_wcsicmp(pgms[i].image, SBIECTRL_EXE) == 0) { ULONG sessid; if (ProcessIdToSessionId(GetCurrentProcessId(), &sessid)) if (pgms[i].session_id == sessid) continue; } swprintf(text, L"%-48.48s PID %5d Session %d", pgms[i].image, pgms[i].process_id, pgms[i].session_id); SendMessage(hList, LB_ADDSTRING, 0, (LPARAM)text); pgms[i].skip = FALSE; b = TRUE; } if (! b) return 0; if (silent) goto terminate_and_return; // // show window and do message loop // ShowWindow(hWnd, SW_SHOWNORMAL); SetFocus(hBtnOk); while (1) { if (GetMessage(&msg, hWnd, 0, 0) <= 0) break; if (msg.message == WM_KEYDOWN) { if (msg.wParam == VK_TAB) { HWND hWndNew = GetFocus(); if (hWndNew && (GetParent(hWndNew) == hWnd)) { hWndNew = GetWindow(hWndNew, GW_HWNDNEXT); if (hWndNew) { ULONG style = GetWindowLong(hWndNew, GWL_STYLE); if (! (style & WS_TABSTOP)) hWndNew = NULL; } } else hWndNew = NULL; if (! hWndNew) hWndNew = hBtnOk; SetFocus(hWndNew); } if (msg.wParam == VK_ESCAPE) break; if (msg.wParam == VK_RETURN || msg.wParam == VK_SPACE) { HWND hWndFocus = GetFocus(); if (hWndFocus != hBtnCancel) OkClicked = TRUE; break; } } DispatchMessage(&msg); } DestroyWindow(hWnd); // // terminate programs if the OK button was clicked // if (! OkClicked) return 1; terminate_and_return: // We don't want to call TerminateProcess on any host services that have been injected. It will create an event log entry and immediate restart. Kmd_Stop_Host_Injected_Svcs(); for (i = 0; pgms[i].process_id; ++i) { if (! pgms[i].skip) { HANDLE hProcess = OpenProcess( PROCESS_TERMINATE, FALSE, pgms[i].process_id); if (hProcess) { TerminateProcess(hProcess, 1); CloseHandle(hProcess); } } } Sleep(1000); return -1; }