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

📄 hidlink.cpp

📁 查找HID类设备的程序。检查指定PID号码的USB设备是否存在
💻 CPP
字号:
// hidlink.cpp : Defines the initialization routines for the DLL.
//

#include "stdafx.h"
#include "hidlink.h"
#include "setupapi.h"
extern "C"
{
	#include "d:\ntddk\inc\hidsdi.h"
}

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

//
//	Note!
//
//		If this DLL is dynamically linked against the MFC
//		DLLs, any functions exported from this DLL which
//		call into MFC must have the AFX_MANAGE_STATE macro
//		added at the very beginning of the function.
//
//		For example:
//
//		extern "C" BOOL PASCAL EXPORT ExportedFunction()
//		{
//			AFX_MANAGE_STATE(AfxGetStaticModuleState());
//			// normal function body here
//		}
//
//		It is very important that this macro appear in each
//		function, prior to any calls into MFC.  This means that
//		it must appear as the first statement within the 
//		function, even before any object variable declarations
//		as their constructors may generate calls into the MFC
//		DLL.
//
//		Please see MFC Technical Notes 33 and 58 for additional
//		details.
//

/////////////////////////////////////////////////////////////////////////////
// CHidlinkApp

BEGIN_MESSAGE_MAP(CHidlinkApp, CWinApp)
	//{{AFX_MSG_MAP(CHidlinkApp)
		// NOTE - the ClassWizard will add and remove mapping macros here.
		//    DO NOT EDIT what you see in these blocks of generated code!
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CHidlinkApp construction

CHidlinkApp::CHidlinkApp()
{
	// TODO: add construction code here,
	// Place all significant initialization in InitInstance
}

/////////////////////////////////////////////////////////////////////////////
// The one and only CHidlinkApp object

CHidlinkApp theApp;
unsigned char	inbuffer[9];		/* input buffer*/
unsigned char   outbuffer[9];		/* output buffer */
HANDLE hDevice;
OVERLAPPED		HidOverlapped;
//#define VID 0x1241
//#define PID 0xe000

BOOL bOpenHidDevice(HANDLE *HidDevHandle, USHORT vid, USHORT pid,unsigned char open)
{
		static GUID HidGuid;						
		HDEVINFO HidDevInfo;						
		SP_DEVICE_INTERFACE_DATA devInfoData;		
		BOOLEAN Result;								
		DWORD Index;								
		DWORD DataSize;										
		BOOLEAN GotRequiredSize;					
		PSP_DEVICE_INTERFACE_DETAIL_DATA detailData;
		DWORD RequiredSize;							
		BOOLEAN DIDResult;							
		HIDD_ATTRIBUTES HIDAttrib;					
		GotRequiredSize = FALSE;
		HidD_GetHidGuid(&HidGuid);
		Index = 0;
		do {
			HidDevInfo = SetupDiGetClassDevs(	&HidGuid, 
													NULL, 
													NULL, 
													DIGCF_PRESENT | DIGCF_INTERFACEDEVICE);

			if(HidDevInfo==INVALID_HANDLE_VALUE)
			{
				return FALSE;
					
			}
			devInfoData.cbSize = sizeof(devInfoData);	
			Result = SetupDiEnumDeviceInterfaces(	HidDevInfo, 
															0, 
															&HidGuid, 
															Index, 
															&devInfoData);
			if(Result == FALSE)
			{
				SetupDiDestroyDeviceInfoList(HidDevInfo);
				return FALSE;
			}
			DIDResult = SetupDiGetDeviceInterfaceDetail(	HidDevInfo,
																	&devInfoData,
																	NULL,
																	0,
																	&DataSize,
																	NULL);
			GotRequiredSize = TRUE;
			detailData = (PSP_DEVICE_INTERFACE_DETAIL_DATA) malloc(DataSize);
			detailData->cbSize = sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA);
			DIDResult = SetupDiGetDeviceInterfaceDetail(	HidDevInfo,
																&devInfoData,
																detailData,
																DataSize,
																&RequiredSize,
																NULL);
			hDevice= CreateFile( detailData->DevicePath,
												GENERIC_WRITE|GENERIC_READ,
												FILE_SHARE_READ | FILE_SHARE_WRITE,
												NULL,
												OPEN_EXISTING,
												FILE_FLAG_OVERLAPPED,
												(LPOVERLAPPED) &HidOverlapped);
											//	NULL);
			
			if(hDevice != INVALID_HANDLE_VALUE)
			{
				HIDAttrib.Size = sizeof(HIDAttrib);
				HidD_GetAttributes(	*HidDevHandle, &HIDAttrib);
				if((HIDAttrib.VendorID == vid) && (HIDAttrib.ProductID == pid))
				{			
					if(detailData != NULL)
						free(detailData);
						return TRUE;		    
				}				
				CloseHandle(*HidDevHandle);
			}		
			Index++;	

		} while(Result == TRUE);


	if(detailData != NULL)
		free(detailData);

	
	SetupDiDestroyDeviceInfoList(HidDevInfo);

	return FALSE;

}
extern "C" _declspec(dllexport) int findHID(int PID,int VID)
{
	if(bOpenHidDevice( &hDevice, VID, PID,0) == TRUE){
	
		return 1;
	}else{
		return 0;
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -