Software python + autoit pentru YHY632A Rfid

This article has been written before more than 24months, information might old.

Acum ceva timp am achiziționat un aparat pe care în momentul de față nu îl mai am în posesie pentru aplicații cu tag-uri NFC, evident ca dispozitivul nu numai ca era făcut în China ( pentru ca asta este foarte normal ) ci era și proiectat tot acolo, de aceea l am luat destul de ieftin as spune. Dacă îmi amintesc bine cred ca a costat 28 de $ sau mai mult dar pot să găsesc exact suma, dar nu asta este ideea.
La prima inspecție mi s-a părut, excelent la asemenea preț însă dezamăgirea a venit mai târziu când mi-am dat seama ca suportul pentru linux e cam 0, plus de asta venea cu un micro-chip fără prea multe specificații care ar fi fost greu de inclus în librăriile standard NFC. Totuși de ce să fiu rău, căci venea cu un SDK și cu suport bun pe Windows, în fine nici prin cap nu mi-a dat cumva să încerc să îl fac compatibil cu linux-ul pentru ca ar fi însemnat să fi scris un modul de kernel doar ca aparatul sa fie recunoscut după care ar fi trebuit să îl fac cumva compatibil cu libnfc de care aveam eu nevoie.Asa ca am făcut rost de alt aparat care sa funcționeze cu linux-ul fără prea mari bătăi de cap.Ce este drept este ca a costat un pic mai mult.

În orice caz după câteva luni m am gândit totuși sa fac un soft pentru aparatul acesta chinezesc de care nu mai aveam nevoie prima data am scris softul în python, ( just for fun ) după care m am gândit sa îl rescriu în autoit că e mai user friendly mai ales în cazul în care vrei sa trimiți cuiva ceva deja compilat, și plus de asta era mult mai ușor de portat în autoit maxim o durata de 2-3 ore. Pe când în altele mi-ar fi luat ceva mai mult, oricum e atât de simplu ca poți sa îl portezi folosind orice limbaj singura condiție e sa poată importa funcții din dll-uri.

Asa deci o sa încep cu versiunea în python care are 2 fișiere o clasă pentru câteva operații simple și un fișier principal.

'''
Created on May 1, 2013

@author: azrael-sub7
'''


import rfidCard
import argparse
import sys
        

if __name__ == '__main__':
    
    
    cardDumpData = ""
    cardDumpKeys = ""
    port = ""
    band = ""
    
    parser = argparse.ArgumentParser(
                                     prog='YHY632WriterPython',
                                     description='''
                                     This program will copy data from a mifare 1k whole dump
                                     and write on a rfid mifare 1k tag if you provide the 
                                     correct keys \n
                                     
                                     Simple usage: exemple --cardDumpData cardDumWithDataToCopy.dmp --cardDumpKeys cardDumWithKeysToUse.dmp \n 
                                     
                                     
                                     ''',
                                    epilog='''
                                    
                                    A Whole Card Dump look like this : \n
                                    
                                    Layout: 64 * [16 Bytes BLOCK] (16 KEYS A and B Keys For each 4 Block )\n
                                    
                                    Data Diagram:\n
                                    
                                    ADDRESS-00--------16 Bytes: SPECIAL BLOCK:------------\n 
                                    ADDRESS-01--------16 Bytes: DATA BLOCK   :------------\n 
                                    ADDRESS-02--------16 Bytes: DATA BLOCK   :------------\n 
                                    ADDRESS-03--------16 Bytes: KEYS BLOCK   :------------\n 
                                    \n
                                    ADDRESS-04--------16 Bytes: SPECIAL BLOCK:------------\n 
                                    ADDRESS-05--------16 Bytes: DATA BLOCK   :------------\n 
                                    ADDRESS-06--------16 Bytes: DATA BLOCK   :------------\n 
                                    ADDRESS-07--------16 Bytes: KEYS BLOCK   :------------\n
                                    \n
                                    [................ Repeat Until ..... .................]\n
                                    
                                    ADDRESS-60---------16 Bytes: SPECIAL BLOCK:------------\n 
                                    ADDRESS-61--------16 Bytes: DATA BLOCK   :------------\n 
                                    ADDRESS-62--------16 Bytes: DATA BLOCK   :------------\n 
                                    ADDRESS-63--------16 Bytes: KEYS BLOCK   :------------\n
                                    
                                    
                                    ''')
    
   
    parser.add_argument('--cardDumpData', dest='cardDumpData', action='store_const',
                   const=sum, default=max,
                   help='File path to card dump ( data from the dump will be copied )')
    
    parser.add_argument('--cardDumpKeys', dest='cardDumpKeys', action='store_const',
                   const=sum, default=max,
                   help='File path to card dump ( keys form the dump will be used )')
    
    parser.add_argument('--port', dest='port', action='store_const',
                   const=sum, default=max,
                   help='port where you have the device connected ex: 3( default value) ( see device manager )')
    
    parser.add_argument('--band', dest='band', action='store_const',
                   const=sum, default=max,
                   help='band rate to transmit message: ussualy 9600(default value) ( see device manager )')
    
    args = parser.parse_args()

    port = 1
    band = 9600
    
    
    fCardFile = file('1.dmp', 'rb')
    fCardFileContentsList = bytearray(fCardFile.read())
    fCardFile.close()
    
    allSectorsC1 = dict()
    for i in range(0,16):allSectorsC1[int(i)] = fCardFileContentsList[0+64*i:64*(1+i)]
    
    
    fCardFile = file('2.dmp', 'rb')
    fCardFileContentsList = bytearray(fCardFile.read())
    fCardFile.close()
    
    allSectorsC2 = dict()
    for i in range(0,16):allSectorsC2[int(i)] = fCardFileContentsList[0+64*i:64*(1+i)]
    
     
    if not len(sys.argv):
        card = rfidCard.rfidCard()       
        card.connectDev()
        card.selectCard()
        card.writeCardData(allSectorsC2, allSectorsC1)
    else:
        
        #band = int(band)
        #port = int(port)
        
        if((band > 1) and (port > 1)):
            card = rfidCard.rfidCard(port,band)
        else:
            card = rfidCard.rfidCard();      
        
        card.connectDev()
        card.selectCard()
        card.writeCardData(allSectorsC2, allSectorsC1)
        card.printCard(allSectorsC2)
       

Clasa :

'''
Created on May 3, 2013

@author: azrael-sub7
'''


import ctypes 
import sys
import time


 

