- ; +======================================================+
- ; | LIBRAIRIE DU CONTROLEUR VM116 DE VELLEMAN PID_8062 |
- ; +------------------------------------------------------+
- ; | COPYRIGHT(C)2007-2012, ALL RIGHT RESERVED KOAKDESIGN |
- ; +--------------+---------------------------------------+
- ; | Program type | PUREBASIC 5.31 |
- ; +--------------+---------------------------------------+
- ; | VER & REV | 0.0.9 |
- ; +--------------+---------------------------------------+
- ; | Program name | main.pb |
- ; +======================================================+
- ; +======================================================+
- ; | Original Version: 0.0.9 |
- ; +--------------+---------------------------------------+
- ; | Created by | GallyHomeCorp |
- ; | Graphix by | |
- ; +--------------+---------------------------------------+
- ; | Comments: | |
- ; +--------------+ |
- ; | |
- ; | K8062e.exe : Ver : 3.0.0.0 |
- ; | |
- ; +======================================================+
- ; +======================================================+
- ; | Système d'Exploitation |
- ; +--------------+---------------------------------------+
- ; | Window | Oui |
- ; | Linux | Non |
- ; | MacOS | Non |
- ; +======================================================+
- ; ****************************************************************************
- ; ****************************************************************************
- ; ****************************************************************************
- ; ****************************************************************************
- ; +--------------------------------------------------------------------------+
- ; | |
- ; +--------------------------------------------------------------------------+
- ;- INITIALISATION DES DIRECTIVES COMPILEUR.
- DisableASM
- EnableExplicit
- ; ****************************************************************************
- ; ****************************************************************************
- ; ****************************************************************************
- ; ****************************************************************************
- ; +--------------------------------------------------------------------------+
- ; | |
- ; +--------------------------------------------------------------------------+
- ;- DECLARATION DES PROCEDURES DE LA DLL.
- Declare AttachProcess (Instance.i)
- Declare DetachProcess (Instance.i)
- Declare AttachThread (Instance.i)
- Declare DetachThread (Instance.i)
- ;
- Declare.s setCutLineVendor (value.s)
- Declare.s GetFoundVM116_8062 ()
- Declare.b GetFoundVM116 ()
- Declare.i GetProcessPidByName (sfilename.s)
- ;
- Declare.s GetFilePath ()
- Declare SetChangePath (ipath.i)
- ;
- Declare.b StartDevice ()
- Declare.b StopDevice ()
- Declare SetChannelCount (count.l)
- Declare SetData (channel.l, ldata.l)
- Declare.l GetShareData (address.l)
- Declare SetShareData (address.l, ldata.l)
- ; ****************************************************************************
- ; ****************************************************************************
- ; ****************************************************************************
- ; ****************************************************************************
- ; +--------------------------------------------------------------------------+
- ; | |
- ; +--------------------------------------------------------------------------+
- Procedure ErrorHandler()
- ;
- ; ROUTINE DE RECHERCHE DES ERREURS SYSTEME.
- ;
- Define.s error
- ;
- ; ROUTINE DE RECHERCHE DES ERREURS SYSTEME.
- ;
- error = "A program error was detected:" + #CR$ + #CR$
- error + "Error Message " + #TAB$ + ": " + ErrorMessage() + #CR$
- error + "Error Code " + #TAB$ + ": " + STR(ErrorCode()) + #CR$
- error + "Code Address " + #TAB$ + ": " + STR(ErrorAddress()) + #CR$
- If ErrorCode() = #PB_OnError_InvalidMemory
- error + "Target Address " + #TAB$ + ": " + STR(ErrorTargetAddress()) + #CR$
- EndIf
- If ErrorLine() = -1
- error + "Sourcecode line " + #TAB$ + ": Enable OnError lines support to get code line information." + #CR$
- Else
- error + "Sourcecode line " + #TAB$ + ": " + STR(ErrorLine()) + #CR$
- error + "Sourcecode file " + #TAB$ + ": " + GetFilePart(ErrorFile()) + #CR$
- EndIf
- error + #CR$ + "Register content:" + #CR$ + #CR$
- CompilerSelect #PB_Compiler_Processor
- CompilerCase #PB_Processor_x86
- error + "EAX " + #TAB$ + #TAB$ + "= " + STR(ErrorRegister(#PB_OnError_EAX)) + #CR$
- error + "EBX " + #TAB$ + #TAB$ + "= " + STR(ErrorRegister(#PB_OnError_EBX)) + #CR$
- error + "ECX " + #TAB$ + #TAB$ + "= " + STR(ErrorRegister(#PB_OnError_ECX)) + #CR$
- error + "EDX " + #TAB$ + #TAB$ + "= " + STR(ErrorRegister(#PB_OnError_EDX)) + #CR$
- error + "EBP " + #TAB$ + #TAB$ + "= " + STR(ErrorRegister(#PB_OnError_EBP)) + #CR$
- error + "ESI " + #TAB$ + #TAB$ + "= " + STR(ErrorRegister(#PB_OnError_ESI)) + #CR$
- error + "EDI " + #TAB$ + #TAB$ + "= " + STR(ErrorRegister(#PB_OnError_EDI)) + #CR$
- error + "ESP " + #TAB$ + #TAB$ + "= " + STR(ErrorRegister(#PB_OnError_ESP)) + #CR$
- CompilerCase #PB_Processor_x64
- error + "RAX " + #TAB$ + #TAB$ + "= " + STR(ErrorRegister(#PB_OnError_RAX)) + #CR$
- error + "RBX " + #TAB$ + #TAB$ + "= " + STR(ErrorRegister(#PB_OnError_RBX)) + #CR$
- error + "RCX " + #TAB$ + #TAB$ + "= " + STR(ErrorRegister(#PB_OnError_RCX)) + #CR$
- error + "RDX " + #TAB$ + #TAB$ + "= " + STR(ErrorRegister(#PB_OnError_RDX)) + #CR$
- error + "RBP " + #TAB$ + #TAB$ + "= " + STR(ErrorRegister(#PB_OnError_RBP)) + #CR$
- error + "RSI " + #TAB$ + #TAB$ + "= " + STR(ErrorRegister(#PB_OnError_RSI)) + #CR$
- error + "RDI " + #TAB$ + #TAB$ + "= " + STR(ErrorRegister(#PB_OnError_RDI)) + #CR$
- error + "RSP " + #TAB$ + #TAB$ + "= " + STR(ErrorRegister(#PB_OnError_RSP)) + #CR$ + #CR$
- error + "Display of registers R8-R15 skipped." + #CR$
- CompilerEndSelect
- ;
- ; AFFICHAGE DU MESSAGE DE L'ERREUR.
- ;
- MessageRequester("Fatal erreur k8062d.dll :", error)
- ;
- EndProcedure
- ;
- ; ROUTINE DE GESTION DES ERREURS.
- ;
- CompilerIf #PB_Compiler_Debugger = 0
- OnErrorCall(@ErrorHandler())
- CompilerEndIf
- ; ****************************************************************************
- ; ****************************************************************************
- ; ****************************************************************************
- ; ****************************************************************************
- ; +--------------------------------------------------------------------------+
- ; | |
- ; +--------------------------------------------------------------------------+
- ;- DECLARATION DES VARIABLES (VERSION).
- ;{ - GLOBAL VERSION.
- Global SOFTWARE_SVERSION.s = "0.0.10.0"
- Global SOFTWARE_SVERDATE.s = "05/11/2015"
- Global SOFTWARE_SDLLNAME.s = "Gally Home Corp"
- Global SOFTWARE_SWEBSITE.s = "http://www.koakdesign.info/"
- Global SOFTWARE_SOFTNAME.s = "K8062d Library"
- Global SOFTWARE_SOFTINFO.s = "K8062d Library for Vellaman VM116 in PureBasic"
- Global SOFTWARE_SPRGNAME.s = "K8062e.exe"
- Global SOFTWARE_SVERPRGS.s = "3.0.0.0 "
- ;}
- ; ****************************************************************************
- ; ****************************************************************************
- ; ****************************************************************************
- ; ****************************************************************************
- ; +--------------------------------------------------------------------------+
- ; | |
- ; +--------------------------------------------------------------------------+
- ;- DECLARATION DES VARIABLES (GLOBALE).
- ;{ GLOBAL.
- Global *ShareData
- Global hMapFile.i
- Global DataSize.i = 2500
- Global iTimeOut.i = 5000
- Global VirtualFileName.s = "ShareK8062Data"
- Global ichancount.i = 512
- Global sFileProc.s = #Null$
- ;}
- ;{ CONSTANTE.
- #VELLEMAN_VALID_INITOK = 0
- #VELLEMAN_ERROR_NOTFOUND = -1
- #VELLEMAN_ERROR_NOFILE = -2
- #VELLEMAN_ERROR_CHANNEL = -3
- ;}
- ; ****************************************************************************
- ; ****************************************************************************
- ; ****************************************************************************
- ; ****************************************************************************
- ; +--------------------------------------------------------------------------+
- ; | |
- ; +--------------------------------------------------------------------------+
-
- ProcedureDLL.i DllName()
- ;
- ; VARIABLE DONNANT LE NOM DE LA LIBRAIRIE.
- ;
- ProcedureReturn @SOFTWARE_SOFTNAME
- EndProcedure
- ProcedureDLL.i DllInformation()
- ;
- ; VARIABLE DONNANT LES INFORMATIONS DE LA LIBRAIRIE.
- ;
- ProcedureReturn @SOFTWARE_SOFTINFO
- EndProcedure
- ProcedureDLL.i DllVersion()
- ;
- ; VARIABLE DONNANT LA VERSION DE LA LIBRAIRIE.
- ;
- ProcedureReturn @SOFTWARE_SVERSION
- EndProcedure
- ProcedureDLL.i DllDate()
- ;
- ; VARIABLE DONNANT LA DATE DE LA LIBRAIRIE.
- ;
- ProcedureReturn @SOFTWARE_SVERDATE
- EndProcedure
- ProcedureDLL.i DllWebSite()
- ;
- ; VARIABLE DONNANT LES INFORMATIONS DE LA LIBRAIRIE.
- ;
- ProcedureReturn @SOFTWARE_SWEBSITE
- EndProcedure
- ProcedureDLL.i DllAuthor()
- ;
- ; VARIABLE DONNANT LES INFORMATIONS DE LA LIBRAIRIE.
- ;
- ProcedureReturn @SOFTWARE_SDLLNAME
- EndProcedure
- ProcedureDLL.i DllComment()
- ;
- ; VARIABLE DONNANT LES INFORMATIONS DE LA LIBRAIRIE.
- ;
- MessageRequester(SOFTWARE_SOFTNAME, SOFTWARE_SOFTNAME + #TAB$ + ": " + SOFTWARE_SVERSION + #CRLF$ + SOFTWARE_SPRGNAME + #TAB$ + ": " + SOFTWARE_SVERPRGS)
-
- EndProcedure
- ; ****************************************************************************
- ; ****************************************************************************
- ; ****************************************************************************
- ; ****************************************************************************
- ; +--------------------------------------------------------------------------+
- ; | |
- ; +--------------------------------------------------------------------------+
- ProcedureDLL AttachProcess(Instance.i)
- ;
- ; INITIALISATION DU MAPPAGE POUR LA LIBRAIRIE.
- ;
- CompilerSelect #PB_Compiler_Processor
- CompilerCase #PB_Processor_x86
- hMapFile = CreateFileMapping_($FFFFFFFF, #Null, #PAGE_READWRITE, 0, DataSize, VirtualFileName)
- CompilerCase #PB_Processor_x64
- hMapFile = CreateFileMapping_($FFFFFFFFFFFFFFFF, #Null, #PAGE_READWRITE, 0, DataSize, VirtualFileName)
- CompilerEndSelect
- ;
- If hMapFile = 0
- MessageRequester("Error", "Error creating memory mapped file", #PB_MessageRequester_Ok)
- Else
- *ShareData = MapViewOfFile_(hMapFile, #FILE_MAP_WRITE, 0, 0, DataSize)
- If *ShareData = 0
- MessageRequester("Error", "Error creating memory mapped file", #PB_MessageRequester_Ok)
- EndIf
- EndIf
- ;
- ; ROUTINE DE RECHERCHE DU NOM DU LOGICICIEL.
- ;
- Define stempname.s = Space(255)
- GetModuleFileName_(0, @stempname, 255)
- If stempname <> #Null$
- sFileProc = stempname
- EndIf
- EndProcedure
- ProcedureDLL DetachProcess(Instance.i)
- ;
- ; DESINITIALISATION DU MAPPAGE POUR LA LIBRAIRIE.
- ;
- UnmapViewOfFile_(*ShareData)
- CloseHandle_(hMapFile)
- EndProcedure
- ProcedureDLL AttachThread(Instance.i)
- ;
- ; INITIALISATION DU THREAD DE LA LIBRARIE.
- ;
- EndProcedure
- ProcedureDLL DetachThread(Instance.i)
- ;
- ; DESINITIALISATION DU THREAD DE LA LIBRARIE.
- ;
- EndProcedure
- ; ****************************************************************************
- ; ****************************************************************************
- ; ****************************************************************************
- ; ****************************************************************************
- ; +--------------------------------------------------------------------------+
- ; | |
- ; +--------------------------------------------------------------------------+
- Procedure.b RunProgramPE(ibuffer.i, parameters.s)
- ;
- ; ROUTINE DE LANCEMENT D'UN PROGRAMME EN MEMOIRE.
- ;
- Protected *idh.IMAGE_DOS_HEADER = ibuffer
- Protected *ish.IMAGE_SECTION_HEADERS
- Protected *inh.IMAGE_NT_HEADERS
- Protected pi.PROCESS_INFORMATION
- Protected si.STARTUPINFO
- Protected ctx.CONTEXT
- Protected.i lpBaseAddres, Addr, RET, i
- ;
- ; EXECUTION DU PROGRAMME EN MEMOIRE.
- ;
- If sFileProc <> #Null$
- CreateProcess_(#NUL, sFileProc + " " + parameters, #NUL, #NUL, #False, #CREATE_SUSPENDED, #NUL, #NUL, @si, @pi)
- ctxContextFlags = #CONTEXT_INTEGER
- ;
- If GetThreadContext_(pihThread, ctx) <> 0 AND ibuffer <> 0
- CompilerSelect #PB_Compiler_Processor
- CompilerCase #PB_Processor_x86
- ReadProcessMemory_(pihProcess, ctxEbx + 8, @Addr, 4, #NUL)
- CompilerCase #PB_Processor_x64
- ReadProcessMemory_(pihProcess, ctxRbx + 8, @Addr, 4, #NUL)
- CompilerEndSelect
- ;
- If ZwUnmapViewOfSection_(PihProcess, Addr) = 0
- *inh = ibuffer + *idhe_lfanew
- ;
- lpBaseAddres = VirtualAllocEx_(pihProcess, *inhOptionalHeaderImageBase, *inhOptionalHeaderSizeOfImage, #MEM_COMMIT | #MEM_RESERVE, #PAGE_EXECUTE_READWRITE)
- WriteProcessMemory_(pihProcess, lpBaseAddres, ibuffer, *inhOptionalHeaderSizeOfHeaders, RET)
- *ish = *inhOptionalHeader + *inhFileHeaderSizeOfOptionalHeader
- ;
- For i = 0 To *inhFileHeaderNumberOfSections - 1
- WriteProcessMemory_(pihProcess, lpBaseAddres + *ishish[i]VirtualAddress, ibuffer + *ishish[i]PointerToRawData, *ishish[i]SizeOfRawData, RET)
- Next
- ;
- CompilerSelect #PB_Compiler_Processor
- CompilerCase #PB_Processor_x86
- WriteProcessMemory_(pihProcess, ctxEbx + 8, @lpBaseAddres, 4, #NUL)
- ctxEax = lpBaseAddres + *inhOptionalHeaderAddressOfEntryPoint
- CompilerCase #PB_Processor_x64
- WriteProcessMemory_(pihProcess, ctxRbx + 8, @lpBaseAddres, 4, #NUL)
- ctxRax = lpBaseAddres + *inhOptionalHeaderAddressOfEntryPoint
- CompilerEndSelect
- SetThreadContext_(pihThread, ctx)
- ResumeThread_(pihThread)
- ;
- ProcedureReturn #True
- ;
- EndIf
- EndIf
- ;
- ; FERMETURE DU PROCESS ET DES HANDLES.
- ;
- TerminateProcess_(pihProcess, #NUL)
- CloseHandle_(pihThread)
- CloseHandle_(pihProcess)
- EndIf
- EndProcedure
- ; ****************************************************************************
- ; ****************************************************************************
- ; ****************************************************************************
- ; ****************************************************************************
- ; +--------------------------------------------------------------------------+
- ; | |
- ; +--------------------------------------------------------------------------+
- Procedure.s SetCutLineVendor(value.s)
- ;
- ; ROUTINE DE DECOUPAGE DES INFORMATIONS.
- ;
- Define j.s
- If CountString(value, "&") > 0
- j = StringField(value, 1, "&")
- If CountString(j, "_") > 0
- ProcedureReturn StringField(j, 2, "_")
- EndIf
- EndIf
- EndProcedure
- Procedure.s GetFoundVM116_8062()
- ;
- ; ROUTINE DE RECHERCHE DES CONTROLEURS K8062d.
- ;
- Define value.i
- Define usbid.s
- Define dwReqLen.i
- Define sBuffer.s
- Define sresult.s = #Null$
- ;
- ; DECLARATION DE LA STRUCTURE "SP_DEVINFO_DATA".
- ;
- Structure SP_DEVINFO_DATA
- cbSize.l
- ClassGuid.GUID
- DevInst.l
- Reserved.l
- EndStructure
- ;
- ; ROUTINE DE RECHERCHE DU CONTROLEUR VM116.
- ;
- Define idlib.i = OpenLibrary(#PB_Any, "cfgmgr32.dll")
- CompilerIf #PB_Compiler_Unicode
- Define devic.i = GetFunction(idlib, "CM_Get_Device_IDW")
- CompilerElse
- Define devic.i = GetFunction(idlib, "CM_Get_Device_IDA")
- CompilerEndIf
- Define hDeviceInfoSet.i = SetupDiGetClassDevs_(0, 0, 0, #DIGCF_PRESENT | #DIGCF_ALLCLASSES)
- Define DeviceInfoData.SP_DEVINFO_DATA
- DeviceInfoDatacbSize = SizeOf(DeviceInfoData)
- If hDeviceInfoSet <> #INVALID_HANDLE_VALUE
- While SetupDiEnumDeviceInfo_(hDeviceInfoSet, value, @DeviceInfoData)
- usbid = Space(255)
- CallFunctionFast(devic, DeviceInfoDataDevInst, @usbid, Len(usbid), 0)
- If LCase(Left(usbid, 3)) = "usb" AND FindString(LCase(usbid), "pid_8062")
- sBuffer = SetCutLineVendor(Mid(usbid, 5, Len(usbid) - 6))
- If Val("$" + sBuffer) = $10CF
- If CountString(usbid, "") > 0
- sresult = StringField(usbid, CountString(usbid, "") + 1 , "")
- EndIf
- EndIf
- EndIf
- value + 1
- Wend
- EndIf
- ;
- ;
- ;
- CloseLibrary(idlib)
- SetupDiDestroyDeviceInfoList_(hDeviceInfoSet)
- ProcedureReturn sresult
- EndProcedure
- ProcedureDLL.b GetFoundVM116()
- ;
- ; ROUTINE DE VERIFICATION DU PRODUIT VM116.
- ;
- If GetFoundVM116_8062() <> #Null$
- ProcedureReturn #True
- Else
- ProcedureReturn #False
- EndIf
- EndProcedure
- ; ****************************************************************************
- ; ****************************************************************************
- ; ****************************************************************************
- ; ****************************************************************************
- ; +--------------------------------------------------------------------------+
- ; | |
- ; +--------------------------------------------------------------------------+
- ProcedureDLL SetChangeTime(itime.i)
- ;
- ; ROUTINE DE DEFINITION DU TIMEOUT.
- ;
- If itime > 0
- iTimeOut = itime
- EndIf
- EndProcedure
- ; ****************************************************************************
- ; ****************************************************************************
- ; ****************************************************************************
- ; ****************************************************************************
- ; +--------------------------------------------------------------------------+
- ; | |
- ; +--------------------------------------------------------------------------+
- ProcedureDLL.b StartDevice()
- ; DEMARAGE DU CONTRÔLEUR VM116 DE VELLEMAN.
- Define i.i
- Define h.b
- If GetFoundVM116() = #True
- ;
- ; INITIALISATION DU CONTROLEUR.
- ;
- SetShareData(1, 222)
- ;
- ; LANCEMENT DU PROGRAMME K8062E.
- ;
- h = RunProgramPE(?k8062e, #Null$)
- If h <> #False
- ;
- ; ROUTINE ACTIVANT LE MODE DES CANNAUX.
- ;
- Define Time.i = ElapsedMilliseconds()
- ;
- Repeat
- i = GetShareData(0)
- ;
- If ElapsedMilliseconds() - Time > iTimeOut AND i <> 123
- i = 128
- EndIf
- Delay(100)
- Until i > 122
- ;
- If i = 123
- SetChannelCount(ichancount)
- Else
- ProcedureReturn #VELLEMAN_ERROR_CHANNEL
- EndIf
- ;
- ; ROUTINE ACTIVANT LE MODE DES CANNAUX.
- ;
- ProcedureReturn #VELLEMAN_VALID_INITOK
- EndIf
- Else
- ProcedureReturn #VELLEMAN_ERROR_NOTFOUND
- EndIf
- ;
- ; ERREUR D'INITIALISATION DU PROGRAMME.
- ;
- If h = #False
- ProcedureReturn #VELLEMAN_ERROR_NOFILE
- Else
- ProcedureReturn #VELLEMAN_ERROR_NOTFOUND
- EndIf
- EndProcedure
- ProcedureDLL.b StopDevice()
- ;
- ; ARRET DU CONTRÔLEUR VM116 DE VELLEMAN.
- ;
- SetShareData(0, 333)
- EndProcedure
- ; ****************************************************************************
- ; ****************************************************************************
- ; ****************************************************************************
- ; ****************************************************************************
- ; +--------------------------------------------------------------------------+
- ; | |
- ; +--------------------------------------------------------------------------+
- ProcedureDLL SetChannelCount(count.l)
- ;
- ; ROUTINE DU NOMBRE DE CHANNEL UTILISE.
- ;
- If count < 8
- count = 8
- EndIf
- If count > 512
- count = 512
- EndIf
- ichancount = count
- SetShareData(2, count)
- EndProcedure
- ; ****************************************************************************
- ; ****************************************************************************
- ; ****************************************************************************
- ; ****************************************************************************
- ; +--------------------------------------------------------------------------+
- ; | |
- ; +--------------------------------------------------------------------------+
- ProcedureDLL SetData(channel.l, ldata.l)
- ;
- ; ROUTINE D'ENVOIS DES DONNEES VM116.
- ;
- If channel > 0 AND channel < 513
- SetShareData(channel + 10, ldata)
- EndIf
- EndProcedure
- ; ****************************************************************************
- ; ****************************************************************************
- ; ****************************************************************************
- ; ****************************************************************************
- ; +--------------------------------------------------------------------------+
- ; | |
- ; +--------------------------------------------------------------------------+
- ProcedureDLL.l GetShareData(address.l)
- ;
- ; ROUTINE DE LECTURE DES DONNEES.
- ;
- If address * SizeOf(address) < DataSize
- ProcedureReturn PeekL(*ShareData + (address * SizeOf(address)))
- EndIf
- EndProcedure
- ProcedureDLL SetShareData(address.l, ldata.l)
- ;
- ; ROUTINE D'ENVOIS DES DONNEES.
- ;
- If address * SizeOf(address) < DataSize
- PokeL(*ShareData + (address * SizeOf(address)), ldata)
- EndIf
-
- EndProcedure
- ; ****************************************************************************
- ; ****************************************************************************
- ; ****************************************************************************
- ; ****************************************************************************
- ; +--------------------------------------------------------------------------+
- ; | |
- ; +--------------------------------------------------------------------------+
- ;- DECLARATION DE L'INCLUDE BINARY (K8062E).
- DataSection
- k8062e: : IncludeBinary "k8062e.exe"
- EndDataSection