468 lines
27 KiB
VB.net
468 lines
27 KiB
VB.net
' !! this file should not be modified
|
|
|
|
' DAPF file is in the following format:
|
|
' DINKEYINFO
|
|
' LICENCEINFO (however many are needed)
|
|
' FILEINFO (however many are needed)
|
|
' ALGORITHM (however many are needed)
|
|
' DATAFILEENC (however many are needed)
|
|
|
|
Imports System
|
|
Imports System.Runtime.InteropServices ' so we can marshal the structures as a block of memory
|
|
Imports System.Text ' for StringBuilder
|
|
|
|
' *********** define structures that make up the DAPF file *******************
|
|
|
|
Module dapf_code
|
|
|
|
<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Ansi, Pack:=1)> _
|
|
Structure DINKEYINFO
|
|
Dim Header1 As Byte ' should be set to "DAPF"
|
|
Dim Header2 As Byte
|
|
Dim Header3 As Byte
|
|
Dim Header4 As Byte
|
|
Dim Version As Integer ' version of this structure. Currently 9.
|
|
Dim SelectedModels As Integer ' BIT0 = Dinkey Pro Lite, BIT1 = Dinkey Pro Plus, BIT2 = Dinkey Pro Net etc...
|
|
<VBFixedString(12), MarshalAs(UnmanagedType.ByValTStr, SizeConst:=12)> _
|
|
Dim ProdCode As String
|
|
Dim PerLicence As Integer ' 1 = per licence, 0 = per product (default)
|
|
Dim MaxNetUsers As Integer ' product net users, unlimited = -1, no entry = -2
|
|
Dim RangeSettings As Integer ' 0 = any number, 1 = dongle in computer, 2 = range
|
|
Dim RangeMin As UInt32
|
|
Dim RangeMax As UInt32
|
|
Dim NumLicences As Integer ' number of LICENCEINFO structures in this DAPF file
|
|
Dim NumProgs As Integer ' number of FILEINFO structures in this DAPF file
|
|
Dim NumAlgs As Integer
|
|
Dim DataSizeType As Integer ' 1 = set the zero data size, 0 = use file to initialise data area
|
|
Dim ZeroDataSize As Integer ' size of the data area area in bytes
|
|
' NB some of these entries were for an older (deprecated) FD model. Now marked as deprecated. These fields are ignored.
|
|
<VBFixedString(256), MarshalAs(UnmanagedType.ByValTStr, SizeConst:=256)> _
|
|
Dim DataFile As String ' path to data file (0 = no data file)
|
|
Dim DataAreaSize As Integer ' file size in bytes, -1 = file not found
|
|
<VBFixedString(256), MarshalAs(UnmanagedType.ByValTStr, SizeConst:=256)> _
|
|
Dim ShellSuccessMsg As String ' Shell Method messages...
|
|
<VBFixedString(256), MarshalAs(UnmanagedType.ByValTStr, SizeConst:=256)> _
|
|
Dim ShellNoDongleMsg As String
|
|
<VBFixedString(256), MarshalAs(UnmanagedType.ByValTStr, SizeConst:=256)> _
|
|
Dim ShellExpiryDateMsg As String
|
|
<VBFixedString(256), MarshalAs(UnmanagedType.ByValTStr, SizeConst:=256)> _
|
|
Dim ShellExpiryExecsMsg As String
|
|
<VBFixedString(256), MarshalAs(UnmanagedType.ByValTStr, SizeConst:=256)> _
|
|
Dim ShellWarnDateMsg As String
|
|
<VBFixedString(256), MarshalAs(UnmanagedType.ByValTStr, SizeConst:=256)> _
|
|
Dim ShellWarnExecsMsg As String
|
|
<VBFixedString(256), MarshalAs(UnmanagedType.ByValTStr, SizeConst:=256)> _
|
|
Dim ShellNetUserLimitMsg As String
|
|
<VBFixedString(256), MarshalAs(UnmanagedType.ByValTStr, SizeConst:=256)> _
|
|
Dim ShellOtherErrorMsg As String
|
|
<VBFixedString(256), MarshalAs(UnmanagedType.ByValTStr, SizeConst:=256)> _
|
|
Dim ShellBackgroundMsg As String
|
|
<VBFixedString(256), MarshalAs(UnmanagedType.ByValTStr, SizeConst:=256)> _
|
|
Dim NetNoServerMsg As String
|
|
<VBFixedArray(12), MarshalAs(UnmanagedType.ByValArray, SizeConst:=12)> _
|
|
Dim rwalg As Byte() ' coded form of rw algorithm (0 = no algorithm)
|
|
Dim SecOptions As Integer ' BIT0: DRIS encryption, BIT1: Data encryption, BIT2: Data enc with alg, BIT3: only secure update codes
|
|
Dim SecDRISEncKey1 As Byte ' DRIS encryption parameters
|
|
Dim SecDRISEncKey2 As Byte
|
|
Dim SecDRISEncKey3 As Byte
|
|
Dim Ignored1 As Byte ' this byte is ignored
|
|
Dim SecDataEncKey1 As Byte ' API Data encryption parameters
|
|
Dim SecDataEncKey2 As Byte
|
|
Dim SecDataEncKey3 As Byte
|
|
Dim Ignored2 As Byte ' this byte is ignored
|
|
Dim ProtectionType As Integer ' 0 = software + dongle, 1 = dongle only, 2 = program only
|
|
<VBFixedString(12), MarshalAs(UnmanagedType.ByValTStr, SizeConst:=12)> _
|
|
Dim DataEncKeyProdCode As String ' Alternative Product Code used to generate internal encryption keys. Normally set to 0.
|
|
<VBFixedString(256), MarshalAs(UnmanagedType.ByValTStr, SizeConst:=256)> _
|
|
Dim Notes As String ' user-defined notes
|
|
Dim LockDongle As Integer ' 0 = don't lock (default), 1 = lock dongle to user's computer
|
|
Dim Reserved1 As Integer ' must be 0
|
|
Dim Reserved2 As Integer ' must be 0
|
|
Dim AdvancedOptions As Integer ' BIT0 = do not allow usb-over-network for non-Net dongles, BIT1 = do not check for Software Key at Runtime.
|
|
Dim NumDataFileEnc As Integer ' Number of data files in our encryption list
|
|
End Structure
|
|
|
|
<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Ansi, Pack:=1)> _
|
|
Structure LICENCEINFO
|
|
<VBFixedString(256), MarshalAs(UnmanagedType.ByValTStr, SizeConst:=256)> _
|
|
Dim LicenceName As String ' licence name
|
|
Dim MaxDays As Integer ' -1 = no limit
|
|
Dim ExpiryDay As Integer ' -1 = no limit, 0 = no change
|
|
Dim ExpiryMonth As Integer
|
|
Dim ExpiryYear As Integer
|
|
Dim Execs As Integer ' -1 = no limit
|
|
Dim ExecsWarn As Integer ' 0 = no warning (just for Shell method)
|
|
Dim DaysWarn As Integer ' 0 = no warning (just for Shell method)
|
|
Dim Features As Uint32
|
|
Dim LicenceNetUsers As Integer ' unlimited = -1 (-2 = not needed (this is for display only))
|
|
End Structure
|
|
|
|
<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Ansi, Pack:=1)> _
|
|
Structure FILEINFO
|
|
<VBFixedString(256), MarshalAs(UnmanagedType.ByValTStr, SizeConst:=256)> _
|
|
Dim InputName As String ' input file (full path)
|
|
<VBFixedString(256), MarshalAs(UnmanagedType.ByValTStr, SizeConst:=256)> _
|
|
Dim OutputName As String ' output file/folder
|
|
<VBFixedString(256), MarshalAs(UnmanagedType.ByValTStr, SizeConst:=256)> _
|
|
Dim CallingProg As String ' calling program name
|
|
Dim LicenceIndex As Integer ' index (of licence) in the LicenceInfo structure (1-based index. 0 = no selection)
|
|
Dim Method As Integer ' 0-api, 1-shell, 2-shell & api
|
|
Dim ShellFlags As Integer ' same bit flag values as in dris. i.e. 1 = DEC_ONE_EXEC, 4 = START_NET_USER
|
|
Dim BackGround As Integer ' 0=no background, 1=1min, 2=5min, 3=10min, 4=30min, 5=60min
|
|
Dim OtherShellOptions As Integer ' BIT0 = Shell Data Encryption Enabled, BIT1: Extra Anti-Debug is disabled, BIT2: Extra Anti-Piracy is disabled
|
|
<VBFixedString(256), MarshalAs(UnmanagedType.ByValTStr, SizeConst:=256)> _
|
|
Dim EncFileList As String ' files (or file types) that the Shell-protected program will treat as encrypted (separated by ':')
|
|
<VBFixedString(256), MarshalAs(UnmanagedType.ByValTStr, SizeConst:=256)> _
|
|
Dim ExceptList As String ' files (or file types) that are exceptions to the above list (separated by ':')
|
|
Dim ExtraAntiPiracy As Integer ' 0 = off, 1=min, 10=max
|
|
End Structure
|
|
|
|
<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Ansi, Pack:=1)> _
|
|
Structure ALGORITHM
|
|
<VBFixedArray(12), MarshalAs(UnmanagedType.ByValArray, SizeConst:=12)> _
|
|
Dim alg As Byte() ' coded form of algorithm
|
|
End Structure
|
|
|
|
<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Ansi, Pack:=1)> _
|
|
Structure DATAFILEENC
|
|
<VBFixedString(256), MarshalAs(UnmanagedType.ByValTStr, SizeConst:=256)> _
|
|
Dim InputName As String ' file name, wild cards are allowed
|
|
<VBFixedString(256), MarshalAs(UnmanagedType.ByValTStr, SizeConst:=256)> _
|
|
Dim OutputName As String ' file name (or folder name if input is a wildcard)
|
|
End Structure
|
|
|
|
' this structure is used for creating Temporary Software Keys
|
|
<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Ansi, Pack:=1)> _
|
|
Structure TEMP_SWKEY_INFO
|
|
Dim Size As Integer
|
|
Dim MachineID As UInt32
|
|
Dim ExpiryDay As Integer
|
|
Dim ExpiryMonth As Integer
|
|
Dim ExpiryYear As Integer
|
|
Dim DongleModel As Integer
|
|
Dim DongleNumber As UInt32
|
|
End Structure
|
|
|
|
' this structure is used for creating Demo Software Key Templates
|
|
<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Ansi, Pack:=1)> _
|
|
Structure DEMO_SWKEY_INFO
|
|
Dim Size As Integer
|
|
Dim MaxDays As Int32 ' max days demo swkey installation is valid (0-60)
|
|
Dim Models As Int32 ' bitmap of valid dongle models. See constant values below. 0 = default (only use if only one model is selected in DINKEYINFO)
|
|
End Structure
|
|
|
|
' ********************** DinkeyAdd Module Imports ************************
|
|
|
|
' Loads DAPF from disk and returns handle
|
|
Declare Ansi Function LoadDAPFFromFile32 Lib "DinkeyAdd32.dll" Alias "LoadDAPFFromFile" (ByVal dapf_file As String, ByRef err_code As Integer) As IntPtr
|
|
Declare Ansi Function LoadDAPFFromFile64 Lib "DinkeyAdd64.dll" Alias "LoadDAPFFromFile" (ByVal dapf_file As String, ByRef err_code As Integer) As IntPtr
|
|
|
|
' Loads DAPF from disk into structures supplied (so we can modify DAPF in memory)
|
|
Declare Ansi Function ReadDAPFEx32 Lib "DinkeyAdd32.dll" Alias "ReadDAPFEx" (ByVal dapf_file As String, ByRef MyDinkeyInfo As DINKEYINFO, ByVal licence_bytes() As Byte, _
|
|
ByVal fileinfo_bytes() As Byte, ByVal alg_bytes() As Byte, ByVal datafile_bytes() As Byte, ByRef dapf_version As Integer, ByRef dapf_format As Integer) As Integer
|
|
Declare Ansi Function ReadDAPFEx64 Lib "DinkeyAdd64.dll" Alias "ReadDAPFEx" (ByVal dapf_file As String, ByRef MyDinkeyInfo As DINKEYINFO, ByVal licence_bytes() As Byte, _
|
|
ByVal fileinfo_bytes() As Byte, ByVal alg_bytes() As Byte, ByVal datafile_bytes() As Byte, ByRef dapf_version As Integer, ByRef dapf_format As Integer) As Integer
|
|
|
|
' Loads DAPF from structures and returns a handle
|
|
Declare Ansi Function LoadDAPF32 Lib "DinkeyAdd32.dll" Alias "LoadDAPF" (ByRef MyDinkeyInfo As DINKEYINFO, ByVal licence_bytes() As Byte, ByVal fileinfo_bytes() As Byte, _
|
|
ByVal alg_bytes() As Byte, ByVal datafile_bytes() As Byte, ByRef ret_code As Integer) As IntPtr
|
|
Declare Ansi Function LoadDAPF64 Lib "DinkeyAdd64.dll" Alias "LoadDAPF" (ByRef MyDinkeyInfo As DINKEYINFO, ByVal licence_bytes() As Byte, ByVal fileinfo_bytes() As Byte, _
|
|
ByVal alg_bytes() As Byte, ByVal datafile_bytes() As Byte, ByRef ret_code As Integer) As IntPtr
|
|
|
|
' saves the DAPF file to disk
|
|
Declare Ansi Function WriteDAPFEx32 Lib "DinkeyAdd32.dll" Alias "WriteDAPFEx" (ByVal dapf_handle As IntPtr, ByVal dapf_file As String, ByVal dapf_format As Integer, _
|
|
ByVal dapf_version As Integer, ByVal flags As Integer) As Integer
|
|
Declare Ansi Function WriteDAPFEx64 Lib "DinkeyAdd64.dll" Alias "WriteDAPFEx" (ByVal dapf_handle As IntPtr, ByVal dapf_file As String, ByVal dapf_format As Integer, _
|
|
ByVal dapf_version As Integer, ByVal flags As Integer) As Integer
|
|
|
|
' unloads the DAPF file
|
|
Declare Ansi Sub UnloadDAPF32 Lib "DinkeyAdd32.dll" Alias "UnloadDAPF" (ByRef dapf_handle As IntPtr)
|
|
Declare Ansi Sub UnloadDAPF64 Lib "DinkeyAdd64.dll" Alias "UnloadDAPF" (ByRef dapf_handle As IntPtr)
|
|
|
|
'main functions
|
|
Declare Ansi Function AddProtection32 Lib "DinkeyAdd32.dll" Alias "AddProtection" (ByVal dapf_handle As IntPtr, ByVal action As Integer, ByVal file_num As Integer, _
|
|
ByVal flags As Integer, ByRef dongle_number As UInt32) As Integer
|
|
Declare Ansi Function AddProtection64 Lib "DinkeyAdd64.dll" Alias "AddProtection" (ByVal dapf_handle As IntPtr, ByVal action As Integer, ByVal file_num As Integer, _
|
|
ByVal flags As Integer, ByRef dongle_number As UInt32) As Integer
|
|
|
|
Declare Ansi Function CreateTempSoftwareKey32 Lib "DinkeyAdd32.dll" Alias "CreateTempSoftwareKey" (ByVal dapf_handle As IntPtr, ByRef my_swkey_info As TEMP_SWKEY_INFO, _
|
|
ByVal flags As Integer) As Integer
|
|
Declare Ansi Function CreateTempSoftwareKey64 Lib "DinkeyAdd64.dll" Alias "CreateTempSoftwareKey" (ByVal dapf_handle As IntPtr, ByRef my_swkey_info As TEMP_SWKEY_INFO, _
|
|
ByVal flags As Integer) As Integer
|
|
|
|
Declare Ansi Function CreateDemoSoftwareKeyTemplate32 Lib "DinkeyAdd32.dll" Alias "CreateDemoSoftwareKeyTemplate" (ByVal dapf_handle As IntPtr, ByRef my_swkey_info As DEMO_SWKEY_INFO, _
|
|
ByVal flags As Integer) As Integer
|
|
Declare Ansi Function CreateDemoSoftwareKeyTemplate64 Lib "DinkeyAdd64.dll" Alias "CreateDemoSoftwareKeyTemplate" (ByVal dapf_handle As IntPtr, ByRef my_swkey_info As DEMO_SWKEY_INFO, _
|
|
ByVal flags As Integer) As Integer
|
|
|
|
Declare Ansi Function EncryptShellDataFiles32 Lib "DinkeyAdd32.dll" Alias "EncryptShellDataFiles" (ByVal dapf_handle As IntPtr, ByVal file_num As Integer, _
|
|
ByVal flags As Integer) As Integer
|
|
Declare Ansi Function EncryptShellDataFiles64 Lib "DinkeyAdd64.dll" Alias "EncryptShellDataFiles" (ByVal dapf_handle As IntPtr, ByVal file_num As Integer, _
|
|
ByVal flags As Integer) As Integer
|
|
|
|
' get the message output by DinkeyAdd
|
|
Declare Ansi Sub GetLastMessage32 Lib "DinkeyAdd32.dll" Alias "GetLastMessage" (ByVal message As StringBuilder, ByVal buffer_size As Integer, ByRef message_length As Integer)
|
|
Declare Ansi Sub GetLastMessage64 Lib "DinkeyAdd64.dll" Alias "GetLastMessage" (ByVal message As StringBuilder, ByVal buffer_size As Integer, ByRef message_length As Integer)
|
|
|
|
' get the extended error (set if an error occurs)
|
|
Declare Ansi Function GetLastExtendedError32 Lib "DinkeyAdd32.dll" Alias "GetLastExtendedError" () As Integer
|
|
Declare Ansi Function GetLastExtendedError64 Lib "DinkeyAdd64.dll" Alias "GetLastExtendedError" () As Integer
|
|
|
|
' ********************** Constants ************************
|
|
Public Const DAPF_VERSION As Integer = 9 ' current DAPF version
|
|
|
|
' WriteDAPFEx API flags
|
|
Public Const FLAGS_LOSE_FEATURES As Integer = 1 ' means that you can save the DAPF file to an earlier version even if it means losing some new features that have been currently set
|
|
|
|
' AddProtection API action values
|
|
Public Const ACTION_USE_DAPF_SETTINGS As Integer = 0 ' means you just ignore the action value and use the default dapf settings
|
|
Public Const ACTION_PROGRAM_DONGLE As Integer = 1 ' program the dongle only
|
|
Public Const ACTION_PROTECT_SOFTWARE As Integer = 2 ' protect a software file (index indicated by separate parameter)
|
|
Public Const ACTION_PROGRAM_AND_PROTECT As Integer = 3 ' program the dongle and protect software
|
|
|
|
' AddProtection API flags values
|
|
Public Const FLAGS_OVERWRITE_OUTPUT As Integer = 1 ' overwrite the output file if it already exists (default is to give an error)
|
|
|
|
' CreateSoftwareKey API flags
|
|
Public Const FLAGS_OVERWRITE_SWKEY As Integer = 1 ' ovewrite an existing swkey with the new one
|
|
Public Const FLAGS_EXPIRY_DONTCARE As Integer = 2 ' create the Software Key even though the expiry date (or max days) is less than the expiry date of the key itself.
|
|
|
|
' constants for dapf_format in ReadDAPFEx and WriteDAPFEx functions
|
|
Public Const DAPF_FORMAT_BINARY As Integer = 1
|
|
Public Const DAPF_FORMAT_JSON As Integer = 2
|
|
Public Const DAPF_FORMAT_JSON_MIN As Integer = 3 ' this value is only used with WriteDAPEx. ReadDAPFEx cannot return this value.
|
|
|
|
' constants for values for model in the TEMP_SWKEY_INFO structure
|
|
Public Const SWKEY_MODEL_PRO_LITE As Integer = 0
|
|
Public Const SWKEY_MODEL_PRO_PLUS As Integer = 1
|
|
Public Const SWKEY_MODEL_PRO_NET As Integer = 2
|
|
Public Const SWKEY_MODEL_FD_LITE As Integer = 3
|
|
Public Const SWKEY_MODEL_FD_PLUS As Integer = 4
|
|
Public Const SWKEY_MODEL_FD_NET As Integer = 5
|
|
|
|
' constants for models bitmap in the DEMO_SWKEY_INFO structure
|
|
Public Const SWKEY_BITMAP_DEFAULT As Integer = 0 ' use default value set in DINKEYINFO.SelectedModels
|
|
Public Const SWKEY_BITMAP_PRO_LITE As Integer = 1 ' BIT0
|
|
Public Const SWKEY_BITMAP_PRO_PLUS As Integer = 2 ' BIT1
|
|
Public Const SWKEY_BITMAP_PRO_NET As Integer = 4 ' BIT2
|
|
Public Const SWKEY_BITMAP_FD_LITE As Integer = 8 ' BIT3
|
|
Public Const SWKEY_BITMAP_FD_PLUS As Integer = 16 ' BIT4
|
|
Public Const SWKEY_BITMAP_FD_NET As Integer = 32 ' BIT5
|
|
|
|
' private constants
|
|
Private Const MAX_LICENCES As Integer = 255 ' max number of licences in a DAPF file
|
|
Private Const MAX_FILE_INFO As Integer = 1000 ' theoretically unlimited but in practice it is easier if we limit it
|
|
Private Const MAX_USER_ALGS As Integer = 20 'max number of user algs in DAPF file
|
|
Private Const MAX_DATA_ENCS As Integer = 255 ' max number of Shell data encryption files in DAPF file
|
|
|
|
' ********************** API Functions ************************
|
|
' We only want to load the correct DLL for the bit-ness of the computer. The other DLL may not exist.
|
|
' if the appropriate DLL does not exist in the same directory as this test program you will receive a DllNotFoundException
|
|
|
|
' call the correct dll depending on whether we are running 32-bit or 64-bit code
|
|
Function LoadDAPFFromFile(ByVal dapf_file As String, ByRef err_code As Integer) As IntPtr
|
|
If (IntPtr.Size = 4) Then
|
|
LoadDAPFFromFile = LoadDAPFFromFile32(dapf_file, err_code)
|
|
Else
|
|
LoadDAPFFromFile = LoadDAPFFromFile64(dapf_file, err_code)
|
|
End If
|
|
End Function
|
|
|
|
' we have to do some marshalling of arrays of bytes into arrays of structures
|
|
Function ReadDAPFEx(ByVal dapf_file As String, ByRef MyDinkeyInfo As DINKEYINFO, ByRef LicenceInfoArray() As LICENCEINFO, ByRef FileInfoArray() As FILEINFO, _
|
|
ByRef AlgorithmArray() As ALGORITHM, ByRef DataFileEncArray() As DATAFILEENC, ByRef dapf_version As Integer, ByRef dapf_format As Integer) As Integer
|
|
Dim i As Integer
|
|
Dim MyLicenceInfo As New LICENCEINFO
|
|
Dim licence_bytes(MAX_LICENCES * Marshal.SizeOf(MyLicenceInfo)) As Byte
|
|
Dim licence_bytes_one_struct(Marshal.SizeOf(MyLicenceInfo)) As Byte
|
|
Dim MyFileInfo As New FILEINFO
|
|
Dim fileinfo_bytes(MAX_FILE_INFO * Marshal.SizeOf(MyFileInfo)) As Byte
|
|
Dim fileinfo_bytes_one_struct(Marshal.SizeOf(MyFileInfo)) As Byte
|
|
Dim MyAlgorithm As New ALGORITHM
|
|
Dim alg_bytes(MAX_USER_ALGS * Marshal.SizeOf(MyAlgorithm)) As Byte
|
|
Dim alg_bytes_one_struct(Marshal.SizeOf(MyAlgorithm)) As Byte
|
|
Dim MyDataFileEnc As New DATAFILEENC
|
|
Dim datafile_bytes(MAX_DATA_ENCS * Marshal.SizeOf(MyDataFileEnc)) As Byte
|
|
Dim datafile_bytes_one_struct(Marshal.SizeOf(MyDataFileEnc)) As Byte
|
|
Dim MyGC As GCHandle
|
|
MyDinkeyInfo = New DINKEYINFO
|
|
|
|
If (IntPtr.Size = 4) Then
|
|
ReadDAPFEx = ReadDAPFEx32(dapf_file, MyDinkeyInfo, licence_bytes, fileinfo_bytes, alg_bytes, datafile_bytes, dapf_version, dapf_format)
|
|
Else
|
|
ReadDAPFEx = ReadDAPFEx64(dapf_file, MyDinkeyInfo, licence_bytes, fileinfo_bytes, alg_bytes, datafile_bytes, dapf_version, dapf_format)
|
|
End If
|
|
|
|
If ReadDAPFEx <> 0 Then
|
|
Exit Function
|
|
End If
|
|
|
|
' convert byte array to an array of structs
|
|
ReDim LicenceInfoArray(MyDinkeyInfo.NumLicences)
|
|
For i = 0 To MyDinkeyInfo.NumLicences - 1
|
|
LicenceInfoArray(i) = New LICENCEINFO
|
|
Array.Copy(licence_bytes, i * Marshal.SizeOf(MyLicenceInfo.GetType), licence_bytes_one_struct, 0, Marshal.SizeOf(MyLicenceInfo.GetType))
|
|
MyGC = GCHandle.Alloc(licence_bytes_one_struct, GCHandleType.Pinned)
|
|
LicenceInfoArray(i) = Marshal.PtrToStructure(MyGC.AddrOfPinnedObject, MyLicenceInfo.GetType)
|
|
MyGC.Free()
|
|
Next
|
|
|
|
ReDim FileInfoArray(MyDinkeyInfo.NumProgs)
|
|
For i = 0 To MyDinkeyInfo.NumProgs - 1
|
|
FileInfoArray(i) = New FILEINFO
|
|
Array.Copy(fileinfo_bytes, i * Marshal.SizeOf(MyFileInfo.GetType), fileinfo_bytes_one_struct, 0, Marshal.SizeOf(MyFileInfo.GetType))
|
|
MyGC = GCHandle.Alloc(fileinfo_bytes_one_struct, GCHandleType.Pinned)
|
|
FileInfoArray(i) = Marshal.PtrToStructure(MyGC.AddrOfPinnedObject, MyFileInfo.GetType)
|
|
MyGC.Free()
|
|
Next
|
|
|
|
ReDim AlgorithmArray(MyDinkeyInfo.NumAlgs)
|
|
For i = 0 To MyDinkeyInfo.NumAlgs - 1
|
|
AlgorithmArray(i) = New ALGORITHM
|
|
Array.Copy(alg_bytes, i * Marshal.SizeOf(MyAlgorithm.GetType), alg_bytes_one_struct, 0, Marshal.SizeOf(MyAlgorithm.GetType))
|
|
MyGC = GCHandle.Alloc(alg_bytes_one_struct, GCHandleType.Pinned)
|
|
AlgorithmArray(i) = Marshal.PtrToStructure(MyGC.AddrOfPinnedObject, MyAlgorithm.GetType)
|
|
MyGC.Free()
|
|
Next
|
|
|
|
ReDim DataFileEncArray(MyDinkeyInfo.NumDataFileEnc)
|
|
For i = 0 To MyDinkeyInfo.NumDataFileEnc - 1
|
|
DataFileEncArray(i) = New DATAFILEENC
|
|
Array.Copy(datafile_bytes, i * Marshal.SizeOf(MyDataFileEnc.GetType), datafile_bytes_one_struct, 0, Marshal.SizeOf(MyDataFileEnc.GetType))
|
|
MyGC = GCHandle.Alloc(datafile_bytes_one_struct, GCHandleType.Pinned)
|
|
DataFileEncArray(i) = Marshal.PtrToStructure(MyGC.AddrOfPinnedObject, MyDataFileEnc.GetType)
|
|
MyGC.Free()
|
|
Next
|
|
|
|
End Function
|
|
|
|
Function LoadDAPF(ByRef MyDinkeyInfo As DINKEYINFO, ByRef LicenceInfoArray() As LICENCEINFO, ByRef FileInfoArray() As FILEINFO, _
|
|
ByRef AlgorithmArray() As ALGORITHM, ByRef DataFileEncArray() As DATAFILEENC, ByRef ret_code As Integer) As IntPtr
|
|
Dim i As Integer
|
|
Dim MyLicenceInfo As New LICENCEINFO
|
|
Dim licence_bytes(MAX_LICENCES * Marshal.SizeOf(MyLicenceInfo)) As Byte
|
|
Dim licence_bytes_one_struct(Marshal.SizeOf(MyLicenceInfo)) As Byte
|
|
Dim MyFileInfo As New FILEINFO
|
|
Dim fileinfo_bytes(MAX_FILE_INFO * Marshal.SizeOf(MyFileInfo)) As Byte
|
|
Dim fileinfo_bytes_one_struct(Marshal.SizeOf(MyFileInfo)) As Byte
|
|
Dim MyAlgorithm As New ALGORITHM
|
|
Dim alg_bytes(MAX_USER_ALGS * Marshal.SizeOf(MyAlgorithm)) As Byte
|
|
Dim alg_bytes_one_struct(Marshal.SizeOf(MyAlgorithm)) As Byte
|
|
Dim MyDataFileEnc As New DATAFILEENC
|
|
Dim datafile_bytes(MAX_DATA_ENCS * Marshal.SizeOf(MyDataFileEnc)) As Byte
|
|
Dim datafile_bytes_one_struct(Marshal.SizeOf(MyDataFileEnc)) As Byte
|
|
Dim MyGC As GCHandle
|
|
|
|
' convert array of structs to byte arrays
|
|
For i = 0 To MyDinkeyInfo.NumLicences - 1
|
|
MyGC = GCHandle.Alloc(licence_bytes_one_struct, GCHandleType.Pinned)
|
|
Marshal.StructureToPtr(LicenceInfoArray(i), MyGC.AddrOfPinnedObject, False)
|
|
MyGC.Free()
|
|
Array.Copy(licence_bytes_one_struct, 0, licence_bytes, i * Marshal.SizeOf(MyLicenceInfo.GetType), Marshal.SizeOf(MyLicenceInfo.GetType))
|
|
Next
|
|
|
|
For i = 0 To MyDinkeyInfo.NumProgs - 1
|
|
MyGC = GCHandle.Alloc(fileinfo_bytes_one_struct, GCHandleType.Pinned)
|
|
Marshal.StructureToPtr(FileInfoArray(i), MyGC.AddrOfPinnedObject, False)
|
|
MyGC.Free()
|
|
Array.Copy(fileinfo_bytes_one_struct, 0, fileinfo_bytes, i * Marshal.SizeOf(MyFileInfo.GetType), Marshal.SizeOf(MyFileInfo.GetType))
|
|
Next
|
|
|
|
For i = 0 To MyDinkeyInfo.NumAlgs - 1
|
|
MyGC = GCHandle.Alloc(alg_bytes_one_struct, GCHandleType.Pinned)
|
|
Marshal.StructureToPtr(AlgorithmArray(i), MyGC.AddrOfPinnedObject, False)
|
|
MyGC.Free()
|
|
Array.Copy(alg_bytes_one_struct, 0, alg_bytes, i * Marshal.SizeOf(MyAlgorithm.GetType), Marshal.SizeOf(MyAlgorithm.GetType))
|
|
Next
|
|
|
|
For i = 0 To MyDinkeyInfo.NumDataFileEnc - 1
|
|
MyGC = GCHandle.Alloc(datafile_bytes_one_struct, GCHandleType.Pinned)
|
|
Marshal.StructureToPtr(DataFileEncArray(i), MyGC.AddrOfPinnedObject, False)
|
|
MyGC.Free()
|
|
Array.Copy(datafile_bytes_one_struct, 0, datafile_bytes, i * Marshal.SizeOf(MyDataFileEnc.GetType), Marshal.SizeOf(MyDataFileEnc.GetType))
|
|
Next
|
|
|
|
If (IntPtr.Size = 4) Then
|
|
LoadDAPF = LoadDAPF32(MyDinkeyInfo, licence_bytes, fileinfo_bytes, alg_bytes, datafile_bytes, ret_code)
|
|
Else
|
|
LoadDAPF = LoadDAPF64(MyDinkeyInfo, licence_bytes, fileinfo_bytes, alg_bytes, datafile_bytes, ret_code)
|
|
End If
|
|
|
|
End Function
|
|
|
|
Function WriteDAPFEx(ByVal dapf_handle As IntPtr, ByVal dapf_file As String, ByVal dapf_format As Integer, ByVal dapf_version As Integer, ByVal flags As Integer) As Integer
|
|
If (IntPtr.Size = 4) Then
|
|
WriteDAPFEx = WriteDAPFEx32(dapf_handle, dapf_file, dapf_format, dapf_version, flags)
|
|
Else
|
|
WriteDAPFEx = WriteDAPFEx64(dapf_handle, dapf_file, dapf_format, dapf_version, flags)
|
|
End If
|
|
End Function
|
|
|
|
Sub UnloadDAPF(ByRef dapf_handle As IntPtr)
|
|
If (IntPtr.Size = 4) Then
|
|
UnloadDAPF32(dapf_handle)
|
|
Else
|
|
UnloadDAPF64(dapf_handle)
|
|
End If
|
|
End Sub
|
|
|
|
Function AddProtection(ByVal dapf_handle As IntPtr, ByVal action As Integer, ByVal file_num As Integer, ByVal flags As Integer, ByRef dongle_number As UInt32) As Integer
|
|
If (IntPtr.Size = 4) Then
|
|
AddProtection = AddProtection32(dapf_handle, action, file_num, flags, dongle_number)
|
|
Else
|
|
AddProtection = AddProtection64(dapf_handle, action, file_num, flags, dongle_number)
|
|
End If
|
|
End Function
|
|
|
|
Function CreateTempSoftwareKey(ByVal dapf_handle As IntPtr, ByRef swkey_info As TEMP_SWKEY_INFO, ByVal flags As Integer) As Integer
|
|
If (IntPtr.Size = 4) Then
|
|
CreateTempSoftwareKey = CreateTempSoftwareKey32(dapf_handle, swkey_info, flags)
|
|
Else
|
|
CreateTempSoftwareKey = CreateTempSoftwareKey64(dapf_handle, swkey_info, flags)
|
|
End If
|
|
End Function
|
|
|
|
Function CreateDemoSoftwareKeyTemplate(ByVal dapf_handle As IntPtr, ByRef swkey_info As DEMO_SWKEY_INFO, ByVal flags As Integer) As Integer
|
|
If (IntPtr.Size = 4) Then
|
|
CreateDemoSoftwareKeyTemplate = CreateDemoSoftwareKeyTemplate32(dapf_handle, swkey_info, flags)
|
|
Else
|
|
CreateDemoSoftwareKeyTemplate = CreateDemoSoftwareKeyTemplate64(dapf_handle, swkey_info, flags)
|
|
End If
|
|
End Function
|
|
|
|
Function EncryptShellDataFiles(ByVal dapf_handle As IntPtr, ByVal file_num As Integer, ByVal flags As Integer) As Integer
|
|
If (IntPtr.Size = 4) Then
|
|
EncryptShellDataFiles = EncryptShellDataFiles32(dapf_handle, file_num, flags)
|
|
Else
|
|
EncryptShellDataFiles = EncryptShellDataFiles64(dapf_handle, file_num, flags)
|
|
End If
|
|
End Function
|
|
|
|
' do a bit of work here to make the function easier to use for VB.NET
|
|
Function GetLastMessage() As String
|
|
Dim length, dummy As Integer
|
|
Dim message As StringBuilder
|
|
|
|
If (IntPtr.Size = 4) Then
|
|
GetLastMessage32(Nothing, 0, length)
|
|
message = New StringBuilder(length)
|
|
GetLastMessage32(message, length, dummy)
|
|
Else
|
|
GetLastMessage64(Nothing, 0, length)
|
|
message = New StringBuilder(length)
|
|
GetLastMessage64(message, length, dummy)
|
|
End If
|
|
|
|
Return message.ToString()
|
|
End Function
|
|
|
|
Function GetLastExtendedError() As Integer
|
|
If (IntPtr.Size = 4) Then
|
|
GetLastExtendedError = GetLastExtendedError32()
|
|
Else
|
|
GetLastExtendedError = GetLastExtendedError64()
|
|
End If
|
|
End Function
|
|
|
|
End Module
|