class rfidCard():
    '''
    classdocs
    '''

    conected=0
    selected=0
    
    port = 1
    band = 9600
    
    yhyDll = ctypes.cdll.LoadLibrary("MasterRD.dll") 
    
    def __init__(self,port=3,band=9600):
        self.port = port
        self.band = band
        '''
        Constructor
        '''
    
    def connectDev(self,port=1,band=9600):
        self.port = port
        self.band = band
        if self.yhyDll.rf_init_com(self.port,self.band) != 0:
            print "Could not connect on port"
        else:
            time.sleep(0.5)
            print "Conected to port"
            self.conected = 1

    def selectCard(self):
        shortJ = ctypes.c_short()
        buf1 = (ctypes.c_byte * 200)()
        b1 = ctypes.c_byte()
        if self.conected:
            if self.yhyDll.rf_request(0, 0x52, ctypes.byref(shortJ)) != 0:
                print "Could not get request"
            else:
                time.sleep(0.5)
                print "Request Successfull !"
                if self.yhyDll.rf_anticoll(0, 4, ctypes.byref(buf1), ctypes.byref(b1)) !=0:
                    print "Could not get anticoll"
                else:
                    time.sleep(0.5)
                    print "Passed anticoll"
                    if(self.yhyDll.rf_select(0, ctypes.byref(buf1), 4, ctypes.byref(b1)) !=0):
                        print "Faild to select card"
                    else:
                        time.sleep(0.5)
                        print "Card selected"
                        self.selected = 1

    
    def writeCard(self, path ,allSectors,debug=0):
        f = open(path, 'w+')
        for k in sorted(allSectors.iterkeys()):
            if debug: f.write( "\n"+str(k)+" Data 0:")
            for x in allSectors[k][0:16]:  f.write(hex(x))
            if debug:f.write( "\n"+str(k)+" Data 1:")
            for x in allSectors[k][16:16*2]:  f.write(hex(x))
            if debug:f.write( "\n"+str(k)+" Data 2:")
            for x in allSectors[k][16*2:16*3]:  f.write(hex(x))
            if debug:f.write( "\n"+str(k)+" Key A :")
            for x in allSectors[k][16*3:16*3+6]:  f.write(hex(x))
            if debug:f.write("\n"+str(k)+" aCond :")
            for x in allSectors[k][16*3+6:16*3+6+4]:  f.write(hex(x))
            if debug:f.write("\n"+str(k)+" Key B :")
            for x in allSectors[k][16*3+10:16*3+6+4+6]:  f.write(hex(x))
            f.close()
    
    def printCard(self, allSectors):
        for k in sorted(allSectors.iterkeys()):
            print "\n"+str(k)+" Data 0:"
            for x in allSectors[k][0:16]: sys.stdout.write(hex(x))
            print "\n"+str(k)+" Data 1:"
            for x in allSectors[k][16:16*2]: sys.stdout.write(hex(x))
            print "\n"+str(k)+" Data 2:"
            for x in allSectors[k][16*2:16*3]: sys.stdout.write(hex(x))
            print "\n"+str(k)+" Key A :"
            for x in allSectors[k][16*3:16*3+6]: sys.stdout.write(hex(x))
            print "\n"+str(k)+" aCond :"
            for x in allSectors[k][16*3+6:16*3+6+4]: sys.stdout.write(hex(x))
            print "\n"+str(k)+" Key B :"
            for x in allSectors[k][16*3+10:16*3+6+4+6]: sys.stdout.write(hex(x))
    
    def authSector(self, sectnum, sectkey):
        return self.yhyDll.rf_M1_authentication2(0, 0x61,sectnum, sectkey)
    
    def writeCardData(self, cardData, cardKey, useKey='b'):
        
        if self.conected != 1:
            print "Device not connected , please try to connect first"
            return
        elif self.selected != 1:
            print "Card not selected , please try to select first"
            return
        
        
        if isinstance(useKey, basestring):
            if ((useKey != 'b') or (useKey != 'a') ): useKey ='b'
        else: useKey='b'
        
        keyList = list()
        
        
        for i in range(0,16):
            
            cb = ctypes.c_byte(i*4+1)
            
            
            keyBBuff = cardKey[i][16*3+10:16*3+10+6]
            keyBBuffC = (ctypes.c_byte * len(keyBBuff)).from_buffer(keyBBuff)
            
            for s in range(0,4):
                s = s
                keyList.append(keyBBuff)
            
            
            keyPrint = ''
            for x in keyBBuff: keyPrint += hex(x)
            
            
            
            if self.authSector(cb, ctypes.byref(keyBBuffC)):
                print "Autentification faild with key" , keyPrint," on sector " , str(cb.value)
                return
            else:
                print "Autentification succeed with key " , keyPrint," on sector " , str(cb.value)
            
        print "All Sectors have been authentificated begin writeing !"
        
        cData = list()
        for i in range(0,16):
            for x in range(0,4):
                cData.append(cardData[i][0+x*16:16+x*16])
            
        '''     
        for x in cData:
            pdata = ''
            for y in x: pdata += hex(y)
            print  tempcount, " " ,pdata     
                
        '''

        for i in range(0,64):
            
            keyBlocks = list()
            for x in range(1,17): keyBlocks.append(int( (1*4)-1 ))
                       
            if(i == 0 ):continue
            elif(i in keyBlocks ): continue
            else:
                
                cb = ctypes.c_byte(i)
                writeBuff = (ctypes.c_byte * len(cData[i])).from_buffer(cData[i])
                
                writePrint = ''
                for x in cData[i]: writePrint += hex(x)
                keyBBuffC = (ctypes.c_byte * len(keyList[i])).from_buffer(keyList[i])
                
                
                self.authSector(cb, ctypes.byref( keyBBuffC ))
                if self.yhyDll.rf_M1_write(0, cb, ctypes.byref(writeBuff)):
                    print "Write Data " , writePrint," on block " , i , "faild ."
                else:
                    print "Write Data " , writePrint," on block " , i , "succeed ."
  

Si versiunea autoit la fel în două fișiere unul l-am ținut pentru GUI și unul pentru restul:

Gui:

#include <ButtonConstants.au3>
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
#Region ### START Koda GUI section ### Form=e:\dev\apps_old\autoit3\scite\koda\forms\yhy632awriter\yhy632awriter.kxf
$Form1_1 = GUICreate("YHY632AWriter  - azrael-sub7.ro", 473, 623, 432, 22)
$btBrowseKeys = GUICtrlCreateButton("Browse", 384, 120, 57, 25)
$edConsole = GUICtrlCreateEdit("", 16, 288, 441, 297)
$Label1 = GUICtrlCreateLabel("Image Data Writer ", 112, 16, 220, 33)
GUICtrlSetFont(-1, 18, 800, 0, "MS Sans Serif")
GUICtrlSetColor(-1, 0x800000)
$Label2 = GUICtrlCreateLabel("Path to image with Keys ", 48, 120, 120, 17)
$Label3 = GUICtrlCreateLabel("Path to data image to write", 40, 168, 130, 17)
$inKeysPath = GUICtrlCreateInput("", 184, 120, 193, 21)
$btBrowseData = GUICtrlCreateButton("Browse", 384, 160, 57, 25)
$inDataPath = GUICtrlCreateInput("", 184, 160, 193, 21)
$btWrite = GUICtrlCreateButton("Write Chip Data", 176, 200, 89, 41)
$Label4 = GUICtrlCreateLabel("Console", 192, 256, 61, 20)
GUICtrlSetFont(-1, 10, 800, 0, "MS Sans Serif")
$Label5 = GUICtrlCreateLabel("Hardware: YHY632A", 96, 56, 241, 33)
GUICtrlSetFont(-1, 18, 800, 0, "MS Sans Serif")
GUICtrlSetColor(-1, 0x800000)
$inPort = GUICtrlCreateInput("1", 64, 200, 49, 21)
$inBand = GUICtrlCreateInput("9600", 66, 230, 49, 21)
$Label6 = GUICtrlCreateLabel("Port :", 24, 200, 29, 17)
$Label7 = GUICtrlCreateLabel("Band", 18, 232, 29, 17)
$btShowHelp = GUICtrlCreateButton("Help", 417, 256, 41, 25)
$Label8 = GUICtrlCreateLabel("azrael-sub7", 400, 600, 58, 17)
GUICtrlSetColor(-1, 0x000080)
GUICtrlSetCursor (-1, 0)
GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###

Si main:

#NoTrayIcon
#RequireAdmin
#Region ;**** Directives created by AutoIt3Wrapper_GUI ****
#AutoIt3Wrapper_UseUpx=n
#AutoIt3Wrapper_icon=jr.ico
;#AutoIt3Wrapper_Run_After=upx.exe --best --compress-resources=0 "%out%"
#EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****
#include <Array.au3>
#include "gui/gui.au3"



$defaultDllRdPath =  @ScriptDir&"\data\MasterRD.dll"
$defaultDllRdCom =   @ScriptDir&"\data\MasterCom.dll"


$defaultBand = 9600
$defaultPort = 1

$defaultKeysPath = @ScriptDir&"\data\fckeys.dmp"
$defaultDatapath = @ScriptDir&"\data\fcdata.dmp"

GUICtrlSetData ( $inKeysPath, $defaultKeysPath)
GUICtrlSetData ( $inDataPath, $defaultDatapath)

While 1
	$nMsg = GUIGetMsg()
	Switch $nMsg
		Case $GUI_EVENT_CLOSE
			Exit

		Case $btWrite

If Not(FileExists($defaultDllRdPath)) Then
GUICtrlSetData($edConsole,"Error - dll"&$defaultDllRdPath&" not found !"&@CRLF)
ContinueCase
EndIf

If (Number(GUICtrlRead($inPort)) < 0 Or Number(GUICtrlRead($inPort)) > 31   ) Then
GUICtrlSetData($edConsole,"Error - Port should be a number ( 0 - 30 ) please check device manager to see where you have the device connected !"&@CRLF)
ContinueCase
Else
$defaultPort = Number(GUICtrlRead($inPort))
EndIf

