Unit matrix32; {***************************************************************************** MATRIX32.PAS MS-WINDOWS W32 (95/98/NT/2K/XP) Copyright (C) TDi GmbH Include File for Delphi *****************************************************************************} Interface Type pLongWord = ^LongWord; DNGINFO = packed RECORD LPT_Nr : smallint; LPT_Adr : smallint; DNG_Cnt : smallint; END; pDNGINFO = ^DNGINFO; FUNCTION Init_MatrixAPI : smallint; stdcall; external 'matrix32.DLL'; FUNCTION Release_MatrixAPI : smallint; stdcall; external 'matrix32.DLL'; FUNCTION PausePrinterActivity : smallint; stdcall; external 'matrix32.DLL'; FUNCTION ResumePrinterActivity : smallint; stdcall; external 'matrix32.DLL'; FUNCTION GetVersionAPI : LongInt; stdcall; external 'matrix32.DLL'; FUNCTION GetVersionDRV : LongInt; stdcall; external 'matrix32.DLL'; FUNCTION GetVersionDRV_USB : LongInt; stdcall; external 'matrix32.DLL'; FUNCTION GetPortAdr (DNG_LPT: smallint) : smallint; stdcall; external 'matrix32.DLL'; FUNCTION Dongle_Find : smallint; stdcall; external 'matrix32.DLL'; FUNCTION Dongle_FindEx (xbuffer : pDNGINFO): smallint; stdcall; external 'matrix32.DLL'; FUNCTION Dongle_Version (DNG_Nr : smallint; DNG_Port: smallint) : LongInt; stdcall; external 'matrix32.DLL'; FUNCTION Dongle_Model (DNG_Nr : smallint; DNG_Port: smallint) : LongInt; stdcall; external 'matrix32.DLL'; FUNCTION Dongle_MemSize (DNG_Nr : smallint; DNG_Port: smallint) : smallint; stdcall; external 'matrix32.DLL'; FUNCTION Dongle_Count (DNG_Port: smallint) : smallint; stdcall; external 'matrix32.DLL'; FUNCTION Dongle_ReadData (UserCode: LongInt; DataIn : pLongWord; MaxVar : smallint; DNG_Nr : smallint; DNG_Port: smallint) : smallint; stdcall; external 'matrix32.DLL'; FUNCTION Dongle_ReadDataEx (UserCode: LongInt; DataIn : pLongWord; StartVar: smallint; MaxVar : smallint; DNG_Nr : smallint; DNG_Port: smallint) : smallint; stdcall; external 'matrix32.DLL'; FUNCTION Dongle_WriteData (UserCode: LongInt; DataOut : pLongWord; MaxVar : smallint; DNG_Nr : smallint; DNG_Port: smallint) : smallint; stdcall; external 'matrix32.DLL'; FUNCTION Dongle_WriteDataEx(UserCode: LongInt; DataOut : pLongWord; StartVar: smallint; MaxVar : smallint; DNG_Nr : smallint; DNG_Port: smallint) : smallint; stdcall; external 'matrix32.DLL'; FUNCTION Dongle_ReadSerNr (UserCode: LongInt; DNG_Nr : smallint; DNG_Port: smallint) : LongInt; stdcall; external 'matrix32.DLL'; FUNCTION SetConfig_MatrixNet(NAccess: smallint; NFile : PChar) : smallint; stdcall; external 'matrix32.DLL'; FUNCTION GetConfig_MatrixNet(Category: smallint) : LongInt; stdcall; external 'matrix32.DLL'; FUNCTION LogIn_MatrixNet (UserCode: LongInt; AppSlot : smallint; DNG_Nr : smallint) : smallint; stdcall; external 'matrix32.DLL'; FUNCTION LogOut_MatrixNet (UserCode: LongInt; AppSlot : smallint; DNG_Nr : smallint) : smallint; stdcall; external 'matrix32.DLL'; FUNCTION Dongle_WriteKey (UserCode: LongInt; KeyData : pLongWord; DNG_Nr : smallint; DNG_Port: smallint) : smallint; stdcall; external 'matrix32.DLL'; FUNCTION Dongle_GetKeyFlag (UserCode: LongInt; DNG_Nr : smallint; DNG_Port: smallint) : smallint; stdcall; external 'matrix32.DLL'; FUNCTION Dongle_EncryptData(UserCode : LongInt; DataBlock: pLongWord; DNG_Nr : smallint; DNG_Port : smallint) : smallint; stdcall; external 'matrix32.DLL'; FUNCTION Dongle_DecryptData(UserCode : LongInt; DataBlock: pLongWord; DNG_Nr : smallint; DNG_Port : smallint) : smallint; stdcall; external 'matrix32.DLL'; {****************************************************************************} implementation end. ------------------------------------------------------------- unit MatrixExample; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls; type TForm1 = class(TForm) Panel1: TPanel; RadioGroup1: TRadioGroup; GroupBox1: TGroupBox; Button1: TButton; ComboBox1: TComboBox; procedure Button1Click(Sender: TObject); private { Private-Deklarationen } public { Public-Deklarationen } end; var Form1: TForm1; implementation uses mxtea, matrix32; const UserCode = 1234; (* the demo UserCode 1234 isd used here *) cTAB = #9; (* Code for Tab *) cRET = #13; (* Code for Return *) var DNG_Port: smallint; RetCode: smallint; {$R *.dfm} (**********************************************************************) procedure LPT_Port_Exists; var DNG_LPTADR: smallint; begin if DNG_Port = 85 then (* USB *) Showmessage('DNG_Port=85 (USB)' + cRET + 'This function works only with LPT-Ports!') else begin RetCode := Init_MatrixAPI(); (***********************************************************) (* Check whether the LPT port DNG_Port is available *) (***********************************************************) DNG_LPTADR := GetPortAdr(DNG_Port); if DNG_LPTADR = 0 then Showmessage('LPT' + IntToStr(DNG_Port) + ' not available!') else Showmessage('The Address of LPT' + IntToStr(DNG_Port) + ' is: ' + '0x' + Format('%x',[DNG_LPTADR])); RetCode := Release_MatrixAPI(); end; end; (*--------------------------------------------------------------------*) procedure Number_of_Dongles; var DNG_Count: smallint; begin RetCode := Init_MatrixAPI(); (***********************************************************) (* Search for number of Dongles at DNG_Port *) (***********************************************************) DNG_Count := Dongle_Count(DNG_Port); if (DNG_Count <= 0) then Showmessage('There is no Dongle at Port ' + IntToStr(DNG_Port) + ' available!') else Showmessage('Found: ' + IntToStr(DNG_Count) + ' Dongles at Port ' + IntToStr(DNG_Port)); RetCode := Release_MatrixAPI(); end; (*--------------------------------------------------------------------*) procedure Memory_of_Dongle; var DNG_Nummer: smallint; DNG_Mem: smallint; DNG_MaxVar: smallint; begin RetCode := Init_MatrixAPI(); (***********************************************************) (* Read memory size of last Dongle at DNG_Port and *) (* calculate the maximum number of data fields *) (***********************************************************) DNG_Nummer := Dongle_Count(DNG_Port); DNG_Mem := Dongle_MemSize(DNG_Nummer, DNG_Port); if (DNG_Mem <= 0) then Showmessage('Error while determining Dongle memory!') else begin DNG_MaxVar := DNG_Mem div 4; Showmessage('Number of variables of this Dongle: ' + IntToStr(DNG_MaxVar)); RetCode := Release_MatrixAPI(); end; end; (*--------------------------------------------------------------------*) procedure Version_of_Dongle; var DNG_Nummer: smallint; DNG_Version: LongInt; VerMinor: smallint; VerMajor: smallint; begin RetCode := Init_MatrixAPI(); (***********************************************************) (* Read Dongle version from last Dongle at DNG_Port *) (***********************************************************) DNG_Nummer := Dongle_Count(DNG_Port); DNG_Version := Dongle_Version(DNG_Nummer, DNG_Port); if (DNG_Version <= 0) then Showmessage('Error while reading Dongle version!') else begin VerMinor := (DNG_Version and 65535); VerMajor := (DNG_Version shr 16); Showmessage('This Dongle has the version number: ' + IntToStr(VerMajor) + '.' + IntToStr(VerMinor)); end; RetCode := Release_MatrixAPI(); end; (*--------------------------------------------------------------------*) procedure Read_Dongle_SerNr; var DNG_Nummer: smallint; DNG_SerNr: LongInt; begin RetCode := Init_MatrixAPI(); (***********************************************************) (* Read the SerialNo. of last Dongle at DNG_Port via *) (* UserCode and display. *) (***********************************************************) DNG_Nummer := Dongle_Count(DNG_Port); DNG_SerNr := Dongle_ReadSerNr(UserCode, DNG_Nummer, DNG_Port); if (DNG_SerNr < 0) then begin Showmessage('Error ' + IntToStr(DNG_SerNr) + ' while reading the Dongle SerialNo.!'); RetCode := Release_MatrixAPI(); end else begin Showmessage('SerialNo. of the Dongle: (dec) ' + IntToStr(DNG_SerNr) + ' (hex) ' + Format('%x',[DNG_SerNr])); RetCode := Release_MatrixAPI(); end; end; (*--------------------------------------------------------------------*) procedure Read_Dongle_Data; var DNG_Nummer: smallint; DataIn: array[0..255] of longword; MessageString: String; i: smallint; begin RetCode := Init_MatrixAPI(); (***********************************************************) (* Read 3 data fields from last Dongle at DNG_Port via *) (* UserCode and display. *) (***********************************************************) DNG_Nummer := Dongle_Count(DNG_Port); RetCode := Dongle_ReadData(UserCode, @DataIn, 3, DNG_Nummer, DNG_Port); if (RetCode < 0) then begin Showmessage('Error ' + IntToStr(RetCode) + ' while reading the Dongle data!'); RetCode := Release_MatrixAPI(); end else begin MessageString := 'Content of dongle variables: ' + cRET + cRET; for i := 0 to 2 do MessageString := MessageString + 'Var' + Format('%.4d',[i + 1]) + ': ' + IntToStr(DataIn[i]) + cRET; Showmessage(MessageString); RetCode := Release_MatrixAPI(); end; end; (*--------------------------------------------------------------------*) procedure Write_Dongle_Data; var DNG_Nummer: smallint; DataOut: array[0..255] of longword; i: smallint; begin RetCode := Init_MatrixAPI(); (***********************************************************) (* Save 3 data fields in last Dongle at DNG_Port via *) (* UserCode. The values 101,102,103 are saved as example *) (***********************************************************) DNG_Nummer := Dongle_Count(DNG_Port); for i := 0 to 2 do DataOut[i] := 101 + i; RetCode := Dongle_WriteData(UserCode, @DataOut, 3, DNG_Nummer, DNG_Port); if (RetCode < 0) then Showmessage('Error ' + IntToStr(RetCode) + ' while writing Dongle data!') else Showmessage('The Dongle data have been written successfully!'); RetCode := Release_MatrixAPI(); end; (*--------------------------------------------------------------------*) procedure Dongle_Find_Ex; var xBuffer: array[0..2] of DNGINFO; MessageString: String; i: smallint; begin RetCode := Init_MatrixAPI(); (***********************************************************) (* Search all LPT-Dongles *) (***********************************************************) RetCode := Dongle_FindEx(@xBuffer); if (RetCode <= 0) then begin Showmessage('No LPT Ports available!'); RetCode := Release_MatrixAPI(); end else begin MessageString := 'Found: ' + IntToStr(RetCode) + ' LPT-Ports' + cRET + cRET; for i := 1 to RetCode do MessageString := MessageString + 'Address of LPT' + IntToStr(i) + ': ' + '0x' + Format('%x',[xBuffer[i - 1].LPT_Adr]) + cRET + 'Dongles at LPT' + IntToStr(i) + ': ' + IntToStr(xBuffer[i - 1].DNG_Cnt) + cRET + cRET; Showmessage(MessageString); RetCode := Release_MatrixAPI(); end; end; (*--------------------------------------------------------------------*) procedure Dongle_Encrypt_Decrypt; var DataBlock: array[0..1] of Longword; MessageString: String; DNG_Nummer: smallint; begin RetCode := Init_MatrixAPI(); DataBlock[0] := 1234567890; (* Clear Data *) DataBlock[1] := 1234567890; (* Clear Data *) MessageString := 'Clear Data: ' + cTAB + '(dec) ' + cTAB + IntToStr(DataBlock[0]) + ' ' + cTAB + IntToStr(DataBlock[1]) + cRET + cTAB + cTAB + '(hex) ' + cTAB + Format('%x',[DataBlock[0]]) + ' ' + cTAB + Format('%x',[DataBlock[1]])+ cRET + cRET; DNG_Nummer := Dongle_Count(DNG_Port); (***********************************************************) (* Encrypt DataBlock over the Dongle *) (***********************************************************) RetCode := Dongle_EncryptData(UserCode, @DataBlock, DNG_Nummer, DNG_Port); if (RetCode < 0) then begin Showmessage('Error ' + IntToStr(RetCode)); RetCode := Release_MatrixAPI(); end else begin MessageString := MessageString + 'Encrypted Data: ' + cTAB + '(dec) ' + cTAB + IntToStr(DataBlock[0]) + ' ' + cTAB + IntToStr(DataBlock[1]) + cRET + cTAB + cTAB + '(hex) ' + cTAB + Format('%x',[DataBlock[0]]) + ' ' + cTAB + Format('%x',[DataBlock[1]]) + cRET + cRET; (***********************************************************) (* Decrypt DataBlock over the Dongle *) (***********************************************************) RetCode := Dongle_DecryptData(UserCode, @DataBlock, DNG_Nummer, DNG_Port); if (RetCode < 0) then begin Showmessage('Error ' + IntToStr(RetCode)); RetCode := Release_MatrixAPI(); end else begin ShowMessage(MessageString + 'Decrypted Data: ' + cTAB + '(dec) ' + cTAB + IntToStr(DataBlock[0]) + ' ' + cTAB + IntToStr(DataBlock[1]) + cRET + cTAB + cTAB + '(hex) ' + cTAB + Format('%x',[DataBlock[0]]) + ' ' + cTAB + Format('%x',[DataBlock[1]]) + cRET + cRET); RetCode := Release_MatrixAPI(); end; end; end; (*--------------------------------------------------------------------*) procedure Version_of_API; var RetVer: LongInt; VerMinor: smallint; VerMajor: smallint; begin RetCode := Init_MatrixAPI(); (***********************************************************) (* Read the version of the Matrix-API *) (***********************************************************) RetVer := GetVersionAPI(); if (RetVer = 0) then Showmessage('Error while reading API version!') else begin VerMinor := (RetVer and 65535); VerMajor := (RetVer shr 16); Showmessage('The Matrix-API has the version: ' + IntToStr(VerMajor) + '.' + IntToStr(VerMinor)); end; RetCode := Release_MatrixAPI(); end; (*--------------------------------------------------------------------*) procedure Dongle_Network; var AppSlot: smallint; MxNetFile: String; DNG_Nummer: smallint; begin (*************************************************************) (* Network *) (* Example: the dongle is prepared with the value 7 in *) (* Var0002, meaning AppSlot=2 and max. Users = 7 *) (*************************************************************) RetCode := Init_MatrixAPI(); (*************************************************************) (* Max. Users stored in AppSlot 2 (Var0002 of the dongle) *) (*************************************************************) AppSlot := 2; (*************************************************************) (* Activate Network access into the Matrix-API *) (*************************************************************) MxNetFile := 'D:\TEMP\MXNET2.DAT'; RetCode := SetConfig_MatrixNet(1, pChar(MxNetFile)); (*************************************************************) (* Read the Dongle count from MxNetFile *) (* !! DNG_Port will be ignored in the Network mode !! *) (*************************************************************) DNG_Nummer := Dongle_Count(DNG_Port); (*************************************************************) (* LogIn will lock one User-Slot and the returned value is *) (* the remaining free User-Slots (for our Example RetCode=6) *) (*************************************************************) RetCode := LogIn_MatrixNet(UserCode, AppSlot, DNG_Nummer); if (RetCode < 0) then begin if (RetCode = -31) then Showmessage('All Users are active!' + cRET + 'No more User-Slots free') else Showmessage('LogIn failed ! ' + IntToStr(RetCode)); end else Showmessage( 'LogIn successfull ! Free User-Slots: ' + IntToStr(RetCode) + cRET + cRET + 'Now you can check the Active Users List in MxNet-Server.' + cRET + 'After clicking the OK button, the User will be Logged Out and' + cRET + 'removed from the Active Users List in MxNet-Server.'); (*************************************************************) (* LogOut will free the User-Slot and the returned value is *) (* the remaining free User-Slots (for our Example RetCode=7) *) (*************************************************************) RetCode := LogOut_MatrixNet(UserCode, AppSlot, DNG_Nummer); if (RetCode < 0) then Showmessage('LogOut failed ! ' + IntToStr(RetCode)) else Showmessage('LogOut successfull ! Free User-Slots: ' + IntToStr(RetCode)); (*************************************************************) (* Deactivate Network access into the Matrix-API *) (*************************************************************) RetCode := SetConfig_MatrixNet(0, ''); RetCode := Release_MatrixAPI(); end; (*--------------------------------------------------------------------*) procedure App_Encrypt; var Key: array[0..3] of Longword; Data: array[0..1] of Longword; MessageString: String; begin Data[0] := $499602D2; Data[1] := $499602D2; Key[0] := $423A612E; Key[1] := $423A8C95; Key[2] := $8474C25C; Key[3] := $8474EDC3; MessageString := 'Clear Data: ' + cTAB + '(dec) ' + cTAB + IntToStr(Data[0]) + ' ' + cTAB + IntToStr(Data[1]) + cRET + cTAB + cTAB + '(hex) ' + cTAB + Format('%x',[Data[0]]) + ' ' + cTAB + Format('%x',[Data[1]]) + cRET + cRET + 'Key: ' + cTAB + cTAB + '(dec) ' + cTAB + IntToStr(Key[0]) + ' ' + cTAB + IntToStr(Key[1]) + cRET + cTAB + cTAB + cTAB + IntToStr(Key[2]) + ' ' + cTAB + IntToStr(Key[3]) + cRET + cTAB + cTAB + '(hex) ' + cTAB + Format('%x',[Key[0]]) + ' ' + cTAB + Format('%x',[Key[1]]) + cRET + cTAB + cTAB + cTAB + Format('%x',[Key[2]]) + ' ' + cTAB + Format('%x',[Key[3]]) + cRET + cRET; MxApp_Encrypt(@Data, @Key); (*** Display Data(0)/Data(1) as Long ***) Showmessage(MessageString + 'Encrypted Data:' + cTAB + '(dec) ' + cTAB + IntToStr(Data[0]) + ' ' + cTAB + IntToStr(Data[1]) + cRET + cTAB + cTAB + '(hex) ' + cTAB + Format('%x',[Data[0]]) + ' ' + cTAB + Format('%x',[Data[1]]) + cRET + cRET); end; (*--------------------------------------------------------------------*) (**********************************************************************) procedure SetActivePort(Port: String); begin DNG_Port := 0; if Port = 'LPT1' then DNG_Port := 1 else if Port = 'LPT2' then DNG_Port := 2 else if Port = 'LPT3' then DNG_Port := 3 else if Port = 'USB' then DNG_Port := 85; end; procedure CallSelectedItem(ItemIndex : Integer); begin case ItemIndex of 0: LPT_Port_Exists(); 1: Number_of_Dongles(); 2: Memory_of_Dongle(); 3: Version_of_Dongle(); 4: Read_Dongle_SerNr(); 5: Read_Dongle_Data(); 6: Write_Dongle_Data(); 7: Dongle_Find_Ex(); 8: Dongle_Encrypt_Decrypt(); 9: Version_of_API(); 10: Dongle_Network(); 11: App_Encrypt(); end; end; (**********************************************************************) procedure TForm1.Button1Click(Sender: TObject); begin SetActivePort(ComboBox1.Text); CallSelectedItem(RadioGroup1.ItemIndex); end; end.