c#,Powershell,mmsys.cpl,使用Win32 API展示音频设备属性对话框

常识(基础)

众所周知,mmsys.cpl使管理音频设备的控制面板小工具,

其能产生一个对话框(属性表)让我们查看和修改各设备的详细属性:

在音量合成器中单击音频输出设备的小图标也能实现这个效果:

分析

查看进程后发现,其原来调用了RunDll32.exe

"C:\Windows\system32\rundll32.exe" shell32.dll,Control_RunDLL mmsys.cpl,,{0.0.0.00000000}.{46f5d09f-309e-4ec5-8919-4a881d3fc9e1},general

那我们是不是可以试着调用一下呢?

本质上,rundll调用了mmsys.cpl中的一个函数,但是,mmsys.cpl中只有CPlApplet一个函数

怎么办?

观察:{0.0.0.00000000}.{46f5d09f-309e-4ec5-8919-4a881d3fc9e1},general

提供数据字符串由两组构成,分别为前面的ID与后面的??!!general组成

这是一个很迷惑人的字符串,实际上,他们应作为一组字符串输入

进阶

那怎样获取ID呢,根据DEEPSEEK帮忙,我编制了一个小C#

using System;
using System.Collections.Generic;
using System.Runtime.InteropServices;namespace AudioDeviceEnumerator
{public static class Win32AudioAPI{// 常量定义public const int DEVICE_STATE_ACTIVE = 0x00000001;// 枚举定义public enum EDataFlow{eRender = 0,eCapture = 1,eAll = 2}public enum ERole{eConsole = 0,eMultimedia = 1,eCommunications = 2}// COM 接口定义[ComImport, Guid("A95664D2-9614-4F35-A746-DE8DB63617E6"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]public interface IMMDeviceEnumerator{int EnumAudioEndpoints(EDataFlow dataFlow, int stateMask, out IMMDeviceCollection devices);int GetDefaultAudioEndpoint(EDataFlow dataFlow, ERole role, out IMMDevice endpoint);int GetDevice(string id, out IMMDevice device);int RegisterEndpointNotificationCallback([MarshalAs(UnmanagedType.Interface)] object handler);int UnregisterEndpointNotificationCallback([MarshalAs(UnmanagedType.Interface)] object handler);}[ComImport, Guid("0BD7A1BE-7A1A-44DB-8397-CC5392387B5E"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]public interface IMMDeviceCollection{int GetCount(out int numDevices);int Item(int index, out IMMDevice device);}[ComImport, Guid("D666063F-1587-4E43-81F1-B948E807363F"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]public interface IMMDevice{int Activate([MarshalAs(UnmanagedType.LPStruct)] Guid iid, int clsCtx, IntPtr activationParams, [MarshalAs(UnmanagedType.IUnknown)] out object interfacePtr);int OpenPropertyStore(int access, out IPropertyStore properties);int GetId([MarshalAs(UnmanagedType.LPWStr)] out string id);int GetState(out int state);}[ComImport, Guid("886D8EEB-8CF2-4446-8D02-CDBA1DBDCF99"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]public interface IPropertyStore{int GetCount(out int count);int GetAt(int index, out PropertyKey key);int GetValue(ref PropertyKey key, out PropVariant value);int SetValue(ref PropertyKey key, ref PropVariant value);int Commit();}[StructLayout(LayoutKind.Sequential)]public struct PropertyKey{public Guid fmtid;public int pid;}[StructLayout(LayoutKind.Sequential)]public struct CNM{public string Name;public string ID;}[StructLayout(LayoutKind.Sequential)]public struct PropVariant{public short vt;public short wReserved1;public short wReserved2;public short wReserved3;public IntPtr pointerValue;public int intValue;}// COM 类标识[ComImport, Guid("BCDE0395-E52F-467C-8E3D-C4579291692E")] public class MMDeviceEnumerator { }// 辅助函数:获取设备友好名称public static string GetDeviceFriendlyName(IMMDevice device){IPropertyStore propStore;device.OpenPropertyStore(0, out propStore);PropertyKey key = new PropertyKey{fmtid = new Guid("A45C254E-DF1C-4EFD-8020-67D146A850E0"),pid = 14};PropVariant value;propStore.GetValue(ref key, out value);return Marshal.PtrToStringUni(value.pointerValue);}// 枚举音频设备并返回设备信息public static List<CNM> EnumerateAudioDevices(EDataFlow dataFlow){var enumerator = (IMMDeviceEnumerator)new MMDeviceEnumerator();IMMDeviceCollection devices;enumerator.EnumAudioEndpoints(dataFlow, DEVICE_STATE_ACTIVE, out devices);List<CNM> L = new List<CNM>();int count;devices.GetCount(out count);for (int i = 0; i < count; i++){IMMDevice device;devices.Item(i, out device);string id;device.GetId(out id);string name = GetDeviceFriendlyName(device);CNM c = new CNM();c.Name = name;c.ID = id;L.Add(c);}return L;}}
}

在Powershell中,我们只需要使用ADd-type加载一下,然后调用[AudioDeviceEnumerator.Win32AudioAPI]::EnumerateAudioDevices(
    [AudioDeviceEnumerator.Win32AudioAPI+EDataFlow]::eAll
)即可获取名称和ID

熟悉WIN32编程的同学都知道,CPlApplet函数的标准声明为CPlApplet(IntPtr,int,ver,ver)

而要得到对话框,我们就需要将第二个参数设置为10

        [DllImport("mmsys.cpl", SetLastError = true, CharSet = CharSet.Unicode)]public static extern int CPlApplet(IntPtr hwndCpl,int msg,string lParam1,string lParam2
);

简单一调用

CPlApplet(0,10,null,"{0.0.0.00000000}.{46f5d09f-309e-4ec5-8919-4a881d3fc9e1},general")
成功;

拓展

然而

"{0.0.0.00000000}.{46f5d09f-309e-4ec5-8919-4a881d3fc9e1},general"中,前面ID已经明白,后面的general是什么意思呢?

用IDA逆向一下,得到了以下字符串

playback
recording
sounds
spatial
listento
custom
vendor
sysfx
advanced
levels
tone
hdmi
spdif
general
communications

所以说,这写字符串对应的是选项卡的默认起始位置

结束。(备注:下期更精彩)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.pswp.cn/web/83536.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

织梦dedecms内容页调用seotitle标题的写法

首先方法一&#xff0c;直接用织梦的sql实现&#xff1a; <title> {dede:field nametypeid runphpyes} $idme; global $dsql; $sql"select seotitle from dede_arctype where id$id"; $row$dsql->getOne($sql); me$row["seotitle"]; {/dede:fiel…

linux等保思路与例题

例题 最近在做玄机的靶场&#xff0c;对这方面没怎么接触过&#xff0c;于是决定做一下顺便学习一下 这里可以用change更改命令来查看&#xff1a;change -l xiaoming 也可以用shadow中存储的信息grep出来&#xff1a;cat /etc/shadow|grep xiaoming 其中&#xff1a; 第一个字…

AirSim中文文档(2025-6-11)

文档的git链接&#xff1a; https://github.com/yolo-hyl/airsim-zh-docs 目前可访问的网站&#xff1a; https://airsim.huayezuishuai.site/

​​​​​​​6板块公共数据典型应用场景【政务服务|公共安全|公共卫生|环境保护|金融风控|教育科研]

