You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
			
				
					240 lines
				
				7.9 KiB
			
		
		
			
		
	
	
					240 lines
				
				7.9 KiB
			| 
								 
											6 years ago
										 
									 | 
							
								// Loader4.cpp
							 | 
						||
| 
								 | 
							
								// (c) 2005 National Control Systems, Inc.
							 | 
						||
| 
								 | 
							
								// Portions (c) 2004 Drew Technologies, Inc.
							 | 
						||
| 
								 | 
							
								// Dynamic J2534 v04.04 dll loader for VB
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								// This program is free software; you can redistribute it and/or
							 | 
						||
| 
								 | 
							
								// modify it under the terms of the GNU General Public License
							 | 
						||
| 
								 | 
							
								// as published by the Free Software Foundation; either version 2
							 | 
						||
| 
								 | 
							
								// of the License, or any later version.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								// This program is distributed in the hope that it will be useful,
							 | 
						||
| 
								 | 
							
								// but WITHOUT ANY WARRANTY; without even the implied warranty of
							 | 
						||
| 
								 | 
							
								// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
							 | 
						||
| 
								 | 
							
								// GNU General Public License for more details.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								// You should have received a copy of the GNU General Public License
							 | 
						||
| 
								 | 
							
								// along with this program; if not, write to:
							 | 
						||
| 
								 | 
							
								// the Free Software Foundation, Inc.
							 | 
						||
| 
								 | 
							
								// 51 Franklin Street, Fifth Floor
							 | 
						||
| 
								 | 
							
								// Boston, MA  02110-1301, USA
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								// National Control Systems, Inc.
							 | 
						||
| 
								 | 
							
								// 10737 Hamburg Rd
							 | 
						||
| 
								 | 
							
								// Hamburg, MI 48139
							 | 
						||
| 
								 | 
							
								// 810-231-2901
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								// Drew Technologies, Inc.
							 | 
						||
| 
								 | 
							
								// 7012  E.M -36, Suite 3B
							 | 
						||
| 
								 | 
							
								// Whitmore Lake, MI 48189
							 | 
						||
| 
								 | 
							
								// 810-231-3171
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#define STRICT
							 | 
						||
| 
								 | 
							
								#include "stdafx.h"
							 | 
						||
| 
								 | 
							
								#include <windows.h>
							 | 
						||
| 
								 | 
							
								#include "Loader4.h"
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								PTOPEN LocalOpen;
							 | 
						||
| 
								 | 
							
								PTCLOSE LocalClose;
							 | 
						||
| 
								 | 
							
								PTCONNECT LocalConnect;
							 | 
						||
| 
								 | 
							
								PTDISCONNECT LocalDisconnect;
							 | 
						||
| 
								 | 
							
								PTREADMSGS LocalReadMsgs;
							 | 
						||
| 
								 | 
							
								PTWRITEMSGS LocalWriteMsgs;
							 | 
						||
| 
								 | 
							
								PTSTARTPERIODICMSG LocalStartPeriodicMsg;
							 | 
						||
| 
								 | 
							
								PTSTOPPERIODICMSG LocalStopPeriodicMsg;
							 | 
						||
| 
								 | 
							
								PTSTARTMSGFILTER LocalStartMsgFilter;
							 | 
						||
| 
								 | 
							
								PTSTOPMSGFILTER LocalStopMsgFilter;
							 | 
						||
| 
								 | 
							
								PTSETPROGRAMMINGVOLTAGE LocalSetProgrammingVoltage;
							 | 
						||
| 
								 | 
							
								PTREADVERSION LocalReadVersion;
							 | 
						||
| 
								 | 
							
								PTGETLASTERROR LocalGetLastError;
							 | 
						||
| 
								 | 
							
								PTIOCTL LocalIoctl;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								HINSTANCE hDLL = NULL;
							 | 
						||
