如何实现不禁用USB鼠标,禁用U盘?

zhgwbzhd 2009-10-20 02:49:11
我通过这两天的查询。
已经实现了,可以禁用所有的USB接口或者某个指定的接口。

但是,我如何实现不禁用USB鼠标,键盘??

谢谢啊!
...全文
920 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
我现在也在写这个程序,不知道楼主解决了问题没有?
zjj_zjj 2009-11-18
  • 打赏
  • 举报
回复
USB 键盘的CLASSID 是多少,我忘了,可以用此来进行区别的
USB\\CLASS_08
zhgwbzhd 2009-11-01
  • 打赏
  • 举报
回复
哦,谢谢啊。
我试试。
gangliche 2009-10-29
  • 打赏
  • 举报
回复
代碼:
HDEVINFO hDevInfo;
bool Success, BNewValue;
struct {DWORD cbSize; char DevicePath[256];} FunctionClassDeviceData;
SP_INTERFACE_DEVICE_DATA DeviceInterfaceData;
SP_DEVINFO_DATA DeviceInfoData;
// DWORD i;
DWORD i,j,k,p,q,BytesReturned;
char Msg[300]={0};
//--------------------------------------------------------------------------
hDevInfo = SetupDiGetClassDevs((LPGUID)&GUID_CLASS_USB_DEVICE,
0, // Enumerator
0,
DIGCF_PRESENT | DIGCF_DEVICEINTERFACE );
if (hDevInfo == INVALID_HANDLE_VALUE) {
printf("ERROR - SetupDiGetClassDevs()");
return false ;
}
//--------------------------------------------------------------------------
DeviceInfoData.cbSize = sizeof(SP_DEVINFO_DATA);
for (i=0;SetupDiEnumDeviceInfo(hDevInfo, i, &DeviceInfoData);i++)
{
Application->ProcessMessages();
if ( bStop->Tag == 1 )
return false;//exit timer1
sprintf(Msg,"Device [%d]",i);
iXprintf ("%s",Msg);
//should do this before SetupDiEnumDeviceInterfaces(hDevInfo, NULL, (LPGUID)&GUID_CLASS_USB_DEVICEA, i, &DeviceInterfaceData);
DeviceInterfaceData.cbSize = sizeof(DeviceInterfaceData);
Success = SetupDiEnumDeviceInterfaces(hDevInfo, NULL, (LPGUID)&GUID_CLASS_USB_DEVICE, i, &DeviceInterfaceData);
if (Success)
{
// There is a device here, get it's name
FunctionClassDeviceData.cbSize = 5;
Success = SetupDiGetDeviceInterfaceDetail(hDevInfo, &DeviceInterfaceData,
(PSP_INTERFACE_DEVICE_DETAIL_DATA)&FunctionClassDeviceData, 256, &BytesReturned, NULL);
if (!Success)
{
sprintf(Msg,"%s",SysErrorMessage(GetLastError()));
iXprintf("Get USB informtion Fail [%s]",Msg);
return false;
}
else
{
sprintf(Msg,"%s",FunctionClassDeviceData.DevicePath);
iXprintf("%s",Msg);
char Dir[80];
ZeroMemory(Dir,sizeof(Dir));
k = 0;
p = 0;
for ( j = 0; j < strlen(FunctionClassDeviceData.DevicePath); j++ )
{//FunctionClassDeviceData.DevicePath sample [\\?\usb#vid_067b&pid_2507#6&14e622e5&0&2#{a5dcbf10-6530-11d2-901f-00c04fb951ed}]
if ( FunctionClassDeviceData.DevicePath[j] == '#' )
{
k++;
if ( k == 3 )
{
break;
}
Dir[p++] = '\\';
continue;
}
if ( k == 0 )
continue;
else if ( k <= 2 )
{//copy example [#vid_067b&pid_2507#6&14e622e5&0&2#]
Dir[p++] = FunctionClassDeviceData.DevicePath[j];
}
}
iXprintf("%s",Dir);
/* if ( (strstr(Dir,"2507") == NULL) && (strstr(Dir,"04B4") == NULL)
&& (strstr(Dir,"152D") == NULL))
continue;//not PL-2507, try next device
for ( q = 0; q < 4; q++ )
{//check repeat class id ( not the new one)
BNewValue = true;
if ( strcmp(Dir,USB[q].ClassID) == 0 )
{
BNewValue = false;
break;
}
}
if ( BNewValue )
{//new value, copy to array
strcpy(USB[Order].ClassID,Dir);
USB[Order].Len = strlen(USB[Order].ClassID);
break;
}*/
}
}
else
return false;

}//end for
if ( GetLastError()!=NO_ERROR &&
GetLastError()!=ERROR_NO_MORE_ITEMS )
{
// Insert error handling here.
return false ;
}

// Cleanup

SetupDiDestroyDeviceInfoList(hDevInfo);
return true;
gangliche 2009-10-29
  • 打赏
  • 举报
回复
可以枚舉所有USB VID/PID,選擇你要移除的drive.
EagleFew 2009-10-28
  • 打赏
  • 举报
回复
之前俺做过一个弹出U盘的小程序, 使用的ddk , 版本记不清楚了. 以前在2000下可以编译, 现在在xp下不能编译. 你枚举usb 设备的时候会有一个字符串名称"the mass storage"(大容量存储器) 判断这个就行了.
YeBinYe 2009-10-20
  • 打赏
  • 举报
回复
学习一下
hemiya 2009-10-20
  • 打赏
  • 举报
回复
标记,学习
gameloader 2009-10-20
  • 打赏
  • 举报
回复
mark
学习一下
Waiting4you 2009-10-20
  • 打赏
  • 举报
回复
我们公司的做法是删除U盘驱动,然后控制管理员权限(大部分人都没有这个权限,当然用其它手段得到的不算-_-)
zhgwbzhd 2009-10-20
  • 打赏
  • 举报
回复
我没有做到驱动那样。
我现在做的是样例。

先通过 SetupDiGetClassDevs 得到一个句柄。

在通过循环 SetupDiEnumDeviceInfo

通过CM_Get_DevNode_Status得到设备的状态。
如果该设备没问题。
就用
SetupDiGetDeviceRegistryProperty得到设备的参数。

用参数SPDRP_DEVICEDESC是就可以得到下面的信息

USB Root Hub
USB Root Hub
USB Root Hub
USB Root Hub
USB 人体学接口设备

禁止通过 StateChange实现。

如果把前4个都禁止了,鼠标也没了。

我怎能才能把U盘之类的和鼠标键盘之类的区别开来呢?

谢谢各位!
lghndyz 2009-10-20
  • 打赏
  • 举报
回复
这就得区分USB鼠标,键盘的dwIoControlCode控制码。驱动程序可以通过CTL_CODE宏来组合定义一个控制码,并在IRP_MJ_DEVICE_CONTROL的实现中进行控制码的操作。在驱动层,irpStack->Parameters.DeviceIoControl.IoControlCode表示了这个控制码。
屏蔽USB鼠标,键盘以外的dwIoControlCode控制码。

1,221

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder Windows SDK/API
社区管理员
  • Windows SDK/API社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