If  Number((GUICtrlRead($inBand)) < 9600 Or Number(GUICtrlRead($inBand)) > 115200    ) Then
GUICtrlSetData($edConsole,"Error - Port should be a number ( 9600 - 115200 ) !"&@CRLF)
ContinueCase
Else
$defaultBand = Number(GUICtrlRead($inBand))
EndIf



		Local $dllHandle = DllOpen ( $defaultDllRdPath )

		Local $KeysPath = guictrlread($inKeysPath)
		Local $Datapath = guictrlread($inDataPath)
		if FileExists($KeysPath) And FileExists($Datapath) Then
		Local $KeysFileSize =  FileGetSize ($KeysPath)
		Local $DataFileSize =  FileGetSize ($Datapath)
		If (  ( $KeysFileSize = 4096) And  ( $DataFileSize = 4096) ) Then ; e 4k sau 1k ?

		Local $fileOpenKeysBin = FileOpen ( $KeysPath, 16  )
		Local $fileOpenDataBin = FileOpen ( $Datapath, 16  )

	Local $fileReadBinKeys
	Local $fileReadBinData

	Local $fileReadBinKeys
	Local $fileReadBinData

    $fileReadBinKeys &= FileRead($fileOpenKeysBin,4096)
    $fileReadBinData &= FileRead($fileOpenDataBin,4096)


FileClose($fileOpenKeysBin)
FileClose($fileOpenDataBin)

    ;GUICtrlSetData($edConsole,$fileReadBinKeys)
	;GUICtrlSetData($edConsole,GUICtrlRead($edConsole)&@CRLF&@CRLF&@CRLF&$fileReadBinKeys)



    Local $fileKeysSectors[1]
	For $i=0 To 15 Step +1
	If $i = 0 Then
	_ArrayInsert($fileKeysSectors,$i,BinaryMid($fileReadBinKeys,1,64 ))
	Else
	_ArrayInsert($fileKeysSectors,$i,BinaryMid($fileReadBinKeys,64*$i+1,64 ))
	EndIf
	Next

	Local $fileDataSectors[1]
	For $i=0 To 15 Step +1
    If $i = 0 Then
	_ArrayInsert($fileDataSectors,$i,BinaryMid($fileReadBinData,1,64))
	Else
	_ArrayInsert($fileDataSectors,$i,BinaryMid($fileReadBinData,64*$i+1,64))
	EndIf
	Next

	Local $KeyList[1]
	For $i=0 To 15 Step +1
	_ArrayInsert($KeyList,$i,BinaryMid($fileKeysSectors[$i],16*3+11,6 ))
	Next



If Not( DllCall($defaultDllRdPath, "int", "rf_init_com", "int", $defaultPort , "long", $defaultBand ) =="" )Then
GUICtrlSetData($edConsole,"Info - Conected to port. "&@CRLF)
Local $structStr = "short shortj;byte buf1[200];byte b1; byte keyb[6];byte cb;byte writebuf[16]"
Local $Struct = DllStructCreate($structStr)
If Not ( DllCall($defaultDllRdPath, "int", "rf_request", "int", 0 , "int", 0x52, "ptr", DllStructGetPtr($Struct,1) )  =="" ) Then
GUICtrlSetData($edConsole,GUICtrlRead($edConsole)&"Info - Request Successfull !"&@CRLF)
If Not ( DllCall($defaultDllRdPath, "int", "rf_anticoll", "int", 0 , "int", 4, "ptr", DllStructGetPtr($Struct,2), "ptr", DllStructGetPtr($Struct,3) ) =="" ) Then
GUICtrlSetData($edConsole,GUICtrlRead($edConsole)&"Info - Passed anticoll !"&@CRLF)
If Not ( DllCall($defaultDllRdPath, "int", "rf_select", "int", 0 , "ptr", DllStructGetPtr($Struct,2) , "int", 4, "ptr", DllStructGetPtr($Struct,3) ) =="" )  Then
GUICtrlSetData($edConsole,GUICtrlRead($edConsole)&"Info - Card selected !"&@CRLF)

	For $i=0 To 15 Step +1

	DllStructSetData($Struct,5,1+4*$i)
	DllStructSetData($Struct,4,$KeyList[$i])
	If Not ( DllCall($defaultDllRdPath, "int", "authSector", "byte", DllStructGetData($Struct,5) , "ptr", DllStructGetPtr($Struct,4) ) =="" )   Then
    GUICtrlSetData($edConsole,GUICtrlRead($edConsole)&"Info - Autentification succeed with key  ! "& DllStructGetData($Struct,4)&" on block "&DllStructGetData($Struct,5)&@CRLF)
	Else
	GUICtrlSetData($edConsole,GUICtrlRead($edConsole)&"Error - Autentification succeed with key  ! "& DllStructGetData($Struct,4)&" on block "&DllStructGetData($Struct,5)&@CRLF)
	ContinueCase
	EndIf

	Next



