blob: 8139f563069ac091fbe293cf887ab1fdf92858b6 [file] [log] [blame]
/*---------------------------------------------------------
* 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;
}