我一直在用c#开发一个应用程序,我希望在插入USB海量存储时进行一些验证。
问题是在验证期间我想从消息队列中取出大容量存储的消息。
一个人告诉我你不能在C#中这样做,但只能在C语言中使用汇编语言。
你能帮我找一个C库,我可以用C#从操作系统消息队列中提取消息吗?
protected override void WndProc(ref Message m)
{
switch (m.Msg)
{
case Win32.WM_DEVICECHANGE:
//OnDeviceChange(ref m);
break;
}
base.WndProc(ref m);
}
void OnDeviceChange(ref Message msg)
{
int wParam = (int)msg.WParam;
if (wParam == Win32.DBT_DEVICEARRIVAL)
{
label1.Text = "Arrival";
//MessageBox.Show("" + wParam);
//msg = Message.Create(new IntPtr(),1,new IntPtr(),new IntPtr());
}
else if (wParam == Win32.DBT_DEVICEREMOVECOMPLETE) label1.Text =
"Remove";
}
我已经做到了,但它只是告诉你发生了什么。
我想关闭消息,以便操作系统不知道是否与设备相邻,然后在验证验证后再次打开消息。
答案 0 :(得分:2)
不会发生,伙计。当您收到Win32 WM_DEVICECHANGE
消息时,设备已经非常负载。内核已经知道设备,加载的驱动程序,在这种情况下作为大容量存储设备,已经创建了一个卷。这是所有(大多数)内核模式活动。然后Win32(用户模式)将此消息广播到所有顶级窗口。您根本无法在Win32级别以任何语言 以及此WM_DEVICECHANGE
机制执行此操作。
为此,您将不得不编写设备驱动程序。它们是用C语言编写的,在内核模式下运行,并且比简单的C#应用程序实现起来要复杂得多。我建议您寻找其他解决方案,以实现您的目标。顺便问一下......这是什么?
“否则它会丢弃该消息,以便操作系统不会知道它”
很抱歉,但你完全忽略了这一点。 WM_DEVICECHANGE
从操作系统(即Win32子系统)发送到所有顶级窗口。它只是一个通知,没有与此消息相关的控件。 WM_DEVICECHANGE
无助于您阻止访问设备的目标。就像我说的,为此你需要一个设备驱动程序,很可能是一个文件系统过滤器驱动程序。对于该驱动程序,您将发送一个IOCTL(来自用户模式),允许访问该设备。
答案 1 :(得分:1)
操作系统不依赖于WM_DEVICECHANGE
来了解设备,因此阻止该消息将无效。
您要求做的事情非常困难,因为必须加载操作系统驱动程序和文件系统才能访问设备并执行验证,但听起来您想要阻止任何其他程序使用它。即使内核中实现的防病毒软件也不会阻止设备在扫描之前出现。
您可能会实现一个文件系统过滤器驱动程序,该驱动程序报告设备上没有文件,直到扫描完成,但这会严重混淆看到设备出现的软件,但文件在以后才可用。而C#对于实现Windows驱动程序没有用。甚至没有“在C#中使用的C库”(我假设你的意思是p / invoke)。 C#代码与内核中的环境不兼容。