| 
								 | 
							
								//BOOL bIsCorrectVersion = FALSE;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								BOOL WINAPI DllMain(HINSTANCE hInstA, DWORD dwReason, LPVOID lpvReserved)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
									switch (dwReason) {
							 | 
						||
| 
								 | 
							
									case DLL_PROCESS_ATTACH:
							 | 
						||
| 
								 | 
							
										// The DLL is being mapped into the process's address space
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									case DLL_THREAD_ATTACH:
							 | 
						||
| 
								 | 
							
										// A thread is being created
							 | 
						||
| 
								 | 
							
									    break;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									case DLL_THREAD_DETACH:
							 | 
						||
| 
								 | 
							
										// A thread is exiting cleanly
							 | 
						||
| 
								 | 
							
									    break;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									case DLL_PROCESS_DETACH:
							 | 
						||
| 
								 | 
							
										// The DLL is being unmapped from the process's address space
							 | 
						||
| 
								 | 
							
									    break;
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									return TRUE;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								long WINAPI LoadJ2534Dll(char *sLib)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
									long lFuncList = 0;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									if (hDLL != NULL) UnloadJ2534Dll();
							 | 
						||
| 
								 | 
							
									hDLL = LoadLibraryA (sLib);
							 | 
						||
| 
								 | 
							
									if (hDLL == NULL) return ERR_NO_DLL;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									LocalOpen = (PTOPEN)(GetProcAddress(hDLL, "PassThruOpen"));
							 | 
						||
| 
								 | 
							
									if (LocalOpen == NULL) lFuncList = lFuncList | ERR_NO_PTOPEN;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									LocalClose = (PTCLOSE)(GetProcAddress(hDLL, "PassThruClose"));
							 | 
						||
| 
								 | 
							
									if (LocalClose == NULL) lFuncList = lFuncList | ERR_NO_PTCLOSE;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									LocalConnect = (PTCONNECT)(GetProcAddress(hDLL,"PassThruConnect"));
							 | 
						||
| 
								 | 
							
									if (LocalConnect == NULL) lFuncList = lFuncList | ERR_NO_PTCONNECT;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									LocalDisconnect = (PTDISCONNECT)(GetProcAddress(hDLL,"PassThruDisconnect"));
							 | 
						||
| 
								 | 
							
									if (LocalDisconnect == NULL) lFuncList = lFuncList | ERR_NO_PTDISCONNECT;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									LocalReadMsgs = (PTREADMSGS)(GetProcAddress(hDLL,"PassThruReadMsgs"));
							 | 
						||
| 
								 | 
							
									if (LocalReadMsgs == NULL) lFuncList = lFuncList | ERR_NO_PTREADMSGS;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									LocalWriteMsgs = (PTWRITEMSGS)(GetProcAddress(hDLL,"PassThruWriteMsgs"));
							 | 
						||
| 
								 | 
							
									if (LocalWriteMsgs == NULL) lFuncList = lFuncList | ERR_NO_PTWRITEMSGS;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									LocalStartPeriodicMsg = (PTSTARTPERIODICMSG)(GetProcAddress(hDLL,"PassThruStartPeriodicMsg"));
							 | 
						||
| 
								 | 
							
									if (LocalStartPeriodicMsg == NULL) lFuncList = lFuncList | ERR_NO_PTSTARTPERIODICMSG;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									LocalStopPeriodicMsg = (PTSTOPPERIODICMSG)(GetProcAddress(hDLL,"PassThruStopPeriodicMsg"));
							 | 
						||
| 
								 | 
							
									if (LocalStopPeriodicMsg == NULL) lFuncList = lFuncList | ERR_NO_PTSTOPPERIODICMSG;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									LocalStartMsgFilter = (PTSTARTMSGFILTER)(GetProcAddress(hDLL,"PassThruStartMsgFilter"));
							 | 
						||
| 
								 | 
							
									if (LocalStartPeriodicMsg == NULL) lFuncList = lFuncList | ERR_NO_PTSTARTMSGFILTER;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									LocalStopMsgFilter = (PTSTOPMSGFILTER)(GetProcAddress(hDLL,"PassThruStopMsgFilter"));
							 | 
						||
| 
								 | 
							
									if (LocalStopMsgFilter == NULL) lFuncList = lFuncList | ERR_NO_PTSTOPMSGFILTER;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									LocalSetProgrammingVoltage = (PTSETPROGRAMMINGVOLTAGE)(GetProcAddress(hDLL,"PassThruSetProgrammingVoltage"));
							 | 
						||
| 
								 | 
							
									if (LocalSetProgrammingVoltage == NULL) lFuncList = lFuncList | ERR_NO_PTSETPROGRAMMINGVOLTAGE;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									LocalReadVersion = (PTREADVERSION)(GetProcAddress(hDLL,"PassThruReadVersion"));
							 | 
						||
| 
								 | 
							
									if (LocalReadVersion == NULL) lFuncList = lFuncList | ERR_NO_PTREADVERSION;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									LocalGetLastError = (PTGETLASTERROR)(GetProcAddress(hDLL,"PassThruGetLastError"));
							 | 
						||
| 
								 | 
							
									if (LocalGetLastError == NULL) lFuncList = lFuncList | ERR_NO_PTGETLASTERROR;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									LocalIoctl = (PTIOCTL)(GetProcAddress(hDLL,"PassThruIoctl"));
							 | 
						||
| 
								 | 
							
									if (LocalIoctl == NULL) lFuncList = lFuncList | ERR_NO_PTIOCTL;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									if (lFuncList == ERR_NO_FUNCTIONS) return ERR_WRONG_DLL_VER;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									return lFuncList;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								long WINAPI UnloadJ2534Dll()
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
									if (FreeLibrary(hDLL))
							 | 
						||
| 
								 | 
							
									{
							 | 
						||
| 
								 | 
							
										hDLL = NULL;
							 | 
						||
| 
								 | 
							
										LocalOpen = NULL;
							 | 
						||
| 
								 | 
							
										LocalClose = NULL;
							 | 
						||
| 
								 | 
							
										LocalConnect = NULL;
							 | 
						||
| 
								 | 
							
										LocalDisconnect = NULL;
							 | 
						||
| 
								 | 
							
										LocalReadMsgs = NULL;
							 | 
						||
| 
								 | 
							
										LocalWriteMsgs = NULL;
							 | 
						||
| 
								 | 
							
										LocalStartPeriodicMsg = NULL;
							 | 
						||
| 
								 | 
							
										LocalStopPeriodicMsg = NULL;
							 | 
						||
| 
								 | 
							
										LocalStartMsgFilter = NULL;
							 | 
						||
| 
								 | 
							
										LocalStopMsgFilter = NULL;
							 | 
						||
| 
								 | 
							
										LocalSetProgrammingVoltage = NULL;
							 | 
						||
| 
								 | 
							
										LocalReadVersion = NULL;
							 | 
						||
| 
								 | 
							
										LocalGetLastError = NULL;
							 | 
						||
| 
								 | 
							
										LocalIoctl = NULL;
							 | 
						||
| 
								 | 
							
										return 0;
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
									return ERR_NO_DLL;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								long WINAPI PassThruOpen(void *pName, unsigned long *pDeviceID)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
									if (LocalOpen == NULL) return ERR_FUNC_MISSING;
							 | 
						||
| 
								 | 
							
									return LocalOpen(pName, pDeviceID);
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								long WINAPI PassThruClose(unsigned long DeviceID)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
									if (LocalOpen == NULL) return ERR_FUNC_MISSING;
							 | 
						||
| 
								 | 
							
									return LocalClose(DeviceID);
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								long WINAPI PassThruConnect(unsigned long DeviceID, unsigned long ProtocolID, unsigned long Flags, unsigned long Baudrate, unsigned long *pChannelID)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
									if (LocalConnect == NULL) return ERR_FUNC_MISSING;
							 | 
						||
| 
								 | 
							
									return LocalConnect(DeviceID, ProtocolID, Flags, Baudrate, pChannelID);
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								long WINAPI PassThruDisconnect(unsigned long ChannelID)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
									if (LocalDisconnect == NULL) return ERR_FUNC_MISSING;
							 | 
						||
| 
								 | 
							
									return LocalDisconnect(ChannelID);
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								long WINAPI PassThruReadMsgs(unsigned long ChannelID, PASSTHRU_MSG *pMsg, unsigned long *pNumMsgs, unsigned long Timeout)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
									if (LocalReadMsgs == NULL) return ERR_FUNC_MISSING;
							 | 
						||
| 
								 | 
							
									return LocalReadMsgs(ChannelID, pMsg, pNumMsgs, Timeout);
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								long WINAPI PassThruWriteMsgs(unsigned long ChannelID, PASSTHRU_MSG *pMsg, unsigned long *pNumMsgs, unsigned long Timeout)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
									if (LocalWriteMsgs == NULL) return ERR_FUNC_MISSING;
							 | 
						||
| 
								 | 
							
									return LocalWriteMsgs(ChannelID, pMsg, pNumMsgs, Timeout);
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								long WINAPI PassThruStartPeriodicMsg(unsigned long ChannelID, PASSTHRU_MSG *pMsg, unsigned long *pMsgID, unsigned long TimeInterval)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
									if (LocalStartPeriodicMsg == NULL) return ERR_FUNC_MISSING;
							 | 
						||
| 
								 | 
							
									return LocalStartPeriodicMsg(ChannelID, pMsg, pMsgID, TimeInterval);
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								long WINAPI PassThruStopPeriodicMsg(unsigned long ChannelID, unsigned long MsgID)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
									if (LocalStopPeriodicMsg == NULL) return ERR_FUNC_MISSING;
							 | 
						||
| 
								 | 
							
									return LocalStopPeriodicMsg(ChannelID, MsgID);
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								long WINAPI PassThruStartMsgFilter(unsigned long ChannelID, unsigned long FilterType,
							 | 
						||
| 
								 | 
							
									PASSTHRU_MSG *pMaskMsg, PASSTHRU_MSG *pPatternMsg, PASSTHRU_MSG *pFlowControlMsg, unsigned long *pFilterID)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
									if (LocalStartMsgFilter == NULL) return ERR_FUNC_MISSING;
							 | 
						||
| 
								 | 
							
									return LocalStartMsgFilter(ChannelID, FilterType, pMaskMsg, pPatternMsg, pFlowControlMsg, pFilterID);
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								long WINAPI PassThruStopMsgFilter(unsigned long ChannelID, unsigned long FilterID)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
									if (LocalStopMsgFilter == NULL) return ERR_FUNC_MISSING;
							 | 
						||
| 
								 | 
							
									return LocalStopMsgFilter(ChannelID, FilterID);
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								long WINAPI PassThruSetProgrammingVoltage(unsigned long DeviceID, unsigned long PinNumber, unsigned long Voltage)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
									if (LocalSetProgrammingVoltage == NULL) return ERR_FUNC_MISSING;
							 | 
						||
| 
								 | 
							
									return LocalSetProgrammingVoltage(DeviceID, PinNumber, Voltage);
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								long WINAPI PassThruReadVersion(unsigned long DeviceID, char *pFirmwareVersion, char *pDllVersion, char *pApiVersion)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
									if (LocalReadVersion == NULL) return ERR_FUNC_MISSING;
							 | 
						||
| 
								 | 
							
									return LocalReadVersion(DeviceID, pFirmwareVersion, pDllVersion, pApiVersion);
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								long WINAPI PassThruGetLastError(char *pErrorDescription)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
									if (LocalGetLastError == NULL) return ERR_FUNC_MISSING;
							 | 
						||
| 
								 | 
							
									return LocalGetLastError(pErrorDescription);
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								long WINAPI PassThruIoctl(unsigned long ChannelID, unsigned long IoctlID, void *pInput, void *pOutput)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
									if (LocalIoctl == NULL) return ERR_FUNC_MISSING;
							 | 
						||
| 
								 | 
							
									return LocalIoctl(ChannelID, IoctlID, pInput, pOutput);
							 | 
						||
| 
								 | 
							
								}
							 |