📄 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)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 + -