;----
	Local $allBlockKeys[1]

	For $i=0 To 15 Step +1
	For $x=0 To 3 Step +1
	If $i = 0 and $x = 0 Then
	_ArrayInsert($allBlockKeys,$i, $KeyList[$i])
	_ArrayDelete($allBlockKeys,1)
	Else
	_ArrayAdd($allBlockKeys,$KeyList[$i])
	EndIf
	Next
	Next

;----
Local $allBlockData[1]

	For $i=0 To 15 Step +1
	For $x=0 To 3 Step +1
	If $i = 0 and $x = 0 Then
	_ArrayInsert($allBlockData,$i,BinaryMid($fileDataSectors[$i],$x*16+1,16 ))
	_ArrayDelete($allBlockData,1)
	Else
	_ArrayAdd($allBlockData,BinaryMid($fileDataSectors[$i],$x*16+1,16 ))
	EndIf
	Next
	Next

;---

	Local $KeyBloks[1]

	For $x = 0 to 15 Step +1
		If Not($x = 0) Then
		_ArrayAdd($KeyBloks,($x+1)*4-1 )
		Else
		_ArrayInsert($KeyBloks,$x,($x+1)*4-1 )
		_ArrayDelete($KeyBloks,1)
		EndIf
	Next

	For $i=1 To 63 Step +1

	If Not (_ArraySearch($KeyBloks,$i) = -1) Then ContinueLoop
	DllStructSetData($Struct,5,$i)
	DllStructSetData($Struct,6,$allBlockData[$i])
	DllStructSetData($Struct,4,$allBlockKeys[$i])
	DllCall($defaultDllRdPath, "int", "authSector", "byte", DllStructGetData($Struct,5) , "ptr", DllStructGetPtr($Struct,4) =="" )

	If Not ( DllCall($defaultDllRdPath, "int", "rf_M1_write", "int", 0 ,"byte", DllStructGetData($Struct,5) , "ptr", DllStructGetPtr($Struct,6) ) =="" )   Then
	GUICtrlSetData($edConsole,GUICtrlRead($edConsole)&"Info - Write Data   ! "& DllStructGetData($Struct,6)&" on block "&DllStructGetData($Struct,5)& " succeed!"&@CRLF)
	Else
	GUICtrlSetData($edConsole,GUICtrlRead($edConsole)&"Error - Write Data   ! "& DllStructGetData($Struct,6)&" on block "&DllStructGetData($Struct,5)& " faild!"&@CRLF)
	EndIf
	Next


Else
GUICtrlSetData($edConsole,GUICtrlRead($edConsole)&"Error - Faild to select card"&@CRLF)
EndIf
Else
GUICtrlSetData($edConsole,GUICtrlRead($edConsole)&"Error - Could not get anticoll"&@CRLF)
EndIf
Else
GUICtrlSetData($edConsole,GUICtrlRead($edConsole)&"Error - Could not get request"&@CRLF)
EndIf
Else
GUICtrlSetData($edConsole,"Error - Could not connect on port, , check port and band, check device manager to see where you have the device connected !"&@CRLF)
EndIf

#cs


$ff = FileOpen("testk1.dmp",16+2)
	For $i=0 To 15 Step +1
	FileWrite($ff, $fileKeysSectors[$i])
	Next
	FileClose($ff)


	$ff = FileOpen("testd1.dmp",16+2)
	For $i=0 To 15 Step +1
	FileWrite($ff, $fileDataSectors[$i])
	Next
	FileClose($ff)



    $ff = FileOpen("test.dmp",16+2)
	FileWrite($ff, $fileReadBinData)
	FileClose($ff)

#ce


		Else
		GUICtrlSetData($edConsole,"Error - File of both files sould be 4096 ! Abort.")
		EndIf
		Else
		GUICtrlSetData($edConsole,"Error - File with keys or file with data dosen't exist! Abort!")
		EndIf
DllClose($dllHandle)

Case "void"
Case $btShowHelp
ShellExecute ( "notepad.exe", @ScriptDir&"/data/help.txt")

Case $Label8
ShellExecute ( "http://azrael-sub7.ro")

	EndSwitch
WEnd

Share the joy

Leave a Reply