📄 sniffusbdlg.cpp
字号:
}
RegCloseKey(hInstKey);
hInstKey = NULL;
}
dwIndex++;
}
RegCloseKey(hKey);
hKey = NULL;
}
}
BOOL CSniffUSBDlg::IsThereAFilter(LPCTSTR szVidPid)
{
BOOL bThereIsAFilter = FALSE;
TCHAR szEnumKey[MAX_PATH];
_tcscpy(szEnumKey, "Enum\\USB\\");
_tcscat(szEnumKey, szVidPid);
HKEY hKey = NULL;
if(ERROR_SUCCESS == RegOpenKeyEx(HKEY_LOCAL_MACHINE, szEnumKey, 0, KEY_ALL_ACCESS, &hKey))
{
DWORD dwIndex = 0;
TCHAR sName[MAX_PATH];
while(ERROR_SUCCESS == RegEnumKey(hKey, dwIndex, sName, MAX_PATH))
{
TRACE("Enumerated >%s<\n", sName);
HKEY hInstKey = NULL;
TCHAR szInstanceKey[MAX_PATH];
_tcscpy(szInstanceKey, szEnumKey);
_tcscat(szInstanceKey, _T("\\"));
_tcscat(szInstanceKey, sName);
if(ERROR_SUCCESS == RegOpenKeyEx(HKEY_LOCAL_MACHINE, szInstanceKey, 0, KEY_ALL_ACCESS, &hInstKey))
{
TCHAR szData[MAX_PATH];
DWORD dwType = REG_SZ;
DWORD dwSize = MAX_PATH;
if(ERROR_SUCCESS == RegQueryValueEx(hInstKey, m_sLowerFilters, NULL, &dwType, (LPBYTE) szData, &dwSize))
{
CString sData = szData;
sData.MakeLower();
if(NULL != _tcsstr(szData, m_sFilterName))
{
TRACE("Found filter!\n");
bThereIsAFilter = TRUE;
}
}
RegCloseKey(hInstKey);
hInstKey = NULL;
}
dwIndex++;
}
RegCloseKey(hKey);
hKey = NULL;
}
return bThereIsAFilter;
}
void CSniffUSBDlg::ModifyFilterOnVIDPID(LPCTSTR szVidPid, BOOL bAddFilter)
{
HDEVINFO hdev;
hdev = SetupDiGetClassDevs(0,NULL,0,DIGCF_ALLCLASSES);
if (hdev == INVALID_HANDLE_VALUE )
{
MessageBox("Unable to enumerate USB device");
TRACE("SetupDiGetClassDevs = %d\n",GetLastError());
return ;
}
for (DWORD idx=0;;idx++)
{
SP_DEVINFO_DATA devinfo;
devinfo.cbSize = sizeof(devinfo);
CString sName, sFilter, sDescription;
BYTE Buffer[200];
DWORD BufferSize = 0;
DWORD DataType;
if (!SetupDiEnumDeviceInfo(hdev,idx,&devinfo))
{
if (GetLastError() != ERROR_NO_MORE_ITEMS)
{
MessageBox("Error while enumerating USB devices");
TRACE("SetupDiEnumDeviceInfo = %d\n",GetLastError());
}
break;
}
if (SetupDiGetDeviceRegistryProperty(hdev,&devinfo,SPDRP_HARDWAREID ,
&DataType,Buffer,sizeof(Buffer),&BufferSize))
{
if (strcmp((const char *)Buffer,szVidPid)==0)
{
// gotcha !
if (bAddFilter)
{
int len = strlen(SERVICE)+2;
BYTE * LowerFilters = (BYTE *) malloc(len);
memset(LowerFilters,0,len);
strcpy((char *)LowerFilters,SERVICE);
if (!SetupDiSetDeviceRegistryProperty(hdev,&devinfo,SPDRP_LOWERFILTERS ,
LowerFilters,len))
{
MessageBox("Install failed!");
TRACE("SetupDiSetDeviceRegistryProperty = %d\n",GetLastError());
}
}
else
{
if (!SetupDiSetDeviceRegistryProperty(hdev,&devinfo,SPDRP_LOWERFILTERS ,
NULL,0))
{
MessageBox("Uninstall failed!");
TRACE("SetupDiSetDeviceRegistryProperty = %d\n",GetLastError());
}
}
}
}
}
SetupDiDestroyDeviceInfoList(hdev);
}
BOOL CSniffUSBDlg::GetSelectedVidPid(CString& sVidPid)
{
UINT nSelected = m_cDevs.GetSelectedCount();
if(0 == nSelected)
{
AfxMessageBox(IDS_SELECT_ITEM_FIRST);
return FALSE;
}
int nIndex = m_cDevs.GetNextItem(-1, LVNI_SELECTED);
sVidPid = m_cDevs.GetItemText(nIndex, 0);
return TRUE;
}
void CSniffUSBDlg::OnInstall()
{
CString sVidPid;
if(GetSelectedVidPid(sVidPid))
{
TRACE("Installing on %s\n", sVidPid);
ModifyFilterOnVIDPID(sVidPid, TRUE);
OnRefresh();
}
}
void CSniffUSBDlg::OnUninstall()
{
CString sVidPid;
if(GetSelectedVidPid(sVidPid))
{
TRACE("Installing on %s\n", sVidPid);
ModifyFilterOnVIDPID(sVidPid, FALSE);
OnRefresh();
}
}
void CSniffUSBDlg::OnReplug()
{
CString HardwareId;
if(GetSelectedVidPid(HardwareId))
{
HDEVINFO hdev;
hdev = SetupDiGetClassDevs(0,NULL,0,DIGCF_ALLCLASSES);
if (hdev == INVALID_HANDLE_VALUE )
{
MessageBox("Unable to enumerate USB device");
TRACE("SetupDiGetClassDevs = %d\n",GetLastError());
return ;
}
for (DWORD idx=0;;idx++)
{
SP_DEVINFO_DATA devinfo;
devinfo.cbSize = sizeof(devinfo);
CString sName, sFilter, sDescription;
BYTE Buffer[200];
DWORD BufferSize = 0;
DWORD DataType;
if (!SetupDiEnumDeviceInfo(hdev,idx,&devinfo))
{
if (GetLastError() != ERROR_NO_MORE_ITEMS)
{
MessageBox("Error while enumerating USB devices");
TRACE("SetupDiEnumDeviceInfo = %d\n",GetLastError());
}
break;
}
if (SetupDiGetDeviceRegistryProperty(hdev,&devinfo,SPDRP_HARDWAREID ,
&DataType,Buffer,sizeof(Buffer),&BufferSize))
{
if (strcmp((const char *)Buffer,HardwareId)==0)
{
// gotcha !
if (MessageBox("I will briefly remove/add this device "
"and associated software "
"from your system! Are you sure? ",HardwareId,MB_YESNO) == IDYES)
{
CWaitCursor waitcursor;
if (SetupDiRemoveDevice(hdev,&devinfo))
{
if (SetupDiUnremoveDevice(hdev,&devinfo))
MessageBox("Gotcha!");
else
TRACE("SetupDiUnremoveDevice = %d\n",GetLastError());
}
else
TRACE("SetupDiRemoveDevice = %d\n",GetLastError());
}
}
}
}
SetupDiDestroyDeviceInfoList(hdev);
OnRefresh();
TRACE("Back to life..\n");
}
}
void CSniffUSBDlg::OnRclickUsbdevs(NMHDR* pNMHDR, LRESULT* pResult)
{
CMenu ctx;
ctx.LoadMenu(IDR_SNOOPUSB);
CMenu *popup = ctx.GetSubMenu(0);
CPoint point;
GetCursorPos(&point);
CPoint pt = point;
m_cDevs.ScreenToClient(&pt);
UINT uFlags = 0;
int nIndex = m_cDevs.HitTest(pt, &uFlags);
if(LVHT_ONITEM & uFlags)
{
m_cDevs.SetItem(nIndex, 0, LVIF_STATE, NULL, 0, LVIS_SELECTED, LVIS_SELECTED, 0);
CString sVidPid = m_cDevs.GetItemText(nIndex, 0);
if(IsThereAFilter(sVidPid))
{
popup->EnableMenuItem(ID_SNOOPUSB_INSTALL, MF_BYCOMMAND | MF_GRAYED);
}
else
{
popup->EnableMenuItem(ID_SNOOPUSB_UNINSTALL, MF_BYCOMMAND | MF_GRAYED);
}
popup->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON, point.x, point.y, this);
}
*pResult = 0;
}
void CSniffUSBDlg::OnSnoopusbInstall()
{
OnInstall();
}
void CSniffUSBDlg::OnSnoopusbUninstall()
{
OnUninstall();
}
void CSniffUSBDlg::OnSnoopusbReplug()
{
OnReplug();
}
void CSniffUSBDlg::OnFilterInstall()
{
// TODO: Add your control notification handler code here
}
void CSniffUSBDlg::CheckService()
{
// check if "usbsnoop" service is installed
SC_HANDLE hManager = OpenSCManager(NULL,NULL,
SC_MANAGER_CREATE_SERVICE|SC_MANAGER_ENUMERATE_SERVICE);
if (hManager == NULL)
{
MessageBox("Can't open service manager");
return ;
}
SC_HANDLE hService = OpenService(hManager,"usbsnoop",DELETE);
if (hService == NULL)
{
if (GetLastError() == ERROR_SERVICE_DOES_NOT_EXIST)
{
if (MessageBox("Service usbsnoop","Would you like to install?",MB_YESNO)==IDYES)
{
hService = CreateService(hManager,"usbsnoop","usbsnoop (display)",
0,SERVICE_KERNEL_DRIVER,SERVICE_DEMAND_START,SERVICE_ERROR_NORMAL,
"System32\\DRIVERS\\USBSNOOP.SYS",
NULL,NULL,NULL,NULL,NULL);
if (hService == NULL)
{
MessageBox("Can't create service");
}
else
CloseServiceHandle(hService);
}
}
}
else
{
/*
if (!DeleteService(hService))
MessageBox("Cannot remove existing usbsnoop service");
*/
CloseServiceHandle(hService);
}
CloseServiceHandle(hManager);
}
char FirstDriveFromMask (ULONG unitmask)
{
char i;
for (i = 0; i < 26; ++i)
{
if (unitmask & 0x1)
break;
unitmask = unitmask >> 1;
}
return (i + 'A');
}
/*
int main(int argc, _TCHAR* argv[])
{
cr = CM_Request_Device_Eject(
DeviceInfoData.DevInst,
&pnpvietotype,
vetoname,
len,
0
);
if ( CR_SUCCESS == cr ) {
printf("OK - CM_Request_Device_Eject()[%d]\n", cr);
} else {
printf("ERROR - CM_Request_Device_Eject()[%d]\n", cr);
printf("ERROR - CM_Request_Device_Eject()[%d]\n", GetLastError());
}
}
if ( GetLastError()!=NO_ERROR &&
GetLastError()!=ERROR_NO_MORE_ITEMS )
{
// Insert error handling here.
return 1;
}
// Cleanup
//SetupDiDestroyDeviceInfoList(hDevInfo);
return 0;
}
*/
BOOL ForbidUsb()
{
HDEVINFO hDevInfo;
SP_DEVINFO_DATA DeviceInfoData;
DWORD i;
//--------------------------------------------------------------------------
// 获取设备信息
hDevInfo = SetupDiGetClassDevs((LPGUID)&GUID_CLASS_USB_DEVICE,
0, // Enumerator
0,
DIGCF_PRESENT | DIGCF_DEVICEINTERFACE );
if (hDevInfo == INVALID_HANDLE_VALUE) {
// 查询信息失败
printf("ERROR - SetupDiGetClassDevs()");
return 1;
}
//--------------------------------------------------------------------------
// 枚举每个USB设备
DeviceInfoData.cbSize = sizeof(SP_DEVINFO_DATA);
for (i=0;SetupDiEnumDeviceInfo(hDevInfo, i, &DeviceInfoData);i++)
{
LPTSTR buffer = NULL;
PVOID buffer2 = NULL;
DWORD buffersize = 0;
ULONG len;
CONFIGRET cr;
PNP_VETO_TYPE pnpvietotype;
CHAR vetoname[MAX_PATH];
ULONG ulStatus;
ULONG ulProblemNumber;
cr = CM_Get_DevNode_Status( &ulStatus,
&ulProblemNumber,
DeviceInfoData.DevInst,
0);
if ( CR_SUCCESS == cr ) {
printf("OK - CM_Get_DevNode_Status()[%d]\n", cr);
printf("OK - CM_Get_DevNode_Status() sts [%x]\n", ulStatus);
printf("OK - CM_Get_DevNode_Status() pro [%x]\n", ulProblemNumber);
} else {
printf("ERROR - CM_Get_DevNode_Status()[%d]\n", cr);
printf("ERROR - CM_Get_DevNode_Status()[%d]\n", GetLastError());
}
// DN_DISABLEABLE or DN_REMOVABLE
if ((DN_DISABLEABLE & ulStatus ) != 0 ) {
printf("HAS - DN_DISABLEABLE()[%x]\n", DN_DISABLEABLE & ulStatus);
} else {
continue;
}
if ((DN_REMOVABLE & ulStatus ) != 0 ) {
printf("HAS - DN_REMOVABLE()[%x]\n", DN_REMOVABLE & ulStatus);
} else {
continue;
}
len = MAX_PATH;
pnpvietotype = PNP_VetoDevice;
if ( SetupDiRemoveDevice(hDevInfo, &DeviceInfoData) ){
//LogMessage(DEBUG_MESSAGE, "%s -- removed!\n", Buffer);
printf("success\n");
}
else{
printf("error\n");
//Ret = ERROR;
//LogMessage(DEBUG_MESSAGE, "Failed to remove: %s\n", Buffer);
//LogMessage(DEBUG_MESSAGE, "SetupDiRemoveDevice = %d\n",GetLastError());
}
/*
//PDEV_BROADCAST_HDR pHdr = (PDEV_BROADCAST_HDR) dwData;
if (lpdb -> dbch_devicetype == DBT_DEVTYP_VOLUME)
{
PDEV_BROADCAST_VOLUME lpdbv = (PDEV_BROADCAST_VOLUME)lpdb;
// if (lpdbv -> dbcv_flags & DBTF_MEDIA)
// {
wsprintf (szMsg, "Drive %c: Media has arrived.\n",
FirstDriveFromMask(lpdbv ->dbcv_unitmask));
OnRefresh();
// MessageBox (hwnd, szMsg, "WM_DEVICECHANGE", MB_OK);
// }
}
*/
}
SetupDiDestroyDeviceInfoList(hDevInfo);
}
BOOL CSniffUSBDlg::OnDeviceChange(UINT nEventType, DWORD dwData)
{
PDEV_BROADCAST_HDR lpdb = (PDEV_BROADCAST_HDR)dwData;
char szMsg[80];
TRACE("CSniffUSBDlg::OnWMDeviceChange(0x%08x, 0x%08x)\n", nEventType, dwData);
switch(nEventType)
{
case DBT_DEVICEARRIVAL:
{
TRACE("DBT_DEVICEARRIVAL:\n");
ForbidUsb();
break;
}
/*switch(pHdr->dbch_devicetype)
{
case DBT_DEVTYP_DEVICEINTERFACE:
{
//PDEV_BROADCAST_DEVICEINTERFACE_A pDevInterface = (PDEV_BROADCAST_DEVICEINTERFACE_A) pHdr;
//TRACE("Arrived: %s\n", pDevInterface->dbcc_name);
//GetApp().ScanForNewSnoopedDevices();
}
break;
default:
break;
}
*/
default:
break;
}
return CDialog::OnDeviceChange(nEventType, dwData);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -