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

📄 myusbmouse.cpp

📁 WindowsCE.NET USB驱动开发
💻 CPP
字号:
// MyUsbMouse.cpp : Defines the entry point for the DLL application.

//USB的鼠标驱动   作者:宁杨   Email:no.killer@163.com

//////////////////////////
#include "stdafx.h"

#include "Mouse.h"
BOOL APIENTRY DllMain(HANDLE hDllHandle, DWORD dwReason, LPVOID lpReserved)
{
    switch (dwReason) {
        case DLL_PROCESS_ATTACH:
            DEBUGREGISTER((HINSTANCE)hDllHandle);

            DEBUGMSG(ZONE_INIT, (TEXT("+Hid DriverEntry\r\n")));
	    DisableThreadLibraryCalls((HMODULE) hDllHandle);
            break;
        case DLL_PROCESS_DETACH:
            DEBUGMSG(ZONE_INIT, (TEXT("-Hid DriverEntry\r\n")));
        default:
            break;
    }
    return TRUE;
}
//监控通知函数USBDeviceNotifications
extern "C" BOOL
USBDeviceNotifications(LPVOID lpvNotifyParameter, DWORD dwCode, 
LPDWORD * dwInfo1, LPDWORD * dwInfo2, LPDWORD * dwInfo3, 
LPDWORD * dwInfo4) 
{
	CMouse * pMouse = (CMouse *)lpvNotifyParameter; 
	
	switch(dwCode) 
	{
	case USB_CLOSE_DEVICE:
		//删除相关的资源。 
		delete pMouse; 
		return TRUE; 
	} 
	return FALSE;
}
//USB连接函数
extern "C" BOOL 
USBDeviceAttach(USB_HANDLE hDevice,// USB设备句柄 
                LPCUSB_FUNCS lpUsbFuncs, // USBDI的函数集合 
                LPCUSB_INTERFACE lpInterface, // 设备接口描述信息 
                LPCWSTR szUniqueDriverId, // 设备ID描述字符串。 
                LPBOOL fAcceptControl, // 返回TRUE,标识我们可以控制此设备, 反之表示不能控制 
				LPCUSB_DRIVER_SETTINGS lpDriverSettings,
                DWORD dwUnused)
{
	*fAcceptControl = FALSE;
    // 我们的鼠标设备有特定的描述信息,要检测是否是我们的设备。 

	if (lpInterface == NULL)  
	{
		return FALSE; 
	}
    // 初试数据USB鼠标类,产生一个接受USB鼠标数据的线程 
    CMouse * pMouse = new CMouse(hDevice, lpUsbFuncs, lpInterface); 
    if (pMouse == NULL) 
	{
		return FALSE; 
	}

    if (!pMouse->Initialize())  
	{ 
		delete pMouse; 
		return FALSE; 
	}
	// 注册一个监控USB设备事件的回调函数,用于监控USB设备是否已经拔掉。 
	(*lpUsbFuncs->lpRegisterNotificationRoutine)(hDevice, 
		USBDeviceNotifications, pMouse); 
	
	*fAcceptControl = TRUE; 
	return TRUE;
}


const WCHAR gcszRegisterClientDriverId[] = L"RegisterClientDriverID";
const WCHAR gcszRegisterClientSettings[] = L"RegisterClientSettings";
const WCHAR gcszUnRegisterClientDriverId[] = L"UnRegisterClientDriverID";
const WCHAR gcszUnRegisterClientSettings[] = L"UnRegisterClientSettings";
const WCHAR gcszMouseDriverId[] = L"Generic_Sample_Mouse_Driver";