1. 政务服务 1.1 城市规划与管理 公共数据在城市规划与管理中可发挥关键作用。通过汇聚自然资源、建筑物、人口分布等基础数据,构建数字孪生城市模型,辅助城市总体规划编制、决策仿真模拟。在城市基础设施建设、安全运营、应急管理等方面,公共数据也是不可或缺的基础支撑。例…

LevelDB介绍和内部机制

介绍 LevelDB 是 Google 开源的高性能键值对嵌入式数据库&#xff0c;具有一系列设计上的优势&#xff0c;特别适合写多读少、对存储空间要求高效的场景。 核心优势 1. 高写入性能&#xff08;顺序写磁盘&#xff09; 基于 LSM-Tree&#xff08;Log Structured Merge Tree&am…

数据库-数据查询-Like

引言 &#xff1c;模糊沟通&#xff1e; 父亲&#xff08;45岁&#xff0c;对外谦和&#xff0c;对内急躁&#xff0c;东北口音&#xff09; 儿子&#xff08;18岁&#xff0c;逻辑思维强&#xff0c;喜用生活化比喻&#xff09; 母亲&#xff08;43岁&#xff0c;家庭矛盾调…

SD-WAN优化云应用与多云架构访问的关键策略

1. SD-WAN如何优化企业对公有云和SaaS应用的访问&#xff1f; 1.1 智能流量优化 SD-WAN通过应用识别技术&#xff0c;可以根据不同的业务应用流量需求&#xff0c;动态分配网络资源。例如&#xff0c;SD-WAN能够优先为钉钉、企业微信、金山文档等关键SaaS应用分配低延迟、高带…

JVM——对象模型:JVM对象的内部机制和存在方式是怎样的?

引入 在Java的编程宇宙中&#xff0c;“Everything is object”是最核心的哲学纲领。当我们写下new Book()这样简单的代码时&#xff0c;JVM正在幕后构建一个复杂而精妙的“数据实体”——对象。这个看似普通的对象&#xff0c;实则是JVM内存管理、类型系统和多态机制的基石。…

专题:2025年跨境B2B采购买家行为分析及采购渠道研究报告|附160+份报告PDF汇总下载

