从禁用U盘*法大**聊开去

因工作原因需做外设管控方面的内容,今天借这个话题聊一发。外设是各种各样的,仅拿U盘来讲一讲。

首先,最容易想到的是禁用U盘相关驱动程序,我们知道要显示U盘,必须启用Usbstor.sys驱动,修改一下注册表:

从禁用U盘*法大**聊开去

修改Start值即可

把上图中Start值由3改为4即可(想知道为什么可点击看我的文章 闲聊Windows注册表-基础)。不过你一旦知道这种方法是不是还可以改回来,大笑!

其次,还有Windows策略可以设置:

从禁用U盘*法大**聊开去

Windows策略禁止U盘

设置完后,记得调用gpupdate /force更新,否则不生效。同样的,如果用户有管理员权限,可以随时改过来。

唉呀呀,如何是好?我们换个想法,Windows对U盘的插入和卸载是有事件通知的,我们可以在那里做点儿事情:

LRESULT CHWDetectDlg::OnMyDeviceChange(WPARAM wParam, LPARAM lParam)
{
	if ( DBT_DEVICEARRIVAL == wParam || DBT_DEVICEREMOVECOMPLETE == wParam ) {
		PDEV_BROADCAST_HDR pHdr = (PDEV_BROADCAST_HDR)lParam;
		PDEV_BROADCAST_DEVICEINTERFACE pDevInf;
		PDEV_BROADCAST_HANDLE pDevHnd;
		PDEV_BROADCAST_VOLUME pDevVolume;
		switch( pHdr->dbch_devicetype ) {
			case DBT_DEVTYP_DEVICEINTERFACE:
				pDevInf = (PDEV_BROADCAST_DEVICEINTERFACE)pHdr;
				break;
			case DBT_DEVTYP_VOLUME:
				pDevVolume = (PDEV_BROADCAST_VOLUME)pHdr;
				break;
		}
	}
	return 0;
}

可以想到,在上面程序检测到事件通知后,可以判断是否U盘并做一个实时的启用禁用,仿佛就象U盘没插入一样。

爱思考的同学可有就想了,你弄一个程序来做,我可以把你程序给停掉哇,只好祭出终极大杀器,搞个Windows驱动程序来做,驱动也有多种做法,这里提一下:

  • 注册系统模块加载回调,停止usbstor.sys的加载
  • Hook设备PNP分发例程,禁止设备启动
  • 写一个标准的设备过滤驱动, UpperFilter即可

这里抛砖引玉,感兴趣的同学可以试一试啦!