//USBInstallDriver主要用于创建一个驱动程序加载所需的注册表信息,例如读写超时,设备名称等。
extern "C" BOOL 
USBInstallDriver(LPCWSTR szDriverLibFile) // @parm [IN] - Contains client driver DLL name
{
	BOOL fRet = FALSE;
	HINSTANCE hInst = LoadLibrary(L"USBD.DLL");
	
	// 注册USB设备信息
	if(hInst)
	{ 
		LPREGISTER_CLIENT_DRIVER_ID pRegisterId = (LPREGISTER_CLIENT_DRIVER_ID) 
			GetProcAddress(hInst, gcszRegisterClientDriverId); 
		
		LPREGISTER_CLIENT_SETTINGS pRegisterSettings = 
			(LPREGISTER_CLIENT_SETTINGS) GetProcAddress(hInst,gcszRegisterClientSettings);
		
		if(pRegisterId && pRegisterSettings)
		{
			USB_DRIVER_SETTINGS DriverSettings;
			
			DriverSettings.dwCount = sizeof(DriverSettings);
			
			// 设置我们的特定的信息。
			DriverSettings.dwVendorId = USB_NO_INFO;
			DriverSettings.dwProductId = USB_NO_INFO;
			DriverSettings.dwReleaseNumber = USB_NO_INFO;
			
			DriverSettings.dwDeviceClass = USB_NO_INFO;
			DriverSettings.dwDeviceSubClass = USB_NO_INFO; 
			DriverSettings.dwDeviceProtocol = USB_NO_INFO; 
			
			DriverSettings.dwInterfaceClass = 0x03; // HID
			DriverSettings.dwInterfaceSubClass = 0x01; // boot device
			DriverSettings.dwInterfaceProtocol = 0x02; // mouse
			
			fRet = (*pRegisterId)(gcszMouseDriverId);
			
			if(fRet)
			{
				fRet = (*pRegisterSettings)(szDriverLibFile,
					gcszMouseDriverId, NULL, &DriverSettings);
				
				if(!fRet)
				{
					//BUGBUG unregister the Client Driver's ID
				}
			}
		}
		else
		{
			RETAILMSG(1,(TEXT("!USBMouse: Error getting USBD function pointers\r\n")));
		} 
		FreeLibrary(hInst);
	} 
	return fRet;
}

//另外一个函数是USBUninstallDriver()函数,具体代码如下:
extern "C" BOOL 
USBUnInstallDriver()
{
	BOOL fRet = FALSE;
	HINSTANCE hInst = LoadLibrary(L"USBD.DLL");
	
	if(hInst)
	{ 
		LPUN_REGISTER_CLIENT_DRIVER_ID pUnRegisterId = 
			(LPUN_REGISTER_CLIENT_DRIVER_ID) 
			GetProcAddress(hInst, gcszUnRegisterClientDriverId); 
		
		LPUN_REGISTER_CLIENT_SETTINGS pUnRegisterSettings = 
			(LPUN_REGISTER_CLIENT_SETTINGS) GetProcAddress(hInst,
			gcszUnRegisterClientSettings);
		
		if(pUnRegisterSettings)
		{ 
			USB_DRIVER_SETTINGS DriverSettings;
			
			DriverSettings.dwCount = sizeof(DriverSettings);
			// 必须填入与注册时相同的信息.
			DriverSettings.dwVendorId = USB_NO_INFO;
			DriverSettings.dwProductId = USB_NO_INFO;
			DriverSettings.dwReleaseNumber = USB_NO_INFO;
			
			DriverSettings.dwDeviceClass = USB_NO_INFO;
			DriverSettings.dwDeviceSubClass = USB_NO_INFO;
			DriverSettings.dwDeviceProtocol = USB_NO_INFO;
			
			DriverSettings.dwInterfaceClass = 0x03; // HID 
			DriverSettings.dwInterfaceSubClass = 0x01; // boot device 
			DriverSettings.dwInterfaceProtocol = 0x02; // mouse 
			
			fRet = (*pUnRegisterSettings)(gcszMouseDriverId, NULL, 
				&DriverSettings);
		} 
		
		if(pUnRegisterId) 
		{ 
			BOOL fRetTemp = (*pUnRegisterId)(gcszMouseDriverId); 
			fRet = fRet ? fRetTemp : fRet; 
		} 
		FreeLibrary(hInst); 
	} 
	return fRet; 
}

⌨️ 快捷键说明

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