原文链接&#xff1a;https://tecdat.cn/?p42612 在商业决策的复杂版图中&#xff0c;数据是穿透迷雾的精准坐标。本报告汇总解读聚焦2024年跨境B2B行业核心动态&#xff0c;以详实数据为锚&#xff0c;串联商品出口、品牌网站运营、独立站流量生态三大关键领域。我们深入挖掘…

使用spring-ai-alibaba接入大模型

spring-ai-alibaba 是Spring AI生态里与阿里巴巴相关的组件&#xff0c;借助它能够实现接入各类大模型。以下为你详细介绍如何使用 spring-ai-alibaba 接入不同大模型&#xff1a; 接入open ai 项目环境准备 首先要创建一个Spring Boot项目&#xff0c;并且在 pom.xml 里添加…

字符串的向量处理技巧:KD树和TF-IDF向量

使用下面的技术&#xff0c;可以构建不用DL的搜索引擎。 向量搜索引擎使用KD-Tree KD-Tree 搭建以字符串向量为索引的树&#xff0c;以 O ( l o g n ) O(logn) O(logn) 的时间复杂度快速查找到最近的向量 代码来源&#xff1a;https://github.com/zhaozh10/ChatCAD/blob/ma…

Modbus TCP 转Canopen网关连接台达伺服驱动器的配置案例

本案例是使用欧姆龙PLC通过开疆智能ModbusTCP转Canopen网关连接台达A2伺服驱动器的配置案例。 配置过程&#xff1a; 首先打开PLC组态软件“Sysmac Studio”&#xff0c;新建项目并进行配置。 编写ModbusTCP的通讯程序。 设置连接的IP地址&#xff0c;端口号等参数。 设置Modb…

Vim Z 开头的视图滚动/折叠命令完整学习笔记

Vim Z 开头的视图滚动/折叠命令完整学习笔记 文章目录 Vim Z 开头的视图滚动/折叠命令完整学习笔记1. 核心概念2. 垂直滚动对齐命令2.1 基础对齐2.2 重画增强版 3. 横向滚动命令3.1 字符级滚动3.2 半屏滚动 4. 代码折叠命令4.1 基础折叠操作4.2 高级折叠操作4.3 全局折叠控制4.…

【Keepalived】Keepalived-2.3.4 已恢复对 CentOS 7 支持

之前在CentOS 7.9系统中对 Keepalived 2.3.2、2.3.3 版本进行编译和安装测试&#xff0c;都出现了编译报错&#xff0c;且官方文档中也给出了不再支持RHEL 7的申明&#xff0c;但是6月10日&#xff0c;Keeplived-2.3.4版本在CentOS 7.9系统中编译、安装成功。 对于此问题&#…

Java NIO 面试全解析:9大核心考点与深度剖析

文章目录 &#x1f680; Java NIO 面试全解析&#xff1a;9大核心考点与深度剖析&#x1f4cc; 一、基础概念&#xff1a;BIO/NIO/AIO 终极对比&#x1f4cc; 二、Buffer核心机制&#xff1a;状态机设计精髓Buffer状态机原理 &#x1f4cc; 三、零拷贝原理&#xff1a;高性能IO…

C++提高编—(模板,泛型,异常处理)

一 模板 1.1 模板概论 以下图为例子&#xff0c;提供了三个西装的证件照&#xff0c;谁都可以取拍照&#xff0c;可以是小孩&#xff0c;男女人&#xff0c;也可以是某些动物等等等。n那么我们这个模板也是这样&#xff0c;它可以是任何类型&#xff0c;基础类型&#xff0c;c…

Python图像处理基础(六)

Python图像处理基础(六) 文章目录 Python图像处理基础(六)3.4 双层图像3.5 具有更多色阶的位图数据3.6 基于调色板的图像3.6.1 超过 256 种颜色的图像3.7 处理透明度3.7.1 Alpha 通道3.7.2 透明调色板条目3.7.3 透明颜色3.8 隔行扫描和交替像素排序3.4 双层图像 某些类型的…

卷积神经网络(一)

第七章 卷积神经网络 从今天开始学习卷积神经网络的内容。 本章的主题是卷积神经网络&#xff08;Convolutional Neural Network&#xff0c;CNN&#xff09;。 CNN被用于图像识别、语音识别等各种场合&#xff0c;在图像识别的比赛中&#xff0c;基于 深度学习的方法几乎都以…

OpenCV 多边形绘制与填充

一、知识点 1、void polylines(InputOutputArray img, InputArrayOfArrays pts, bool isClosed, const Scalar & color, int thickness 1, int lineType LINE_8, int shift 0 ); (1)、在图像上绘制多边形曲线。 (2)、参数说明: img: 输入、输出参数&#xff0…

C#接口代码记录

using System;namespace InterfacesExample {// 定义接口public interface INBAPlayable{void KouLan();}public interface ISupermanable{void Fly();}// 基类public class Person{public void CHLSS(){Console.WriteLine("人类吃喝拉撒睡");}}// Student 类实现多个…