www.pudn.com > pCom.rar > pCom.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)bufferlendwLength) 
					{ 
						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; 
}