⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sniffusbdlg.cpp

📁 禁止usb,非常好的代码
💻 CPP
📖 第 1 页 / 共 2 页
字号:
                }
                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 + -