| /*--------------------------------------------------------- | |
| * Copyright (C) Microsoft Corporation. All rights reserved. | |
| * Modification copyright 2021 The Go Authors. All rights reserved. | |
| * Licensed under the MIT License. See LICENSE in the project root for license information. | |
| *--------------------------------------------------------*/ | |
| // Modified from: | |
| // https://github.com/microsoft/vscode-python/blob/main/src/client/debugger/extension/attachQuickPick/wmicProcessParser.ts. | |
| // - Added arguments to get the ExecutablePath from wmic. | |
| 'use strict'; | |
| import { AttachItem, ProcessListCommand } from '../pickProcess'; | |
| const wmicNameTitle = 'Name'; | |
| const wmicCommandLineTitle = 'CommandLine'; | |
| const wmicPidTitle = 'ProcessId'; | |
| const wmicExecutableTitle = 'ExecutablePath'; | |
| const defaultEmptyEntry: AttachItem = { | |
| label: '', | |
| description: '', | |
| detail: '', | |
| id: '', | |
| processName: '', | |
| commandLine: '' | |
| }; | |
| // Perf numbers on Win10: | |
| // | # of processes | Time (ms) | | |
| // |----------------+-----------| | |
| // | 309 | 413 | | |
| // | 407 | 463 | | |
| // | 887 | 746 | | |
| // | 1308 | 1132 | | |
| export const wmicCommand: ProcessListCommand = { | |
| command: 'wmic', | |
| args: ['process', 'get', 'Name,ProcessId,CommandLine,ExecutablePath', '/FORMAT:list'] | |
| }; | |
| export function parseWmicProcesses(processes: string): AttachItem[] { | |
| const lines: string[] = processes.split('\r\n'); | |
| const processEntries: AttachItem[] = []; | |
| let entry = { ...defaultEmptyEntry }; | |
| for (const line of lines) { | |
| if (!line.length) { | |
| continue; | |
| } | |
| parseLineFromWmic(line, entry); | |
| // Each entry of processes has ProcessId as the last line | |
| if (line.lastIndexOf(wmicPidTitle, 0) === 0) { | |
| processEntries.push(entry); | |
| entry = { ...defaultEmptyEntry }; | |
| } | |
| } | |
| return processEntries; | |
| } | |
| function parseLineFromWmic(line: string, item: AttachItem): AttachItem { | |
| const splitter = line.indexOf('='); | |
| const currentItem = item; | |
| if (splitter > 0) { | |
| const key = line.slice(0, splitter).trim(); | |
| let value = line.slice(splitter + 1).trim(); | |
| if (key === wmicNameTitle) { | |
| currentItem.label = value; | |
| currentItem.processName = value; | |
| } else if (key === wmicPidTitle) { | |
| currentItem.description = value; | |
| currentItem.id = value; | |
| } else if (key === wmicCommandLineTitle) { | |
| const dosDevicePrefix = '\\??\\'; // DOS device prefix, see https://reverseengineering.stackexchange.com/a/15178 | |
| if (value.lastIndexOf(dosDevicePrefix, 0) === 0) { | |
| value = value.slice(dosDevicePrefix.length); | |
| } | |
| currentItem.detail = value; | |
| currentItem.commandLine = value; | |
| } else if (key === wmicExecutableTitle) { | |
| currentItem.executable = value; | |
| } | |
| } | |
| return currentItem; | |
| } |