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

📄 pcom.cpp

📁 一款usb端口控制手机的程序
💻 CPP
字号:
// pCom.cpp : 定义 DLL 应用程序的入口点。
//

#include "stdafx.h"
#include "pCom.h"
BOOL APIENTRY DllMain( HANDLE hModule, 
                       DWORD  ul_reason_for_call, 
                       LPVOID lpReserved
					 )
{
	switch (ul_reason_for_call)
	{
	case DLL_PROCESS_ATTACH:
	case DLL_THREAD_ATTACH:
	case DLL_THREAD_DETACH:
	case DLL_PROCESS_DETACH:
		break;
	}
    return TRUE;
}

// 这是导出函数的一个示例。

PCOM_API int RegisterNotify(HWND hWnd)
{
	//AFX_MANAGE_STATE(AfxGetStaticModuleState());

	DEV_BROADCAST_DEVICEINTERFACE   broadcastInterface;    
	memset(&broadcastInterface,NULL,sizeof(DEV_BROADCAST_DEVICEINTERFACE));

	// Register to receive notification when a USB device is plugged in.
	broadcastInterface.dbcc_size = sizeof(DEV_BROADCAST_DEVICEINTERFACE);
	broadcastInterface.dbcc_devicetype = DBT_DEVTYP_DEVICEINTERFACE;

	GUID                    nHubGUID	= GUID_CLASS_USBHUB;
	GUID                    nGUID		= GUID_CLASS_USB_DEVICE;
	GUID                    nModemGUID	= GUID_DEVCLASS_MODEM;
	GUID					nNetMonGUID	= GUID_DEVCLASS_NETMON;	

	HANDLE h=HANDLE(hWnd);
	HDEVNOTIFY m_hNotifyDevHandle,m_hNotifyHubHandle,m_hNotifyModemHandle;
	try
	{
		broadcastInterface.dbcc_classguid = nGUID;
		m_hNotifyDevHandle = RegisterDeviceNotification(h,
			&broadcastInterface,
			DEVICE_NOTIFY_WINDOW_HANDLE);

		// register hub class
		broadcastInterface.dbcc_classguid = nHubGUID;

		m_hNotifyHubHandle = RegisterDeviceNotification(h,
			&broadcastInterface,
			DEVICE_NOTIFY_WINDOW_HANDLE);

		// register USB Modem class
		broadcastInterface.dbcc_classguid = nModemGUID;

		m_hNotifyModemHandle = RegisterDeviceNotification(h,
			&broadcastInterface,
			DEVICE_NOTIFY_WINDOW_HANDLE);

		// register USB NetMonModem class
		broadcastInterface.dbcc_classguid = nNetMonGUID;

		m_hNotifyModemHandle = RegisterDeviceNotification(h,
			&broadcastInterface,
			DEVICE_NOTIFY_WINDOW_HANDLE);
	}
	catch (...)
	{
		int i=GetLastError();
		return i;	
	}
	return 0;
}
PCOM_API int GetPhoneString(char* comStr,int strLen)
{
	DWORD                               lastError;
	LONG                                ii = 0;
	HDEVINFO                            hDeviceInfo;
	DWORD                               bufferSize;
	SP_DEVICE_INTERFACE_DATA            interfaceData;
	PSP_DEVICE_INTERFACE_DETAIL_DATA    deviceDetail;
	int result=0;
	GUID GUIDS[]={GUID_CLASS_USB_DEVICE,GUID_DEVCLASS_MODEM,GUID_CLASS_MSD,GUID_DEVCLASS_NETMON};
	for(int i=0;i<4;i++)
	{
		hDeviceInfo = SetupDiGetClassDevs(
			&GUIDS[i],
			NULL,
			NULL,
			DIGCF_PRESENT | DIGCF_DEVICEINTERFACE
			);
		if (hDeviceInfo == INVALID_HANDLE_VALUE)
		{
			lastError = GetLastError();
			return lastError;
		}

		// Setup the interface data struct
		interfaceData.cbSize = sizeof(interfaceData);

		for (ii = 0;
			SetupDiEnumDeviceInterfaces(
			hDeviceInfo,
			NULL,
			&GUIDS[i],
			ii,
			&interfaceData);
		++ii)
		{
			// Found our device instance
			if (!SetupDiGetDeviceInterfaceDetail(
				hDeviceInfo,
				&interfaceData,
				NULL,
				0,
				&bufferSize,
				NULL))
			{
				if (GetLastError() != ERROR_INSUFFICIENT_BUFFER)
				{
					continue;
				}
			}

			// Allocate a big enough buffer to get detail data
			deviceDetail = (PSP_DEVICE_INTERFACE_DETAIL_DATA)malloc(bufferSize);
			if (deviceDetail == NULL)
			{
				continue;
			}
			// Setup the device interface struct
			deviceDetail->cbSize = sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA);

			// Try again to get the device interface detail info
			if (!SetupDiGetDeviceInterfaceDetail(
				hDeviceInfo,
				&interfaceData,
				deviceDetail,
				bufferSize,
				NULL,
				NULL))
			{
				free(deviceDetail);
				continue;
			}
			char* ptr=strchr(deviceDetail->DevicePath,'#');
			if (ptr && ++ptr && strnicmp(ptr,"vid_22b8&pid_",13)==0)
			{
				ptr+=13;	// move ptr after "Pid_" (example ptr="1001&Mi_00#")
				int nPID = 0xFFFF;
				sscanf(ptr, "%X",&nPID);
				char* pMi_0=strchr(ptr,'&');
				if (pMi_0 && ++pMi_0 && strnicmp(pMi_0,"mi_",2)==0)	// if P2K_TEST_COMMAND Motorola interface (example ptr="i_0x#"  where x is >=0 and <=9)
				{
					switch (pMi_0[4])// determine x from Mi_0x#
					{
					case '8':
						switch (nPID)
						{
						case 0x2821:// CDMA 1X 5100
						case 0x2A21:// CDMA 1x 6100
						case 0x2AC1:// CDMA 1x 6100  MILAN LATAM
						case 0x2A41:// CDMA 1x 6100
						case 0x2A61:// CDMA 1x 6500
						case 0x2A81:// CDMA 1x 6025
							break;
						default:
							strcpy(comStr,deviceDetail->DevicePath);
							result=1;
							break;					
						}
						break;
					default:
						break;
					}
				}
			}
			free(deviceDetail);
		}

		SetupDiDestroyDeviceInfoList(hDeviceInfo);
	}
	return result;
}

PCOM_API HANDLE OpenRadio(LPCTSTR comStr)
{
	HANDLE  hDev;
	hDev = CreateFile(
		comStr,
		GENERIC_READ | GENERIC_WRITE,
		FILE_SHARE_READ | FILE_SHARE_WRITE,
		NULL,
		OPEN_EXISTING,
		FILE_FLAG_OVERLAPPED,
		0
		);

	if (hDev == INVALID_HANDLE_VALUE)
	{
		return INVALID_HANDLE_VALUE;
	}
	return hDev;
}
PCOM_API int WriteData(HANDLE pHandle,BYTE* pData,int len,OVERLAPPED m_osWrite)
{
	int bok;
	//const BYTE P2K_TEST_CMND_TO_FLASH_MODE[]={0x41,0x02,00,00,0x08,00,0x09,00,00,0x00,0x00,0x13,00,01,00,00,0x0A};
	int nStatus=TDTK_FAIL;
	DWORD pdwLen=len;
	char databack[128]={0};
	DWORD pdwWriteBytes;
	//AcquireBus();
	bok=::DeviceIoControl(	pHandle,
		IOCTL_MOTUSB_CLASS_OR_VENDOR_REQUEST,
		(LPVOID) pData,
		(DWORD) pdwLen,
		databack,
		(DWORD) 128,
		&pdwWriteBytes,
		&m_osWrite);
	if(!bok)
	{
		if(GetLastError()==ERROR_IO_PENDING)
		{
			if(::WaitForSingleObject(m_osWrite.hEvent,30000)!=WAIT_TIMEOUT)
			{								
				if(GetOverlappedResult(pHandle,&m_osWrite,&pdwWriteBytes,FALSE))
				{
					nStatus=TDTK_SUCCESS;
				}
				else
				{
					nStatus=GetLastError();
				}
			}
			else
			{
				nStatus=GetLastError();
			}
		}
		else
			nStatus=GetLastError();
	}	
	return nStatus;
}
PCOM_API int QueryData(HANDLE pHandle,BYTE* buffer,ULONG bufferlen,ULONG& ReturnedLen,OVERLAPPED m_osRead)
{
	int bok;	
	DWORD pdwLen=(DWORD)bufferlen;
	POLL_RESPONSE_DATA_PACKET databack;
	memset(&databack,0,sizeof(POLL_RESPONSE_DATA_PACKET));
	DWORD pdwWriteBytes;

	CLASS_OR_VENDOR_REQUEST_IN_STRUCT  pollPacket;
	int nStatus=TDTK_FAIL;
	int i=0;
	pollPacket.bmRequestType= 0xC1;
	pollPacket.bRequest		= 0x00;
	pollPacket.wValue		= 0x00;
	pollPacket.wIndex		= 0x08;
	pollPacket.wLength		= 8;

	DWORD dwResponeSize=sizeof(POLL_RESPONSE_DATA_PACKET);	
	DWORD packsize=sizeof(CLASS_OR_VENDOR_REQUEST_IN_STRUCT);

	do {
		bok=::DeviceIoControl(	pHandle,
			IOCTL_MOTUSB_CLASS_OR_VENDOR_REQUEST,
			(LPVOID) &pollPacket,
			(DWORD) pdwLen,
			&databack,
			(DWORD) sizeof(POLL_RESPONSE_DATA_PACKET),
			&pdwWriteBytes,
			&m_osRead);
		if(i++>4)
			break;
		if(!bok)
		{
			if(GetLastError()==ERROR_IO_PENDING)
			{
				if(::WaitForSingleObject(m_osRead.hEvent,30000)!=WAIT_TIMEOUT)
				{
					if(GetOverlappedResult(pHandle,&m_osRead,&pdwLen,FALSE))
					{
						if(databack.nMessages<1)
						{
							nStatus=TDTK_SUCCESS;
							if(i<4)
								continue;
							else
								break;
						}
						else
						{
							databack.nSizeMsg1=(0xff & databack.nSizeMsg1)<<8 | databack.nSizeMsg1>>8;
							databack.nSizeMsg2=(0xff & databack.nSizeMsg2)<<8 | databack.nSizeMsg2>>8;
							databack.nSizeMsg3=(0xff & databack.nSizeMsg3)<<8 | databack.nSizeMsg3>>8;
							nStatus=read(pHandle,buffer,bufferlen,ReturnedLen,m_osRead,databack);
							if(buffer[0]!=1||nStatus!=TDTK_SUCCESS)
							{
								i++;
								continue;
							}
							break;
						}
					}
					else
					{
						nStatus=GetLastError();
					}
				}
				else
					nStatus=GetLastError();
			}
			else
				nStatus=GetLastError();
		}
		else
			nStatus=GetLastError();

	} while(1);
	if(i>3)
		nStatus=TDTK_FAIL;
	return nStatus;
}
PCOM_API RADIOTYPE GetConnectedType()
{
	return TYPE_UNKNOW;
}
int read(HANDLE pHandle,BYTE* buffer,ULONG bufferlen,ULONG& ReturnedLen,OVERLAPPED m_osRead,POLL_RESPONSE_DATA_PACKET databack)
{
	int bok;	
	DWORD pdwLen=(DWORD)bufferlen;
	DWORD pdwWriteBytes;
	int i=0;
	DWORD sizeBuf = sizeof(QUEUED_MESSAGE_RESPONSE_DATA_PACKET)+databack.nSizeMsg1+1;
	QUEUED_MESSAGE_RESPONSE_DATA_PACKET *pResponse=(QUEUED_MESSAGE_RESPONSE_DATA_PACKET*)new BYTE[sizeBuf];
	CLASS_OR_VENDOR_REQUEST_IN_STRUCT  pollPacket;
	int nStatus=TDTK_FAIL;

	pollPacket.bmRequestType= 0xC1;
	pollPacket.bRequest		= 0x01;
	pollPacket.wValue		= 0x01;
	pollPacket.wIndex		= 0x08;
	pollPacket.wLength		= (USHORT)sizeBuf-1;

	DWORD dwResponeSize=sizeof(POLL_RESPONSE_DATA_PACKET);	
	DWORD packsize=sizeof(CLASS_OR_VENDOR_REQUEST_IN_STRUCT);
	bok=::DeviceIoControl(	pHandle,
		IOCTL_MOTUSB_CLASS_OR_VENDOR_REQUEST,
		(LPVOID) &pollPacket,
		(DWORD) sizeof(CLASS_OR_VENDOR_REQUEST_IN_STRUCT),
		(LPVOID)pResponse,
		sizeBuf+sizeof(QUEUED_MESSAGE_RESPONSE_DATA_PACKET),
		&pdwWriteBytes,
		&m_osRead);

	if(!bok)
	{
		if(GetLastError()==ERROR_IO_PENDING)
		{
			if(::WaitForSingleObject(m_osRead.hEvent,30000)!=WAIT_TIMEOUT)
			{
				if(GetOverlappedResult(pHandle,&m_osRead,&pdwLen,FALSE))
				{
					if((ULONG)bufferlen<pResponse->dwLength)
					{
						throw("buf out error");
						nStatus=GetLastError();
					}
					else
					{
						ReturnedLen=pResponse->dwLength;
						memcpy(buffer,((PCLASS_OR_VENDOR_REQUEST_OUT_STRUCT)pResponse)->DataBuf,ReturnedLen);
						nStatus=TDTK_SUCCESS;
					}

				}
				else
				{
					nStatus=GetLastError();
				}
			}
			else
				nStatus=GetLastError();
		}
		else
			nStatus=GetLastError();
	}
	else
		nStatus=GetLastError();
	delete pResponse;
	return nStatus;
}

⌨️ 快捷键说明

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